Marvel Mods

XML and MUA - Common Items => Knowledge Base - (not for questions) => Tutorials => Topic started by: Outsider on September 07, 2019, 09:59PM

Title: [MUA1] The Outsider's Guide To Modding
Post by: Outsider on September 07, 2019, 09:59PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Introduction


So, you want to learn how to create a mod? You wish to learn how it's done? Well, this is the tutorial thread showing in lessons on how to do it in small intervals. It is best to learn how to do each lesson one at a time, step by step and not rush anything, until you think you're ready for the next step. Learn at your own pace. Please note that I will not teach how to convert 3-D models. This is only for those who wish to learn how to create mods entirely from scratch. No tuition required :laugh:.

Language Note:
I can't provide these lessons in another language -- I can only speak English. For those who speak Portuguese, Aventureiromax is providing videos over at his thread.


Required Tools:
Quick Batch -- This program is needed to alter the herostat file and important files for each character you plan on creating. I used XMLBCUI previously so you can use that too if you prefer, but this is what I use now, as I find this tool better.

Animation Mixing Package -- This package contains everything needed to conduct animation mixing as well as batch files to hex-edit skins, as well as create HUDs, icons, and loading screens.

ZSM Editor -- This is a program used to create sound files for each character you wish to create. You can also use ZSND, but I generally use that for other modding purposes.

GIMP -- This program will help you create and alter aesthetics for your mod. Other photoshop programs may work as well, but this is what I use.

Wavepad -- This program will help alter sounds and voice lines to the correct format. Other sound editing programs may work as well, but this is what I use.

XVI32 -- This program is used for hex-editing skins. This helps when you're making a mod where one skin is meant to change into another (i.e. shape-shifter mods).

SkinnerUI -- This is the previously used program used to create HUDs, icons, and loading screens for each character you wish to create.

You can find these programs (except GIMP and Wavepad) over at Tony Stark's Resource Backup Database. (http://marvelmods.com/forum/index.php/topic,8626.0.html) If any program is missing or links aren't working, feel free to message him either there or on Discord.


Rules on Questions:
1. I know that this is the knowledge base, which is not for questions -- but since you will no doubt have questions, you can post and ask them here and I will do my best to answer whenever I have time. Other experienced modders can feel free to answer as well.
2. Do not send me a private message containing modding questions, because this is a class, and others may have the same question in mind. It is best for everyone to see the questions and the answers to them.
3. Please do not ask the same questions over and over -- I don't wish to repeat myself. Check if someone has asked that question already.
4. Do not request mods here. This isn't the place for that, and I will simply ignore them without consideration. This thread is only to learn. Period.


Everyone got that? Good. Take a seat -- class is now in session.


Syllabus:
Lesson 01 - The CCC: Below
Lesson 02 - Package Files: http://marvelmods.com/forum/index.php/topic,10705.msg196394.html#msg196394
Lesson 03 - The Herostat: http://marvelmods.com/forum/index.php/topic,10705.msg196428.html#msg196428
Lesson 04 - Skins / Hex-Editing: http://marvelmods.com/forum/index.php/topic,10705.msg196464.html#msg196464
Lesson 05 - Animations: http://marvelmods.com/forum/index.php/topic,10705.msg196512.html#msg196512
Lesson 06 - Basic Mod Testing: http://marvelmods.com/forum/index.php/topic,10705.msg196536.html#msg196536
Lesson 07 - Coding Basics: https://marvelmods.com/forum/index.php/topic,10705.msg196648.html#msg196648
Lesson 08 - Passives: https://marvelmods.com/forum/index.php?topic=10705.msg196817#msg196817
Lesson 09 - Boost Coding: https://marvelmods.com/forum/index.php/topic,10705.msg197033.html#msg197033
Lesson 10 - Power Coding (Melee): https://marvelmods.com/forum/index.php/topic,10705.msg197545.html#msg197545
Lesson 11 - Power Coding (Radial): https://marvelmods.com/forum/index.php/topic,10705.msg197699.html#msg197699
Lesson 12 - Power Coding (Charge): https://marvelmods.com/forum/index.php?topic=10705.msg197753#msg197753
Lesson 13 - Power Coding (Beam): https://marvelmods.com/forum/index.php/topic,10705.msg197803.html#msg197803
Lesson 14 - Power Coding (Projectile): https://marvelmods.com/forum/index.php/topic,10705.msg197970.html#msg197970
Lesson 15 - Xtreme Coding: https://marvelmods.com/forum/index.php/topic,10705.msg198015.html#msg198015
Lesson 16 - Throw Powers / Grab Smash: https://marvelmods.com/forum/index.php?topic=10705.msg198128#msg198128
Lesson 17 - Effects: https://marvelmods.com/forum/index.php/topic,10705.msg198197.html#msg198197
Lesson 18 - Aesthetics: https://marvelmods.com/forum/index.php/topic,10705.msg198277.html#msg198277
Lesson 19 - Sounds: https://marvelmods.com/forum/index.php/topic,10705.msg198299.html#msg198299
Lesson 20 - Project Finish: https://marvelmods.com/forum/index.php/topic,10705.msg198300.html#msg198300


Herostat Reviews:
https://marvelmods.com/forum/index.php/topic,10705.msg196437.html#msg196437
https://marvelmods.com/forum/index.php/topic,10705.msg197707.html#msg197707



Title: The Outsider's Guide To Modding - Lesson 1
Post by: Outsider on September 07, 2019, 11:09PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 1: The CCC


Before you can even think about modding a new character, you must first be familiar with a Google spreadsheet that we call the Custom Character Central (the CCC for short). You can learn the rules for it here: http://marvelmods.com/forum/index.php/topic,9777.0.html. I will go over it in detail here.

For this lesson, I will put up the link for the CCC itself: https://docs.google.com/spreadsheet/ccc?key=0AvJoufVb_vSTdEprRkVqMzh6cy1wZlJxb1dkdzQzVXc&usp=sharing
Go ahead and click on it to pull it up as I continue the lesson. I'll wait...

See, every mod for Marvel: Ultimate Alliance has a number that is assigned to them. This spreadsheet reveals the list of mods that have been released, and the number connected to them. The tabs are on the bottom. The first list showcases mods of only Marvel characters -- this is MARVEL MODS, after all. The next tab showcases non-Marvel mods -- characters from DC, Image/Top Cow, film and movie properties and custom characters etc.

As you can see there, the numbers go from 0-255. Mods cannot be created with numbers 256 and higher, so some numbers will have more than one character assigned to it. It is possible, as long as skin numbers do not clash with each other. (More on that later.)

Now, take a look at the next tab that says "CCC Applicants." This shows modders and the mods that they have registered to work on. This needs to be done to secure numbers for mods. This way, we can prevent clashes from happening. So, it's important to register your project and choose a number that is available. (To do that, you have to fill out this very easy registration form: https://docs.google.com/forms/d/1SIgeT_OtG9w0lEOIKHmrUL46fm0BtjxUhsEABDtplL0/viewform?edit_requested=true)





Say, for example, you want to create a mod of a Marvel character. You would need to first look at the "CCC Marvel" tab, and look for a number that is available. Mostly all numbers on the Marvel side are taken, so you may have to share with another. Once you've found a number that you like, click on the "CCC Non-Marvel" tab and look for that same number on that side to see which character you'll be sharing with, if any. Then, you would register your project using that form. Your entry would then appear as the last entry on the "CCC Applicants" tab as a timestamp.

Remember that you're requesting a number, so you may not get it because maybe two mods are already using that number. So, it's important to look and see what numbers are being used. If two mods are already using that number on either side, it's best not to pick that one. Once you've registered your project, I will see it, as I moderate the CCC. I can tell you if that number is accepted or rejected. If rejected, I'll inform you of why. If accepted, I will inform you of what skin numbers to avoid.

Skin numbers? What is that, you ask? Well, every character has a herostat entry. I'll show you one of the official characters as an example -- :nightcrawler2: Nightcrawler.


   stats {
   ailevel = 1 ;
   autospend = bruiser_light ;
   body = 7 ;
   characteranims = 47_nightcrawlerdlc ;
   charactername = Nightcrawler ;
   level = 1 ;
   menulocation = 43 ;
   mind = 9 ;
   name = Nightcrawlerdlc ;
   playable = true ;
   powerstyle = ps_nightcrawlerdlc ;
   scale_factor = 0.98 ;
   scriptlevel = 3 ;
   skin = 4702 ;
   skin_01_name = Astonishing ;
   skin_02 = 03 ;
   skin_02_name = Classic ;
   skin_03 = 04 ;
   skin_03_name = Age of Apocalypse ;
   skin_04 = 06 ;
   skin_04_name = Uncanny X-Force ;
   sounddir = night_m ;
   strength = 5 ;
   team = hero ;
   textureicon = 7 ;
      BoltOn {
      anim = 47_nightcrawlerDlc_tail ;
      bolt = Bip01 Pelvis ;
      model = 4710 ;
      slot = ebolton_tail ;
      }

      Multipart {
      hideskin = swords_bolton ;
      hideskin2 = swords ;
      }

      talent {
      level = 1 ;
      name = night_power1 ;
      }

      talent {
      level = 1 ;
      name = night_tele ;
      }

      talent {
      level = 1 ;
      name = fightstyle_nightc ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }


This is his herostat entry. Notice that the number 47 appears often? That's because his mod uses number 47. Take a look at the CCC Marvel list, and look for #47. You will see Nightcrawler is listed there. Now look at his herostat, at the part that says "skin = 4702." This begins to tell you what skin numbers that the character is using. So naturally, your new project cannot pick the same skin numbers as Nightcrawler, for that will cause a clash, as well as a lot of angry people upset with you. You don't want that. Now, you'll also see that Nightcrawler is sharing #47 with my mod of Blue Marvel. That's because he also uses #47. Take a look below at the herostat entry for Blue Marvel:


   stats {
   ailevel = 1 ;
   autospend = support_heavy ;
   body = 7 ;
   characteranims = 47_bluemarvel ;
   charactername = Blue Marvel ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 7 ;
   moveset1 = moveset_flying ;
   name = bluemarvel ;
   playable = true ;
   powerstyle = ps_bluemarvel ;
   scale_factor = 1.1 ;
   scriptlevel = 3 ;
   skin = 4711 ;
   skin_01_name = Ultimates ;
   skin_02 = 12 ;
   skin_02_name = Classic ;
   skin_03 = 13 ;
   skin_03_name = Steel ;
   skin_04 = 14 ;
   skin_04_name = Masked ;
   sounddir = blue_m ;
   strength = 10 ;
   team = hero ;
   textureicon = 11 ;
      StatEffect {
      anim = menu_goodbye ;
      bolt = Bip01 Spine1 ;
      effect = char/blue/blue_charge ;
      fxlevel = 6 ;
      }

      talent {
      level = 1 ;
      name = blue_p1 ;
      }

      talent {
      level = 1 ;
      name = blue_resist ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = flight ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

      talent {
      level = 1 ;
      name = leadership ;
      }

   }


Now look at the part that says "skin = 4711." You see? He is not using the same skins as Nightcrawler -- therefore, there is no clash. Now, go back to the CCC, and click the CCC Non-Marvel tab. Look for that same number #47... Notice that it's blank? That's because two mods are already using number #47. So it's best not to request #47 until we run out of space in the CCC, and now three mods will have to share that number. Again, it is possible as long as the same skin numbers are not used.





So having said all that, let's use another example. Let's say you want to create a non-Marvel mod --a DC Comics character. You would need to look under the CCC Non-Marvel list and look for a number that is available. As you can see, there are a lot more available numbers there. Once you've selected a number that you want, check the CCC Marvel side and see who you'll be sharing that number with. (If there are two mods there like with #47, don't bother -- just pick a different number.) If you're satisfied with your pick, you'd then register that project using the registration form. And then you'd look at the mod you're sharing with to see what skin numbers not to use. It's that simple.


IMPORTANT NOTE:
There are other reasons why once you pick a number, you should look at the Marvel or Non-Marvel side to see who what character you'll sharing with. Here's one reason why: They will share the same mannequin. That's right. The game can only handle one mannequin for each number. (FYI: Mannequins are the statues of characters you see at MUA's character select screen.) For example, Nightcrawler and Blue Marvel both share #47, so you can't play as both of them unless you don't mind seeing two mannequins of Nightcrawler or two mannequins of Blue Marvel there. That's why it's important that you pick a number for a character that you don't mind clashing with.
Another reason is loading screens. The game will only display three loading screens for each number. So mods who share a number must be mindful that if one character has two loading screens, then the other can only have one.

That said, if you've already registered your project, and then later you decide that you want a different number than the one you chose, just send me a PM and I can change it. Also, it is important that when you release your mod project, to place a notice saying what character it will clash with in mannequin and possibly loading screens. That way, nobody can get angry with you saying that you didn't warn them.

DID YOU KNOW?
In the past, there have been many number clashes, and back then plenty of numbers were available. There was no need for two mods having the same number in those days. That's why I invented The Outsider's Fix number system that eliminates number clashes. Take a look at the Marvel side and look for #23... As you can see, :x-23: X-23 is there. Somewhere on the right side of that line, you will see the word "FIXED." That's because the Outsider's Fix system changed it. The mod of X-23 used to use #86, which clashed with the mod of Gorgon. So, I had to change it to #23, which was available. The changes are official, so if you have mods like X-23, you can use the Outsider's Fix system to easily change her number to #23. You can find it here: http://marvelmods.com/forum/index.php/topic,8753.msg166312.html#msg166312






Lesson Takeaway:
-Modders have to register their project with the CCC's registration form and choose a number that is available from 0-255.
-Look at the CCC on both Marvel and non-Marvel lists closely to see who that number will share with.
-Choose wisely what number you want, because they will share the same mannequin and up to three loading screens.
-View herostats and avoid choosing skin numbers that will clash with the one your project is sharing with. Clashes like that will cause a huge mess.
-When releasing your mod, place a notice saying which character your mod is sharing with, warning them.

Title: The Outsider's Guide To Modding - Lesson 2
Post by: Outsider on September 08, 2019, 09:32PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 2: Package Files


So now that you've chosen a number for your mod project, now it's time to work on the mod itself. Your first mod will always be the hardest, but it gets easier the more you do it. The very first thing you should do when creating a mod is to create that character's package files. This is an important step because your mod will not work at all without them. To begin modding, click on your XMLBCUI program to launch it. And, on your desktop, create a "new folder" where you'll work on it. Let's name it "Mod Project" going forward. Do not work inside the game's folders.

Go now to your game's folder. Now go to "packages," then "generated," and finally "characters." See those .pkgb files? Those are the package files for all mods in your game. Notice that all of them have a ".pkgb" file and a _nc.pkgb" file? The "nc" part means non-combat, like when your character is at a HUB where fighting is not necessary (i.e. Stark Tower). For this lesson, we'll use :magneto: Magneto's files. Highlight "magneto_17501.pkgb" and "magneto_17501_nc.pkgb file," copy them both, then go to that "Mod Project" folder, and paste the files you just copied. (NOTE: Any "_c.pkgb" files are really not necessary. Mods will work without them. Only .pkgb and _nc.pkgb files are needed.)





Once you've done that, use XLMBCUI to decompile the magneto_17501.pkgb file. Then hit "Edit." It should look like this...


XMLB packagedef {
   actorskin {
   filename = 17501 ;
   }

   actoranimdb {
   filename = interact_magneto_victim ;
   }

   actoranimdb {
   filename = 175_magneto_4_combat ;
   }

   actoranimdb {
   filename = 175_magneto ;
   }

   texture {
   filename = textures/ui/magneto_icons ;
   }

   texture {
   filename = textures/ui/magnetoc_icons ;
   }

   xml_talents {
   filename = data/talents/magneto ;
   }

   texture {
   filename = textures/nextgen/distort_mask2 ;
   }

   texture {
   filename = textures/nextgen/smoke1_normal2 ;
   }

   texture {
   filename = textures/oval ;
   }

   effect {
   filename = char/magneto/flying ;
   }

   model {
   filename = HUD/hud_head_17501 ;
   }

   texture {
   filename = textures/invisw_forcefield ;
   }

   effect {
   filename = char/magneto/p1_impact ;
   }

   effect {
   filename = char/storm/special_electrified ;
   }

   texture {
   filename = textures/nextgen/water4_local ;
   }

   texture {
   filename = textures/nextgen/bolt_softedge ;
   }

   texture {
   filename = textures/nextgen/distort_ring2 ;
   }

   effect {
   filename = char/magneto/p3_power ;
   }

   effect {
   filename = char/magneto/p1_power ;
   }

   texture {
   filename = textures/select_ring_glow ;
   }

   texture {
   filename = textures/clawring4 ;
   }

   texture {
   filename = textures/nextgen/distort_trail2 ;
   }

   effect {
   filename = char/magneto/p1_release ;
   }

   texture {
   filename = textures/nextgen/ripple ;
   }

   texture {
   filename = textures/nextgen/debris1 ;
   }

   texture {
   filename = textures/zigzag ;
   }

   texture {
   filename = textures/psi_ring ;
   }

   effect {
   filename = char/magneto/p2_power ;
   }

   texture {
   filename = textures/nextgen/burstline_flipped ;
   plat = 40 ;
   }

   effect {
   filename = char/magneto/p2_impact ;
   }

   model {
   filename = models/effects/ice_chunk_expanding ;
   }

   sound {
   filename = char/magnet_m/p2_grip ;
   }

   xml {
   filename = data/entities/ents_magneto ;
   }

   texture {
   filename = textures/nextgen/fire7 ;
   plat = 40 ;
   }

   effect {
   filename = base/powerup/pu_burning ;
   }

   effect {
   filename = char/magneto/p4_power ;
   }

   texture {
   filename = textures/ring3 ;
   }

   texture {
   filename = textures/nextgen/distort_trail ;
   }

   effect {
   filename = char/magneto/p4_power2 ;
   }

   texture {
   filename = textures/nextgen/crack_decal_a_ng_d ;
   }

   texture {
   filename = textures/flame_base ;
   }

   effect {
   filename = char/magneto/p5_power ;
   }

   effect {
   filename = char/magneto/p5_impact ;
   }

   effect {
   filename = char/magneto/p5_aura ;
   }

   model {
   filename = models/effects/fx_invisw_forcefield ;
   }

   texture {
   filename = textures/bigglow ;
   }

   effect {
   filename = char/magneto/p6_power ;
   }

   effect {
   filename = char/invisw/p6_power ;
   }

   texture {
   filename = textures/trail_elem_fade ;
   }

   model {
   filename = models/effects/fx_invisible_shield ;
   }

   effect {
   filename = char/magneto/p6_aura ;
   }

   effect {
   filename = char/magneto/p6_impact ;
   }

   texture {
   filename = textures/s_anhpower ;
   plat = 40 ;
   }

   texture {
   filename = textures/nextgen/trail_elem_ng ;
   }

   effect {
   filename = char/magneto/p7_power ;
   }

   texture {
   filename = textures/bluestar ;
   }

   effect {
   filename = char/magneto/p7_aura ;
   }

   texture {
   filename = textures/levelup_rain ;
   }

   texture {
   filename = textures/nextgen/spark_ng ;
   }

   model {
   filename = models/chunks/roc_4 ;
   }

   model {
   filename = models/chunks/metal_generic_lrg ;
   }

   effect {
   filename = char/magneto/p8_impact ;
   }

   effect {
   filename = char/magneto/p8_power ;
   }

   effect {
   filename = char/invisw/p5_victim ;
   }

   fightstyle {
   filename = data/fightstyles/interact_magneto_victim ;
   }

   fightstyle {
   filename = data/powerstyles/ps_magneto ;
   }

   fightstyle {
   filename = data/fightstyles/moveset_flying ;
   }

}




I know... that is a lot of lines. But believe it or not, most of those lines aren't necessary. So, I will trim out the useless fat and show you only what is needed. Now the inside will look like this...


XMLB packagedef {
   actorskin {
   filename = 17501 ;
   }

   actoranimdb {
   filename = interact_magneto_victim ;
   }

   actoranimdb {
   filename = 175_magneto_4_combat ;
   }

   actoranimdb {
   filename = 175_magneto ;
   }

   texture {
   filename = textures/ui/magneto_icons ;
   }

   xml_talents {
   filename = data/talents/magneto ;
   }

   model {
   filename = HUD/hud_head_17501 ;
   }

   fightstyle {
   filename = data/fightstyles/interact_magneto_victim ;
   }

   fightstyle {
   filename = data/powerstyles/ps_magneto ;
   }

}




Ah, much better. Now before you do anything, take a look at it. Each of these lines are important.

actorskin = This refers to the skin number that this package file will support (only for one skin).
actoranimdb = These refer to the animation files that the mod will be using.
texture = This refers to the icons that the mod will be using.
xml_talents = This refers to the talents file that the mod will be using.
model = This refers to the HUD that this package file will support (only for one skin).
fightstyle = This refers to the powerstyle file that the mod will be using. You see this one twice, but really only the powerstyles one is needed. The "interact_magneto_victim" one doesn't need to be listed for it to work, but leave it there anyway.






Now comes the next step -- switching "magneto" to the name of your character and switching "175" to the number that you selected earlier. For this lesson, we'll just say the number is 243, and the character is Puck from Alpha Flight (who doesn't have a mod). So, change "magneto" to "puck" and "175" to "243." Now it should look like this...


XMLB packagedef {
   actorskin {
   filename = 24301 ;
   }

   actoranimdb {
   filename = interact_puck_victim ;
   }

   actoranimdb {
   filename = 243_puck_4_combat ;
   }

   actoranimdb {
   filename = 243_puck ;
   }

   texture {
   filename = textures/ui/puck_icons ;
   }

   xml_talents {
   filename = data/talents/puck ;
   }

   model {
   filename = HUD/hud_head_24301 ;
   }

   fightstyle {
   filename = data/fightstyles/interact_puck_victim ;
   }

   fightstyle {
   filename = data/powerstyles/ps_puck ;
   }

}




Did you do that? Good. Don't save it yet. Now because Puck is #243, we have to know that #243 is being used by Heimdall, as seen at the CCC (see previous lesson). So, now we have to look at Heimdall's herostat and see what skin numbers he is using so we know what not to use. Heimdall is using skin numbers 24305-24308. So for Puck, we will use skin numbers 24309-24312, just to be safe. So go back to that .pkgb file above, and change "24301" to "24309." Now, it should look like this...


XMLB packagedef {
   actorskin {
   filename = 24309 ;
   }

   actoranimdb {
   filename = interact_puck_victim ;
   }

   actoranimdb {
   filename = 243_puck_4_combat ;
   }

   actoranimdb {
   filename = 243_puck ;
   }

   texture {
   filename = textures/ui/puck_icons ;
   }

   xml_talents {
   filename = data/talents/puck ;
   }

   model {
   filename = HUD/hud_head_24309 ;
   }

   fightstyle {
   filename = data/fightstyles/interact_puck_victim ;
   }

   fightstyle {
   filename = data/powerstyles/ps_puck ;
   }

}




Good. NOW you can save it, and use XLMBCUI to compile the file. Remember what you named the files here, because later on when you're creating the mod, you'll have to name the files whatever they say here.
IMPORTANT NOTE: When compiling it back, the output xmlb line will end with an .xmlb extension. That is incorrect. Make sure you change the extension to .pkgb before compiling it, to ensure that the changes are recorded properly.






Now what we did here with the .pkgb file, we must also do with the _nc.pkgb file. So, use XMLBCUI to decompile "magneto_17501_nc.pkgb." Because this file is for non-combat, it will be shorter. It should look like this...


XMLB packagedef {
   actorskin {
   filename = 17501 ;
   }

   actoranimdb {
   filename = 175_magneto ;
   }

   texture {
   filename = textures/ui/magneto_icons ;
   }

   texture {
   filename = textures/ui/magnetoc_icons ;
   }

   xml_talents {
   filename = data/talents/magneto ;
   }

   texture {
   filename = textures/nextgen/distort_mask2 ;
   }

   texture {
   filename = textures/nextgen/smoke1_normal2 ;
   }

   texture {
   filename = textures/oval ;
   }

   effect {
   filename = char/magneto/flying ;
   }

   model {
   filename = HUD/hud_head_17501 ;
   }

}



Again, some of the lines aren't necessary, but let's just replace 17501 with 24309, 175 with 243, and "magneto" with "puck." Then I will get rid of the fluff, and when you're done, it will look like this...


XMLB packagedef {
   actorskin {
   filename = 24309 ;
   }

   actoranimdb {
   filename = 243_puck ;
   }

   texture {
   filename = textures/ui/puck_icons ;
   }

   xml_talents {
   filename = data/talents/puck ;
   }

   model {
   filename = HUD/hud_head_24309 ;
   }

}



Now go ahead and save and compile that. Delete the .xml and the .bak files that appear. You won't need those anymore. Now you've successfully created package files for one of Puck's costumes. However, Puck has four costumes. So now, you have to make package files for the other three costumes. Fortunately, that's easy. Just copy the puck_24309.pkgb and puck_24309_nc.pkgb files that you just did successfully, and paste them. Rename the copies "puck_24310." Paste them again, rename the new copies "puck_24311." Paste them again, rename the newer copies "puck_24312." Now you have package files for all four costumes -- but you're not done yet. This is what you should have now...

puck_24309.pkgb :done:
puck_24309_nc.pkgb :done:
puck_24310.pkgb
puck_24310_nc.pkgb
puck_24311.pkgb
puck_24311_nc.pkgb
puck_24312.pkgb
puck_24312_nc.pkgb

You no longer have to worry about the "24309" ones -- they're done. However, now all you have to do is decompile each of the rest of them, and change the number from 24309 to whatever number of the file you're opening, save, and compile. That's it. So, for example, if you open the 24311 files, then change 24309 to 24311 and save. Do it for each one here, and you're done. Congrats -- you've successfully created package files for your new mod!




IMPORTANT NOTE:
Other than the skin (called "actorskin" there), and HUD (called "model" there), all data must be exactly the same for the mod to work. Otherwise later on when you're selecting skins for your character, some will not have powers at all. Critically important. That's why I suggest copying & pasting, then change only the skin and HUD numbers.

CHALLENGE:
I would highly suggest practicing this lesson yourself, and when you think you got the hang of it, then I can move on to the next lesson. And if one is actually interested in creating Puck, then this can be your first mod for real. So somebody feel free to volunteer to create Puck -- these lessons will help you to create him along the way. (Post here if you wish to be the one to create Puck. Talk amongst yourselves and decide who's going to do it.)






Lesson Takeaway:
-Use a new folder on your desktop to begin your mod work. Do not work inside the game's folders.
-Package files need to be done for both ".pkgb" and "_nc.pkgb" files, for every skin of the mod.
-Other than skin and HUD numbers, all data there needs to be completely the same -- identical in every way.
-The copying & pasting method is your friend here. Ctrl + C to copy, Ctrl + V to paste.
-Remember what you named everything in the package files -- the mod's stuff later on will have to be named the same things.
-When compiling the files, make sure the extension is .pkgb, not .xmlb.

Title: Re: The Outsider's Guide To Modding
Post by: BlackHand13 on September 10, 2019, 03:36AM
TUTORIAL PROGRESS

Hello Marvel Mods students !
I volunteered to create Puck :avalanche: , the character Outsider is using as an exemple for this tutorial. I will be posting my progress here, and maybe other notes about the different lessons as well (difficulty, tips etc..).   

Lesson 1: The CCC :done:

=> No particular note on that, just choose your number carefully.

Lesson 2: Packages Files :done:

=> Not that hard to make as you just have to replace and copy-paste most of the time, however, mistakes happen, even if it's just a tiny space between numbers. Rereading your code is mandatory.

Lesson 3 : Herostat :done:

=> http://marvelmods.com/forum/index.php/topic,10705.msg196435.html#msg196435

see Outsider going over what's correct and what's not, down here
http://marvelmods.com/forum/index.php?topic=10705.msg196437#msg196437

Lesson 4 : Skins and hex-editing :done:

=> I grabbed all five skins and hex-edited them, it was pretty simple thanks to Outsider's explanation. I also created package files for the fifth one and I put it in the herostat with the others skins.

Lesson 5: Animations :done:

=> Beast and Thing animations (combat and menu) changed to Puck number and name.

Lesson 6: Basic mod testing :done:

=> I tested Puck in game as he is right now, see the post below.
http://marvelmods.com/forum/index.php/topic,10705.msg196556.html#msg196556
http://marvelmods.com/forum/index.php/topic,10705.msg196570.html#msg196570

Lesson 7: Coding Basics :done:

Lesson 8: Passives ???
Title: The Outsider's Guide To Modding - Lesson 3
Post by: Outsider on September 10, 2019, 08:53PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 3: The Herostat


Remember during the first lesson I mentioned that every character has a herostat? Well, let's dive deeper into that particular thing, shall we? See, after you've created your package files, now comes the part when you create a small file that sets up your new mod's official entry into everyone's game. This is called the herostat. It's a file that tells the game what kind of character your mod is. I tend to use Notepad to create a new herostat or edit another's herostat to create one. For this lesson, let's take a look at :genis: Captain Marvel's herostat:


   stats {
   ailevel = 1 ;
   autospend = support ;
   body = 5 ;
   characteranims = 173_captainmarvel ;
   charactername = Captain Marvel ;
   level = 1 ;
   menulocation = 50 ;
   mind = 12 ;
   moveset1 = moveset_flying ;
   name = CaptainMarvel ;
   playable = true ;
   powerstyle = ps_captainmarvel ;
   scriptlevel = 3 ;
   skin = 17301 ;
   skin_01_name = Genis-Vell ;
   skin_02 = 05 ;
   skin_02_name = Thunderbolts ;
   skin_03 = 02 ;
   skin_03_name = Genis ;
   skin_04 = 04 ;
   skin_04_name = Ultimate ;
   skin_05 = 03 ;
   skin_05_name = Captain Mar-Vell ;
   sounddir = capmvl_m ;
   strength = 4 ;
   team = hero ;
   textureicon = 4 ;
      StatEffect {
      bolt = Bip01 Spine2 ;
      effect = char/captmarvel/special_aura ;
      }

      StatEffect {
      bolt = Bip01 L Hand ;
      effect = char/captmarvel/special_aura_hand ;
      }

      StatEffect {
      bolt = Bip01 R Hand ;
      effect = char/captmarvel/special_aura_hand ;
      }

      talent {
      level = 1 ;
      name = captma_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = flight ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }


All herostats more or less look like this. When creating a mod, always create the herostat to match the abilities of the character you're creating. Now, let's look more in detail as to what each part of the herostat means.



ailevel = To my knowledge, this is the XP level that a character has if the game's AI is controlling him/her. Notice that when the AI is attacking enemies, it's significantly weaker than when you attack with that same character? This could be why. Usually, this is always set at 1.

autospend = This is the trait that tells the game how the character levels up in attribute points (strength, body, and mind). There are four categories: bruiser, bruiser_light, support, and support_heavy.  Sbarth13 found out through his own research how the game factors it...

bruiser - heavy strength, medium body, light mind
bruiser_light - heavy body, medium strength, light mind
support - light strength, light body, heavy mind
support_heavy - medium strength, medium body, heavy mind

This is important because it determines the kind of character your mod is. For example, :hulk_icon: Hulk and :wolverine: Wolverine are most definitely in the bruiser category, focusing more on melee and brute force. :captainamerica2: Captain America and :blade: Blade fit the bruiser_light category, as they have durability/resiliency to last longer and go the distance in fights. :humant: Human Torch and :iceman: Iceman are in the support category for sure, as they focus more on powers and long-range attacks. And finally, support_heavy is the more rare category that not many mods use, but more boss-like characters like :bheart: Blackheart, Dormammu and Thanos would fit that category, with nothing light at all.

body = The amount of health points the character has. A high number in this attribute means that they have more health than most and can last longer in fights.

characteranims = The character animations that the character is using. Will go into that more in a future lesson.

charactername = The name of your character. This is the name that is displayed throughout the game.

level = I believe this is the level of your character at the start of the game. All characters start at level 1, so don't change this.

menulocation = The character's position on the character select screen. It can be from 1-25 and 40-50 using the 36 Roster Hack.

mind = The amount of energy points that the character has. Another word for this is focus. A high number in this attribute means that they can spend energy on powers more often than others.

moveset1 = An alternate moveset that the character uses. It only uses "moveset_flying" so it's really only for characters who can fly. If your character can fly such as :thor: Thor or :stark: Iron Man, be sure to add this in.

name = The internal name that the game will recognize as your character, and tells the game what talents file the character is using. Be careful -- this is NOT the same as "charactername" mentioned earlier. Take :blackwidow: Black Widow for instance: Her charactername is "Black Widow" -- that's the name you'll see displayed in the game. But her name in the game's system is "BlackWidowv" with no spaces and an extra V. It is important not to change this name, otherwise the game will not recognize your character. Very important.

playable = Confirms if a character is playable or not by you, the player. Your heroes will have it set to "true." NPCs will have it set to "false."

powerstyle = This tells the computer what powerstyle file the character will be using. Remember those package files you made earlier? It tells you what you named his/her powerstyle as. That gets put here.

scale_factor = This tells the game how big and tall the character is. If this line is not present (like with Captain Marvel), it means the character is of normal height and size. For this, 1 = 100%. So, characters like :juggernaut: Juggernaut will be much bigger. His scale factor is 1.5, meaning that he is 50% bigger than most characters. Other characters like Rocket Raccoon will be shorter than most. His scale factor is 0.7, meaning that he is 30% smaller than most characters.

scriptlevel = Honestly, I have no idea what this is, or what it does. If anyone knows, feel free to inform me.

skin = The skin number of the character's first (primary) costume. For only this one, you must place the entire skin number. It will tell the game the mod number that the character is using for all skins. In Captain Marvel's case, that number is 173. So the game is expecting all skins to start with 173.

skin_01_name = The name of the character's first (primary) skin. You can name it whatever you want.

skin_02 = The last two digits in the skin number of the character's second costume. Notice here that it only lists the last two numbers? That's because you've already told the game what mod number the character is using. So for this skin and all skins after it, you only have to put the last two digits.

skin_02_name = The name of the character's second skin. You can name it whatever you want.

skin_03 = The last two digits in the skin number of the character's third costume.

skin_03_name = The name of the character's third skin. You can name it whatever you want.

skin_04 = The last two digits in the skin number of the character's fourth costume.

skin_04_name = The name of the character's fourth skin. You can name it whatever you want.

skin_05 = The last two digits in the skin number of the character's fifth costume, if any.

skin_05_name = The name of the character's fifth skin. You can name it whatever you want.

skin_06 = The last two digits in the skin number of the character's sixth costume, if any. Notice in this example that Captain Marvel doesn't have a sixth skin, but some do. NOTE: The maximum number of costumes a single character can have is six. The fifth and sixth costumes will not have passives. More on passives in a future lesson.

skin_06_name = The name of the character's sixth skin. You can name it whatever you want.

sounddir = This tells the game where the character's sounds and voice are coming from. More on sounds in a future lesson.

strength = The amount of hit points the character has. Another word for this is strike. A high number in this attribute means that the character can inflict more damage on enemies than most. NOTE: The combined total of a character's strength, body, and mind should equal 22-24. More than that may be alright for boss-like characters.

team = The character's alignment. There's only two - hero and enemy. Your character (whether they are good or evil) will use "hero" while enemy NPCs will use "enemy."

textureicon = A leftover trait from XML2 that the game didn't bother removing. Probably not needed, but we leave it there anyway.





Are you with me so far? Good - let's continue on with understanding what parts of the herostat means. NOTE: In some of the official mods, you'll see lines such as "XMen" or "Brotherhood", then "grab." Those lines are not necessary. You can delete them.

StatEffect = If a character is using an effect while he/she is on the character select screen or heroes menu, this part tells you what the effect is. If adding this, be sure to place all brackets correctly, such as with Captain Marvel below:

      StatEffect {
      bolt = Bip01 Spine2 ;
      effect = char/captmarvel/special_aura ;
      }

      StatEffect {
      bolt = Bip01 L Hand ;
      effect = char/captmarvel/special_aura_hand ;
      }

      StatEffect {
      bolt = Bip01 R Hand ;
      effect = char/captmarvel/special_aura_hand ;
      }

The "bolt" tells the game which body part of the character that the effect is coming from.

NOTE: You can add "menuonly = true" to this if the effects are only supposed to be seen during the character select screen and heroes menu. You can also add "zoneonly = true" if the effect is to be seen during actual gameplay. You can put the value as "true" or "false." Iceman, for example, has it like this...

      StatEffect {
      bolt = Bip01 R Hand ;
      effect = char/iceman/special_selfchill ;
      fxlevel = 2 ;
      menuonly = true ;
      zoneonly = false ;
      }

      StatEffect {
      bolt = Bip01 L Hand ;
      effect = char/iceman/special_selfchill ;
      fxlevel = 2 ;
      menuonly = true ;
      zoneonly = false ;
      }

NOTE: You can also connect effects to a particular menu animation. (There are only three menu animations: menu_action, menu_idle, and menu_goodbye. More on that in a future lesson.) For example, :spiderman: Spider-Man uses the coding below to have his webs appear only when just appearing on the screen, when he's hanging upside-down on his web, and stays idle on his web.

      StatEffect {
      anim = menu_action ;
      bolt = Bip01 L Hand ;
      effect = char/spider/menu_idle ;
      fxlevel = 1 ;
      }

      StatEffect {
      anim = menu_idle ;
      bolt = Bip01 L Hand ;
      effect = char/spider/menu_idle ;
      fxlevel = 2 ;
      }

As you can see, "anim" refers to a certain menu animation. "fxlevel" just refers to a certain level within that particular effect, but more on that in a future lesson. Don't want to overwhelm anyone.

talent = Tells the game what talents your character has at all times, including the start of the game. Take a look at the coding below...

      talent {
      level = 1 ;
      name = captma_p1 ;
      }

That applies to Captain Marvel's first power. By default, ALL characters must have their first power unlocked and be available for use. Their first power should not be that strong-hitting. Very important. Now take a look at the next one below...

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

This tells the game the fightstyle that the character will be using. Most characters will use "fightstyle_default," but some have a unique fightstyle that adds more animations to their sets. More on animations in a future lesson. Baby steps, people. Now, take a look at the next one...

      talent {
      level = 1 ;
      name = flight ;
      }

This is the flight talent that is only for characters that can fly. Look at the next one...

      talent {
      level = 1 ;
      name = block ;
      }

This is the generic block talents that all characters must have. Without this, your character can't block at all. Now, look at the next one...

      talent {
      level = 1 ;
      name = might ;
      }

This is the might ability that only certain characters have. It allows them to lift heavy objects and throw them at enemies. They can also hit walls and objects harder than most. So characters like :pman: Luke Cage and :warbird: Ms. Marvel would have this talent because they have super strength. So, if your character has super strength, be sure to add this talent. Now, look at the next one...

      talent {
      level = 1 ;
      name = melee_moves ;
      }

That is the generic melee moves talent. While this is not needed per se, it allows the game to tell you at the stats screen of your character what his/her melee moves (basic attacks) are. All characters have this one by default. Now look at this next one that Captain Marvel does not have...

      talent {
      level = 1 ;
      name = healing_factor ;
      }

This is the healing factor talent that only some characters have. So, if your character can regenerate health gradually just as Wolverine, :deadpool: Deadpool, and :stooth: Sabretooth can, then be sure to add this talent. This next one Captain Marvel also doesn't have...

      talent {
      level = 1 ;
      name = leadership ;
      }

That is the leadership talent that only certain characters have. It increases the combo damage and combo XP your team makes by a certain amount. By default, nobody really has it, but natural born leaders like :cyclops: Cyclops and :panther: Black Panther ought to. So, if your character is the leader of a team, or is a king/dictator/ruler of some kind, then be sure to include this. Here's another that Captain Marvel doesn't have...

      talent {
      level = 1 ;
      name = ghost_resist ;
      }

Some characters such as :ghostr: Ghost Rider will have custom talents named after them that is set up in the talents file and is reinforced here. In Ghost Rider's case, it makes him immune to fire damage. Talents like this are usually named "(character)_resist." More on how to set up custom talents in a future lesson.





Now let's look at other different kinds that you don't see on Captain Marvel, but you'll see on others.

Boltons = If a character is using a bolton (an object separate from the character that the hero wields, such as a weapon or device), then this is for that. See this code below used by :cable2: Cable for example...

      BoltOn {
      bolt = Bip01 Spine2 ;
      model = models/weapons/cable_gun_back ;
      slot = ebolton_clawleft ;
      }

In this, "model" refers to what bolton the character is holding. "slot" refers to where of the body the bolton should connect to. Now besides boltons, there is another you will see on some herostats...

Skin Segments = If a character has a skin segment (an object that is connected to a character's particular skin, unique to that skin), then it would be displayed here, being called a "multipart." :hawkeye: Hawkeye has quite a few of them, so I'll show you a couple of his below:

      Multipart {
      hideskin = 20301_missile_R_hand_segment ;
      hideskin2 = 20301_bird_R_hand_segment ;
      }

      Multipart {
      hideskin = 20301_bow_L_hand_segment ;
      nonmenuonly = true ;
      showskin = 20301_bow_back_segment ;
      }

See? If a character's skin has skin segments, you can use "hideskin" to hide them from view, or "showskin" to reveal them. You can add "hideskin2" or "showskin2" if there is more than one skin segment. Just like with effects, you can also add "menuonly" or "zoneonly" (or in this case, "nonmenuonly") if you wish to either hide or show them only during the game, or during the character select screen / heroes menu.


IMPORTANT NOTE:
Don't feel overwhelmed. I know that was a lot of information to take in. As I've been saying all throughout these lessons, learn at your own pace. Slow it down, and make sure you read through and practice the steps when you feel most comfortable.






Lesson Takeaway:
-Design your herostat with a knowledge of who the character is and what he/she can do.
-Do not overpower the character. The game needs to have balance. Traits should equal 22-24, unlike it's a boss-level villain, and even then, don't go too far.
-Only write the whole skin number for the character's first (primary) costume. The rest only need the last two digits.
-Be careful and make sure all of the brackets and semicolons are in the right places.

Title: Re: The Outsider's Guide To Modding
Post by: BlackHand13 on September 11, 2019, 02:30AM
Following Outsider's lesson on the herostat, here's my version for Puck, and also first attempt at creating one.

   stats {
   ailevel = 1 ;
   autospend = bruiser ;
   body = 9 ;
   characteranims = 243_puck ;
   charactername = Puck ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 3 ;
   name = Puck ;
   playable = true ;
   powerstyle = ps_puck ;
   scale_factor = 0.75 ;
   scriptlevel = 3 ;
   skin = 24309 ;
   skin_01_name = ??? ;
   skin_02 = 10 ;
   skin_02_name = ??? ;
   skin_03 = 11 ;
   skin_03_name = ??? ;
   skin_04 = 12 ;
   skin_04_name = ??? ;
   sounddir = puck_m ;
   strength = 11 ;
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = puck_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }


NOTE: - I gave him a scale_factor of 0.75, he is a lot smaller than a normal human but not as small as Rocket Raccoon.

Some changes were made in Outsider's post: http://marvelmods.com/forum/index.php?topic=10705.msg196437#msg196437
Title: Re: The Outsider's Guide To Modding
Post by: BaconWizard17 on September 11, 2019, 06:04AM
A few things to note:

Another way to describe the character name would be the "display name", whereas the name could be called the "internal name"

Textureicon is a remnant from XML2 I believe. It referenced which portrait the character used in the danger room
Title: Re: The Outsider's Guide To Modding
Post by: Outsider on September 11, 2019, 03:19PM
Alright, so let's remind everyone who Puck is.

(https://upload.wikimedia.org/wikipedia/en/c/c8/Alphaflight5.jpg)

Puck (Eugene Judd) is a member of Alpha Flight, and has also been with X-Force. His powers include superhuman strength, agility, reflexes, durability, and superhuman longevity. He is half the size of a normal human male. He is also a skilled fighter.

Powers in detail:
Puck is formidable hand-to-hand combatant, capable of a mixture of various martial arts, street-fighting techniques, acrobatics and gymnastics. After a run-in with The Master of the World his body was subject to genetic manipulation of his cellular structure. His body tissues were condensed at a molecular level, causing his body to become akin to compressed rubber. His trademark attack is a cartwheeling motion. Spinning on his hands and feet at great speeds, he is able to slam into and knock down human-sized enemies with ease. He is also skilled in bullfighting. He has some knowledge of mysticism, enough to once trap Black Raazer, and the ability to put himself in a temporary deathlike trance state. Puck is about half the size of the average man. His condition causes him varying amounts of constant pain. Also, his aging has been stopped or vastly slowed.





Now that we know who Puck is and what he can do, let's take a look at how BlackHand13 did at creating Puck's herostat. View my notes near some of them.

   stats {
   ailevel = 1 ;
   autospend = bruiser ; (NOTE: "bruiser_light" would be Puck's class, as while he has super strength, he's not on par with Colossus, the Thing, etc. He focuses more on body than strength.)
   body = 9 ; (NOTE: That is correct. Puck relies most on body rather than strength, having superhuman longevity and slowed aging. He should last long in fights.)
   characteranims = 243_puck ;
   charactername = Puck ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 3 ; (NOTE: That is too low for any character. It means he'll barely get to use his powers. Four is the minimum. Give him a 6 in mind.)
   name = Puck ;
   playable = true ;
   powerstyle = ps_puck ;
   scale_factor = 0.75 ; (NOTE: That is correct. Puck is significantly smaller than most, but as he said, not smaller than Rocket Raccoon, so 0.75 is decent. We'll see how he looks later on.)
   scriptlevel = 3 ;
   skin = 24309 ;
   skin_01_name = ??? ;
   skin_02 = 10 ;
   skin_02_name = ??? ;
   skin_03 = 11 ;
   skin_03_name = ??? ;
   skin_04 = 12 ;
   skin_04_name = ??? ;
   sounddir = puck_m ;
   strength = 11 ; (NOTE: That is too high for Puck, for that makes him as strong as his own teammate, Sasquatch. Puck relies more on body than strength. Give him a 7 in strength.)
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = puck_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ; (NOTE: That is correct. Puck does have super strength, so he should have the might ability.)
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }

So, overall BlackHand13 did a great job in creating Puck's herostat, as I didn't have to change much (only autospend, mind, & strength).  9 body + 6 mind + 7 strength = 22, which is decent for Puck. Remember, the combined attributes should equal anywhere from 22-24, unless it's a boss-level villain. Attributes should be based on what a character can do. So, let's look at Puck's herostat now...


   stats {
   ailevel = 1 ;
   autospend = bruiser_light ;
   body = 9 ;
   characteranims = 243_puck ;
   charactername = Puck ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 6 ;
   name = Puck ;
   playable = true ;
   powerstyle = ps_puck ;
   scale_factor = 0.75 ;
   scriptlevel = 3 ;
   skin = 24309 ;
   skin_01_name = ??? ;
   skin_02 = 10 ;
   skin_02_name = ??? ;
   skin_03 = 11 ;
   skin_03_name = ??? ;
   skin_04 = 12 ;
   skin_04_name = ??? ;
   sounddir = puck_m ;
   strength = 7 ;
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = puck_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }


OK, that looks good. (Well done, BlackHand13.) So you see? Creating a herostat is essentially taking a character's traits and turning them into stats for the game. I'll have the next lesson up soon.


Quote from: BaconWizard17 on September 11, 2019, 06:04AM
A few things to note:

Another way to describe the character name would be the “display name”, whereas the name could be called the “internal name”

Textureicon is a remnant from XML2 I believe. It referenced which portrait the character used in the danger room

Ah, so "textureicon" isn't really anything here. I figured it wasn't all that important. As for "display name" and "internal name," that's good. I will add those to the lesson.

Title: Re: The Outsider's Guide To Modding
Post by: Pirata on September 11, 2019, 09:05PM
Thanks a lot for these tutorials Outsider, they are very much useful. I already have a idea of a character which in my opinion will be both easy and enjoyable to make. So far:

Lesson 1:  No big deal, just take a look at the CCC and find a spot for your character.

Lesson 2: Got the hang of it, copy and pasting was a nice tip, I only forgot changing the skin number for the HUDS of the other pkgbs (I can make that later).

Lesson 3: Have yet to take a look.

Lesson 4: ????
Title: The Outsider's Guide To Modding - Lesson 4
Post by: Outsider on September 13, 2019, 06:22PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 4: Skins / Hex-Editing


Now that a herostat was developed, we can now add skins to the mod. For obvious reasons, every mod needs skins to help the mod come to life. If you are working on a character that doesn't have skins yet, you may have to ask around for someone to help you by creating skins.

If you want to learn how to model your own skins and/or mannequins, go to the following link to be transferred to BaconWizard17's Modelling Tutorial. I can confirm to you that it's easy to follow and it works. Oh, and don't worry - it has pictures. https://marvelmods.com/forum/index.php/topic,10797.0.html.

Skins come in two types:
PS2: Skins from the PS2 version of MUA that can be recreated as a different character. Less quality than 3-D models, but easier to create.
3-D: Models from another game that is converted into a high-quality skin. Costs time to create, but offers better results.

For this reason, it is best to have a good relationship with fellow members of the forum who can create skins for you. They are referred to as "skinners." Many a time, I had to ask for a skinner or two to create skins for several of my mods. Sometimes, they had no problem doing it and created them before you did the mod. Other times, they may say that they can't at this time, but then after you release the mod, they suddenly provide better skins than the ones you had. There's no guarantee that they will agree to helping you, but if you and them are cool (and they like how your mods play out), then they are more likely to help you out. If they choose not to, however, don't not get angry or pester them -- remember that they don't have to. Sometimes, they want to help you but they just don't have the time. They'll likely explain why they can't. And just like with modders like myself, if a skinner says that they are not accepting requests right now, just respect their wishes. They may decide to help you later on, of their own volition. (Some may write "No Requests" on their thread, letting you know up front.)

Some 3-D skinners include Aventureiromax, Andersonbrazil, BLaw, Julio Cabral, and UltraMegaMagnus.
Some PS2 skinners include MJFan, BaconWizard17, and myself.

If a skinner has made skins for your character, and you wish to use them for your mod, just be sure to credit them for their works. Some skinners require you to ask for their permission to use them -- if so, ask them. You wouldn't want people using your work and you didn't allow them to, right? Same thing for them. Most skinners, however, will just say to credit them. If a skinner is inactive, you won't be able to ask them. In that case, use them but credit them. (More on credits in a future lesson.)






Fortunately for this lesson, the character we are working on is Puck, and he has skins already made by a now-inactive skinner called "Dr. Bruce Banner." You can find them here: http://marvelmods.com/forum/index.php/topic,9530.0.html (Scroll down to find Puck.) So BlackHand13, go ahead and acquire them. Puck has five skins, so feel free to create a fifth set of package files for the 5th costume, and add the following to his herostat...

   skin_05 = 13 ;
   skin_05_name = ??? ;

This is only if you want Puck to use all five skins. If not, you'll have to leave one out.





Once you have acquired the skins, you'll have to rename them into the skin numbers that was set out for your character earlier. In Puck's case, those skin numbers start at 24309. He has five skins -- rename the classic one "24309" -- that will be his primary skin. The other skins can be renamed 24310, 24311, 24312, and if the fifth skin is being used, 24313. And now that you know what they are (what the skinner called them), you can name them on the herostat. In Puck's case, it'll look like this...

   stats {
   ailevel = 1 ;
   autospend = bruiser_light ;
   body = 9 ;
   characteranims = 243_puck ;
   charactername = Puck ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 6 ;
   name = Puck ;
   playable = true ;
   powerstyle = ps_puck ;
   scale_factor = 0.75 ;
   scriptlevel = 3 ;
   skin = 24309 ;
   skin_01_name = Classic ;
   skin_02 = 10 ;
   skin_02_name = Ultimate ;
   skin_03 = 11 ;
   skin_03_name = Modern ;
   skin_04 = 12 ;
   skin_04_name = X-Force ;
   skin_05 = 13 ;
   skin_05_name = Streetwear ;
   sounddir = puck_m ;
   strength = 7 ;
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = puck_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }

That's the order I made for the skins, but the modder can choose whichever order they want. (The part in RED is to be added if a fifth skin is being used, and if so, package files for that fifth skin must be made.)

After renaming the skins, create an "actors" folder inside your mod project folder, but don't place the skins inside there yet. Likewise, create a notepad file there containing the character's herostat, and rename that file "Herostat" so people know what it is. Also, if you haven't already, create new folders "packages," "generated," and "characters." Place the package files for your character in the character folder. Then place the character folder inside the generated folder, and finally, put the generated folder inside the packages folder. What you are doing is creating this mod for people to download, so don't put anything in the game's folders yet. That's why you have a separate mod project folder for you to work.






HEX-EDITING
Want to know why I said not to place the skins inside the actors folder yet? Because now comes the part that requires some technical work. It's called hex-editing. This is an important process, but I'll tell you why in a bit. To begin, you will need the XVI32 program. Open it up, press "File" then "Open." Look for skin #24309, and hit Enter, or press "Open."

Now, on this program, you will notice two sides -- a left side full of only numbers & letters, called the Hex side; and a right side full of all kinds of characters, called the Text side. Don't worry... this isn't complicated work. It's actually very simple. Click on any square on the Text side to make sure the Text side is highlighted. Next, press Ctrl + F. It'll open up the Find option. Make sure the text string is checked. Then, write in the bar igactor01appearance. Make sure "case sensitive" is unchecked. Then press OK.
NOTE:
"igactor01appearance" is what you'll mainly see. If that's not found, then it may have been hex-edited already to a different number. In which case, you'll have to scroll down the skin a long way, and look for a lone three-digit or four-digit number that stands out.


If the skins were not hex-edited already, it will appear on the Text side with the first "i" highlighted. Now type in the skin number that you renamed the skin. In this case, that's 24309. When you're done, it will now read 24309or01appearance with the "o" highlighted. That's normal. Now notice on the Hex side that something was highlighted just as the "o" was highlighted on the Text side. See, when you change one side, you'll change the other. Now, click on the square that was highlighted on the Hex side, and keep pressing zero until the "or01appearance" part on the Text side is gone, as you're erasing it. It should now read 24309 on the Text side. Now press Ctrl + S to save, or click File then Save.

Congrats! You've just hex-edited a skin. Now you have to do the same to the character's other skins. If at any point you think you made a mistake, just click File, then Reload (or Ctrl + L). It will say that the skin has been modified. Click No -- that will undo any mistakes. Do not save if you think a mistake was made -- as it will make the skin unplayable. Once you are done hex-editing the character's skins, NOW you can place them in your project's actors folder.


IMPORTANT NOTE:
Why was the hex-editing part important? Because at some point in the game, you will play the Murderworld mission. There will be Arcade Androids that take the appearance of your heroes. If your skin is not hex-edited, the Arcade Android will just have a plain white skin, ruining the game. It is also helpful for shape-shifter mods like :mystique: Mystique and Mortal Kombat's Shang Tsung, as it tells the game the skin they are supposed to morph into.

DID YOU KNOW?:
I had created a tool just for hex-editing that people can use to check all skins of all mods to see if they are hex-edited. It's called the Hex-Edit Test and you can find it here -- http://marvelmods.com/forum/index.php/topic,8753.msg191895.html#msg191895. This way, any skins you find that are not hex-edited, you can hex-edit them yourself.






Lesson Takeaway:
-Acquire any skins for your character (if any) and rename to the skin numbers you had assigned.
-Be sure to credit the skinners for their work. Ask for their permission if they require it.
-If skinners do not choose to help you, don't burn your bridges. They aren't obligated to, and there may be a reason why they can't.
-Hex-Edit all skins to ensure that the Arcade Androids take their appearance at Murderworld.
-Press the Reload button if you think you made a mistake. Better safe than sorry.

Title: Re: The Outsider's Guide To Modding
Post by: Jaybird on September 13, 2019, 09:18PM
Thanks, Outsider for these tutorials. I've always wanted to make a mod but just find myself kind of overwhelmed. I have a couple of characters in mind that I want to see that with your guide I might be able to make. I have some free time Sunday I'll see what I can do.
Title: The Outsider's Guide To Modding - Lesson 5
Post by: Outsider on September 16, 2019, 08:55PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 5: Animations


If you've been following and practicing the lessons thus far, then your mod is starting to come together. But, now your mod needs to move and be able to attack. It's now time to choose your animations. Chances are, you've played as a character and thought to yourself, "oh, that's a cool power!" Well, the main thing it takes to do that is a decent animation. Want a visual aid? Take a look inside your game's actors folder. Animation sets are .igb files that contain certain movements for various characters. There are two main kinds of animation sets, which I'll explain in a little bit. For this lesson, let's use :storm: Storm as an example. Look in your game's actors folder and find "04_storm.igb..."

Did you find that file? OK, that is Storm's menu animation set. Those are the movements that you see whenever you choose her at the character select screen/team stage. Every mod has one. Now, copy and paste that very file to your mod project folder. Open the XVI32 program, and open that very file. Why? Because we are going to look inside that file. This is not necessary for modding, but just to learn.





OK, so you'll see a whole lot of characters on both sides. Don't worry -- I'll guide you through the maze. Don't change anything -- you're only viewing. So, there are two sides -- on the left is the hex side, which consists of only numbers. And on the right is the text side. Click on any square on the right side (the Text side) Hit Ctrl + F to open the Find feature, type "idle" and press Enter. You should see it, along with some more lines. See, menu animation files usually have only a few animations:

idle = The animation used when your character does nothing while in-game. His/her fighting stance.
walk = The animation used when your character is walking in-game.
run = The animation used when your character is running in-game.
menu_action = The animation used immediately when your character is picked from the character select screen (CSS), or immediately when you change costumes.
menu_idle = The animation used a while after your character appears at the character select screen. This animation stays until you leave the CSS or change costumes.
menu_goodbye = The animation used when your character leaves the character select screen.

jump_start = The animation used when your character is jumping.
jump_land = The animation used when your character is landing from a jump.






Now, look again at your game's actors folder. Notice that Storm has another file there? That is her combat animation set. It's called "04_storm_4_combat.igb" and as you can guess from its name, it's where Storm's fighting animations are. Copy and paste that file into your mod project folder, then open up that file via XVI32 so you see inside there. Again, you're just viewing. (If you accidently changed something, click "File," then "Reload." Say No when it asks if you want to save the changed file.)

So, you'll see the same kind of maze. Hit Ctrl + F to Find, type "power_12" and press Enter. You should see it, along with many other lines. Every mod has these, but some will differ from others. Here are the kind of animations you will likely see in many of these:

power_1 = The animation used when your character is performing a power attack. It can range from power_1 all the way to power_20.
power_1_loop = The animation used when your character is charging up a power attack or using a rapid power attack, while you are holding a power button down or repeatedly hitting it.
power_1_end = The animation used when your character is performing a power attack after a holding animation, releasing that power after a change, or ending a power after it's been used.
attack_light1 = The animation used when your character is performing the 1st basic light attack, after you've the pressed light attack button once.
attack_light2 = The animation used when your character is performing the 2nd basic light attack, after you've the pressed light attack button twice.
attack_light3 = The animation used when your character is performing the 3rd basic light attack, after you've the pressed light attack button 3X. This is called a blitz.
attack_popup1 = The animation used when your character is performing a basic attack that pops the enemy upward.
attack_trip2 = The animation used when your character is performing a basic sweep attack that trips the enemy.
attack_stun1 = The animation used when your character is performing the 1st stun attack, after you've the pressed light attack button, then the heavy attack button.
attack_stun2 = The animation used when your character is performing the 2nd stun attack -- the one that actually stuns the enemy.
attack_heavy1 = The animation used when your character is immediately performing the heavy knockback attack that you can hold down.
attack_knockback1 = The animation used when your character is holding (charging) the heavy knockback attack.
attack_knockback2 = The animation used when your character has released the heavy knockback attack.

jumpdouble_start = The animation used when your character is double jumping, like a flip.
jump_smash_hold = The animation used when your character is in the air, holding for a jump smash attack.
blocking = The animation used when your character is blocking.
pain_blocking = The animation used the moment your character blocks an enemy attack.
fly_idle = The animation used when your character is flying but not moving anywhere. (Only for flying characters.)
fly_slow = The animation used when your character is flying slowly in a certain direction. (Only for flying characters.)
fly_fast = The animation used when your character is flying normally in a certain direction. (Only for flying characters.)
ground_attack1 = The animation used when your character is attacking an enemy while he's on the ground.
ground_attack2 = The animation used when your character is attacking an enemy while he's on the ground after the first ground attack.



So why am I telling you about these? Well, because it's important to know how these animations are named. You'll need to have an understanding of this for when you begin animation mixing. More on that later.







PREP ANIMATIONS

Now that you get how animation sets work, it's time to choose the ones you want. If you've played MUA before, then you probably know what animations you want for a certain character going in. Keep in mind of what the character can do, and decide from there.

If your character uses guns, you'll probably go with something from :blade: Blade and :nfury: Nick Fury's combat animation sets. Does your character use swords? If so, you can use animations from (again) Blade, and :deadpool: Deadpool's combat sets. Though :thor: Thor wields a hammer, his would work too for swords. If your character is an archer, then obviously something from :hawkeye: Hawkeye's set is best. Not wielding a weapon, but can fire various powers? Then the possibilities are endless. Is your character female and flirtacious or seductive? You can use something from :emmafrost: Emma Frost or :spiderwoman: Spider-Woman's animation sets. Just don't pick a female animation set if your character is male -- that's just creepy. Choose your animations wisely.

For example, let's say you want :hawkeye: Hawkeye's Multi-Shot power animation (power_1, power_1_loop, & power_1_end) because your character is an archer, but you also want to use :blade: Blade's Slayer Slash, (which is also power_1, power_1_loop, & power_1_end) because your character is also a swordsman, just like :tmaster: Taskmaster. I type them in Notepad in numerical order the animation files I want, like this:



01_blade_4_combat: power_1, power_1_end, power_1_loop
171_hawkeye_4_combat: power_1, power_1_end, power_1_loop



Remember that two or more animations cannot be named the same thing. If you want two animations that are named the same such as these, then make a note that you have to rename one or the other into something else that the game recognizes. I type that note like this...

01_blade_4_combat: power_1, power_1_end, power_1_loop
171_hawkeye_4_combat: power_1*, power_1_end*, power_1_loop*
(*must rename)



You can do this for certain melee, power or defensive animations. Once you've listed all of the animation sets that contain the animations you want, you can then move on to the animation mixing process.








ANIMATION MIXING

In the past, if you wanted more animations than two sets can offer, you had to create a fightstyle animation set. However, over time we learned that multiple custom fightstyles can cause problems with 4-man teams and some mods not to function correctly. Fortunately, a member named defogexa found a newer way to create a custom animation set that is no longer limited to just two or three sets. It's called Animation Mixing, and once you learn how to do it, you'll find that it's rather easy and is quickly becoming the preferred method for modding. As a result, I've erased the old method from this lesson.

To do this, you will first need Alchemy 5, which is a tool that you can also use to view mannequins, preview animations, and more. To get it, click HERE (https://www.mediafire.com/file/spsi085blcz5acv). Follow the instructions inside that package to set it up. I won't go over that here.

Then, you will need a useful Animation Mixing rar package, which contains what you need to mix them. To get it, click HERE (https://www.mediafire.com/file/p9prpzqlpjbinup).



Now, open that AnimationMixing rar. A folder will appear called "AnimationMixing." Place that Animation Mixing folder somewhere. Don't place it in your game, in Program Files or anywhere sensitive. Now click inside. You will see five files. The very first you should do is read the "ReadMe" file. It's there for a reason. Now, here's what I do...

STEP 1: Create a new folder called "Extract" and place only the _animations.txt and the _extract.bat files inside of it.

STEP 2: Create a new folder called "Mix" and place only the _combine.bat and the _fightstyle_default files inside of it.

STEP 3: Right-click the Mix folder, and click create shortcut. A shortcut to it will appear on your desktop. Move that shortcut inside the Extract folder. Now you're ready to mix. The next steps will be for your combat animation set.

STEP 4: Open the Extract folder. Now go to your game's actors folder and copy (copy, not move) each animation set that you've listed before. I usually do it one at a time, but you can do multiple if you wish. Paste it to the Extract folder. Now click the _extract file. A black screen will appear saying "Extracting animation list..." as it moves to extract the animations from that igb. Leave it alone and let it do its thing, as it takes two or three minutes if you do it one at a time like I do it. (Obviously it will take longer if you did multiple files.) When it's done, it will disappear and a folder named after that animation file will appear. You'll also find a .bak file and and txt file called "extract-(animation file name). You can delete those.

STEP 5: Open the new folder that just appeared. Those are the individual animations from that igb. Take only the ones you want from there and move them to the Extract folder, and delete the rest. Then go back to the Extract folder and move the animations inside the "Mix" shortcut. Do this for any animation that you want.

Look back at the notes where you have to rename some of them. If some are clashing with others, do not overwrite. That's your warning that you'll have to rename them. And you can't rename them just anything. It has to be something that the game will recognize, or they will not work.

Once you've acquired all of the animations that you want, click on the Mix shortcut, taking you to the Mix folder.

STEP 6: Inside the Mix folder, review the animations you've acquired and confirm that these are the ones you want. Now click the _combine file. A black screen will appear and will ask you to name the new animation file. Name it (mod number)_(character name)_4_combat and do not include the .igb part. In the case of Puck, that would be 243_puck_4_combat. (You must rename them the exact same files as you recorded back in the package files. Yes, it all goes back to that.) Then press Enter. Unlike the extract function, the mixing is very fast and is done within a couple of seconds. Once done, your new animation igb file will appear. A "combine" text will also appear.

Congratulations! You've just successfully mixed your first combat animation igb file!

STEP 7: Now delete the individual animations and that combine text, as you no longer need them. Move that new animation igb file into the actors folder of your mod.



You can also do this with your menu animation set, that you normally see within the character select/team stage. The process is the same, except when mixing, just name it (mod number)_(character name). You can use this to change idle stances or create new animations not normally seen at the team stage. And again, whatever you name the animation files must match what you put in their package files. Otherwise, they won't work.


If you'd like a more visual tutorial on this method, refer to the MUA animation tutorial found here: https://marvelmods.com/forum/index.php/topic,11012.msg200550.html#msg200550. You can also preview individual animations by checking the tutorial above that.

Once you have a menu animation set and a custom animation set (mixed or not), you now have the animation files you need for your character mod.






Lesson Takeaway:
-Mods have a menu animation set and a combat animation set. Choose wisely the animations you want.
-If you accidently touched the animations when viewing them via XVI32, press Reload to undo the mistake. Better safe than sorry.
-Gather up all animation sets that contain the animations you want.
-Before mixing animations, be sure to rename the clashing ones into something else that the game recognizes.
-The new animation files must be named to match what you wrote in the package files, which is ##_character.igb, and ##_character_4_combat.igb.


Title: The Outsider's Guide To Modding - Lesson 6
Post by: Outsider on September 18, 2019, 11:32PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 6: Basic Mod Testing


You are almost done with the basics and are nearly ready to test out your mod in the game. This is a short but critical lesson. Here's what to do next: Create three new folders in your mod project's folder. Rename one of them "data," another as "talents" and the other as "powerstyles." I will tell you how to set that bad boy up.







SETTING UP TALENTS & POWERSTYLES

Now that your animations are done from the previous lesson, this next part is critical. Open your game's data/talents folder. See those? These are the talents files for all characters. Highlight any one of them as long as it ends with ".engb" Then copy it and paste it to your mod project folder. Rename it "(character).engb." It is best to copy the talents file and powerstyle file of a character who's animations you took. For example, in the case of Puck, we used :beast: Beast's animations, so it would be wise to use Beast's talents file, which is beast.engb. So rename that one as "puck.engb."

Next, go to your game's data/powerstyles folder. These are the powerstyle files for all characters and NPCs (who don't use talents files). Highlight and copy any of them as long as it ends with ".engb" -- preferably that of the character who's animations you used. Paste it to your mod project folder, and rename it "ps_(character).engb." In the case of Puck, copy "ps_beast.engb," paste it to your mod project folder, and rename it "ps_puck.engb."

Now, decompile (character).engb. You will see a lot of text that we will not go through in this lesson, as I don't want to confuse you all. We'll deal with all of that in a future lesson. For right now, press Ctrl + H to Replace. Type the character name of the file you copied in Find What, and your character's name in Replace With. (in Puck's case, you'd write Puck in Replace With), and press Replace All. Don't worry if some things don't make sense, as they'll eventually be corrected.

Now, save and compile -- make sure that the end extension is .engb, not .xmlb. Copy this new file, go into the talents folder you made earlier, and paste it there. (Keep the .xml and .bak files that appeared -- you'll need it later.) Now go back and decompile "ps_(character).engb." Again, there is a lot of coding there -- don't worry about that for now. Just press Ctrl + H to Replace. Type the character name of the file you copied in Find What, and your character's name in Replace With, just as you did with the talents file. Then save and compile -- again, make sure that the end extension is .engb, not .xmlb. Now, copy the file you just saved, go into the powerstyles folder you made earlier, and paste it there. You're almost there now. Move both your talents folder and powerstyles folder into your data folder.






Hopefully, that wasn't too hard for your all. OK, so what you did was set up all of the basics for your new mod. So let's recap -- here's what you should have in your mod project's folder so far:

actors folder
data folder
packages folder

Herostat file
(character).engb
(character).xml
(character).engb.bak
ps_(character).engb
ps_(character).xml
ps_(character).engb.bak


OK, the parts I've put in bold? You can now copy (copy, not move) those folders into your game's folder. You just installed the basic files for your new mod into your game for testing. Now you just have to do one more thing -- decompile herostat.engb, take one of the characters out and replace him/her with the herostat for your new mod. Make sure the menulocation number you're switching herostat entries with is the same. Good, now save and compile, then copy the new herostat in the game's data folder. Your character is now officially ready for testing!!!

Click twice on Game.exe to turn on MUA. Once you get to a SHIELD access point, your new character (Puck or whoever you're working on) should be there, but either without a mannequin or with the mannequin of whoever is sharing the mod number you chose in the beginning. Clear the default team of :capamer: :spiderman: :thor: :wolverine: and select your character. You can now test out your character's basic animations such as idle, running, jumping, blocking, and all basic melee attacks. Don't worry about the powers listed there -- some may work and some may not, we'll deal with that in future lessons. For now, just make sure your character's basic animations are correct and to your liking. If not, you can always replace them.


IMPORTANT NOTE:
It is best to use the 36 Roster Hack as it contains a SHIELD access point at the very start location of the game, which is perfect for testing out your mods.






Lesson Takeaway:
-Create the necessary folders to set up your mod for testing.
-Rename the character listed to your character's name, provided that it matches what you wrote back in the package files.
-Once again, copying and pasting are once again your friends here.
-Keep the .xml and .bak files that appear with the talents and powerstyle files -- you'll need them later.
-Make sure that you compile the files with the .engb extension.

Title: Re: The Outsider's Guide To Modding
Post by: BlackHand13 on September 20, 2019, 06:21AM
Ok, so, as I said in my porgress post, I tested Puck in game.

The combat animations seem to work correctly, but the idle animation in the character select screen looks like he is in slow-motion.. not sure why.

Here's how he looks like.
http://www.mediafire.com/view/2w9j150g2ai0igb/Marvel0010.png/file (http://www.mediafire.com/view/2w9j150g2ai0igb/Marvel0010.png/file)

Did I make him too small ? Because he is very very tiny  :avalanche:
Title: Re: The Outsider's Guide To Modding
Post by: Outsider on September 20, 2019, 04:41PM
Quote from: BlackHand13 on September 20, 2019, 06:21AM
Ok, so, as I said in my porgress post, I tested Puck in game.

The combat animations seem to work correctly, but the idle animation in the character select screen looks like he is in slow-motion.. not sure why.

Here's how he looks like.
http://www.mediafire.com/view/2w9j150g2ai0igb/Marvel0010.png/file (http://www.mediafire.com/view/2w9j150g2ai0igb/Marvel0010.png/file)

Did I make him too small ? Because he is very very tiny  :avalanche:

Hmm... that might be a bit too small. Jump the scale_factor in his herostat to 0.8.
His idle animation in the character select screen (menu_idle) may be a bit slow because he's using the Thing's menu animation and his might be slow by default. Remember that you can always try a different character's menu animation if you don't like it by copying another's and renaming it "243_puck.igb."

That is his idle stance in-game? Use XVI32 to go into "fightstyle_puck.igb" at your actors folder. Remember when you "X" out the idle animation there? Change it
back and save. I want to see if his in-game idle animation will change for the better. But make a copy of that file, just in case it doesn't look better.

However, good to hear that his combat animations are working fine.

Title: Re: The Outsider's Guide To Modding
Post by: BlackHand13 on September 21, 2019, 02:28AM
I decided to set his scale_factor to 0.85, as 0.8 still made him too small.

Although, for some reason, his basic attacks were working fine but not his powers.. I managed to fix it by deleting this from the top of his talents file (puck.engb)

=>  talent {
   fightstyle = true ;
   name = fightstyle_puck ;
      level {
      }

   }

That fixed the power issue, now they are working well, see here
http://www.mediafire.com/view/pd2rhv53sdpgza2/Marvel0016.png/file

BUT now, his normal combat attacks don't work... I'm probably missing something.

Well, I added back the talent line up there in his talents file and now everything works well, both powers and basic attacks.
Title: Re: The Outsider's Guide To Modding
Post by: Outsider on September 24, 2019, 01:58AM
Everyone, if you've made it this far in the modding lessons, then give yourself credit. You now already know more about modding than most. These past six lessons help make up the basics that one needs to learn in order to create their own mod.

Admittedly, it may take a little while before I can release the next lesson as I've been very busy lately. Plus, now the lessons will get more technical -- focusing on details that make up the character's powers. But don't worry -- I will break them down so it's easy to learn. I will try to release the 7th lesson sometime this week.

In the meantime, practice... practice... practice on the first six lessons until you feel that you understand it and got it down. The more you do it, the less intimidating it is, and the easier it gets.

Title: The Outsider's Guide To Modding - Lesson 7
Post by: Outsider on September 27, 2019, 02:13AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 7: Coding Basics


Alright, brace yourselves -- now it gets more technical. Now we get into the heart of what makes a mod... the coding. There are two main files associated with every playable mod: The talents file and the powerstyle file. Both of which are .engb files that make the mod unique from all others. This is the very thing that intimidates a lot of people from wanting to mod because a lot of detail goes into it. But, once you understand how it works, it gets easier. For this set of lessons, we will use the files of a character that hasn't been modded all that much -- :spiderwoman: Spider-Woman.

(1) Go into your game's data/talents folder and locate "spiderwoman.engb" (not .xmlb or .itab -- not important), right-click that file and copy it. Then paste it on your mod project folder. Now, go into your game's data/powerstyles folder and locate "ps_spiderwoman.engb" (not .xmlb or .itab -- again, not important), right-click that file and copy it. Then paste it on your mod project folder.

(2) Using XLMBCUI, decompile spiderwoman.engb, then hit edit. You will see inside her talents file. Save that as a Notepad .txt file. (Save it as "Spider-Woman Talents.") Now do the same to ps_spiderwoman.engb. (Save it as "Spider-Woman Powers.") Now you can delete the .engb files and the .xml files from your mod project folder, as we are not changing the files. We are only using the text files to research how the coding within the files work.






OK. Now open both the Spider-Woman Talents text file and move it to the left of your screen. Open the Spider-Woman Powers file, and move it the right of your screen, so that they are placed side-by-side. This is to give you a great visual of just how coding works, as you can't add or copy powers until you know exactly how it works. And, what you do to one side will affect the other. I will break down how this works, so don't get intimidated.

At the talents file, the very first line says this...

XMLB talents {

And at the powerstyles file, the very first line says this...

XMLB PowerStyle {
cansteal = true ;
iconfile = textures/ui/spiderwoman_icons.png ;

These are how the files start. The only thing you can change is the part that I've placed in bold, as that refers to what a character's icon set was named as. Remember what you named your character's icons back at the package files? This must be named the exact same thing for it to work correctly. The rest must be left alone. (NOTE: I honestly have no idea what the "cansteal = true" part means, so if anyone knows, feel free to inform. To my knowledge, Nick Fury's powerstyle file doesn't have that, and he works fine, so it may not be necessary.)

You'll notice on her talents file that she has radiation immunity. This refers to the custom talents that I mentioned during the herostat lesson, but let's skip that one for now. But notice that every entry on the talents file starts with talent { and every entry on the powerstyle file starts with FightMove { ? That's how all entries for powers and passives start. Take note of how the spacing is done and the placement of the opening and closing brackets. This is very important because if those are off, the entry will not work and may take all entries after to be thrown off.

Now you'll see on the talents file that her next entry says "Venom Blast." This is her first power. Now, on the powerstyle file, click Ctrl + F to Find. Type "name = power1" and hit Enter. It will take you to the coding for her first power there. I want to show you how it works on both files, side by side.

Let's break down the entry for her first power to see what each mean.


   talent {
   descname = Venom Blast ;
   description = Shoots a bioelectric beam that will pierce multiple enemies if fully charged.  $PT_CHARGE ;
   descshort = Beam ;
   icon = 0 ;
   icon_texture = textures/ui/spiderwoman_icons.png ;
   name = spdwm_power1 ;
   power = power1 ;


descname = The name for the character's power, which can be named whatever you want.
description = A description of what the character's power does.
descshort = The category that the power falls under. Options are usually Melee, Projectile, Radial, Beam, Charge, Blast, Area of Effect, Trap, Special, and the one I invented - Counter. (There is also Boost and Xtreme, but those are used for specific cases.)
icon = The icon number from the character's icon set that is associated to this power.
icon_texture = The icon set that the icon is coming from. To make sure it works properly, do not use more than one icon set for powers.
name = The internal name of the power that the game will recognize.
power = Another internal name that the game recognizes for this power. Both "name" and "power" are important.

Now let's look at that same power on the powerstyle file and see what they mean there...


   FightMove {
   aitype = beam ;
   animenum = ea_power1 ;
   icon = 0 ;
   is_power = true ;
   lockangles = true ;
   name = power1 ;
   powerup_tag = spidwm_p1 ;
   priority = 5 ;


aitype = The kind of power that the game's AI will recognize it as. Options are melee, beam, projectile, blast, and buff (meaning boost). However, this is not required for all powers.
animenum = The animation that the character will use while performing the power. This is very important, so you must make sure you have the right animation sets for your character to pull it off.
icon = The icon number from the character's icon set that is associated to this power. As you can see, it must match the number in the talents file.
is_power = This tells the game that this attack is a power attack, as opposed to basic melee attacks.
lockangles = Honestly, I'm not sure what this is exactly, but I tend to leave it there.
name = The exact same thing that you named the power in the talents file.
powerup_tag = A specific tag that you connected to the power, making for passives with that power. Not required, is cool for some powerups.
priority = Usually, this is either the number 5, or you can put uninterruptable, which means that while your character is performing the power, it cannot be interrupted by enemy attacks.






Are you with me so far? If that was already too much for you, take some time to digest all that and let it marinate. Remember that there is no rush to learn all of this. Learn at your own pace. If you are ready, then let's continue. Go back to the talents file. Next on that same power, you will see this...


      talentvalues {
         talentvalue {
         level = 1 ;
         name = spdwm_p1_req ;
         value = 1 ;
         }

         talentvalue {
         level = 5 ;
         name = spdwm_p1_req ;
         value = 13 ;
         }

         talentvalue {
         level = 6 ;
         name = spdwm_p1_req ;
         value = 16 ;
         }

         talentvalue {
         level = 9 ;
         name = spdwm_p1_req ;
         value = 25 ;
         }

         talentvalue {
         level = 10 ;
         name = spdwm_p1_req ;
         value = 28 ;
         }

         talentvalue {
         level = 14 ;
         name = spdwm_p1_req ;
         value = 52 ;
         }

         talentvalue {
         level = 15 ;
         name = spdwm_p1_req ;
         value = 72 ;
         }


Notice how the names there end with "req"? Those are the requirements for the power, at different levels. The value refers to the XP level a character must get to add skill points to this power. So, the game uses these values to determine how characters unlock their powers and and when they can add skill points to them. For that reason, they should be untouched. Now look at the powerstyle file. The next thing you'll see is this...

      require {
      cat = skill ;
      item = spdwm_power1 ;
      level = 1 ;
      }

Notice how the item there is the exact same thing as the name over at the talents file? That's what the requirements are for. But not to confuse you, I wouldn't name the name as "spdwm_power1" -- I would name it "spdwm_p1" as it matches "spdwm_p1_req" but without the req part. Makes it easy to remember. Also notice that the level here will be the same number as the value you placed at the talents file. Now it is important to note this: By default, a character's first power is unlocked at the start of the game and always at level 1. Remember during the herostat, you listed "character_p1" as one of the talents? That was for the first power, ensuring that it's unlocked at the start of the game.

Depending on what value/level the power is, the requirement numbers are different, and it is best not to change them. More on that later on.





Next on the talents file, you'll see these...


         talentvalue {
         level = 1 ;
         name = spdwm_p1_pwr ;
         value = 7 ;
         }

         talentvalue {
         level = 5 ;
         name = spdwm_p1_pwr ;
         value = 15 ;
         }

         talentvalue {
         level = 6 ;
         name = spdwm_p1_pwr ;
         value = 17 ;
         }

         talentvalue {
         level = 9 ;
         name = spdwm_p1_pwr ;
         value = 22 ;
         }

         talentvalue {
         level = 10 ;
         name = spdwm_p1_pwr ;
         value = 24 ;
         }

         talentvalue {
         level = 14 ;
         name = spdwm_p1_pwr ;
         value = 37 ;
         }

         talentvalue {
         level = 15 ;
         name = spdwm_p1_pwr ;
         value = 47 ;
         }


Notice how the names there end with "pwr"? These determine the energy cost for this power, at different levels. See how the level numbers here are the same as the requirement numbers I showed you? This is why they should be untouched. The value here refers to the energy cost for this power at each level. Now look at the powerstyle file. The next thing you'll see is this...

      trigger {
      name = powerusage ;
      powerusage = %spdwm_p1_pwr ;
      time = 0 ;
      }

In here, powerusage refers to energy cost, dating back to the value you placed in the talents file, and time refers to when exactly during the power should the game take the energy required for this power. OK, go back to her talents file, and view the next ones...


         talentvalue {
         level = 1 ;
         name = spdwm_p1_dmg ;
         value = 17 19 ;
         value_charged_scale = 2.0 ;
         }

         talentvalue {
         level = 5 ;
         name = spdwm_p1_dmg ;
         value = 58 64 ;
         value_charged_scale = 2.0 ;
         }

         talentvalue {
         level = 6 ;
         name = spdwm_p1_dmg ;
         value = 78 86 ;
         value_charged_scale = 2.0 ;
         }

         talentvalue {
         level = 9 ;
         name = spdwm_p1_dmg ;
         value = 109 120 ;
         value_charged_scale = 2.0 ;
         }

         talentvalue {
         level = 10 ;
         name = spdwm_p1_dmg ;
         value = 139 154 ;
         value_charged_scale = 2.0 ;
         }

         talentvalue {
         level = 14 ;
         name = spdwm_p1_dmg ;
         value = 221 244 ;
         value_charged_scale = 2.0 ;
         }

         talentvalue {
         level = 15 ;
         name = spdwm_p1_dmg ;
         value = 319 353 ;
         value_charged_scale = 2.0 ;
         }

      }


Notice how the names there end with "dmg"? These determine the amount of damage that this power will inflict on enemies, at different levels. Once again, the level numbers here are the same as the requirement numbers from before. The value here refers to the the amount of damage this power will inflict at each level. The space between them means that it's a range between the two numbers. Don't go overboard with the damage numbers -- it's only the first power. Finally, value_charged_scale refers to the percentage that damage will increase by if the power is charged. In Spider-Woman's case, it will take twice as much damage if charged. Now look at the powerstyle file. Hit Ctrl + F, type in "damage =" and press Enter. You will see this:

     damage = %spdwm_p1_dmg ;

This refers to the damage numbers that you set inside the talents file. Now, let's keep going along in the talents file. Next are these...


      level {
      description = %spdwm_p1_dmg $DMG_ENERGY\n%spdwm_p1_pwr $EP ;
         tier {
         cost = 1 ;
         count = 5 ;
         }

         tier {
         cost = 2 ;
         count = 4 ;
         }

         tier {
         cost = 3 ;
         count = 1 ;
         }

         tier {
         cost = 3 ;
         count = 4 ;
         difficulty = hard ;
         }

         tier {
         cost = 4 ;
         count = 1 ;
         difficulty = hard ;
         }

         require {
         cat = level ;
         level = %spdwm_p1_req ;
         }

      }

   }


In here, the description tells the player how much damage the power will inflict, then how much energy it will cost. Information connected to the values you placed would be put here. Notice in Spider-Woman's case you see "$DMG_ENERGY" there... this refers to the damage type that is inflicted on the enemy. More on that in a future lesson. The tiers you are seeing refer to how much skill points are required to strengthen the power as your character levels up. Some will be placed with the difficulty at hard, meaning that it cannot be leveled up to that tier if playing the game at normal or easy. You can also see at the end, that the require level is named the exact same thing as the requirements named earlier. That's why it's so important that they must be identical. Otherwise, the game won't recognize it.

(LESSON CONTINUES IN NEXT POST)

Title: The Outsider's Guide To Modding - Lesson 7
Post by: Outsider on September 27, 2019, 02:14AM




Now, earlier I mentioned how requirement numbers differ depending on the power, as does the tiers. You can look at Spider-Woman's talents file as a reference, but I will list them in (hopefully) an easy way. These are important to ensure that the character's powers level up as correctly as all others do.

Requirement Level (Requirement Value)
1st Power: 1 (1), 5 (13), 6 (16), 9 (25), 10 (28), 14 (52), 15 (72) -- Unlocked at start of game, level 1.
2nd Power: 1 (5), 5 (14), 6 (17), 9 (26), 10 (29), 14 (53), 15 (73) -- Unlocked at level 5.
3rd Power: 1 (10), 3 (13), 4 (16), 7 (25), 8 (28),  12 (52), 13 (72) -- Unlocked at level 10.
4th Power: 1 (17),  4(26), 5 (29), 9 (53), 10 (73) -- Unlocked at level 17.
5th Power: 1 (20), 3 (26), 4 (29), 8 (53), 9 (73) -- Unlocked at level 20.
1st Boost: 1 (2), 5 (14), 6 (17), 9 (26), 10 (29), 14 (53), 15 (73) -- Unlocked at level 2.
2nd Boost: 1 (14), 2 (17), 5 (26), 6 (29), 10 (53), 11 (73) -- Unlocked at level 14.
Xtreme: 1 (10), 8 (45) -- Unlocked at level 10.

Tier Cost (Tier Count)
1st Power: 1 (5), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
2nd Power: 1 (5), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
3rd Power: 1 (3), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
4th Power: 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
5th Power: 2 (3), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
1st Boost: 1 (5), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
2nd Boost: 1 (1), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
Xtreme: 2 (1), 0 (7)

This is the standard for mods, as characters on average have a moveset of 5 powers, 2 boosts, and an Xtreme (8 total). However, the values change a little if a character has more than 8 powers total. If you want your mod to have the maximum of 10, then use the following.

Requirement Level (Requirement Value)
1st Power: 1 (1), 5 (13), 6 (16), 9 (25), 10 (28), 14 (52), 15 (72) -- Unlocked at start of game, level 1.
2nd Power: 1 (5), 5 (14), 6 (17), 9 (26), 10 (29), 14 (53), 15 (73) -- Unlocked at level 5.
3rd Power: 1 (10), 3 (13), 4 (16), 7 (25), 8 (28),  12 (52), 13 (72) -- Unlocked at level 10.
4th Power: 1 (15), 2 (18), 5 (27), 6 (30), 10 (53), 11 (73) -- Unlocked at level 15.
5th Power: 1 (17),  4(26), 5 (29), 9 (53), 10 (73) -- Unlocked at level 17.
6th Power: 1 (20), 3 (26), 4 (29), 8 (53), 9 (73) -- Unlocked at level 20.
7th Power (if any): 1 (23), 2 (26), 3 (29), 7 (53), 8 (73) -- Unlocked at level 23.
1st Boost: 1 (2), 5 (14), 6 (17), 9 (26), 10 (29), 14 (53), 15 (73) -- Unlocked at level 2.
2nd Boost: 1 (7), 4 (14), 5 (17), 8 (26), 9 (29), 13 (53), 14 (73) -- Unlocked at level 7. Only use if character has three boosts.
3rd Boost (if any): 1 (14), 2 (17), 5 (26), 6 (29), 10 (53), 11 (73) -- Unlocked at level 14.
Xtreme: 1 (10), 8 (45) -- Unlocked at level 10.

Tier Cost (Tier Count)
1st Power: 1 (5), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
2nd Power: 1 (5), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
3rd Power: 1 (3), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
4th Power: 1 (1), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
5th Power: 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
6th Power: 2 (3), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
7th Power (if any): 2 (2), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
1st Boost: 1 (5), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
2nd Boost: 1 (4), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard -- Only use if character has three boosts.
3rd Boost (if any): 1 (1), 2 (4), 3 (1), 3 (4) Difficulty Hard, 4 (1) Difficulty Hard
Xtreme: 2 (1), 0 (7)

If you are confused by this, you can copy vanilla mods' talent entries, as they are already set up. Damage and energy costs follow this as well. This is another reason why I keep talent and powerstyle data for all mods as Notepad text files.


IMPORTANT NOTE:
The maximum amount of total powers that a mod can have is 10. This is because some players play the game with a keyboard, and any more than 10 will cause their games to crash.





Lesson Takeaway:
-What you do in the talents file should reflect the powerstyle file. They go hand-in-hand.
-The character's first power must be unlocked and have one skill point in it at the start of the game.
-Do not go overboard with the values. Having early powers that are too damaging will make the game too easy, and high power costs mean will drain your character's energy too quickly. Save it for the more destructive powers that should be unlocked at higher XP levels.
-Try to keep the requirement values and tier values the same, so that they level up correctly.

Title: The Outsider's Guide To Modding - Lesson 8
Post by: Outsider on October 13, 2019, 09:00PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 8: Passives


OK, so now comes the part that involves coding, but is much easier. There are permanent powerups that costs SHIELD points to increase -- these are called passives. Usually there are three for every skin/costume that the character has. For this lesson, we will continue using :spiderwoman: Spider-Woman. Passives only appear in the talents file, and are listed that the bottom of the talents data, usually after the Xtreme. So now, open Spider-Woman's talents file, and hit Ctrl + Find. Type "spdwm_outfit13" and press Enter.

You should see the Defense passive. All skins have this one particularly, but all passives are written as like below. Now let's look at this in detail to see what each line means...


   talent {
   descname = Defense ;
   description = Increases $DR. ;
   icon = 22 ;
   icon_texture = textures/ui/talent_icons.png ;
   name = spdwm_outfit13 ;
   skin = 0 ;
   type = passive ;
      talentvalues {
         talentvalue {
         level = 1 ;
         name = spdwm_outfit13_dr ;
         value = 1 ;
         }

         talentvalue {
         level = 9 ;
         name = spdwm_outfit13_dr ;
         value = 9 ;
         }

      }

      level {
      count = 9 ;
      description = +%spdwm_outfit13_dr $DR ;
         powerup {
         life = -1 ;
            affecter {
            attribute = defense_rating ;
            level = %spdwm_outfit13_dr ;
            }

         }

      }

   }


descname = The name of the passive.
description = A brief explanation of what the passive does.
icon = The number of the icon that is being used.
icon_texture = The icons file that the icon is coming from. Usually, "talent_icons" are used for passives, but character icons can be used as well.
name = The internal name for the passive. Because this defense passive is the third of her first costume, it ends with "13." More on that below.
skin = The number of the skin that the passive is for. (0 = Character's 1st skin, 1 = 2nd skin, 2 = 3rd skin, 3 = 4th skin)

Please note that only the first four skins can have passives. Every skin has three passives, with Defense usually being the third one. So, the internal name is usually this...

1st skin, 1st passive = character_outfit11
1st skin, 2nd passive = character_outfit12
1st skin, 3rd passive = character_outfit13 (Usually Defense)

2nd skin, 1st passive = character_outfit21
2nd skin, 2nd passive = character_outfit22
2nd skin, 3rd passive = character_outfit23 (Usually Defense)

3rd skin, 1st passive = character_outfit31
3rd skin, 2nd passive = character_outfit32
3rd skin, 3rd passive = character_outfit33 (Usually Defense)

4th skin, 1st passive = character_outfit41
4th skin, 2nd passive = character_outfit42
4th skin, 3rd passive = character_outfit43 (Usually Defense)

It should also be noted that for passives, you shouldn't spell out the whole name of the character. For example, Spider-Woman uses the abbreviation "spdwm" for her passives. Sometimes, passives won't work if the spelling is too long, so limit it to five letters. Also, do not use the same name as another character, or they will cause clashes. For instance, :magneto: Magneto uses the abbreviation "mag" for his passives. So, :magma: Magma cannot use the same abbreviation "mag" for her passives, as doing so will cause a clash if they are on the same team -- one will have the passive, and the other won't. So, Magma uses her whole name "magma" for her passives because it's short enough. This way, there are no clashes. So, when you are working on a character, use an abbreviation that no one else is using. If you are unsure, check the mods that have the same starting letters and see what they are using so you don't use the same abbreviation.






Now let's look further into the passive...

      talentvalues {
         talentvalue {
         level = 1 ;
         name = spdwm_outfit13_dr ;
         value = 1 ;
         }

         talentvalue {
         level = 9 ;
         name = spdwm_outfit13_dr ;
         value = 9 ;
         }

      }

Notice that the talent values only go up to 9? That's because 9 is the maximum amount of level that the passive can go to. Can you go higher? Yes, but it's not recommended because remember that you have to spend SHIELD credits to increase the passive. Now let's look further to where it says "powerup."

         powerup {
         life = -1 ;
            affecter {
            attribute = defense_rating ;
            level = %spdwm_outfit13_dr ;
            }

This is the actual powerup that makes up the passive -- in this case, defense_rating. The level listed here is the same as the name listed in the talent values shown before, but with a percent sign (%) in front of it, so make sure they match. Notice that the life is set at -1? That means it's permanent.








There are many, many passives besides Defense. Here is a list I've compiled to make it extremely easy. It showcases all of the passive types known:

https://marvelmods.com/forum/index.php/topic,10953.0.html


DID YOU KNOW?:
This passives collection is how I choose which ones I want without opening multiple talent files. You can do this too if you wish to, but I find this method very easy.






Passives mostly use the "talent_icons" and each icon is connected to a passive. Here is a list of icons in the "talent_icons" file.

ICON   PASSIVE
0          Power Damage
1          Critical Chance
2          (Gold Fist Icon)
3          (Gold Wing Icon)
4          (Star Icon)
5          Melee Damage
6          Experience
7          Bleed Damage
8          Point Blank
9          Dodge
10        Momentum Boost
11        (Awful Leaping Man in Blue)
12        Body Boost
13        Boost Stats
14        Health Per Kill
15        Energy Per Kill
16        Resistance Boost
17        Add Damage Type (Left & Right Arrows)
18        Skill Boost
19        Reflect Melee
20        Max Health
21        Max Energy
22        Defense
23        Resurrection
24        Focus Boost
25        Striking Boost
26       (Shield with Lightning Icon)
27       (Shield with Brain Icon)
28       (Shield with Radiation Icon)
29       Leadership
30       Health Regen
31       Energy Regen
32       (Two Beams Colliding Icon)
44      (1 Icon)
45      (2 Icon)
46      (3 Icon)
47      (4 Icon)
48      (Tooth in Blood Icon)
49      (Gold Hand Icon)
50      (Small Baseball Bat Icon)
51      (POW Icon)
52      (Yellow Fist Going Up Icon)
53      (Blue Block Breaking Icon)
54      (Money Bag Icon)
55      (Yin & Yang Red & Blue Icon)
56      (2 Blue Balls and Plus Sign Icon)
57      (Blue Skull Icon)

ALL OTHER NUMBERS ARE BLANK.






Now notice that Spider-Woman has a passive that no one else has -- Bio-Energy Mastery. Here's how it looks.


   talent {
   descname = Bio Energy Mastery ;
   description = Increases $DMG_ENERGY done by all attacks. ;
   icon = 8 ;
   icon_texture = textures/ui/spiderwoman_icons.png ;
   name = spdwm_outfit12 ;
   skin = 0 ;
   type = passive ;
      talentvalues {
         talentvalue {
         level = 1 ;
         name = spdwm_outfit12_pct ;
         value = 1.03 ;
         }

         talentvalue {
         level = 9 ;
         name = spdwm_outfit12_pct ;
         value = 1.15 ;
         }

      }

      level {
      count = 9 ;
      description = %spdwm_outfit12_pct:s $DMG_ENERGY ;
         powerup {
         life = -1 ;
            affecter {
            affect_type = scale ;
            attribute = atk_damage ;
            level = %spdwm_outfit12_pct ;
            scope_damage = dmg_energy ;
            }

         }

      }

   }


In this one, she is using her own icons rather than the generic talent icons I showed you above. You can do that if you wish to. In the powerup, she connected her atk_damage (attack damage that you inflict on enemies) to a particular damage type: radiation damage. Scope refers to a given category that the passive is connected to. With this in mind, you can create custom passives for your character that no one else may have.






CUSTOM TALENTS

Now remember when I mentioned how :ghostr: Ghost Rider had fire immunity? Well, that is a custom talent. These are not passives, so you do not need to pay SHIELD points. They can use the same powerups as passives can, and they too are permanently attached to a character. For example, scroll all the way up in Spider-Woman's talents file. You'll see this...


   talent {
   descname = Radiation Immunity ;
   description = 100% Immune to $DMG_RADIATION. ;
   name = spdwm_resist ;
   type = ability ;
      level {
      count = 1 ;
         powerup {
         life = -1 ;
            affecter {
            affect_type = scale ;
            attribute = def_damage_scope ;
            damagetype = dmg_radiation ;
            level = 0 ;
            }

         }

      }

   }


That is her custom talent that makes her immune to radiation damage, which is a result of her powers. She forever has this, so no need to level it up. This means that radiation attacks against her are useless and she'll incur no damage at all. Likewise, the same powerups you see in passives and the like can also be set up as a custom talent -- provided that your character has the powers or skills to warrant this.

Whenever setting up a custom talent, pay close attention to the name of the talent. In her case, it was called "spdwm_resist." Now look in her herostat. At the near bottom, you'll see this...

      talent {
      level = 1 ;
      name = spdwm_resist ;
      }

Notice that the name there matches the name in her talents file. This is important, as if it's not on the herostat, then the custom talent will not work. BTW, if Spider-Woman's herostat doesn't have the above entry for some reason, then go ahead and add it. It's a mistake on the developer's part -- she should have this.







Lesson Takeaway:
-Only the first four skins can have passives. Defense is one of them by default.
-Do not use the same abbreviation as another character, or it will clash.
-You can create all kinds of passives for your character, but don't go overboard.
-When naming custom talents, make sure the talent is also listed at your character's herostat, or it won't work.
-View the talents files of various characters. Then copy and paste the passives you want.

Title: The Outsider's Guide To Modding - Lesson 9
Post by: Outsider on November 11, 2019, 12:30AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 9: Boost Coding

Now that you have your talents file set up for the most part, you have to set up your powers at the powerstyle file. The easiest way to do this is to copy the coding from one of the official characters (by opening that character's powerstyle file via QuickBatch or XMLBCUI, then copying the power you want), then pasting it to your character's powerstyle file. But this lesson will show you to customize it to your liking.

For this lesson, let's continue with :spiderwoman: Spider-Woman's files. Look at her talents file and scroll down -- you will eventually see that she has two powers that appear different from other powers. These are called Boosts. They are powerups specific to that character that uses passives (see previous lesson) except that it costs energy instead of SHIELD points, and that it lasts for a certain amount of time. Usual mods carry two, while very few mods have three. In Spider-Woman's case, you will see that she has two. One of them is called "Attract," and down further is the other "Metabolic Aura." Now open her powerstyle file, hit Ctrl + F and type "name = power6" and hit Enter. It'll take you to it. Power 6 is her first boost, Attract. The coding for it is below. I will break it down to help make you understand what the "triggers" in the coding means. My notes for them will be in Royal Blue and isn't part of the coding.





   FightMove {
   aicanuse = false ;
   aitype = buff ;
   animenum = ea_power6 ;
   combotextfinisher = Cloud ;
   combotextstarter = Pheromone ;
   icon = 5 ;
   is_power = true ;
   lockangles = true ;
   lockspeed = true ;
   name = power6 ;
   priority = 5 ;


"aicanuse" refers to whether an AI-controlled hero can use the power or not.
"aitype" refers to what kind of power it is. Boosts that only help the hero who summoned it are called "buffself" while boosts that help the entire team are called "buff."
"animenum" refers to what animation is being used.
"combotextfinisher" = We'll skip that for now.
"combotextstarter" = We'll skip that for now.
"icon" refers to what icon from the character's icon file is being used.
"is_power" refers to whether the move is a power or not. If it's not, this line is not there.
"lockangles" = Not sure what this means, actually.
"lockspeed" = Not sure what this means, either.
"name" refers to the name of the power that the game recognizes it as.
"priority" refers to whether the power can be interrupted by enemy attacks or not. The options are usually "5" or "uninterruptable."


      require {
      cat = skill ;
      item = spdwm_power6 ;
      level = 1 ;
      }

This is the requirement that the game recognizes will unlock this boost.

      trigger {
      effect = char/spidwm/p6_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.13 ;
      }

This trigger is for an effect, as seen by the "name." The "effect" displays the effect from the game that is being used. The "time" tells the game when between 0 and 0.99 to display this effect. "fxlevel" refers to the level of the effect, if there is more than one level. More on effects in a future lesson.

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/spidwm/p6_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.13 ;
      }

Same trigger for an effect, but also has "bolt," which refers to a certain body part where the effect is coming from. In this case, her left hand.

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/spidwm/p6_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.13 ;
      }

Same effect trigger as the previous, but uses her right hand as the "bolt." Notice that the same "time" is used, so all of these effects will appear at the same time.

      trigger {
      effect = char/spidwm/p6_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.59 ;
      }

Same effect trigger as the previous ones, but the "time" is different, so it will appear at a later time than the previous effects. The "fxlevel" is different, but more than that in a different lesson.

      trigger {
      name = powerusage ;
      next_eventtag = 1 ;
      powerusage = %spdwm_p6_pwr ;
      time = 0.59 ;
      }

This is the powerusage trigger, but this can be connected to the actual boost, making this trigger unnecessary. I'll show you what I mean later. Also, notice that "next_eventtag = 1" is used? Take a look at the next one...

      trigger {
      name = sound ;
      next_eventtag = 2 ;
      sound = char/spidwm_m/p6_power ;
      tag = 1 ;
      time = -1 ;
      }

This is the sound trigger, means that a sound will heard at this time. "tag" refers to the "next_eventtag" from the previous trigger, which was 1. This is so they don't they don't need to write the "time" again, which is why "time" is listed as -1. It will appear at the same time as the previous trigger. However, this code can be connected to another and doesn't need to be separated. More on that later. Plus, don't be confused -- the "next_eventtag" is not required for the power to work. Don't worry about effects or sounds for now.

      trigger {
      life = %spdwm_p6_lif ;
      name = powerup ;
      next_eventtag = 3 ;
      tag = 2 ;
      time = -1 ;
         special_fx {
         effect = char/spidwm/p6_power ;
         fxlevel = 4 ;
         how_used = primary ;
         }

         special_fx {
         effect = char/spidwm/p6_power ;
         fxlevel = 5 ;
         how_used = deactivation ;
         }

         affecter {
         attribute = resist_last_hit_major_type ;
         level = 0.5 ;
         }

      }

This is the powerup trigger which creates the actual boost.
"life" is to the duration that the boost will last. This refers to the values placed from the talents file.
"name" refers to what the trigger is. This one must be "powerup" for it to work.

Now pay close attention. Do you see that "special_fx" and "affecter" are three spaces after the powerup, with their own brackets? That's because these coding parts are under the powerup coding. "special_fx" refers to the effects that appear during the boost. "affecter" refers to the actual powerup that makes up the boost. In Spider-Woman's case, the affecter is "resist_last_major_hit_type" but it can be any passive that you want, such as damage increase, speed increase, reduce power cost, health regen, etc. Whatever you choose, it is placed here.


      trigger {
      arc = 180 ;
      damage = 0 ;
      damagetype = dmg_energy ;
      maxrange = 144 ;
      name = taunt ;
      powerusage = 0 ;
      tag = 3 ;
      time = -1 ;
      }

This is a damage trigger to set up the boost. It is connected to the previous triggers, so a "tag" is there referring to it and the "time" is -1. "arc" refers to the radius around the character that the trigger hits. The "name" is a taunt because it takes no damage, which is also why "damage" is at 0. Really, "damage" and "powerusage" don't need to be there.

      chain {
      action = Idle ;
      result = idle ;
      }

   }

This is the chain that brings the character back to the idle animation once you've activated the boost.






Now, notice when I said that some entries were not necessary? Well, they could have written the coding easier to condense it. (1) You can combine effect and sound triggers if they are to appear at the same time. Observe below -- I will take two triggers together and combine them.

      trigger {
      effect = char/spidwm/p6_power ;
      fxlevel = 3 ;
      name = effect_sound ;
      sound = char/spidwm_m/p6_power ;
      time = 0.59 ;
      }

See that? I combined two triggers into one, and got rid of the "next_eventtag" and "tag" parts, as it's not necessary. The main thing needed to do this is to change the "name" to effect_sound. (2) You can add the powerusage to the powerup trigger, so that a separate powerusage trigger isn't necessary. Observe...

      trigger {
      life = %spdwm_p6_lif ;
      name = powerup ;
      powerusage = %spdwm_p6_pwr ;
      time =0.59 ;
         special_fx {
         effect = char/spidwm/p6_power ;
         fxlevel = 4 ;
         how_used = primary ;
         }

         special_fx {
         effect = char/spidwm/p6_power ;
         fxlevel = 5 ;
         how_used = deactivation ;
         }

         affecter {
         attribute = resist_last_hit_major_type ;
         level = 0.5 ;
         }

      }

Notice that I added the powerusage to it, got rid of the tag and next_eventtag, and changed the time back to 0.59. Condensing the triggers can really help with space when adding multiple coding triggers. It's less confusing.

Feel free to change the affecter to whatever you wish to try out different powerups with your character. Now, let's look at Spider-Woman's second boost coding...

   FightMove {
   aicanuse = false ;
   aitype = buff ;
   animenum = ea_power7 ;
   icon = 6 ;
   is_power = true ;
   lockangles = true ;
   name = power7 ;
   priority = 5 ;
      require {
      cat = skill ;
      item = spdwm_power7 ;
      level = 1 ;
      }

      trigger {
      effect = char/spidwm/p7_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0 ;
      }

      trigger {
      effect = char/spidwm/p7_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.8 ;
      }

      trigger {
      name = powerusage ;
      next_eventtag = 1 ;
      powerusage = %spdwm_p7_pwr ;
      time = 0.8 ;
      }

      trigger {
      name = sound ;
      next_eventtag = 2 ;
      sound = char/spidwm_m/p7_power ;
      tag = 1 ;
      time = -1 ;
      }

      trigger {
      life = %spdwm_p7_lif ;
      name = powerup ;
      share_life = 1 ;
      share_radius = 80 ;
      tag = 2 ;
      time = -1 ;
         affecter {
         attribute = health_regen_pct ;
         level = %spdwm_p7_hlth ;
         }

         special_fx {
         effect = char/spidwm/p7_power ;
         fxlevel = 3 ;
         how_used = primary ;
         }

         special_fx {
         effect = char/spidwm/p7_power ;
         fxlevel = 3 ;
         how_used = deactivation ;
         }

      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }

As you can see, it's done pretty much the same way. But focus on the affecter. The attribute is different -- it says "health_regen_pct" which focuses on healing. And notice above it, it uses "share_radius," which refers to how large the radius around Spider-Woman that allies need to be within so that they can be affected by her boost. Not all powerups have this, but if you want the boost to work this way, then use it. The attributes can be different, and can perform different boosts. Here are some, but not all:

ATTRIBUTES
atk_damage: Amount of damage the character can inflict on enemies. 1 = 100% (normal damage), 0.5 = 50% (half the damage), 1.5 = 150% (twice the damage). You can add "scope_powers = true" for only power damage, or add "scope_non_powers = true" for only melee attacks.
def_damage: Amount of resistance to enemy attacks. 1 = 100% (no resistance), 0.5 = 50% (more resistance), 1.5 = 150% (less resistance), 0 = 0% (invincible).
def_damage_scope: Amount of resistance to a certain damage type. 1 = 100% (no resistance), 0.5 = +50% resistance, 1.5 = -50% resistance, 0 = 0% (immune).
def_dodge = Amount of chance that you can dodge/evade attacks. By default, characters can't dodge. 1.1 = +10% evasion chance, 0.5 = -50% evasion chance.
move: Amount of movement speed. 1 = 100% (normal speed), 0.5 = -50% speed, 1.5 = +50% speed.
move_attack: Amount of attack speed. 1 = 100% (normal speed), 0.5 = -50% speed, 1.5 = +50% speed.
power_cost: Amount of energy spent for powers: 1 = 100% (normal EP cost), 0.5 = 50% (less EP cost), 1.5 = 150% (more EP cost)
strength: Amount of striking in the stats screen. 1 = +1 point to striking, 3 = +3 points to striking.
body: Amount of body in the stats screen. 1 = +1 point to body, 3 = +3 points to body.
mind: Amount of focus in the stats screen. 1 = +1 point to focus, 3 = +3 points to focus.
traits: Amount of striking, body & focus in the stats screen. 1 = +1 point to stats, 3 = +3 points to stats.
defense_rating: Amount of defense in the stats screen. 1 = +1 point to defense, 3 = +3 points to defense.
xp: Amount of experience the characters gains. 1 = 100% (normal xp), 0.5 = 50% (-50% xp), 1.2 = 120% (+20% xp) 
momentum: Amount of momentum building up for Xtreme powers. 1 = 100% (normal rate), 0.5 = 50% (slower rate), 1.5 = 150% (faster rate)
health_regen_pct: Amount of health regenerated per second. By default, characters cannot regenerate health, so 0.2 = +20% health regen.
energy_regen_pct: Amount of energy regenerated per second. By default, characters cannot regenerate health, so 0.2 = +20% health regen.
atk_critical: Amount of chance for critical damage. 0 = 0% (no chance), 1 = 100% (certain critical, but that's OP), 0.15 = 15% (15% chance).
health_per_kill: Amount of health you gain for every enemy taken out. 6 = +6 health per kill.
energy_per_kill: Amount of energy you gain for every enemy taken out. 6 = +6 energy per kill.

One other important thing: If you want to set up a boost where your character sets it up, and your teammates are also powered up from it, then add this to the powerup trigger...

      trigger {
      apply_ally = all ;
      life = %spdwm_p6_lif ;
      name = powerup ;
      powerusage = %spdwm_p6_pwr ;
      time =0.59 ;

If you do that, everyone will benefit from the boost, not just your character. Allies will not suffer power costs. Personally, I let heroes have boosts that power up everyone, while villains are more likely to power up only themselves. Figure out what personality your character is like and customize boosts to fit your character.




RENDER FX

While I was working on Chameleon of Mortal Kombat, I found out the various effects that cover the entire character's body. These are called renderfx effects. I've listed them here because you can add them to boosts. First, let me tell you what each one does.

burning: orange shade (slightly red)
chilled: blue shade
cloaked: black shade (semi-transparent)
cloaked_no_tint: semi-transparent
enraged: dark red shade
fading: barely anything at all
invisible: not visible at all
invulnerable: purple shade
metalfreeze: gray shade, barely noticeable
pain1: white shade (disappears when hit)
pain2: red shade (disappears when hit)
radiated: green shade
radiation: green shade, same as radiated
regen: yellow shade, same as minions
xtreme_fb: skin gets brighter

OK, so have you noticed if you freeze an enemy as :iceman: Iceman, the enemy's whole body is shaded blue? It's using "chilled." Observe...

   event {
   class = freeze ;
   inherit = powerup ;
   name = freeze_powerup ;
   no_shatter_on_damage = true ;
   renderfx = chilled ;
   shatter_on_finisher = true ;
   sound1 = char/iceman_m/p2_impact ;
   sound2 = char/iceman_m/p2_explode ;
   user1 = 2 ;
      special_fx {
      bolt = Bip01 Spine2 ;
      effect = char/iceman/special_chilled ;
      fxlevel = 1 ;
      how_used = primary ;
      never_cycle = true ;
      }

      special_fx {
      effect = char/iceman/special_frozen ;
      fxlevel = 3 ;
      how_used = primary ;
      never_cycle = true ;
      }

      special_fx {
      effect = char/iceman/special_frozen ;
      fxlevel = 2 ;
      how_used = custom ;
      tag = 1 ;
      }

   }

You see? Enemies that have a specific powerup attached to them use these as well. You can add a render fx to any boost to cover an enemy or even your character in a certain color shade. However, for it to work on your character, its skin has to have "Generate Global Color" enabled. Otherwise, its skin will just appear pitch black instead. To do that, go to this link (https://marvelmods.com/forum/index.php/topic,10809.msg200108.html#msg200108) and go to where it says "Global Color Fix."





Lesson Takeaway:
-Practice with different passives in the powerup triggers to set up different boosts.
-Remember that boost values refer to the numbers you placed in the the character's talents file.
-You can combine certain triggers to condense the coding and make it less messy.
-Add "apply_ally = all" to allow your teammates to be powered up by the same boost as your character.
-If you get confused by the effect and sound triggers, practice without them. However, you must keep "special_fx" and "affecter" to test out the boost.
-Don't attempt attack powers or Xtreme coding until you've mastered boosts, as they are the easiest of coding powers.

Title: The Outsider's Guide To Modding - Lesson 10
Post by: Outsider on January 13, 2020, 12:47AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 10: Power Coding (Melee)

Sorry it's been awhile since my last lesson, but I've been crazy busy. Anyway, onto the lesson. You're in the powerstyle file for your character, and you've just done the boosts. Now you need to do attack powers. This type of coding has many different categories. For this lesson, I'll show you how to do one of the relatively easier ones -- melee powers.

What is melee? It's the type of powers that are used up at close range to the enemy using various punches and kicks, or attacks with knives, swords, claws, and other close range weapons. Characters who focus on martial arts, or are brutes with super strength tend to have powers in this category.

For this lesson, we will look at :pman: Luke Cage. In particular, we will look at his first power -- the Power Jab. Open his powerstyle file, hit Ctrl + F to Find, type "name = power1" and press Enter. You'll run into the coding for it. Now, you'll notice as you scroll down that he has an initial, a "power1_loop" which is a loop, and a "power1_release" which is a release. All three parts are needed only if you want the move to be a charged move. More on that later. For now, let's look at the release part below.


   FightMove {
   aitype = melee ;
   animenum = ea_power1_end ;
   combotextfinisher = Jab ;
   combotextstarter = Impervious ;
   icon = 0 ;
   is_power = true ;
   lockangles = true ;
   name = power1_release ;
   powerup_tag = lukeca_p1 ;
   priority = 5 ;
      trigger {
      charge_type = stop ;
      critical = true ;
      name = charge ;
      time = 0 ;
      }

      trigger {
      life = 0.2 ;
      movement = 0 ;
      name = slide ;
      targetdistance = 90 ;
      targetradius = 50 ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/lukeca/p1_power ;
      fxlevel = 3 ;
      name = effect_sound ;
      sound = char/lukeca_m/p1_power ;
      time = 0.14 ;
      }

      trigger {
      critical = true ;
      loop_type = stop ;
      name = sound ;
      sound = char/lukeca_m/p1_charge ;
      time = 0.14 ;
      }

      trigger {
      critical = true ;
      name = powerup ;
      remove_tag = lukeca_p1_link ;
      time = 0.21 ;
      }

      trigger {
      arc = 65 ;
      damage = %lukec_p1_dmg ;
      damagemods_require_charge = true ;
      damagescale = none ;
      knockback = %lukec_p1_kb ;
      maxrange = 72 ;
      name = punch ;
      time = 0.21 ;
         damageMod {
         name = dmgmod_auto_knockback ;
         }

         damageMod {
         name = dmgmod_ground ;
         }

      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }


I know it looks confusing, but by now, you know what some of those terms mean. So I'll break down the terms that weren't covered in the previous lesson.

"combotextfinisher" refers to the term used at the end if this attack power is used alongside another character's power in a combo. It can be named whatever you want. For example, the combo text finisher for this power is "Jab." So if this power connects with another character's power in a combo attack, you will see on the screen a special text that reads "Jab" at the end.

"combotextstarter" refers to the term used at the beginning if this attack power is used alongside another character's power in a combo. It can also be named whatever you want. For example, the combo text finisher for this power is "Impervious." So if this power connects with another character's power in a combo attack, you will see on the screen a special text that reads "Impervious" at the beginning.

Now let's look at a different trigger...

      trigger {
      life = 0.2 ;
      movement = 0 ;
      name = slide ;
      targetdistance = 90 ;
      targetradius = 50 ;
      time = 0 ;
      }

Slide allows a character to move forward as a move or power is being done. You can increase the movement that the character slides towards the enemy.

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/lukeca/p1_power ;
      fxlevel = 3 ;
      name = effect_sound ;
      sound = char/lukeca_m/p1_power ;
      time = 0.14 ;
      }

This is an effects trigger, but we will discuss effects in a future lesson. Now the coding below is the actual power itself.

      trigger {
      arc = 65 ;
      damage = %lukec_p1_dmg ;
      damagemods_require_charge = true ;
      damagescale = none ;
      knockback = %lukec_p1_kb ;
      maxrange = 72 ;
      name = punch ;
      time = 0.21 ;
         damageMod {
         name = dmgmod_auto_knockback ;
         }

         damageMod {
         name = dmgmod_ground ;
         }

      }

arc is the angled range of attack that can connect with the enemy. The higher that number, the wider the range.
damage obviously is the amount of damage that is inflicted upon an enemy if the power connects. It connects to the numeric value that you placed in the character's talents file.
damagemods_require_charge refers to exactly that, but it's not necessary really, as moves will take damage without this line.
damagescale refers to the level by which enemies can take damage by the power. Usually I only see "none" or "1", so this line doesn't matter all that much.
damagetype refers to the kind of damage that the enemy will take upon being attacked. There are many different damage types in the game. You don't see that here, but it's good to know about. More on that later.
knockback refers to the amount of distance that a character will be knocked back upon getting hit by the power. The higher the number, the greater the knockback.
maxrange is the amount of distance away from the enemy that the power will connect. Close range powers like melee are usually 72 or less.
name refers to the internal type of attack that the power uses. In this case, it's "punch" referring to a melee attack. "Kick" or "punch_heavy" can be used as well. This tells the game what kind of attack it is.
powerusage refers to how much of the character's energy meter will be depleted upon using this power. You don't see it here in this case because it's elsewhere, but it's mandatory for all powers.
time refers to when the attack takes place during the animation.

Now notice underneath it says "damagemod" followed by "name = dmgmod_?????" OK, so these are dmgmod properties that you can connect to any power. There are quite a few of these. Some examples include:

dmgmod_popup = the enemy will launch upward once the power connects.
dmgmod_ground = the power will harm enemies that are also on the ground.
dmgmod_auto_knockback = the enemy will be blasted back and down far once the power connects. This works along with the "knockback" value.
dmgmod_stun = the enemy will be stunned once the power connects.
dmgmod_unblockable = the enemy cannot block the incoming attack. I don't think this works on bosses, however.
dmgmod_no_atk_roll = (same as unblockable from what I hear.)
dmgmod_ignore_def = the enemy's defense is useless against this power. I don't think this works on bosses, however.
dmgmod_trip = the enemy will trip and fall once the power connects.

Here are some more dmgmod properties, found by BLaw and Teancum. Unsure what they mean, but some seem obvious:

dmgmod_no_protection
dmgmod_no_on_damage
dmgmod_touch_o_death
dmgmod_no_hiteffect
dmgmod_forcepain
dmgmod_pierce
dmgmod_teleport
dmgmod_no_pain
dmgmod_ai_no_hero_dmg
dmgmod_environment
dmgmod_no_text
dmgmod_kill
dmgmod_ignore_dist
dmgmod_weapon
dmgmod_ground
dmgmod_weld
dmgmod_energize
dmgmod_critical
dmgmod_ground_only
dmgmod_drain_battery
dmgmod_extinguish
dmgmod_immobilize
dmgmod_drain
dmgmod_no_actors
dmgmod_no_damage
dmgmod_none






CHARGING POWERS

So now that you've learned the basics of melee powers, you can create a melee power. But I'm sure that when playing MUA, you've noticed that some have the option of charging the move for more damage by holding down the button. This is called charging. It's not required, but for some powers (like beam attacks), it looks cool and offers for more damage output. The coding is a bit complicated, though, so bare with me. We saw the release part of the power. Let's look at the initial and the loop.



   FightMove {
   aitype = melee ;
   animenum = ea_power1 ;
   icon = 0 ;
   is_power = true ;
   name = power1 ;
   noautoaim = true ;
   powerup_tag = lukeca_p1 ;
   priority = 5 ;
   startchaintime = 0.55 ;
   turnrate = 0.5 ;
      require {
      cat = skill ;
      item = lukec_p1 ;
      level = 1 ;
      }

      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

      trigger {
      loop_timeout = 2 ;
      loop_type = start ;
      name = sound ;
      sound = char/lukeca_m/p1_charge ;
      time = 0 ;
      }

      trigger {
      charge = 0 ;
      charge_time = 1.0 ;
      charged_eventtag = 100 ;
      name = charge ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/lukeca/p1_power ;
      fxlevel = 2 ;
      name = effect_sound ;
      sound = common/melee/kb_charge_done ;
      tag = 100 ;
      time = -1 ;
      }

      trigger {
      fx_chargeable = true ;
      life = -1 ;
      name = powerup ;
      powerusage = %lukec_p1_pwr ;
      tag_name = lukeca_p1_link ;
      time = 0 ;
         special_fx {
         bolt = Bip01 R Hand ;
         effect = char/lukeca/p1_power ;
         fxlevel = 1 ;
         how_used = primary ;
         never_cycle = true ;
         }

      }

      chain {
      action = Idle ;
      result = power1_release ;
      }

      chain {
      action = samepowerhold ;
      result = power1_loop ;
      }

   }

   FightMove {
   aitype = melee ;
   always_target = true ;
   animenum = ea_power1_loop ;
   icon = 0 ;
   is_power = true ;
   lockchaining = false ;
   locktransitionangles = true ;
   name = power1_loop ;
   noautoaim = true ;
   powerup_tag = lukeca_p1 ;
   priority = 5 ;
   turnrate = 0.5 ;
      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

      chain {
      action = Idle ;
      result = power1_release ;
      }

      chain {
      action = samepowerhold ;
      result = power1_loop ;
      }

   }


The initial is set up just like most powers, even with the requirement seen. But there are some codings unique to it. Observe.

      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

That is a button hint. It tells the person playing to do a special thing with the controller buttons (or computer keys) during the power. In this case, "samepowerhold" means that the player should hold down the same button that was used to activate the power. This is to set up the charge.

      trigger {
      loop_timeout = 2 ;
      loop_type = start ;
      name = sound ;
      sound = char/lukeca_m/p1_charge ;
      time = 0 ;
      }

That is a sound coding to begin a loop for the charge, but we'll go into sounds in a future lesson.

      trigger {
      charge = 0 ;
      charge_time = 1.0 ;
      charged_eventtag = 100 ;
      name = charge ;
      time = 0 ;
      }

This is the charge coding. This is needed for charging to occur during the power. Under "charge_time," 1.0 is standard. The "charged_eventtag" refers to what happens when the player has charged up the power enough. The number there must match the command.

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/lukeca/p1_power ;
      fxlevel = 2 ;
      name = effect_sound ;
      sound = common/melee/kb_charge_done ;
      tag = 100 ;
      time = -1 ;
      }

That is the effect_sound trigger that the "charged_eventtag = 100 ;" was referring to in the previous coding.

      trigger {
      fx_chargeable = true ;
      life = -1 ;
      name = powerup ;
      powerusage = %lukec_p1_pwr ;
      tag_name = lukeca_p1_link ;
      time = 0 ;
         special_fx {
         bolt = Bip01 R Hand ;
         effect = char/lukeca/p1_power ;
         fxlevel = 1 ;
         how_used = primary ;
         never_cycle = true ;
         }

      }

This is the powerup that happens during the charging. This is one place that you can place the powerusage. "fx_chargeable" just means that the effects are chargeable as well. See the part I highlighted in blue? Pay attention to that -- it is the same link that was seen in the release part of the power's coding. This powerup begins at the initial, continues during the loop, and ends at the release.

      chain {
      action = Idle ;
      result = power1_release ;
      }

      chain {
      action = samepowerhold ;
      result = power1_loop ;
      }

   }

That is the chain command that I showed you in a previous lesson. The "samepowerhold" function (meaning if the player holds down the same power button) will lead them to the loop portion of the power. Idle means that you've released the power button, so the power will be released. Got it? OK, now let's look at the loop part of the coding...

   FightMove {
   aitype = melee ;
   always_target = true ;
   animenum = ea_power1_loop ;
   icon = 0 ;
   is_power = true ;
   lockchaining = false ;
   locktransitionangles = true ;
   name = power1_loop ;
   noautoaim = true ;
   powerup_tag = lukeca_p1 ;
   priority = 5 ;
   turnrate = 0.5 ;
      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

      chain {
      action = Idle ;
      result = power1_release ;
      }

      chain {
      action = samepowerhold ;
      result = power1_loop ;
      }

   }

Notice that there's not much here except the chain commands. But the animation used here keeps the power alive while the player keeps holding down the button. After that is the release part that you saw earlier. That's where you saw this trigger...

      trigger {
      critical = true ;
      name = powerup ;
      remove_tag = lukeca_p1_link ;
      time = 0.21 ;
      }

That is telling the game that the powerup mentioned in the initial can end now, so these are important. Charging can connect to various power types, not just melee. You can practice how to connect charging commands to your powers by using coding that is supplied in vanilla in-game mods.






DAMAGE TYPES

There are different damage types that any power can use. I'll explain what they mean, but most are self-explanatory.

:capamer: dmg_physical = Suffers from physical damage, such as from punches, kicks, and melee attacks. One of the most common in MUA.
:stark: dmg_energy = Suffers from energy damage, such as from lasers and energy projectiles. One of the most common in MUA.
:humant: dmg_fire = Suffers from fire damage.
:iceman: dmg_cold = Suffers from cold damage.
:electro: dmg_electricity = Suffers from electric damage.
:storm: dmg_wind =  Suffers from wind damage.
:hulk_icon: dmg_radiation = Suffers from radiation damage.
:wolverine: dmg_blade = Suffers from damage that came from something sharp like a sword, knife, or claws.
:psylocke: dmg_mental = Suffers from mental damage.
:juggernaut: dmg_crushing = Suffers from damage resulting from being crushed.
:magneto: dmg_magnetic =  Suffers from magnetic damage. Usually, exclusive to Magneto.
:phoenix: dmg_telekinesis = Suffers from telekinetic damage.
:nightcrawler: dmg_teleport = Suffers from damage resulting for a teleporting attack.
:hawkeye: dmg_bleed = Suffers from bleeding after an attack, such as getting impaled by an arrow.
:thor: dmg_elemental = Suffers from elemental damage. This one isn't used all that often.
:ultron: dmg_metal = Suffers from damage coming from a metal object. Very rare - not used often.
:punisher_logo: dmg_direct = I honestly don't know what this one refers to, as it's very rare and not used often. So I personally use it for characters with guns or various firearms.
:scarletw: dmg_special = I honestly don't know what this one refers to, as it's very rare and not used often. So I personally use it for characters related to magic.

For those wondering, damage types can't be created, so we can't create ones like dmg_water, dmg_light, dmg_dark, or dmg_web sadly.






Lesson Takeaway:
-Practice with melee powers as they are relatively easier to create then other power types.
-Learn the various damage types to see what your power connects to.
-Adding a charge command isn't required, but makes some powers look better. Don't attempt until you feel comfortable.
-Remember the numbers you placed for tags here, and the values you placed in the talents file. They all connect.

Title: The Outsider's Guide To Modding - Lesson 11
Post by: Outsider on January 29, 2020, 01:06AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 11: Power Coding (Radial)

Did you find melee powers easy to create? If you did, then you're in for a treat. For in this lesson, I will show you another kind of attack power that is relatively easy to create -- radial powers.

What is radial? It's the type of powers that can inflict damage on all enemies within a given radius (the invisible circle around your character). These powers are very popular because they can hit multiple enemies at one time, so they are good for crowd control. Almost every character mod - vanilla or created, has at least one radial attack power. Or their Xtreme attack is a radial power, but we'll go into Xtreme powers in a future lesson.

For this lesson, we will continue looking at :pman: Luke Cage. In particular, we will look at his fifth power -- the Drill Bit. Open his powerstyle file, hit Ctrl + F to Find, type "name = power5" and press Enter. You'll run into the coding for it. Now, let's look at the coding below.


   FightMove {
   animenum = ea_power5 ;
   combotextfinisher = Slam ;
   combotextstarter = Punishing ;
   icon = 4 ;
   is_power = true ;
   lockangles = true ;
   name = power5 ;
   priority = 5 ;
      require {
      cat = skill ;
      item = lukec_p5 ;
      level = 1 ;
      }

      trigger {
      name = sound ;
      sound = char/lukeca_m/p5_charge ;
      time = 0 ;
      }

      trigger {
      effect = char/lukeca/p5_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.13 ;
      }

      trigger {
      bolt = Bip01 Pelvis ;
      effect = char/lukeca/p5_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.13 ;
      }

      trigger {
      effect = char/lukeca/p5_power ;
      fxlevel = 3 ;
      name = effect_sound ;
      sound = char/lukeca_m/p5_power ;
      time = 0.38 ;
      }

      trigger {
      damage = %lukec_p5_dmg ;
      knockback = 245 ;
      maxrange = 72 ;
      name = radial ;
      powerusage = %lukec_p5_pwr ;
      tiles = true ;
      time = 0.38 ;
         damagemod {
         name = dmgmod_ground ;
         }

      }

      trigger {
      damage = %lukec_p5_dmg ;
      damagescale = none ;
      name = punch ;
      time = 0.65 ;
      }

      trigger {
      effect = char/lukeca/p5_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.75 ;
      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }


Most of what you're seeing there was discussed in the previous lesson. We won't go into effects or sounds -- that's for lessons later on. Being a modder is about pacing yourself, because there is a lot to do -- as I'm sure you've noticed by now. So, there is really only one thing to look into -- the coding of the power itself, which are these:

      trigger {
      damage = %lukec_p5_dmg ;
      knockback = 245 ;
      maxrange = 72 ;
      name = radial ;
      powerusage = %lukec_p5_pwr ;
      tiles = true ;
      time = 0.38 ;
         damagemod {
         name = dmgmod_ground ;
         }

      }

      trigger {
      damage = %lukec_p5_dmg ;
      damagescale = none ;
      name = punch ;
      time = 0.65 ;
      }

Let's look at the first one of these triggers, as the second is really just a follow-up to it. As you can see, the terms there are mostly the same as the melee power coding that you've learned in the previous lesson. But I'll be nice and mention them again.

damage: The amount of damage inflicted on enemies if the power makes contact.
knockback: The amount of distance that an enemy will be thrown back from the impact of the power contact.

maxrange: The amount of distance that the radial power can connect away from the character triggering it. This is very important for radial powers, because the larger that number, the larger the radius (invisible circle around the character) that the power will connect. For example, the maxrange for this power is 72. So that means that only enemies within close range will feel the impact of this power. Enemies a good distance away will not be affected. Likewise, if the maxrange is 300, then multiple enemies even from a good distance away will still get hit by the radial power. Usually, 150 is a decent range for radial powers. 72 is good for melee powers, while 300 is more for Xtreme powers.

name: The name of the power. It must be called "radial" so that the computer knows what kind of power it is.
powerusage: The value of energy that will be depleted from using this power. The value is determined by the number you placed in the talents file for this power.
tiles: Honestly, I'm unsure. Not important.

time: The time where the damage will take place. This value coincides with the animation that you used for this power. For example, Luke Cage jumps up, then lands himself to the ground, causing the impact. You want to make sure the right animation is used, and to time the power correctly. This takes trial and error. You can save and play the game with it to try it out. For Luke, around the 0.38 mark, he landed on the ground, so the power impact is correctly set up. Line up the time of the power with the animation you chose.

Notice that the second coding there says "punch" as the name. This is just a follow-up. Not many radial powers have a follow-up attack, so don't focus on that too much.





STATUS ALIMENTS

Now suppose you want to create a radial power, but not to cause damage, but rather to inflict a certain debuff on enemies? You can do that, too. Observe...

      trigger {
      damage = 0 ;
      knockback = 245 ;
      maxrange = 72 ;
      name = radial ;
      powerusage = %lukec_p5_pwr ;
      tiles = true ;
      time = 0.38 ;
      victimeventtag = 11 ;
      }

See what I did there? I lowered the damage to zero because I only care about what happens to enemies after they are hit by it. I don't want it to take initial damage. Of course, you can have it take initial damage if you wish to.

I then added a victimeventtag which is "victim event tag." This allows something (usually a status aliment) to happen to the enemy when the power connects. This is when you can use various powerups to be used as detriments (or debuffs as they call it) to enemies. They can range from disabling their powers, slowing down their speed, or whatever. In the case below, see what I did:

      trigger {
      life = 10 ;
      name = powerup ;
      tag = 11 ;
      time = -1 ;
         special_fx {
         effect = char/lukeca/p6_power ;
         fxlevel = 3 ;
         how_used = primary ;
         }

         affecter {
         affect_type = scale ;
         attribute = atk_damage ;
         level = 0.5 ;
         }

      }

Can you read what that coding means? It means that for the next 10 seconds (life), enemies hit by that power will have their attack damage (atk_damage) lowered by 50% (0.5). Notice the "tag = 11" part? That connects to the victim event tag I placed in the radial power. You MUST have that for it to work. You also MUST have the time of the powerup to be "-1" because there is no time. It only happens when an enemy is hit by the radial power. You can always change the duration of the debuff and the value of the attribute affected. For some characters, some boosts they have are actually debuffs against enemies, such as :blade: Blade's Flash Bomb. Also note that other attack powers, such as melee powers can use victim event tags as well. Here are some status aliments (debuffs) you can connect to a victim event tag:

         affecter {
         attribute = nullify ;
         level = 1 ;
         }

         special_fx {
         bolt = Bip01 Head ;
         effect = base/powerup/pu_nullified ;
         }

This will shut down enemy power attacks.

         affecter {
         attribute = fear ;
         level = 1 ;
         }

         special_fx {
         bolt = Bip01 Head ;
         effect = base/powerup/pu_fear ;
         how_used = primary ;
         }

This will have enemies running away terrified.

         affecter {
         attribute = team_switch ;
         level = 1 ;
         }

         special_fx {
         bolt = Bip01 Head ;
         effect = base/powerup/pu_converted ;
         }

This will convert enemies to your team.

         affecter {
         affect_type = scale ;
         attribute = def_damage ;
         level = 1.5 ;
         }

This will increase the overall damage enemies take by 50%. You can change the level value.

         affecter {
         affect_type = scale ;
         attribute = def_damage_scope ;
         damagetype = dmg_fire ;
         level = 1.5 ;
         }

This will make enemies 50% more vulnerable to fire damage. You can change the level value and/or the damage type.

         affecter {
         affect_type = scale ;
         attribute = move ;
         level = 0.5 ;
         }

         affecter {
         affect_type = scale ;
         attribute = move_attack ;
         level = 0.5 ;
         }

This will lower enemies' movement speed and attack speed down to 50%. You can change the level value.

      trigger {
      life = %character_p1_lif ;
      name = powerup ;
      shared_tag = shared_stunned ;
      tag = 1 ;
      time = -1 ;
      }

This will stun enemies for a certain period of time. You can add effects to it.

      trigger {
      class = freeze ;
      die_on_critical = false ;
      life = %character_p1_lif ;
      name = powerup ;
      no_shatter_on_damage = true ;
      tag = 1 ;
      time = -1 ;
      }

This will freeze enemies in place. This will have no ice or stone effect, however -- that would have to be added.

      trigger {
      arc = 180 ;
      damage = 0 ;
      damagetype = dmg_physical ;
      maxrange = 144 ;
      name = taunt ;
      powerusage = %character_p1_pwr ;
      time = 0.4 ;
      victimeventtag = 1 ;
      }

Similar to a radial attack, it causes enemies to come to your location, forced to fight melee.

There are likely more status aliments you can use, or you can create one by reversing the value of a passive (mentioned in a previous lesson), making the possibilities even more various.





MULTIPLE RADIAL DAMAGE

Now suppose instead of a debuff, you do want the radial power to inflict initial damage, but at more than one time? You can do that, too. Observe.

First, replace the word trigger in the radial power coding with the word event, and remove the time and powerstyle from it. Then add "inherit = radial" to it.

      event {
      damage = %lukec_p5_dmg ;
      inherit = radial ;
      knockback = 245 ;
      maxrange = 72 ;
      name = big_blast ;
         damagemod {
         name = dmgmod_ground ;
         }

      }

By doing this you are creating an event for the game to reference your radial power to. The "inherit" part in this case is basically you telling the game, "No matter what the "name" of the power is, you should know that it's a radial power." Because of that, now you can name it whatever you want. I named it "big_blast." Why did I rename it? You'll find out in a bit. You'll notice that I've also removed "maxrange" from it. You'll see why next.

Second, add these triggers...

      trigger {
      index = 1 ;
      maxrange = 72 ;
      name = big_blast ;
      powerusage = %lukec_p5_pwr ;
      time = 0.38 ;
      }

      trigger {
      index = 2 ;
      maxrange = 125 ;
      name = big_blast ;
      time = 0.44 ;
      }

      trigger {
      index = 3 ;
      maxrange = 170 ;
      name = big_blast ;
      time = 0.5 ;
      }

      trigger {
      index = 4 ;
      maxrange = 200 ;
      name = big_blast ;
      time = 0.56 ;
      }

Can you understand what those triggers mean? Let's break it down. First, notice that the name of them all is "big_blast," referencing back to the event that you created. So the game knows that all big_blast triggers have the properties of that event.

Next, notice that the maxrange (radius) increases with every blast. This means that the range of the radial attack grows gradually. That's why I removed the maxrange from the event. If I kept it there, all big_blast triggers would have the same maxrange. Of course, you can keep them at the same range if you wish to. Only keep at the event what you don't plan to change for individual triggers.

Also, notice that the powerusage is only at the first trigger of the big_blast. That's why I removed the powerusage from the event. If I kept it there, all big_blast triggers will deplete energy from the character. Not exactly ideal.

And, notice that the time changes with each big_blast trigger. That coincides with the maxrange, so that means that while the initial radial power won't reach enemies a good distance away, a follow-up blast will.

Finally, notice that I added something called "index". This allows for multiple damage. The indexes here equal 4. This means that enemies will get hit up to four times, provided that they are in range of the attacks. If the index isn't there, then enemies that got hit by the first blast will not be harmed by the following blasts. Very important to remember. You can increase the maxrange and number of indexes as much as you wish, but don't make a power too powerful, because that will make the game too easy -- especially against boss villains.


There are many ways you can change radial powers to do what you want them to do. Take this lesson and practice. Trial and error will happen, but practice makes perfect.






Lesson Takeaway:
-Practice with radial powers as they are relatively easier to create then other power types.
-You must add a victim event tag to a power if the enemy is to suffer a status aliment after getting hit by the power. All power types can use this.
-Remember when creating events to only keep values that you don't plan to change in individual triggers that the event will reference.
-Time your attack power with the animation that you chose for it. Otherwise, it won't look right.
-Indexes allow for multiple damage. Use only when necessary, and align them with effects.

Title: Re: The Outsider's Guide To Modding
Post by: Jonnydragon88 on January 30, 2020, 08:27AM
Morning modders! I've been requested to give show you my almost skin ready mod. I do feel I should say this tho since it will be spoiling a surprise: please don't steal this mod from me. If you want to work on it DM me and we can do it together. I promise I'll give you credit. That being said, I hope we can all learn from this.

Herostat:
   stats {
   ailevel = 1 ;
   autospend = support ;
   body = 9 ;
   characteranims = 243_Santiago ;
   charactername = Santiago ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 6 ;
   name = Santiago ;
   playable = true ;
   powerstyle = ps_Santiago ;
   scriptlevel = 3 ;
   skin = 24309 ;
   skin_01_name = Classic ;
   skin_02 = 10 ;
   skin_02_name = Sarge ;
   skin_03 = 11 ;
   skin_03_name = Armor ;
   skin_04 = 12 ;
   skin_04_name = Detective ;
   sounddir = Santiago_m ;
   strength = 7 ;
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = Santiago_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }

nc.package:
   actorskin {
   filename = 24309 ;
   }

   actoranimdb {
   filename = 243_Santiago ;
   }

   texture {
   filename = textures/ui/Santiago_icons ;
   }

   xml_talents {
   filename = data/talents/Santiago ;
   }

   model {
   filename = HUD/hud_head_24309 ;
   }

}

package:
   actorskin {
   filename = 24309 ;
   }

   actoranimdb {
   filename = interact_Santiago_victim ;
   }

   actoranimdb {
   filename = 243_Santiago_4_combat ;
   }

   actoranimdb {
   filename = 243_Santiago ;
   }

   texture {
   filename = textures/ui/Santiago_icons ;
   }

   xml_talents {
   filename = data/talents/Santiago ;
   }

   model {
   filename = HUD/hud_head_24309 ;
   }

   fightstyle {
   filename = data/fightstyles/interact_Santiago_victim ;
   }

   fightstyle {
   filename = data/powerstyles/ps_Santiago ;
   }

}
Title: Re: The Outsider's Guide To Modding
Post by: Outsider on January 30, 2020, 12:10PM
Alright, class. So I wanted Jonnydragon88 to showcase the following, as he asked me to see if they were good, and I wanted to help everyone learn.

OK, so right below is the herostat that Jonnydragon88 made for his upcoming custom character, Santiago. Yes, there are a couple of things wrong with it. I will place them RED.

   stats {
   ailevel = 1 ;
   autospend = support ;
   body = 9 ;
   characteranims = 243_Santiago ;
   charactername = Santiago ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 6 ;
   name = Santiago ;
   playable = true ;
   powerstyle = ps_Santiago ;
   scriptlevel = 3 ;
   skin = 24309 ;
   skin_01_name = Classic ;
   skin_02 = 10 ;
   skin_02_name = Sarge ;
   skin_03 = 11 ;
   skin_03_name = Armor ;
   skin_04 = 12 ;
   skin_04_name = Detective ;
   sounddir = Santiago_m ;
   strength = 7 ;
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = Santiago_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }

So, why are those wrong? Here's why... This upcoming mod was not registered with the CCC. Had he registered it, I could have added it in and told him not to use those skin numbers (24309-24312). Why? Because they will clash with BlackHand13's upcoming mod of Puck. You'll see that here: https://marvelmods.com/forum/index.php/topic,10705.msg196435.html#msg196435. It would have caused a clash.

See, this is why it's so important to view and register with the CCC -- it's the very first lesson here. It will eliminate potential clashes from happening. So, how to fix it? Well, if you look at the CCC, you'll see that #243 have both Heimdall and the upcoming Puck. So Santiago would have to use skin numbers that they are not using. (Puck is using 24313 as well.) Santiago should use skin numbers 24314 and higher to avoid a clash. You'll see the changes in BLUE.


   stats {
   ailevel = 1 ;
   autospend = support ;
   body = 9 ;
   characteranims = 243_Santiago ;
   charactername = Santiago ;
   level = 1 ;
   menulocation = XXXX ;
   mind = 6 ;
   name = Santiago ;
   playable = true ;
   powerstyle = ps_Santiago ;
   scriptlevel = 3 ;
   skin = 24314 ;
   skin_01_name = Classic ;
   skin_02 = 15 ;
   skin_02_name = Sarge ;
   skin_03 = 16 ;
   skin_03_name = Armor ;
   skin_04 = 17 ;
   skin_04_name = Detective ;
   sounddir = santia_m ;
   strength = 7 ;
   team = hero ;
   textureicon = 5 ;
      talent {
      level = 1 ;
      name = Santiago_p1 ;
      }

      talent {
      level = 1 ;
      name = fightstyle_default ;
      }

      talent {
      level = 1 ;
      name = block ;
      }

      talent {
      level = 1 ;
      name = might ;
      }

      talent {
      level = 1 ;
      name = melee_moves ;
      }

   }

Notice that I also changed the "sounddir" from Santiago_m to santia_m? That's because sound files only work at 7 letters or less, so "Santiago" is too many letters so it won't work. "santia" however, will work. And it doesn't need to be in capital letters, either. It's alright that no one knew about this, because sounds were going to be covered in a future lesson.





OK, so now that we know what skin numbers Santiago can use, we now need to change the package file coding to match them. Observe.

nc.package:
   actorskin {
   filename = 24314 ;
   }

   actoranimdb {
   filename = 243_santiago ;
   }

   texture {
   filename = textures/ui/santiago_icons ;
   }

   xml_talents {
   filename = data/talents/santiago ;
   }

   model {
   filename = HUD/hud_head_24314 ;
   }

}

package:
   actorskin {
   filename = 24314 ;
   }

   actoranimdb {
   filename = interact_santiago_victim ;
   }

   actoranimdb {
   filename = 243_santiago_4_combat ;
   }

   actoranimdb {
   filename = 243_santiago ;
   }

   texture {
   filename = textures/ui/santiago_icons ;
   }

   xml_talents {
   filename = data/talents/santiago ;
   }

   model {
   filename = HUD/hud_head_24314 ;
   }

   fightstyle {
   filename = data/fightstyles/interact_santiago_victim ;
   }

   fightstyle {
   filename = data/powerstyles/ps_santiago ;
   }

}




Everything else he did was done correctly. So remember class, always register with the CCC before attempting any mod. It will save you a lot of time. If you need a refresher on that first lesson, click here: https://marvelmods.com/forum/index.php/topic,10705.msg196372.html#msg196372.



Title: The Outsider's Guide To Modding - Lesson 12
Post by: Outsider on February 09, 2020, 12:25AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 12: Power Coding (Charge)

So, in this lesson, I will introduce another kind of attack power -- charging powers. Don't mistake this for any power that you can charge, which you've learned earlier. This is different.

What is charging? It's the type of powers where a character rushes forward, delivering damage to enemies as he/she moves. Usually, you hold the button and the character keeps running. :juggernaut: Juggernaut's Headcrush is an great example of this. Characters with brute strength or those who focus on fighting skill tend to use powers like these.

For this lesson, we will look at :captainamerica2: Captain America. He has a power called the Shield Charge (or if you have my booster, the Charging Star) that is a charging power. Open his powerstyle file, hit Ctrl + F to Find, type "name = power4" and press Enter. You'll run into the coding for it. Now, let's look at the coding below.


   FightMove {
   aireusetime = 8 ;
   aitype = melee ;
   animenum = ea_power4 ;
   combotextfinisher = Charge ;
   combotextstarter = Avenging ;
   energypersecond = %captam_p4_pwr ;
   handler = ch_charge_move ;
   icon = 3 ;
   is_power = true ;
   lockchaining = true ;
   locktransitionangles = true ;
   name = power4 ;
   noautoaim = true ;
   powerup_tag = captam_shield ;
   priority = 5 ;
   startchaintime = 0.2 ;
   turnrate = 0.4 ;
      require {
      cat = skill ;
      item = captam_p4 ;
      level = 1 ;
      }

      trigger {
      name = unlock_loop_chaining ;
      }

      trigger {
      name = kill_shield ;
      time = 0 ;
      type = ce_destroy_personal_proj ;
      }

      trigger {
      name = shield_show ;
      time = 0 ;
      }

      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

      trigger {
      name = powerusage ;
      only_non_looped = true ;
      powerusage = %captam_p4_pwr ;
      time = 0 ;
      }

      trigger {
      arc = 180 ;
      damage = %captam_p4_dmg ;
      damagescale = none ;
      knockback = 120 ;
      name = punch ;
      tag = 1 ;
      tiles = true ;
      time = -1 ;
         damageMod {
         name = dmgmod_ground ;
         }

         damageMod {
         name = dmgmod_auto_knockback ;
         }

      }

      trigger {
      life = -1 ;
      name = powerup ;
      remove_on_node_end = true ;
      time = 0 ;
         affecter {
         affect_type = scale ;
         attribute = def_damage ;
         level = 0 ;
         }

         special_fx {
         bolt = Bip01 Spine2 ;
         effect = char/captam/p4_power ;
         fxlevel = 1 ;
         how_used = primary ;
         }

         special_fx {
         bolt = Bip01 Spine2 ;
         effect = char/captam/p4_blast ;
         how_used = primary ;
         }

         special_fx {
         effect = char/captam/p4_power ;
         fxlevel = 3 ;
         how_used = primary ;
         }

      }

      trigger {
      name = sound ;
      sound = char/captam_m/p4_power ;
      time = 0 ;
      }

      chain {
      action = samepowerhold ;
      result = power4 ;
      }

      chain {
      action = touch ;
      result = power4_break ;
      }

      chain {
      action = idle ;
      result = fastballland ;
      }

   }

   FightMove {
   animenum = ea_idle ;
   is_power = true ;
   lockangles = true ;
   lockspeed = true ;
   locktransitionangles = true ;
   name = power4_break ;
   noautoaim = true ;
   playspeed = 10 ;
   priority = 5 ;
      chain {
      action = idle ;
      result = idle ;
      }

   }


As you can see, there are two coding parts to this type of power. Most of this was already covered in previous lessons, so let's break down the first coding part into sections, so as not to overwhelm you all. Pay attention to the parts in BLUE, which wasn't covered.

   FightMove {
   aireusetime = 8 ;
   aitype = melee ;
   animenum = ea_power4 ;
   combotextfinisher = Charge ;
   combotextstarter = Avenging ;
   energypersecond = %captam_p4_pwr ;
   handler = ch_charge_move ;
   icon = 3 ;
   is_power = true ;
   lockchaining = true ;
   locktransitionangles = true ;
   name = power4 ;
   noautoaim = true ;
   powerup_tag = captam_shield ;
   priority = 5 ;
   startchaintime = 0.2 ;
   turnrate = 0.4 ;

energypersecond is the same as "powerusage" where it will drain a certain amount of energy from the character, except per second. So while you're holding the power button, energy will gradually deplete. When the character has no more energy, the charging move stops.

handler tells the computer what kind of attack this is. Depending on what the handler is, it can change certain properties or commands. A little hard to explain, but essential for a charging power.

turnrate is how much the character can turn or steer during the power. So while the player is holding the power button for the charging power, he/she can have the character turn towards another enemy during it. No turnrate means that the character can only move straight forward.

      require {
      cat = skill ;
      item = captam_p4 ;
      level = 1 ;
      }

The requirement, as you know by now.

      trigger {
      name = unlock_loop_chaining ;
      }

      trigger {
      name = kill_shield ;
      time = 0 ;
      type = ce_destroy_personal_proj ;
      }

These two parts -- "unlock_loop_chaining" and "kill_shield" are not really important. Charging powers will work without them.

      trigger {
      name = shield_show ;
      time = 0 ;
      }

This is just skinsegment or bolton coding for Captain America. We've covered this in a previous lesson.

      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

      trigger {
      name = powerusage ;
      only_non_looped = true ;
      powerusage = %captam_p4_pwr ;
      time = 0 ;
      }

This means that the powerusage will only be depleted initially. That's why it says "only_non_looped." Then as the move continues, energy is depleted per second, as mentioned in the coding earlier.

      trigger {
      arc = 180 ;
      damage = %captam_p4_dmg ;
      damagescale = none ;
      knockback = 120 ;
      name = punch ;
      tag = 1 ;
      tiles = true ;
      time = -1 ;
         damageMod {
         name = dmgmod_ground ;
         }

         damageMod {
         name = dmgmod_auto_knockback ;
         }

      }

Take a look at this part... this is the damage part of the power. Notice that it says "time = -1" ? That's because the damage inflicted to enemies will be constant or ongoing for as long as they hit by that power.

      trigger {
      life = -1 ;
      name = powerup ;
      remove_on_node_end = true ;
      time = 0 ;
         affecter {
         affect_type = scale ;
         attribute = def_damage ;
         level = 0 ;
         }

         special_fx {
         bolt = Bip01 Spine2 ;
         effect = char/captam/p4_power ;
         fxlevel = 1 ;
         how_used = primary ;
         }

         special_fx {
         bolt = Bip01 Spine2 ;
         effect = char/captam/p4_blast ;
         how_used = primary ;
         }

         special_fx {
         effect = char/captam/p4_power ;
         fxlevel = 3 ;
         how_used = primary ;
         }

      }

This is the powerup that features mostly effects that cover the character as the power is being done. From my booster, I've purposely added "def_damage" so that he can't take damage during it.

      trigger {
      name = sound ;
      sound = char/captam_m/p4_power ;
      time = 0 ;
      }

      chain {
      action = samepowerhold ;
      result = power4 ;
      }

      chain {
      action = touch ;
      result = power4_break ;

      }

      chain {
      action = idle ;
      result = fastballland ;
      }

touch is what happens when the charging power runs into a wall or structure. When this happens, you can set a result there. I usually place "idle" there, but in this case, "power4_break" is there. This refers to the second coding entry that you see below. "Fastballland" refers to a command special to the "Fastball Special." I'm sure you all know what that is. In this case, it means that Cap will roll when the charging power is done.


   FightMove {
   animenum = ea_idle ;
   is_power = true ;
   lockangles = true ;
   lockspeed = true ;
   locktransitionangles = true ;
   name = power4_break ;
   noautoaim = true ;
   playspeed = 10 ;
   priority = 5 ;
      chain {
      action = idle ;
      result = idle ;
      }

   }

This is the second coding entry that this move uses, but if you use "idle" under the touch action, then this entry is not necessary. The "animenum" here reads "ea_idle," so it does the same thing as idle itself, making this entry redundant.


That's pretty much it. Charging powers are very easy to do. All you have to do is follow the coding above, adjust it to your character's values, and pick a good animation that allows for charging powers. Not just any animation will do, it has to be an ongoing animation. Try them out but pace yourself.






Lesson Takeaway:
-Practice with charging powers as they are relatively easier to create then other power types.
-Damage is constant, so the same should be said for energy cost per second. Add turnrate for turning or steering.
-Avoid redundant coding entries if a default coding entry does the same thing.
-Choose a running or sliding animation for this kind of power. Otherwise, it will look silly.
-Use powerups to add boosts and effects to your character during it, if you wish to. Not a requirement, but a bonus.


Title: The Outsider's Guide To Modding - Lesson 13
Post by: Outsider on February 12, 2020, 01:16PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 13: Power Coding (Beam)

Now let's get to the more flashier powers. This lesson introduces one kind of power that is normally seen -- beam powers. Not too difficult to do once you know what it's meant to do. 

What are beams? It's the type of powers where a character fires a laser-like power usually from his/her hands, head, or chest, delivering damage to enemies from a far distance away. In some cases, you can charge them (mentioned in a previous lesson) to have the character hold before firing to take even more damage.

For this lesson, we will look at :iceman: Iceman. He has a power called the Ice Beam which shows how this type of power works. Open his powerstyle file, hit Ctrl + F to Find, type "name = power5" and press Enter. You'll run into the coding for it. Now, let's look at the coding below.


   FightMove {
   aireusetime = 4 ;
   aitype = beam ;
   animenum = ea_power5 ;
   combotextfinisher = Ice ;
   combotextstarter = Bitter ;
   icon = 4 ;
   lockangles = true ;
   name = power5 ;
   powerup_tag = ice_power2 ;
   priority = 5 ;
      require {
      cat = skill ;
      item = iceman_p5 ;
      level = 1 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/iceman/p5_charge ;
      name = effect_sound ;
      sound = char/iceman_m/p3_charge ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/iceman/p5_charge ;
      name = effect ;
      time = 0 ;
      }

      trigger {
      name = sound ;
      sound = char/iceman_m/p5_impact ;
      time = 0.5 ;
      }

      trigger {
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 22 -4 39 ;
      beambolt = Bip01 R Hand ;
      beameffect = char/iceman/p5_power ;
      damage = %iceman_p5_dmg ;
      damagetype = dmg_cold ;
      fxlevel = 1 ;
      hiteffect = char/iceman/p5_impact ;
      inherit = beam ;
      maxrange = 500 ;
      name = freeze_fx ;
      powerusage = %iceman_p5_pwr ;
      radius = 0 ;
      spawneffect = char/iceman/p5_shot ;
      tag = 3 ;
      time = 0.5 ;
      victimeventtag = 20 ;
         damageMod {
         name = dmgmod_environment ;
         }

         damageMod {
         name = dmgmod_extinguish ;
         }

      }

      trigger {
      die_on_critical = true ;
      life = %iceman_p5_lif ;
      name = freeze_powerup ;
      tag = 20 ;
      time = -1 ;
         powerup {
         life = 2 ;
         name = chill_powerup ;
            affecter {
            affect_type = scale ;
            attribute = move ;
            level = 0.3 ;
            }

         }

      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }


Most beam powers only need one fightmove (coding entry) unless you want to add a charge to it. The Ice Beam doesn't have charging, so it's only one coding entry. Again, I'll show it to you in sections to make it easy to understand. Pay special attention to the parts in BLUE, which wasn't covered.

   FightMove {
   aireusetime = 4 ;
   aitype = beam ;
   animenum = ea_power5 ;
   combotextfinisher = Ice ;
   combotextstarter = Bitter ;
   icon = 4 ;
   lockangles = true ;
   name = power5 ;
   powerup_tag = ice_power2 ;
   priority = 5 ;
      require {
      cat = skill ;
      item = iceman_p5 ;
      level = 1 ;
      }

aireusetime = Not sure, but I believe that is the number of seconds that the game's AI will take before attempting to use that power again if the AI is controlling the character.
Notice that the aitype says "beam." That tells the game's internal computer that the power is a beam attack. Some beams' aitype will say "beamanyrange," which implies that the beam will reach any enemy, even if they are above or below the character.


      trigger {
      bolt = Bip01 R Hand ;
      effect = char/iceman/p5_charge ;
      name = effect_sound ;
      sound = char/iceman_m/p3_charge ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/iceman/p5_charge ;
      name = effect ;
      time = 0 ;
      }

      trigger {
      name = sound ;
      sound = char/iceman_m/p5_impact ;
      time = 0.5 ;
      }

Effect and sound coding entries. I will discuss those in future lessons, as you must understand how effects and sounds work before attempting them.

      trigger {
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 22 -4 39 ;
      beambolt = Bip01 R Hand ;
      beameffect = char/iceman/p5_power ;

      damage = %iceman_p5_dmg ;
      damagetype = dmg_cold ;
      fxlevel = 1 ;
      hiteffect = char/iceman/p5_impact ;
      inherit = beam ;
      maxrange = 500 ;
      name = freeze_fx ;
      powerusage = %iceman_p5_pwr ;
      radius = 0 ;
      spawneffect = char/iceman/p5_shot ;
      tag = 3 ;
      time = 0.5 ;
      victimeventtag = 20 ;
         damageMod {
         name = dmgmod_environment ;
         }

         damageMod {
         name = dmgmod_extinguish ;
         }

      }

OK, this is the actual coding entry for the beam. Some of the terms you should know:
attack_bone_angles and attack_bone_pos determines where from the body part that the beam is firing from. I usuall don't bother with these, as without them, it still fires from a good position.
beambolt works just like bolt where you tell the game what body part is the beam firing from.
beameffect is the effect used for the beam. Obviously not just any effect will do -- any beam effect will do and you can just recolor & resize it. More on that in a future lesson.
hiteffect is the effect that you see when the beam hits an enemy. This can be done with any kind of power, not just beams.
Note that with beams. the maxrange is 500 or higher, as it is meant to hit enemies from a distance.
spawneffect is when an extra effect is released when the beam is activated. This usually only applies to constant beams, which I'll explain in a little bit.
By the way, you see that the name is freeze_fx. Again, remember that as long as you have inherit followed by what kind of power it is (in this case, beam), the name can be whatever you want.

      trigger {
      die_on_critical = true ;
      life = %iceman_p5_lif ;
      name = freeze_powerup ;
      tag = 20 ;
      time = -1 ;
         powerup {
         life = 2 ;
         name = chill_powerup ;
            affecter {
            affect_type = scale ;
            attribute = move ;
            level = 0.3 ;
            }

         }

      }

This is the status aliment that happens when an enemy is hit by the beam, pertaining to an event listed in the powerstyle file. Mentioned in a previous lesson.

      chain {
      action = Idle ;
      result = idle ;
      }

   }




So now you have an idea of how beam coding works. But what if you don't want the beam to hit just one enemy? What if you want the beam to hit multiple targets in the way? Simple. Just add what I will place in VIOLET...

      trigger {
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 22 -4 39 ;
      beambolt = Bip01 R Hand ;
      beameffect = char/iceman/p5_power ;
      damage = %iceman_p5_dmg ;
      damagetype = dmg_cold ;
      fxlevel = 1 ;
      hiteffect = char/iceman/p5_impact ;
      inherit = beam ;
      maxrange = 500 ;
      name = freeze_fx ;
      pierce = true ;
      powerusage = %iceman_p5_pwr ;
      radius = 0 ;
      spawneffect = char/iceman/p5_shot ;
      tag = 3 ;
      time = 0.5 ;
      victimeventtag = 20 ;
         damageMod {
         name = dmgmod_environment ;
         }

         damageMod {
         name = dmgmod_extinguish ;
         }

      }

   }

pierce is quite literally that. It allows a beam to pierce through and hit multiple enemies, provided that they are in the beam's range. This is considered a special function, so it's usually used after a character charges up a beam power.





CONSTANT BEAM POWERS

There are some beam attacks where the character holds position and fires constantly to hit targets multiple times instead of just once. These are called constant beam powers. For this, let's look at :humant: Human Torch. He has a power called the Flame Thrower, which is a constant beam power. Open his powerstyle file, hit Ctrl + F to Find, type "name = power1" and press Enter. You'll run into the coding for it. Now, let's look at the coding below.


   FightMove {
   animenum = ea_power1 ;
   icon = 0 ;
   is_power = true ;
   lockangles = true ;
   name = power1 ;
   noautoaim = true ;
   powerup_tag = humant_ranged ;
   priority = 5 ;
   startchaintime = 0.7 ;
   turnrate = 0.4 ;
      require {
      cat = skill ;
      item = humant_p1 ;
      level = 1 ;
      }

      trigger {
      failtag = 100 ;
      is_flying = true ;
      name = filter ;
      time = 0 ;
      }

      trigger {
      name = FlameOn ;
      tag = 100 ;
      time = 0 ;
      }

      trigger {
      critical = true ;
      name = FlameOff ;
      time = -1 ;
      }

      trigger {
      name = sound ;
      sound = char/humant_m/p1_charge ;
      time = 0 ;
      }

      trigger {
      name = powerusage ;
      powerusage = %humant_p1_pwr ;
      time = 0 ;
      }

      chain {
      action = Idle ;
      result = power1_loop ;
      }

   }

   FightMove {
   aitype = projectile ;
   always_target = true ;
   animenum = ea_power1_loop ;
   combotextfinisher = Barrage ;
   combotextstarter = Flaring ;
   energypersecond = %humant_p1_pwr ;
   icon = 0 ;
   is_power = true ;
   lockangles = false ;
   lockchaining = true ;
   lockspeed = true ;
   locktransitionangles = true ;
   name = power1_loop ;
   noautoaim = true ;
   powerup_tag = humant_ranged ;
   priority = 5 ;
   target_only_actors = true ;
   turnrate = 0.35 ;
      event {
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 19 0 56 ;
      beambolt = Bip01 R Hand ;
      damage = 0 ;
      damagetype = dmg_fire ;
      fxlevel = 1 ;
      hiteffect = char/humant/p1_impact ;
      inherit = beam ;
      maxrange = 150 ;
      name = flame_dmg ;
      pierce = true ;
      radius = 24 ;
      spawneffect = char/humant/p1_power ;
      victimeventtag = 100 ;
         damagemod {
         name = dmgmod_no_damage ;
         }

      }

      trigger {
      filteractor = true ;
      name = filter ;
      passtag = 101 ;
      tag = 100 ;
      time = -1 ;
      }

      trigger {
      class = harming ;
      damage = %humant_p1_dmg ;
      damagetype = dmg_fire ;
      life = 3 ;
      name = powerup ;
      next_eventtag = 102 ;
      tag = 101 ;
      time = -1 ;
         special_fx {
         bolt = Bip01 Pelvis ;
         effect = char/humant/p1_aura ;
         fxlevel = 1 ;
         how_used = primary ;
         }

         damageMod {
         remove = dmgmod_no_pain ;
         }

      }

      trigger {
      damage = %humant_p1_dmg ;
      damagetype = dmg_fire ;
      name = hitme ;
      tag = 102 ;
      time = -1 ;
      type = ce_atk_self ;
      }

      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

      trigger {
      loop_timeout = 2 ;
      loop_type = start ;
      manual_loop_timer = 0.2 ;
      name = sound ;
      sound = char/humant_m/p1_loop ;
      time = 1 ;
      }

      trigger {
      index = 1 ;
      name = flame_dmg ;
      time = 0.15 ;
      }

      trigger {
      index = 2 ;
      name = flame_dmg ;
      time = 0.3 ;
      }

      trigger {
      index = 3 ;
      name = flame_dmg ;
      time = 0.45 ;
      }

      trigger {
      index = 4 ;
      name = flame_dmg ;
      time = 0.6 ;
      }

      trigger {
      index = 5 ;
      name = flame_dmg ;
      time = 0.75 ;
      }

      trigger {
      index = 6 ;
      name = flame_dmg ;
      time = 0.9 ;
      }

      trigger {
      critical = true ;
      name = FlameOff ;
      time = -1 ;
      }

      chain {
      action = samepowerhold ;
      result = power1_loop ;
      }

      chain {
      action = idle ;
      result = power1_end ;
      }

   }

   FightMove {
   animenum = ea_power1_end ;
   icon = 0 ;
   is_power = true ;
   lockspeed = false ;
   locktransitionangles = false ;
   name = power1_end ;
   noautoaim = true ;
   turnrate = 0.4 ;
      trigger {
      loop_type = stop ;
      name = sound ;
      sound = char/humant_m/p1_loop ;
      time = 0 ;
      }

      trigger {
      failtag = 100 ;
      is_flying = true ;
      name = filter ;
      time = 0 ;
      }

      trigger {
      critical = true ;
      name = FlameOff ;
      tag = 100 ;
      time = -1 ;
      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }


There are three coding entries (fightmoves) here. We will focus on only the power1_loop one, since that is where the attack coding is. Again, let's break it down into sections so you all can understand it. The parts in BLUE weren't covered.

   FightMove {
   aitype = projectile ;
   always_target = true ;
   animenum = ea_power1_loop ;
   combotextfinisher = Barrage ;
   combotextstarter = Flaring ;
   energypersecond = %humant_p1_pwr ;
   icon = 0 ;
   is_power = true ;
   lockangles = false ;
   lockchaining = true ;
   lockspeed = true ;
   locktransitionangles = true ;
   name = power1_loop ;
   noautoaim = true ;
   powerup_tag = humant_ranged ;
   priority = 5 ;
   target_only_actors = true ;
   turnrate = 0.35 ;

By now, you know most of those terms mean. Even though the aitype says "projectile," you will see in a bit that it is actually a beam attack.
For constant beam powers, make sure that the animation you choose is a holding animation, meaning that the character will stay in that pose as players hold down the power button.
target_only_actors means that the power will not destroy objects, only enemies. This piece is not needed for Mental powers obviously, because objects do not have minds of their own.


      event {
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 19 0 56 ;
      beambolt = Bip01 R Hand ;
      damage = 0 ;
      damagetype = dmg_fire ;
      fxlevel = 1 ;
      hiteffect = char/humant/p1_impact ;
      inherit = beam ;
      maxrange = 150 ;
      name = flame_dmg ;
      pierce = true ;
      radius = 24 ;
      spawneffect = char/humant/p1_power ;
      victimeventtag = 100 ;
         damagemod {
         name = dmgmod_no_damage ;
         }

      }

This the actual damage coding entry, but notice it is listed as an event, not a trigger. This is so you only have to write this once instead of multiple times, since this is a constant beam attack. That's why you don't see "time" there. You may also wonder why the damagemod (dmgmod) says "no_damage." That is because of the victimeventtag, which connects to the coding below.
Pay close attention that name of the power is called "flame_dmg." You'll see why later on...


      trigger {
      filteractor = true ;
      name = filter ;
      passtag = 101 ;
      tag = 100 ;
      time = -1 ;
      }

This is saying to the game, "Is the target that the power is hitting alive? If so, go to the passtag."

      trigger {
      class = harming ;
      damage = %humant_p1_dmg ;
      damagetype = dmg_fire ;
      life = 3 ;
      name = powerup ;
      next_eventtag = 102 ;
      tag = 101 ;
      time = -1 ;
         special_fx {
         bolt = Bip01 Pelvis ;
         effect = char/humant/p1_aura ;
         fxlevel = 1 ;
         how_used = primary ;
         }

         damageMod {
         remove = dmgmod_no_pain ;
         }

      }

      trigger {
      damage = %humant_p1_dmg ;
      damagetype = dmg_fire ;
      name = hitme ;
      tag = 102 ;
      time = -1 ;
      type = ce_atk_self ;
      }

These two are the status aliments that occurs when an actor (living enemy) gets hit by that power. class = harming in this case says that the enemy will get burned on fire for a time.

      trigger {
      button = samepowerhold ;
      name = button_hint ;
      time = 0 ;
      }

The button hint, as discussed before.

      trigger {
      loop_timeout = 2 ;
      loop_type = start ;
      manual_loop_timer = 0.2 ;
      name = sound ;
      sound = char/humant_m/p1_loop ;
      time = 1 ;
      }

The sound coding for when the constant beam power activates. More on sounds in a future lesson.

      trigger {
      index = 1 ;
      name = flame_dmg ;
      time = 0.15 ;
      }

      trigger {
      index = 2 ;
      name = flame_dmg ;
      time = 0.3 ;
      }

      trigger {
      index = 3 ;
      name = flame_dmg ;
      time = 0.45 ;
      }

      trigger {
      index = 4 ;
      name = flame_dmg ;
      time = 0.6 ;
      }

      trigger {
      index = 5 ;
      name = flame_dmg ;
      time = 0.75 ;
      }

      trigger {
      index = 6 ;
      name = flame_dmg ;
      time = 0.9 ;
      }

Remember that the event we saw before was called "flame_dmg?"  Well, here it is again, except now you don't have to write all of that again, because these indexed entries all connect to that event. index means that each one will cause damage. This means that when the character fires the power, an enemy can suffer damage multiple times -- hence, the constant part of the beam attack. In this case, six times.

      trigger {
      critical = true ;
      name = FlameOff ;
      time = -1 ;
      }

      chain {
      action = samepowerhold ;
      result = power1_loop ;
      }

      chain {
      action = idle ;
      result = power1_end ;
      }

   }

That just about does it. Beam powers can be fun to create as long as you have the right animations and effects for them. Practice and try them out with the comfort of knowing that you don't have to go up close to hit enemies with them.






Lesson Takeaway:
-Beam powers attack from a distance. Have correct animations and effects for them.
-Maximum range should be 500 and higher. They can be charged for more damage and for the pierce entry.
-Hit effects and status aliments can connect to a beam power easily.
-You must have a holding animation and indexed entries for constant beam powers.
-You can make beams to hit enemies from above and below you, and only harm living enemies if you wish.

Title: The Outsider's Guide To Modding - Lesson 14
Post by: Outsider on February 22, 2020, 11:33PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 14: Power Coding (Projectile)

This next kind of attack power is one of the harder ones, so brace yourself. It's projectile powers, and it's not as simple as the others you've seen.

What are projectiles? It's the type of powers where a character throws a ball/sphere of an energy type, or an object at an enemy. It can range from fireballs and energy blasts to rockets/missiles and bombs. Many mods have at least one projectile attack, so it's important to know how to do these. Unlike other attack powers, though, projectiles need an extra file for them to work. These are called entities. I'll show you why this is important, as you simply cannot create a projectile power without it.

For this lesson, we will look at  :strange: Dr. Strange. His first power are the Mystic Bolts, which are projectiles. First, open his powerstyle file, and let's look at the first event entry...

   event {
   actorbolt = Bip01 L Hand ;
   attacktype = projectile ;
   count = 1 ;
   damage = %drstr_p1_dmg ;
   damagescale = none ;
   entity = MysticBolt ;
   filename = ents_drstr ;
   fulltargeting = true ;
   inherit = projectile ;
   maxrange = 500 ;
   name = MysticBolt ;
   speed = 1000 ;
   targetable = true ;
   }

This is the actual coding for the projectile power. (Note that because it's an event, it can be placed anywhere in the powerstyle, versus trigger, which has to be inside the fightmove of the power, and must have a time. Now, I'll explain some of the terms you're seeing here.

actorbolt: Where of the body that the projectile is firing/shooting from.
count: Quantity/number of the projectile. If this is not here, it will be 1. You can make it as many as you want or you can set a value connected to your character's talents file.
entity: The name of the entity that you named inside the entities file. More on that in a bit.
filename: The entities file that the entity came from. More on that in a bit.
fulltargeting: Honestly not sure what this does, but put it there anyway.
maxrange: The range that the projectile can travel before fading away.
speed: The speed of the projectile. The higher this value, the faster the projectile will move.
spread: This one is not present here, but if added, it will spread out the number of projectiles thrown. For example, if the count is 3, and the spread is 70 let's say, then the projectiles will spread out -- one to the left, one to the center, and one to the right.
targetable: See "fulltargeting."



So now that you've seen the coding for the projectile, hit Ctrl + F to Find, type "name = power1" and press Enter. You'll run into the rest of the coding for it. Let's look at it below.

   FightMove {
   aitype = projectile ;
   animenum = ea_power1 ;
   icon = 0 ;
   is_power = true ;
   name = power1 ;
   noautoaim = true ;
   powerup_tag = DrS_MagicAttack ;
   priority = 5 ;
      require {
      cat = skill ;
      item = drstr_p1 ;
      level = 1 ;
      }

      trigger {
      name = powerusage ;
      powerusage = %drstr_p1_pwr ;
      time = -1 ;
      }

      chain {
      action = Idle ;
      result = power1_looping ;
      }

   }

This is the set-up for his projectile power. Notice that powerusage has the time at "-1," which means that the player can't do it without the powerusage at whatever value you set, but no energy will be taken at that time.

   FightMove {
   aitype = projectile ;
   animenum = ea_power1_loop ;
   combotextfinisher = Missile ;
   combotextstarter = Mystic ;
   icon = 0 ;
   is_power = true ;
   name = power1_looping ;
   noautoaim = true ;
   powerup_tag = DrS_MagicAttack ;
   priority = 5 ;
   startchaintime = 0.99 ;
      trigger {
      name = powerusage ;
      powerusage = %drstr_p1_pwr ;
      time = 0 ;
      }

      trigger {
      button = samepowerclick ;
      name = hint ;
      time = 0.231 ;
      type = ce_power_button_hint ;
      }

The button hint, which will be displayed as the player is using the power. This one, "samepowerclick" tells the player to keep pressing the power button, which will keep firing the projectile.

      trigger {
      actorbolt = Bip01 R Hand ;
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 19 -13 52 ;
      name = MysticBolt ;
      time = 0.25 ;
      }

This refers to the event we saw earlier, "MysticBolt." That's why you don't have to write all of it again.

      trigger {
      name = sound ;
      sound = char/drstr_m/p1_fire ;
      time = 0.25 ;
      }

      trigger {
      actorbolt = Bip01 L Hand ;
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 28 2 37 ;
      name = MysticBolt ;
      time = 0.88 ;
      }

As you can see, the coding shows that Dr. Strange will fire two projectiles. If the player presses the power button again, he will fire two more, costing energy again.

      trigger {
      name = sound ;
      sound = char/drstr_m/p1_fire ;
      time = 0.88 ;
      }

      chain {
      action = Idle ;
      result = power1_end ;
      }

      chain {
      action = samepowerclick ;
      result = power1_looping ;
      }

   }

   FightMove {
   aitype = projectile ;
   animenum = ea_power1_end ;
   icon = 0 ;
   is_power = true ;
   name = power1_end ;
   noautoaim = true ;
   powerup_tag = DrS_MagicAttack ;
   priority = 5 ;
      chain {
      action = Idle ;
      result = idle ;
      }

   }

These entries are necessary due to the animation that was used to fire the projectiles.





ENTITIES FILE

So, as I said before, you must have an entities file to create a projectile power. So, go to your game's data folder, then go to the entities folder. See all of those files? Those are the entities files for every mod that uses at least one. Notice that they end with the extension ".xmlb" which means that if you open (decompile) one of them, edit what you want, then close (compile) it using XLMBCUI, you won't have to change the extensions. To create an entities file, just copy one of them, paste it where you are doing your modding, and rename it to "ents_character." Whatever you name this file must be the same as the filename in the projectile coding mentioned above. Otherwise, it won't work.

Now, earlier you saw that Dr. Strange's entities file is named "ents_drstr," as that was the filename. If you look inside, you'll see that one of his entries there is this...

   entity {
   classname = projectileent ;
   deatheffect = char/drstr/p1_impact ;
   deathsound = char/drstr_m/p1_impact ;
   dieoncontact = true ;
   fxlevel = 1 ;
   health = 1 ;
   lifetime = 3 ;
   loopfx = char/drstr/p1_power ;
   loopfxstarton = true ;
   mass = 30 ;
   name = MysticBolt ;
   nogravity = true ;
   radius = 1 ;
   randompickups = false ;
   spawneffect = char/drstr/p1_charge ;
   stopprojectile = false ;
   }


See that the name there is MysticBolt? That refers to the entity mentioned earlier. They also must be exactly the same, or it will not work. Now let's go through the terms.

classname: The type of projectile. Most of the time, it's "projectileent," but it can be others. More on that in a bit.
deatheffect: The effect made when the projectile hits an enemy or a wall.
deathsound: The sound made when the projectile hits an enemy or a wall.
dieoncontact: This means that the projectile will be destroyed when it hits an enemy or wall. If you put "false," it will keep going.
fxlevel: This refers to the effects being used. More on effects in a future lesson.
health: This is the health of the projectile. See, once fired, shot, or released, the projectile takes a life of its own. So, if the health is low, it can be nullified by another projectile. If the health is high, another projectile won't be strong enough to nullify it and it will keep moving.
lifetime: This details how many seconds the projectile will last before it fades away.
loopfx: This refers to the effect that creates the projectile. This is why you must have the right kind of effect for the entity.
loopfxstarton: I think this means that the effect starts right away, which goes without saying.
mass: The weight or heaviness of the projectile. Not sure why this one is important, quite frankly.
name: The name of the entity. Whatever you put here must match the name on the projectile coding.
nogravity: This means literally that. If you put "true," then the projectile will fly forward continuously. If you put "false," then the projectile will fall to the ground once thrown.
radius: The radius of the projectile, but not its effect. If this value is high, then the projectile may die when trying to go through a doorway. If it's low, then you can shoot it through a doorway, and it will keep going.
randompickups: Not sure what this does or means, but just leave it there.
spawneffect: I think this is the effect that appears when the projectile first fires.
stopprojectile: See "randompickups."





HOMING PROJECTILES

Now let's say you want the projectile to follow the enemy instead of just going straight. It only takes two simple changes. Note them in VIOLET.

   entity {
   classname = guidedprojectileent ;
   deatheffect = char/drstr/p1_impact ;
   deathsound = char/drstr_m/p1_impact ;
   dieoncontact = true ;
   fxlevel = 1 ;
   health = 1 ;
   hometarget = true ;
   lifetime = 3 ;
   loopfx = char/drstr/p1_power ;
   loopfxstarton = true ;
   mass = 30 ;
   name = MysticBolt ;
   nogravity = true ;
   radius = 1 ;
   randompickups = false ;
   spawneffect = char/drstr/p1_charge ;
   stopprojectile = false ;
   }

Adding those values will allow the projectile to be "heat-seeking" and follow the nearest enemy until it makes contact with them.







EXPLOSIVE PROJECTILES

Now you know how to create a fireball or energy projectile kind of power. But what if you wanted to create a missile or bomb instead? Let's look at :nfury: Nick Fury. His fourth power is the frag, which is an entity. So look again at the entities folder. Nick Fury's entities file is "ents_nickfury," and if you look inside, you'll see only one entity, which is this:

   entity {
   animstarton = false ;
   bounce = 0.001 ;
   classname = projectileent ;
   contactcountdown = 1.6 ;
   deatheffect = base/material/explode/exp_generic_lrg ;
   deathsound = char/fury_m/p4_explode ;
   dieoncontact = false ;
   friction = 30 ;
   fxlevel = 1 ;
   health = 50 ;
   lifetime = 10 ;
   mass = 30 ;
   model = models/bolton/nickfury_mine ;
   name = nickfury_p4_grenade ;
   nocollide = true ;
   postanimlife = 2 ;
   radius = 12 ;
   randompickups = false ;
   speed = 300 ;
   stophero = false ;
   stopprojectile = false ;
   }

As you can see, the terms are nearly the same as Dr. Strange's that I showed you earlier. But there are a few differences. Observe...

animstarton: Unsure what this is. May not be necessary.
bounce: The value and amount of times that the projectile will bounce once it hits the ground.
contactcountdown: The number of seconds before the entity explodes and cause damage. This is why the deatheffect and deathsound should resemble an explosion.
dieoncontact: Make this one "true" if it's something like a missile or rocket, and "false" if it's a bomb.
friction: Not sure what this does.
model: The object used for the explosive. Use a model from your game's models folder to create it.
nocollide This means that the projectile will not react with an enemy while being thrown. Good for bombs.
postanimlife: Animations that the object does once it hits the ground or after it's shot.
stophero: See "animstarton."

Notice that you don't see "nogravity" there. That means it does have gravity. So when Fury throws it, it will land on the ground. If you want to create missiles instead of bombs, then "nogravity" must equal true, but should still explode on impact.

So, now open Nick Fury's powerstyle file, hit Ctrl + F to Find, type "name = power4" and hit Enter. You'll run into the coding for this power. Let's take a look, as I break down what they mean.

   FightMove {
   aitype = projectile ;
   animenum = ea_power4 ;
   combotextfinisher = Shrapnel ;
   combotextstarter = Disintegration ;
   icon = 3 ;
   is_power = true ;
   lockangles = true ;
   name = power4 ;
   priority = 5 ;
      require {
      cat = skill ;
      item = nickf_p4 ;
      level = 1 ;
      }

      trigger {
      name = powerusage ;
      powerusage = %nickf_p4_pwr ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/fury/p4_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.22 ;
      }

      trigger {
      name = sound ;
      sound = char/fury_m/p4_charge ;
      time = 0.49 ;
      }

By now, you know what these entries mean. Don't worry about effects and sounds -- that's for future lessons.

      trigger {
      actorbolt = Bip01 R Hand ;
      attack_bone_angles = 0 0 0 ;
      attack_bone_pos = 30 2 58 ;
      attacktype = blast ;
      damage = 1 ;
      damagetype = dmg_fire ;
      entity = nickfury_p4_grenade ;
      explodedamage = %nickf_p4_dmg ;
      explodedamagemod = dmgmod_auto_knockback ;
      explodedamagetype = dmg_physical ;
      exploderadius = 96 ;
      filename = ents_nickfury ;
      name = projectile ;
      speed = 350 ;
      time = 0.49 ;
      }

OK, this is the actual coding for the projectile. This is similar to the first coding entry you saw at the beginning of the lesson. Notice that is written as a trigger instead of an event, and has a time. That means it's intended to only happen once. And once again, the entity you see there matches the name of the entity at the entities file. The new terms you're seeing are:

explodedamage: The amount of damage that the explosion will cause. That is why damage is listed at 1, as the REAL damage takes place in the explosion.
explodedamagemod: Remember the "damagemod" codes I showed you such as "dmgmod_auto_knockback," and "dmgmod_popup"? Well, this works the same way, except it happens when the explosion happens.
explodedamagetype: The damage type that the explosion will inflict on enemies.
exploderadius: The radius that the explosion will hit enemies. The higher the radius, the wider the area where the explosion will inflict damage. Bombs usually have a radius of 90-150.

Note that you can also put explodeknockback, which is the amount of distance enemies will get knocked back after hit by the explosion. Also note that explosions will not harm the player nor his/her allies.



      chain {
      action = idle ;
      result = idle ;
      }

   }

Projectile powers are a bit more difficult than others, but they can make for some really cool powers. Take a look at some entities, and experiment.


SPECIAL NOTE:
Entities files are not just for projectiles, you know. They are also good for vehicles, such as Ghost Rider's motorcycle and Arcade's bumper car. Coding like that, though, is far more complex. I would just look at what they did, and mimic it if you want your character to drive a vehicle.






Lesson Takeaway:
-Projectile powers require an entities file to work. This is unavoidable, so learn it as best as you can.
-The filename of the coding must match the name of the entity file, and the entity listed in the coding must match the name of the entity in the entities file.
-Pick effects, sounds, and models (if any) to best resemble what you want the projectile to do.
-Homing projectiles and bombs or missiles are possible as well, if the coding is correct.
-Once you know what the terms in the coding entries mean, you can then customize your projectiles in a variety of ways.

Title: The Outsider's Guide To Modding - Lesson 15
Post by: Outsider on February 25, 2020, 11:59PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 15: Xtreme Coding

Ah yes, that ever-so-important attack power known as the Xtreme. This lesson teaches you how to create an Xtreme attack for your character. And don't worry -- it's easier than you think.

What are Xtreme powers? It's your character's most devastating, over-the-top attack power. Unlike other powers, it does not use energy. Instead, you have to gain full momentum to be able to use it. Xtreme powers unlock at level 10. All characters typically have just one Xtreme power. Very rare does a character have two.

For this lesson, we will look at three kinds of Xtreme powers, using :thor: Thor, :stark: Iron Man, and :moonk: Moon Knight respectively. So, open up Thor's powerstyle file (ps_thor.engb), hit Ctrl + F to Find, type "team_xtreme" and hit Enter. You'll find the coding for it. Do the same for ps_ironman.engb, and ps_moonknight.engb. Now let's look at the first coding entry for Moon Knight's Xtreme.


   FightMove {
   animenum = ea_idle1 ;
   blendtime = 0 ;
   handler = ch_team_xtreme ;
   icon = 7 ;
   is_power = true ;
   lockangles = true ;
   lockchaining = false ;
   lockspeed = true ;
   name = team_xtreme ;
   playspeed = 10 ;
   priority = uninterruptable ;
      require {
      cat = skill ;
      item = moonk_p8 ;
      level = 1 ;
      }

      require {
      cat = xtreme ;
      level = 1 ;
      }

      trigger {
      name = xtreme_start ;
      only_non_looped = true ;
      team_xtreme = 2 ;
      time = 0 ;
      }

      chain {
      action = idle ;
      result = team_xtreme ;
      }

      chain {
      action = special ;
      result = power8 ;
      }

   }


See that? That is how EVERY Xtreme power starts. They all have this, so this MUST be the first coding entry for all Xtreme powers. Let's look closer at what each means.

   FightMove {
   animenum = ea_idle1 ;
   blendtime = 0 ;
   handler = ch_team_xtreme ;
   icon = 7 ;
   is_power = true ;
   lockangles = true ;
   lockchaining = false ;
   lockspeed = true ;
   name = team_xtreme ;
   playspeed = 10 ;
   priority = uninterruptable ;

This is the introduction to the Xtreme coding. The name is always called "team_xtreme," as this is the brief pause that sets up the Xtreme power. See, in Xtreme powers, it is an event that darkens the lights and slows down the game on purpose to indicate that something big is about to happen. Because the game is slowing down, we need the playspeed at 10. Lower playspeed will cause the pause to delay, so keep this one at 10. The handler MUST be "ch_team_xtreme" as it lets the game know that this is an Xtreme power. Also, the animenum (animation) should be ea_idle1. You can put another animation there, but why?

      require {
      cat = skill ;
      item = moonk_p8 ;
      level = 1 ;
      }

      require {
      cat = xtreme ;
      level = 1 ;
      }

These are the requirements, as you know. But this time, the Xtreme requirement is there as well. This is telling the game that your character cannot perform this power normally, and requires a full momentum bar to work. Keep this here.

      trigger {
      name = xtreme_start ;
      only_non_looped = true ;
      team_xtreme = 2 ;
      time = 0 ;
      }

This is the xtreme_start, telling the game computer to start the Xtreme. I am uncertain what only_non_looped = true means, honestly, but keep that there. As for "team_xtreme = 2 ;" I can tell you that number placed there does not matter, so just put any number 1-9.

      chain {
      action = idle ;
      result = team_xtreme ;
      }

      chain {
      action = special ;
      result = power8 ;
      }

   }

This is the chain. Don't worry that team_xtreme is under the idle action -- it will not repeat that pause. It will go right into the special action, which is your character's Xtreme.

Now, take a look at the first coding energy for Iron Man's Xtreme... See? It's pretty much the same. Now look at the first coding energy for Thor's Xtreme... Again, it's the same. Except one thing was added there...

      trigger {
      name = xtreme_start ;
      next_eventtag = 1 ;
      only_non_looped = true ;
      team_xtreme = 7 ;
      time = 0 ;
      }

      trigger {
      apply_ally = true ;
      heal_type = energy ;
      name = heal ;
      percent = %thor_p9_hlt ;
      tag = 1 ;
      time = -1 ;
      type = ce_heal ;
      }

Thor's Xtreme has it where it will also restore energy to each of your character's team. You can place a powerup there if you wish. :captainamerica2: Captain America and :pman: Luke Cage have powerups during an Xtreme that boosts their team. Experiment with that.





Now, let's go to Thor's Xtreme and scroll down to the next coding entry, which will be his actual Xtreme power. Thor's is an example of a Radial Xtreme, which is the most common kind. Again, I will show you what each mean.

   FightMove {
   animenum = ea_power9 ;
   combotextfinisher = Wrath ;
   icon = 8 ;
   is_power = true ;
   lockangles = true ;
   lockspeed = true ;
   name = power9 ;
   playspeed = 10 ;
   powerup_tag = ghost_p9 ;
   priority = uninterruptable ;
   takeimpactdamage = false ;

This is the beginning of his actual coding for it. For Xtreme powers, usually the priority is uninterruptable. And again, the playspeed is at 10. Here, you can lower the number to make the move for more dramatic effect, but don't make it too slow.

Notice the part in red? That is an error -- as that relates to :ghostr: Ghost Rider, not Thor.


      trigger {
      name = hammer_powerup ;
      time = 0 ;
      }

This is a trigger that connects to an event in Thor's powerstyle file. Yes, you can connect events to here.

      trigger {
      always = true ;
      name = camera_override ;
      time = 0 ;
      }

All Xtreme powers have this entry, so keep this here. It tells the computer to focus the game's camera on the character performing the Xtreme.

      trigger {
      description = Attack ;
      name = team_xtreme_msg ;
      time = 0 ;
      title = Wrath of the Gods ;
      }

This is the Xtreme message -- the words that are displayed on the bottom of the screen, showcasing the name of the character's Xtreme. In Thor's case, it's called "Wrath of the Gods." That's why it's named that under title. Whatever you named your character's Xtreme in their talents file should also be named here.

      trigger {
      name = hammer_hand_show ;
      time = 0.1 ;
      }

      trigger {
      name = hammer_back_hide ;
      time = 0.1 ;
      }

More event triggers related to Thor particularly.

      trigger {
      name = sound ;
      sound = char/thor_m/p9_charge ;
      time = 0.2 ;
      }

      trigger {
      effect = char/thor/p8_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.158 ;
      }

      trigger {
      effect = char/thor/p9_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.289 ;
      }

      trigger {
      name = sound ;
      sound = char/thor_m/p2_impact ;
      time = 0.605 ;
      }

These are effects and sounds triggers. Will be covered in future lessons.

      trigger {
      name = velocity ;
      time = 0.52 ;
      up = -40000 ;
      }

This is a special coding entry called velocity. It allows a character to move in a certain direction with the player doing anything. In Thor's case, he has the velocity going up, but at a negative value for some reason.

      trigger {
      effect = char/thor/p9_impact ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.605 ;
      }

      trigger {
      damage = %thor_p9_dmg ;
      damagetype = dmg_electricity ;
      knockback = 40 ;
      maxrange = 600 ;
      name = radial ;
      offset = 65 ;
      tiles = true ;
      time = 0.605 ;
         damagemod {
         name = dmgmod_auto_knockback ;
         }

         damagemod {
         name = dmgmod_ground ;
         }

      }

This is the actual coding entry for the damage of the Xtreme. As you can see, it's set up just like any other radial power, except there is no powerusage, because it's not supposed to deplete energy. Don't worry about "offset" or "tiles" -- not important. Notice that the effect entry before this has the time listed at 0.605? That's because the effect happens just as the damage happens, at the same time of 0.605.

However, there is an error here, shown in red. The maxrange is listed at 600 -- that is far too much, even for an Xtreme. The usual is 300-350, with the highest being 400, which is rare.


      trigger {
      critical = true ;
      name = hammer_to_back ;
      time = 0.92 ;
      }

Another event trigger connected to Thor exclusively.

      trigger {
      critical = true ;
      end = true ;
      name = xtreme_start ;
      time = 0.75 ;
      }

This is where the Xtreme ends, so this is also very important. It tells the game to end the Xtreme moment, so the lights get bright again, and the game's speed returns to normal. It is a MUST to have this at the end of any Xtreme.

      chain {
      action = Idle ;
      result = idle ;
      }

   }

The ending chain.

Does everyone got that? That is usually how the radial Xtreme works. Fairly easy stuff.





Now, let's look at Iron Man's Xtreme, as maybe you don't want a radial attack. Iron Man's is an example of an Area of Effect Xtreme, where attacks happen only where enemies are standing within range. Let's look at the coding. Above the required "team_xtreme" coding entry, you'll see this...

   event {
   damage = %ironman_p8_dmg ;
   damagelevel = 2 ;
   damagetype = dmg_energy ;
   enemynumber = 0 ;
   fxlevel = 1 ;
   hiteffect = char/iron/p8_impact ;
   inherit = blast ;
   maxrange = 300 ;
   name = strike_impact ;
   radius = 60 ;
   random = true ;
      damagemod {
      name = dmgmod_popup ;
      }

   }

See, it was turned from a trigger to an event because it's going to happen more than once. Oh, and don't worry that the enemynumber is 0. It's standard for moves like these. Now, scroll down past the required "team_xtreme" coding, to look at the coding below.

   FightMove {
   animenum = ea_power8 ;
   blendtime = 0 ;
   combotextfinisher = Retribution ;
   icon = 9 ;
   is_power = true ;
   lockangles = true ;
   lockspeed = true ;
   name = power8 ;
   playspeed = 10 ;
   priority = uninterruptable ;
      trigger {
      always = true ;
      name = camera_override ;
      time = 0 ;
      }

      trigger {
      description = Air Strike ;
      name = team_xtreme_msg ;
      time = 0 ;
      title = Air Strike ;
      }

Again, the setup for the Xtreme coding, followed by the camera_override, and the Xtreme message. Iron Man's Xtreme is called "Air Strike." It only needs to say that in the TITLE, not the description. The description doesn't matter.

      trigger {
      name = sound ;
      sound = char/iron_m/p8_charge ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 L Toe0 ;
      effect = char/iron/p8_power ;
      fxlevel = 1 ;
      name = effect_sound ;
      time = 0.25 ;
      }

      trigger {
      bolt = Bip01 R Toe0 ;
      effect = char/iron/p8_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.25 ;
      }

      trigger {
      effect = char/iron/p8_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.25 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.46 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.48 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.5 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.52 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.54 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.56 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.58 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.6 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.62 ;
      }

      trigger {
      bolt = Bip01 Spine2 ;
      effect = char/iron/p8_power ;
      fxlevel = 3 ;
      name = effect ;
      time = 0.64 ;
      }

      trigger {
      effect = char/iron/p8_power ;
      fxlevel = 4 ;
      name = effect_sound ;
      sound = char/iron_m/p8_bomb ;
      time = 0.7 ;
      }

These are all effects and sounds triggers. They are designed to move along with the Xtreme.

      trigger {
      enemynumber = 0 ;
      name = strike_impact ;
      time = 0.7 ;
      }

      trigger {
      enemynumber = 1 ;
      name = strike_impact ;
      time = 0.715 ;
      }

      trigger {
      enemynumber = 2 ;
      name = strike_impact ;
      time = 0.73 ;
      }

      trigger {
      enemynumber = 3 ;
      name = strike_impact ;
      time = 0.745 ;
      }

      trigger {
      enemynumber = 4 ;
      name = strike_impact ;
      time = 0.76 ;
      }

      trigger {
      enemynumber = 5 ;
      name = strike_impact ;
      time = 0.775 ;
      }

      trigger {
      enemynumber = 6 ;
      name = strike_impact ;
      time = 0.79 ;
      }

      trigger {
      enemynumber = 7 ;
      name = strike_impact ;
      time = 0.805 ;
      }

      trigger {
      enemynumber = 8 ;
      name = strike_impact ;
      time = 0.82 ;
      }

      trigger {
      enemynumber = 9 ;
      name = strike_impact ;
      time = 0.835 ;
      }

These entries connect to the event you saw before, because it's happening multiple times. enemynumber refers to the number of enemies there, to which they will each get hit by the power. This is why you see that in each entry here, the enemy number and the time are increasing, creating a sequence of attack.

      trigger {
      effect = char/iron/p8_power ;
      fxlevel = 5 ;
      name = effect ;
      time = 0.803 ;
      }

      trigger {
      critical = true ;
      end = true ;
      name = xtreme_start ;
      time = 0.85 ;
      }

Again, the ending to the Xtreme. Very important. "critical = true" is right indeed.

      chain {
      action = idle ;
      result = idle ;
      }

   }


And there you go. See how it works? Once you know how regular attack powers work, you can understand how Xtreme powers work. You just have to have the additional coding entries that are only for Xtreme powers.

(CONTINUES IN NEXT POST)
Title: The Outsider's Guide To Modding - Lesson 15
Post by: Outsider on February 25, 2020, 11:59PM

Here's one more. Let's look at Moon Knight's Xtreme, as that is an example of a Projectile Xtreme. It is the most damaging kind of Xtreme, because numerous projectiles are bouncing off the walls and can hit enemies from all directions. Because of that, the damage for each is usually lower than other Xtreme powers.

   FightMove {
   animenum = ea_power8 ;
   combotextfinisher = Devastation ;
   is_power = true ;
   lockangles = true ;
   lockspeed = true ;
   name = power8 ;
   playspeed = 10 ;
   priority = uninterruptable ;
      trigger {
      name = skin22_powerup ;
      time = 0 ;
      }

Again, the setup for the Xtreme coding, followed by something pertaining to an event set up for Moon Knight.

      trigger {
      always = true ;
      name = camera_override ;
      time = 0 ;
      }

The required camera_override entry.

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/moonk/p8_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/moonk/p8_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0 ;
      }

      trigger {
      effect = char/moonk/p8_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0 ;
      }

Effects entries.

      trigger {
      description = !BADFILE:@HERO_MOOONKNIGHT@TEAM_XTREME_MSG ;
      name = team_xtreme_msg ;
      time = 0 ;
      title = Lunar Eclipse ;
      }

The Xtreme message coding. I don't know why all that fluff was placed in the description, but again, that doesn't matter. All that matters is what is listed under title. And in Moon Knight's case, his Xtreme is called the Lunar Eclipse. Hence, that's the title.

      trigger {
      name = sound ;
      sound = char/moon_m/xtreme_launch ;
      time = 0.3 ;
      }

      event {
      attacktype = projectile ;
      damage = %moonk_p8_dmg ;
      damagescale = none ;
      damagetype = dmg_energy ;
      entity = moonk_p8_proj ;
      filename = ents_moonknight ;
      inherit = projectile ;
      maxinstances = 8 ;
      name = p8_proj ;
      pierce = true ;
      speed = 1500 ;
      useboltangles = true ;
      }

A sound entry, then the actual damage coding. Once again, it was written as an event because it's going to happen multiple times. Remember the previous lesson about projectiles and entities? This Xtreme uses projectiles -- that's why you see entity and filename there.

      trigger {
      actorbolt = Bip01 R Hand ;
      angoffset = 0 0 0 ;
      attack_bone_pos = 5 -20 43 ;
      index = 1 ;
      name = p8_proj ;
      time = 0.315 ;
      }

      trigger {
      actorbolt = Bip01 L Hand ;
      angoffset = 0 0 -135 ;
      attack_bone_pos = -33 -6 45 ;
      index = 2 ;
      name = p8_proj ;
      time = 0.33 ;
      }

      trigger {
      actorbolt = Bip01 L Hand ;
      angoffset = 0 0 -45 ;
      attack_bone_pos = -13 -23 45 ;
      index = 3 ;
      name = p8_proj ;
      time = 0.36 ;
      }

      trigger {
      actorbolt = Bip01 R Hand ;
      angoffset = 0 0 135 ;
      attack_bone_pos = 1 22 44 ;
      index = 4 ;
      name = p8_proj ;
      time = 0.37 ;
      }

      trigger {
      actorbolt = Bip01 R Hand ;
      angoffset = 0 0 -90 ;
      attack_bone_pos = -9 -19 42 ;
      index = 5 ;
      name = p8_proj ;
      time = 0.44 ;
      }

      trigger {
      actorbolt = Bip01 L Hand ;
      angoffset = 0 0 90 ;
      attack_bone_pos = 8 20 45 ;
      index = 6 ;
      name = p8_proj ;
      time = 0.45 ;
      }

      trigger {
      actorbolt = Bip01 L Hand ;
      angoffset = 0 0 180 ;
      attack_bone_pos = -5 16 44 ;
      index = 7 ;
      name = p8_proj ;
      time = 0.48 ;
      }

      trigger {
      actorbolt = Bip01 R Hand ;
      angoffset = 0 0 45 ;
      attack_bone_pos = 32 12 42 ;
      index = 8 ;
      name = p8_proj ;
      time = 0.5 ;
      }

These are triggers connected to the event you just saw, creating an attack sequence. And remember, index means that each projectile can damage the enemy..

      trigger {
      critical = true ;
      end = true ;
      name = xtreme_start ;
      time = 0.75 ;
      }

The all-important ending of the Xtreme power. A must-have.

      chain {
      action = Idle ;
      result = idle ;
      }

   }

Hopefully by now, you got the jest of how Xtreme powers work. There are other kinds of Xtreme powers as well. View the Xtreme powers of various official characters and modded characters, and decide what you'd like your character to do. Then customize it to your liking.






Lesson Takeaway:
-Xtreme powers cost no energy, so remove the powerusage if it's there.
-Use grand over-the-top effects to create an Xtreme. And pick the right animation because the game slows down during it.
-Always have the xtreme_start, camera_override, Xtreme message, and the Xtreme ending entries. The Xtreme message has the TITLE of your character's Xtreme.
-Keep the maxrange at 300-350, with the maximum at 400.
-Events can be placed if boltons or skin segments are involved, and if an attack is to happen multiple times.

Title: The Outsider's Guide To Modding - Lesson 16
Post by: Outsider on March 04, 2020, 03:38AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 16: Throw Powers / Grab Smash

So, by now you've developed a good set of attack powers, boosts, and your Xtreme. But, there is another element that goes into a powerstyle file that can add something to your character. It's a throw move called the grab smash.

Grab smashes are throw-type moves that are done after a character grabs an enemy, and presses heavy punch. The grab smash depends on the character, as all vanilla characters have a grab smash that uses something interact victim files. More on that in a bit. First, let me show you the average grab smash that all characters would have if you don't give your character a modified one...


   FightMove {
   animenum = ea_grab_smash ;
   endchaintime = 1 ;
   handler = ch_grab_hold ;
   lockangles = true ;
   name = grab_smash ;
   noautoaim = true ;
   priority = uninterruptable ;
   startchaintime = 0.9 ;
      trigger {
      attackerface = true ;
      doslidemove = true ;
      motion_track_offset = true ;
      name = victim ;
      nodename = grabsmashvictim ;
      targetdistance = 20 ;
      time = 0 ;
      victimface = true ;
      }

      trigger {
      name = victim_release ;
      time = 0.5 ;
      }

      trigger {
      damage = 3 4 ;
      knockback = 120 ;
      maxrange = 64 ;
      name = radial ;
      time = 0.6 ;
      }

      chain {
      action = idle ;
      result = idle ;
      }

   }


What does this do? Your character grabs an enemy with one hand, and punches the enemy with the other. It's very weak and uninspiring. This is why modders often change it to something more character-specific.

In addition, the damage for a grab smash is only 3-4, and its damage doesn't level up as your character does, making the grab smash rather useless in later stages or in hard mode.

Let's look at the coding for :captainamerica2: Captain America's grab smash...


   FightMove {
   animenum = ea_power11 ;
   fallback = grab_smash ;
   handler = ch_grab_hold_base ;
   lockangles = true ;
   lockspeed = true ;
   name = grab_smash ;
   noautoaim = true ;
   priority = 6 ;
   switch_dir_on_end = true ;
      trigger {
      attackerface = false ;
      doslidemove = true ;
      interaction = data/fightstyles/interact_captamerica_victim ;
      name = victim ;
      nodename = grabsmashvictim ;
      offset = 22 0 0 ;
      time = 0 ;
      victimface = true ;
      }

      trigger {
      name = stop ;
      time = 0 ;
      }

      trigger {
      name = stop ;
      time = 0.5 ;
      }

      trigger {
      damage = %captam_gs_dmg ;
      damagescale = normal ;
      damagetype = physical ;
      index = 1 ;
      knockback = 120 ;
      maxrange = 64 ;
      name = radial ;
      time = 0.7 ;
         damagemod {
         name = dmgmod_auto_knockback ;
         }

         damagemod {
         name = dmgmod_ground ;
         }

      }

      trigger {
      critical = true ;
      name = victim_release ;
      ownertime = 0.5 ;
      time = 0.7 ;
      }

      chain {
      action = idle ;
      result = idle ;
      }

   }


What does this do? Cap will throw an enemy down to the ground, then bash him with his shield. Now, let's look at the coding in detail, and go over the terms that you haven't seen before.

   FightMove {
   animenum = ea_power11 ;
   fallback = grab_smash ;
   handler = ch_grab_hold_base ;
   lockangles = true ;
   lockspeed = true ;
   name = grab_smash ;
   noautoaim = true ;
   priority = 6 ;
   switch_dir_on_end = true ;

fallback is referring to what default move is this move replacing. In this case, it is replacing the default grab smash. But, you really don't need to put this there.
switch_dir_on_end means that the character will change the direction they are facing when the grab smash is done.


      trigger {
      attackerface = false ;
      doslidemove = true ;
      interaction = data/fightstyles/interact_captamerica_victim ;
      name = victim ;
      nodename = grabsmashvictim ;
      offset = 22 0 0 ;
      time = 0 ;
      victimface = true ;
      }

This is the coding that sets up the grab smash. See, grab smashes need the enemy caught to do an animation as well. That's why you need an interact victim file and an interact animation file, the latter of which contains animations for the enemy caught. It does NOT have the animations of the character -- only the victim.

Go to your game's actors folder, and press the letter "i" -- See all of those? Those are your interact animation files, which creates not only grab smashes, but throw powers as well. More on the latter later on.

Now go into your game's data/fightstyles folder, and press the letter "i" -- Those are your interact victim files that correspond with the interact animation files you saw in the actors folder. However, these files are very delicate... more on this later. For now, let's continue with the coding.


      trigger {
      name = stop ;
      time = 0 ;
      }

      trigger {
      name = stop ;
      time = 0.5 ;
      }

These are stop codes. I am not exactly sure what they do though, so it may not be needed.

      trigger {
      damage = %captam_gs_dmg ;
      damagescale = normal ;
      damagetype = physical ;
      index = 1 ;
      knockback = 120 ;
      maxrange = 64 ;
      name = radial ;
      time = 0.7 ;
         damagemod {
         name = dmgmod_auto_knockback ;
         }

         damagemod {
         name = dmgmod_ground ;
         }

      }

This is the damage coding for the grab smash. As you can see, it's set up just like an attack power, except it takes no energy cost. Now, take notice that the damage says "%captam_gs_dmg". I did that on purpose. Remember when I said that grab smashes take very little damage and are useless later in the game? Well, I decided to invent upgradeable grab smashes. I placed extra values usually on the character's first power in the talents file, so that as you increase the first power damage, you also increase the grab smash damage. This makes them useful again. You can do this if you want -- just credit me if you do.

      trigger {
      critical = true ;
      name = victim_release ;
      ownertime = 0.5 ;
      time = 0.7 ;
      }

And this is the victim_release coding entry, which all throws such as grab smashes must have, as eventually the enemy must be freed from your character's grasp. This entry is critical.

      chain {
      action = idle ;
      result = idle ;
      }

   }

The easiest way to create a grab smash is to recall a cool grab smash you saw, and just mimic/copy the coding entries for it. The reason I suggest this is because sometimes when creating grab smashes by changing the interact victim files, we may screw up the animation. The enemy may not interact at all, or or it happens ill-proportionately. They are very sensitive, so I usually don't change them. For example, I tend to use :deadpool: Deadpool's grab smash for characters with swords, :spiderwoman: Spider-Woman's grab smash for powerful female characters, etc.





THROW POWERS

Certain powers are special in that they use interact victim files. Let's look at one of them --- take the powerstyle file of :nfury: Nick Fury, open it up, hit Ctrl + F to Find, type = "name = power1" and hit Enter. You'll see the coding for his first power, Furious, which is a throw power. The coding is below.


   FightMove {
   aitype = melee ;
   animenum = ea_power1 ;
   combotextfinisher = Wrath ;
   combotextstarter = Furious ;
   handler = ch_grab_hold_base ;
   icon = 0 ;
   is_power = true ;
   name = power1 ;
   priority = 5 ;
   turnrate = 0.5 ;
      require {
      cat = skill ;
      item = nickf_p1 ;
      level = 1 ;
      }

      event {
      damage = 1 ;
      damagescale = none ;
      inherit = punch ;
      name = p1_punch ;
      }

      trigger {
      name = powerusage ;
      powerusage = %nickf_p1_pwr ;
      time = 0 ;
      }

      trigger {
      name = sound ;
      sound = char/fury_m/p1_charge ;
      time = 0 ;
      }

      trigger {
      maxrange = 72 ;
      name = victim_set ;
      searchangle = 90 ;
      selfeventtag = 1 ;
      time = 0 ;
      }

      trigger {
      attackerface = true ;
      doslidemove = true ;
      interaction = data/fightstyles/interact_nickfury_victim ;
      name = victim ;
      nodename = power1_victim ;
      offset = 50 0 0 ;
      tag = 1 ;
      time = -1 ;
      victimface = true ;
      }

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/fury/p1_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.19 ;
      }

      trigger {
      fail_node = null ;
      failtag = 3 ;
      name = verify_victim ;
      time = 0.22 ;
      }

      trigger {
      damage = %nickf_p1_dmg ;
      name = p1_punch ;
      tag = 3 ;
      time = -1 ;
      }

      trigger {
      fail_node = idle ;
      name = verify_victim ;
      time = 0.22 ;
      }

      trigger {
      name = sound ;
      sound = char/fury_m/p1_power ;
      time = 0.22 ;
      }

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/fury/p1_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.62 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/fury/p1_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.62 ;
      }

      trigger {
      damage = %nickf_p1_dmg ;
      damagescale = none ;
      index = 2 ;
      maxrange = 64 ;
      name = radial ;
      offset = 60 ;
      time = 0.68 ;
         damagemod {
         name = dmgmod_auto_knockback ;
         }

      }

      trigger {
      critical = true ;
      name = victim_release ;
      time = 0.68 ;
      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }


Let's look at the coding in detail.

   FightMove {
   aitype = melee ;
   animenum = ea_power1 ;
   combotextfinisher = Wrath ;
   combotextstarter = Furious ;
   handler = ch_grab_hold_base ;
   icon = 0 ;
   is_power = true ;
   name = power1 ;
   priority = 5 ;
   turnrate = 0.5 ;

As you can see, the handler = ch_grab_hold_base ; is there. This is usually essential for all throw powers, so be sure to put that.

      require {
      cat = skill ;
      item = nickf_p1 ;
      level = 1 ;
      }

      event {
      damage = 1 ;
      damagescale = none ;
      inherit = punch ;
      name = p1_punch ;
      }

An event leading to the damage of this power.

      trigger {
      name = powerusage ;
      powerusage = %nickf_p1_pwr ;
      time = 0 ;
      }

      trigger {
      name = sound ;
      sound = char/fury_m/p1_charge ;
      time = 0 ;
      }

      trigger {
      maxrange = 72 ;
      name = victim_set ;
      searchangle = 90 ;
      selfeventtag = 1 ;
      time = 0 ;
      }

This is the victim_set coding entry that drives the character to find the nearest enemy to do the move on. 72 is usually the maxrange for it, and this leads into the next coding entry.

      trigger {
      attackerface = true ;
      doslidemove = true ;
      interaction = data/fightstyles/interact_nickfury_victim ;
      name = victim ;
      nodename = power1_victim ;
      offset = 50 0 0 ;
      tag = 1 ;
      time = -1 ;
      victimface = true ;
      }

This is the coding that connects to the interact victim file for Nick Fury.[/color] It is in that file that you will find "power1_victim", which is the nodename seen here. That's why it's important to have these coding entries, or it won't work.

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/fury/p1_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.19 ;
      }

      trigger {
      fail_node = null ;
      failtag = 3 ;
      name = verify_victim ;
      time = 0.22 ;
      }

This is the verify_victim coding entry. In case a throw power fails (such as when trying to use it against a boss villain), it will still take damage without throwing them.

      trigger {
      damage = %nickf_p1_dmg ;
      name = p1_punch ;
      tag = 3 ;
      time = -1 ;
      }

The damage coding for the first part, which is Nick cracking the enemy's arm.

      trigger {
      fail_node = idle ;
      name = verify_victim ;
      time = 0.22 ;
      }

      trigger {
      name = sound ;
      sound = char/fury_m/p1_power ;
      time = 0.22 ;
      }

      trigger {
      bolt = Bip01 L Hand ;
      effect = char/fury/p1_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.62 ;
      }

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/fury/p1_power ;
      fxlevel = 2 ;
      name = effect ;
      time = 0.62 ;
      }

      trigger {
      damage = %nickf_p1_dmg ;
      damagescale = none ;
      index = 2 ;
      maxrange = 64 ;
      name = radial ;
      offset = 60 ;
      time = 0.68 ;
         damagemod {
         name = dmgmod_auto_knockback ;
         }

      }

This is the second damage coding, which is when Fury slams the enemy to the ground.

      trigger {
      critical = true ;
      name = victim_release ;
      time = 0.68 ;
      }

The victim_release coding that is critical, as mentioned before.

      chain {
      action = Idle ;
      result = idle ;
      }

   }




Throw powers and grab smashes use highly sensitive interact victim files, so again it is best to just copy the coding of whatever throw power or grab smash that you like, then modify the smaller details. It is possible to turn a special grab smash into a throw power, or vice versa. There are only two differences between them:

(1) Throw powers use a victim_set coding entry, leading into the interact victim coding entry. Grab smashes ONLY use the interact victim coding entry.
(2) Throw powers have a powerusage entry, grab smashes do not.

So, using Captain America's grab smash as-is...

      trigger {
      attackerface = false ;
      doslidemove = true ;
      interaction = data/fightstyles/interact_captamerica_victim ;
      name = victim ;
      nodename = grabsmashvictim ;
      offset = 22 0 0 ;
      time = 0 ;
      victimface = true ;
      }

And here's Captain America's grab smash used as a throw power instead...

      trigger {
      maxrange = 72 ;
      name = victim_set ;
      searchangle = 90 ;
      selfeventtag = 3 ;
      time = 0 ;
      }

      trigger {
      attackerface = false ;
      doslidemove = true ;
      interaction = data/fightstyles/interact_captamerica_victim ;
      name = victim ;
      nodename = grabsmashvictim ;
      offset = 22 0 0 ;
      tag = 3 ;
      time = -1 ;
      victimface = true ;
      }

See the difference? Remember that if changing a grab smash into a throw power, add a powerusage value, a damage value, and a requirement value to unlock it.






Lesson Takeaway:
-The interact victim file is essential for throw powers and grab smashes to work.
-Understand the difference between grab smashes and throw powers, so you can choose what to do with a move.
-Following my method, you can make a grab smash upgradeable.
-To avoid confusion with the highly sensitive interact victim files, just copy the coding of what you want, then adjust.
-Choose the correct animation and interact victim file for the move to work successfully.

Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: deadjoke on March 08, 2020, 04:41PM
I'm having some issues that I can't seem to fix. I can figure things out for myself and learn, IF I know what I'm doing incorrectly and HOW to fix it.

I've done the pkgb files, herostat, and chosen the animation set for the mod I'm working on, but replacing powers is something I can't seem to get right.

For example, I'm using your akuma mod to practice replacing power's on since I can simply reinstall the mod when things go wrong. Here is what I have tried doing.

Replacing the hadouken with Batman's free flow combo in the ps file. Didn't work, and lost the ability to do a hadouken and a shoryuken.

Thought maybe doing the same in the talent file might resolve this, nope. Now he has no powers at all. Where exactly am I going wrong?
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Outsider on March 08, 2020, 07:13PM
Quote from: deadjoke on March 08, 2020, 04:41PM
... I'm using your akuma mod to practice replacing power's on...

To answer your question, using Akuma is where you went wrong. His mod uses special affecters, so he is not recommended for beginners to work on. It's alright -- you didn't know. I would suggest using vanilla mods like Captain America, Nick Fury, or Elektra. Don't use Wolverine though, as he too uses special affecters.

Title: The Outsider's Guide To Modding - Lesson 17
Post by: Outsider on March 11, 2020, 02:59AM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 17: Effects

Throughout these lessons so far, you've seen small entries that I mentioned I would get to in future lessons. Well, here I will cover one of those entries -- Effects. To make a mod feel complete, you have to make a mod visually appealing. This is especially true for their Xtreme powers.

The easiest way to choose effects for a certain power is to just copy the whole coding for a particular power or boost, and then adjust the effects. It is important to choose the right effects for a power or boost, or it won't look right. To that end, there are different types of effects, covering all powers.

Let's look at boost effects. These are the auras that appear on your character during the duration of a boost. For this example, we will look at :deadpool: Deadpool's 2nd boost called "Deadpool Corps." I will show you what that coding looks like. Pay attention to the parts in bold BLUE.


   FightMove {
   aicanuse = false ;
   aitype = buff ;
   animenum = ea_power7 ;
   icon = 11 ;
   is_power = true ;
   name = power7 ;
   powerup_tag = dead_power7 ;
   priority = 5 ;
      require {
      cat = skill ;
      item = dead_p7 ;
      level = 1 ;
      }

      trigger {
      name = sound ;
      sound = char/dphero_m/lackeys ;
      time = 0 ;
      }

      trigger {
      name = sound ;
      sound = char/dphero_m/p7_power ;
      time = 0 ;
      }

      trigger {
      name = show_swords ;
      time = 0.1 ;
      }

      trigger {
      name = hide_back_swords ;
      time = 0.1 ;
      }

      trigger {
      name = sound ;
      sound = char/dphero_m/special_unsheathe ;
      time = 0.1 ;
      }

      trigger {
      apply_ally = all ;
      life = %dead_p7_life ;
      name = powerup ;
      powerusage = %dead_p7_pwr ;
      time = 0.4 ;
         affecter {
         affect_type = scale ;
         attribute = move_attack ;
         level = %dead_p7_spd ;
         }

         affecter {
         affect_type = sum ;
         attribute = atk_damage ;
         level = %dead_p7_dmg ;
         }

         special_fx {
         effect = char/dphero/p7_aura ;
         fxlevel = 1 ;
         how_used = primary ;
         }

         special_fx {
         bolt = Bip01 R Hand ;
         effect = char/dphero/p7_aura ;
         fxlevel = 2 ;
         how_used = primary ;
         }

         special_fx {
         bolt = Bip01 L Hand ;
         effect = char/dphero/p7_aura ;
         fxlevel = 2 ;
         how_used = primary ;
         }


      }

      trigger {
      effect = char/dphero/p7_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.4 ;
      }


      trigger {
      critical = true ;
      name = hide_swords ;
      time = 0.9 ;
      }

      trigger {
      critical = true ;
      name = show_back_swords ;
      time = 0.9 ;
      }

      trigger {
      critical = true ;
      name = sound ;
      sound = char/dphero_m/special_sheathe ;
      time = 0.9 ;
      }

      chain {
      action = Idle ;
      result = idle ;
      }

   }

The parts you see in blue are effects coding entries. When creating your boosts, you can use them as is, or you can alter them. For this lesson, I will show you the effect char/dphero/p7_aura, which is inside the boost powerup.

         special_fx {
         effect = char/dphero/p7_aura ;
         fxlevel = 1 ;
         how_used = primary ;
         }

         special_fx {
         bolt = Bip01 R Hand ;
         effect = char/dphero/p7_aura ;
         fxlevel = 2 ;
         how_used = primary ;
         }

         special_fx {
         bolt = Bip01 L Hand ;
         effect = char/dphero/p7_aura ;
         fxlevel = 2 ;
         how_used = primary ;
         }

special_fx is the starter of the effect coding entry -- ONLY used for boost duration entries.
bolt is the body part where the effect is seen at. In some cases, bolt is not used, in which case it's seen at a certain area. In this case, circling below your character.
effect shows where the effect is coming from. I'll show you those in a bit.
fxlevel is the level where the effect can change, as some effects have more than one level. In this case, this effect has two levels.
how_used is literally that, saying how the effect is used. It is usually primary (ongoing during duration), activation/activate (effect at the start of duration), and deactivation/deactivate (effect at the end of duration).
time is when the effect is seen. This is ONLY used in non-boost effects, such as char/dphero/p7_power.


For non-boost effects, it's simpler, as it really only displays the bolt (if there is one), the effect itself, fxlevel (if there is one), name (which is effect), and the time that it appears.

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/dphero/p7_power ;
      fxlevel = 1 ;
      name = effect ;
      time = 0.4 ;
      }

As mentioned once before, you can connect a sound trigger to a non-boost effect, such as below. We'll go over sounds in a future lesson.

      trigger {
      bolt = Bip01 R Hand ;
      effect = char/dphero/p7_power ;
      fxlevel = 1 ;
      name = effect_sound ;
      sound = char/char_m/p7_power ;

      time = 0.4 ;
      }




INSIDE THE EFFECTS FILE

Now, go into your game's effects folder. This is where you'll find all effects for the game, including for SHIELD access points, base effects like glass shatterings, etc. Now go into the char folder... See all of those folders? Those are the effects for each character -- vanilla or modded in the game, as well as for boss villains and for minions. Don't worry -- we won't be looking at all of these. Look for and go into the "dphero" folder... See those? Those are the effect files for all of Deadpool's powers. Copy "p7_aura" and paste it elsewhere. This is the same file that we were looking at (char/dphero/p7_aura). We are going to open this effect file so you can see what is inside. (NOTE: All effects end with the .xmlb extension, so no need to change the extension when compiling them.)

XMLB Effect {
looptime = 2 ;
randlooptime = 0 ;
   Trail {
   acceleration = 0 0 0 0 0 0 ;
   alpha = -2 1 1 -2 1 1 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 128 ;
   endcolor2 = 128 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   length = 0 0 1 0 0 1 ;
   life = 2 2 ;
   midcolor1 = 128 ;
   midcolor2 = 128 ;
   name = name ;
   offset = 0 0 0 0 0 0 ;
   origin = 0 0 0 0 0 0 ;
   primitiveflags = 4244635904 ;
   primitiveflags2 = 320 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = 0 0 0 0 0 0 ;
   rotationradius = 0 0 0 0 0 0 ;
   shaderflags = 0 ;
   size = 0 0 5 0 0 5 ;
   spawnflags = 1090519040 ;
   startcolor1 = 128 ;
   startcolor2 = 128 ;
   texture = textures/bolt_sharp.png ;
   uvscale = 0 0 1 0 0 1 ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

   OrientedSprite {
   acceleration = 0 0 0 0 0 0 ;
   alpha = 0 0 1 0 0 1 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 128 ;
   endcolor2 = 128 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 2 2 ;
   midcolor1 = 128 ;
   midcolor2 = 128 ;
   name = name ;
   orientaxis = 0 0 1 0 0 1 ;
   origin = 0 0 4 0 0 4 ;
   origin2 = 0 0 0 0 0 0 ;
   primitiveflags = 4261413248 ;
   primitiveflags2 = 64 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = 0 0 0 0 0 0 ;
   rotationaxis = 0 0 1 0 0 1 ;
   rotationradius = 0 0 0 0 0 0 ;
   shaderflags = 0 ;
   size = 0 0 100 0 0 100 ;
   spawnflags = 3238068224 ;
   startcolor1 = 128 ;
   startcolor2 = 128 ;
   texture = textures/misc_hitflash.png ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

   OrientedSprite {
   acceleration = 0 0 0 0 0 0 ;
   alpha = 0 0 1 0 0 1 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 16777215 ;
   endcolor2 = 16777215 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 2 2 ;
   midcolor1 = 16777215 ;
   midcolor2 = 16777215 ;
   name = name ;
   orientaxis = 0 0 1 0 0 1 ;
   origin = 0 0 4 0 0 4 ;
   origin2 = 0 0 0 0 0 0 ;
   plat = 23 ;
   primitiveflags = 4261413248 ;
   primitiveflags2 = 64 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = 0 0 0 0 0 0 ;
   rotationaxis = 0 0 1 0 0 1 ;
   rotationradius = 0 0 0 0 0 0 ;
   shaderflags = 0 ;
   size = 0 0 25 0 0 25 ;
   spawnflags = 3238068224 ;
   startcolor1 = 16777215 ;
   startcolor2 = 16777215 ;
   texture = textures/misc_hitflash.png ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

   Cylinder {
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   alpha = -4 4 0 -4 4 0 ;
   blend = additive ;
   count = 6 6 ;
   delay = 0 2 ;
   drag = 0 0 ;
   drag2 = 0 0 ;
   endarc = 0 0 6.283 0 0 6.283 ;
   endcolor1 = 278015 ;
   endcolor2 = 278015 ;
   gravity = 0 0 ;
   gravity2 = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 1.5 1.5 ;
   midcolor1 = 278015 ;
   midcolor2 = 278015 ;
   name = name ;
   numsegments = 0 ;
   origin = 0 0 4 0 0 4 ;
   origin2 = 0 0 1 0 0 1 ;
   primitiveflags = 4261413248 ;
   primitiveflags2 = 0 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = -0.002 6.285 0 -0.002 6.285 6.283 ;
   rotationaxis = 0 0 1 0 0 1 ;
   rotationradius = 0 0 0 0 0 0 ;
   shaderflags = 0 ;
   size = 0 0 15 0 0 15 ;
   size2 = -10 25 10 -10 25 10 ;
   spawnflags = 3238070272 ;
   startarc = 0 0 0 0 0 0 ;
   startcolor1 = 278015 ;
   startcolor2 = 278015 ;
   texture = textures/bolt_sharp.png ;
   uvscale = 0 0 2 0 0 2 ;
   uvscroll = 0 0 0 0 0 0 ;
   velocity = 0 0 0 0 0 0 ;
   velocity2 = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}


Don't freak out! Don't get overwhelmed. I'll admit that I don't know what most of this is, either. But pretty much all effects have this kind of coding. I will tell you the terms I do know, so it will help you to alter effects to your liking.

looptime is the speed of the effect. So, 2 = 2.0 so it will move at a relatively normal speed. If set to 0.2 let's say, it'll go very fast per cycle.
blend is the kind of colors the effect uses. There are additive, subtractive, and alphaadditive. There may be others, but I generally leave it alone.
endcolor is the color seen at the end of the power. More on colors later in this lesson.
midcolor is the color seen at the middle of the power.
name is the name of the effect. Sometimes, it is not given a name, and so they just put "name." Not important.
origin controls where the effect is coming from. You can alter the six numbers to change it. More on that in a bit.
size is literally the size of the effect. You can make it bigger or smaller. I'll show you what I do later in the lesson.
startcolor is the color seen at the beginning of the power.
texture explains what special form is used for that effect, if any (ex. smoke, lightning, fire, etc.)




FXLEVEL

In some effects, there is more than one fx level. Take for example, Deadpool's p7_aura. Notice in the boost coding, fxlevel = 1 is connected to no particular body part (bolt)? It will make a circular effect around your character at the ground. But if you change the fxlevel to 2, it will create a different effect. It creates a long blurry trail that appears in and out. That is why the same effect is used at "Bip01 R Hand" and "Bip01 L Hand." Of course, every effect is different. Some are used for beams, others for radial attacks. If you scan their powerstyle file, you will see how many fxlevels that an effect has, as currently there is no way to know otherwise.




CHANGING ORIGIN

The origin line (and origin2 line) has six numbers that control where the effect is coming from. Think of it as X Y Z X Y Z. The 1st and 4th numbers will move the effect left / right, the 2nd and 5th numbers will move the effect forward / backward, the 3rd and 6th numbers will move the effect up / down. Negative numbers count as well, so think of them as an X-axis, Y-axis, and a Z-axis.

Normally, there is no need to change these, unless a new skin is made, and suddenly the effect doesn't look as good. Changing the origin lines of each entry in the effect will correct it.




CHANGING SIZE

Many people do not know of this, but with some effects, one thing I do is change the size (and size2 if that is there). Think of the same X Y Z X Y Z method, the 1st and 4th numbers should be the same. The 2nd and 5th numbers should be the same, and the 3rd and 6th numbers should be the same.

I tend to make the effects I want bigger, by doubling the value, or multiplying them by 3. So, for example, if the size line says, "3 2 0, 3, 2, 0" then I would jump it to "9, 6, 0, 9, 6, 0." That will increase the size of the effect. Combine this with a color change, and you can have a whole new effect.




CHANGING COLORS

In every effect, there are three types: startcolor, midcolor, and endcolor. When you see an effect you like, but don't like its original color(s), you can change the colors in each entry of the effect. This can make for excellent effects for your character.

Now, the number you see listed in each corresponds to a different color -- except it's backwards. What do I mean? Go to this webpage:
http://www.mathsisfun.com/hexadecimal-decimal-colors.html

There, scroll down and you'll notice a color key that you can use to create the color(s) you want. Say for example, you want to create neon green as a color. Move the red slider to 114=72, move the green slider to 255=FF, and move the blue slider to 0=00. You will then see the color you want, and that the numbers below has changed. There is a decimal number and a hexadecimal number. The decimal number is one you want, which is currently 7536384. But wait... I had said that the numbers on the effects coding is backwards...  So, now on the website, you must switch the red and blue sliders backwards. In this case, the red slider moves to 0=00, and the blue slider to 114=72. The decimal number will now become 65394. THAT'S the number you'll place in either startcolor, midcolor, or endcolor. There's two of each. You can place the value in both or just one of to create a different color. Your choice. Just remember -- the value must be backwards to get the color you want.

DID YOU KNOW?
The Outsider uses a color system to determine the color he wants for effects. He will share that with you. Here are the numbers that you can put in the color parts of the effects coding for a specific color. They are already turned backwards. (NOTE: The computer colors you see here are not the exact colors for the effects.)

RED: 255 or 128 (darker)
ORANGE: 33023
YELLOW: 65535
GREEN: 65280 or 9502608 (lime green)
CYAN: 16776960
LT BLUE: 16764579 or 16746602 (slight darker)
BLUE: 16711680 (pure) or 16736256 (ideal)
INDIGO: 9437232
VIOLET: 16736400
PURPLE: 16720016
MAGENTA: 8790015
PINK: 11563263
BROWN: 2905468
GOLD: 7270143
SILVER: 15591399
WHITE: 16777215
GRAY: 10855845
BLACK: 0*

(*Must use the blend "subtractive" and the midcolor must be white. Confirmed to work.)

Though only a boost effect was shown in this lesson, virtually any effect from beams, projectiles, melee attacks, and even Xtreme powers can be altered by size, color, origin, and other lines. Practice with various effects and make your character's powers visually stun players. However, don't go crazy with too many effects, as you may suffer an effects overload, where your character suddenly stops displaying effects. Display effects only when needed.

A member here named CorvetteRules discovered that you can also make colors appear darker if you wish.
(1) Choose your color, and view its numbers.
(2) Take the red number and subtract it from 255. Now do the same with the blue number. (Green number stays the same.) *
(3) After making the subtractions, copy & paste the decimal code. Use that for the effects file.
(4) Make sure the blend is subtractive.

*Example: If for the color you want, red is 70, and blue is 150, set red to 255 - 70 = 185, and set blue to 255 - 150 = 105. Nothing is done with green.




CUSTOM TEXTURES

In addition to the effects already out there, one can also create their own custom-made textures for effects, such as the "S" logo for Superman, or the Omega symbol I used for Kratos. The main thing you will need for this besides Alchemy 5 and a photoshop program like GIMP... is Nikita's "image2igb" batch file, which is very simple to use. You can get it here: https://www.mediafire.com/?q6zu7uw0cqs0kia.

The process to create custom textures is quite easy, and I can confirm to you that it works. A member here called "Corvetterules" wrote an easy-to-follow tutorial on that, with visuals. Look in this to learn how to do it: https://docs.google.com/document/d/1yqX2yIwEfv_DxPO-yNNvPj5qzwnRcv67g9Vd7PaET_g/edit.





MENU EFFECTS

You can connect effects to characters at the CSS (Character Select Screen) as well. Look at the herostat of :iceman: Iceman. You should see something like this on it...

      StatEffect {
      bolt = Bip01 Spine2 ;
      effect = char/iceman/special_selfchill ;
      fxlevel = 1 ;
      }

      StatEffect {
      bolt = Bip01 R Hand ;
      effect = char/iceman/special_selfchill ;
      fxlevel = 2 ;
      menuonly = true ;
      zoneonly = false ;
      }

      StatEffect {
      bolt = Bip01 L Hand ;
      effect = char/iceman/special_selfchill ;
      fxlevel = 2 ;
      menuonly = true ;
      zoneonly = false ;
      }

On the herostat, they use StatEffect to display effects. Effect coding here is virtually the same, with only a few differences.
menuonly = The effect appears only at the CSS and not in-game. You can set this to true or false.
zoneonly = The effect appears only in-game, and not at the CSS. You can set this to true or false.
(If neither "menuonly" or "zoneonly" are present, it will appear in both.)


Furthermore, if you look at the herostat of :spiderman: Spider-Man, you will see that you can even connect effects to a particular menu animation.

      StatEffect {
      anim = menu_action ;
      bolt = Bip01 L Hand ;
      effect = char/spider/menu_idle ;
      fxlevel = 1 ;
      }

      StatEffect {
      anim = menu_idle ;
      bolt = Bip01 L Hand ;
      effect = char/spider/menu_idle ;
      fxlevel = 2 ;
      }

This means that when he first appears on screen at the CSS (menu_action), and when he is idle there (menu_idle), the effect will be present. But when begins to start the game (menu_goodbye), the effect is gone. Very easy to understand these coding entries. However, don't use too many effects, as there is a limit when those effects stop appearing.




Lesson Takeaway:
-Pick the right effects to correspond with the kind of power you want. Beam, projectile, radial, xtreme, etc.
-Values with six numbers follow the X Y Z X Y Z plan, so change one, change the other.
-Change colors and size of existing powers to create new ones.
-Color codes must be backwards on the effects coding for them to work correctly.
-Effects can be added to a character's herostat as well, but avoid "effects overload."

Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Ceamonks890 on March 11, 2020, 03:31AM
Hi Outsider,

I don't know if its explained within the 'Boost Coding' section itself, but I can't seem to find any explanation in your vast tutorials for how debuff abilities (which primarily affect enemies) are coded. Ex: Taunts to decrease overall defense, disabling access to enemy special abilities, render them more weak to a particular damagetype, turn into an ally for a selected amount of time etc.

If you could elaborate more on how these work in actual practice, I'd greatly appreciate it.
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Outsider on March 13, 2020, 07:43AM
Quote from: Ceamonks890 on March 11, 2020, 03:31AM
Hi Outsider,

I don't know if its explained within the 'Boost Coding' section itself, but I can't seem to find any explanation in your vast tutorials for how debuff abilities (which primarily affect enemies) are coded. Ex: Taunts to decrease overall defense, disabling access to enemy special abilities, render them more weak to a particular damagetype, turn into an ally for a selected amount of time etc.

If you could elaborate more on how these work in actual practice, I'd greatly appreciate it.


No problem. I've expanded the section in Chapter 11 that covers more status aliments, and shows how they can be connected to a victim event tag.

Title: The Outsider's Guide To Modding - Lesson 18
Post by: Outsider on March 24, 2020, 09:56PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 18: Aesthetics

Alright, you're almost there to completing your mod project. But now, you gotta give your mod some flair. It's going to need HUDs, an icon set, and at least one loading screen. Together, I call them aesthetics. Don't worry -- no coding required here. You're done with the coding!

SPECIAL NOTE:
I talked with skilled skinner BaconWizard17, and we came to an agreement that aesthetics should have its own tutorial covering that topic in detail. So, instead of a full lesson here, I am just going to mention what I do personally.


For this lesson, you will need two tools: SkinnerUI, which is the program that allows the creation of custom aesthetics, and a photoshop program. I personally use GIMP 2.6, as it features so many tools and it's easy to add more plugins to further enhance what you can do. Hasn't failed me yet, so I'll base the lesson on this. If you're using another program, adjust accordingly. (There is an alternate path for each that uses Alchemy 5 and batch files. See "Alternate Path" below in each section.)

SkinnerUI should have the offsets for hud_head_0201.igb, drstr_icons.igb, and char_load_01.igb at the jump. You'll find out later why that is important. Just in case though, check your skinnerui folder, then the bin folder. You'll see something called muaskinner.cfg. Open that file via Notepad, and look for the following offsets...

drstr_icons.igb,RAGB,256,256,6217.
char_load_01.igb,-DXT1,2048,1024,356265,1024,512,94121,512,256,28585,256,128,12201,128,64,8105.
hud_head_0201.igb,-DXT1,256,256,10571,128,128,43339,64,64,51531,32,32,54435,16,16,53595,8,8,54947.

If you already have them there, then you don't need to do anything -- you're good. If you don't, then copy them here exactly as written, paste them in that file, and save. I can confirm that these offsets work, as I've been modding for a long time and I've used these. Never had a problem.

Now, let's go over each of the items needed, in order from easy to hard.




LOADING SCREENS

Loading screens (LS) are the large images that you see while the game is loading. If you're going to a boss stage, you'll see the loading screen of a boss character. Otherwise, you'll see loading screens of characters on your roster at random. It is important to note that every mod number can only have a maximum of three LS, as no others will be shown. Depending on the mod number, a loading screen will be named (mod number)(01, 02, or 03).igb. So for example, if your character is sharing numbers with :captainamerica2: Captain America, and he has two LS, then your character can only have one LS. Either that, or you'll have to replace one of Cap's so your character can have two. Cap's mod number is 07, so his can be 0701.igb, 0702.igb, or 0703.igb. That's how it works for loading screens -- (mod number)(01,02, or 03).igb.

Take a look at your game's textures folder, then click on the loading folder... See all those? Those are the LS for the entire game, including bosses and other stuff. In that folder, highlight and right-click on char_load_01.igb. Copy it, and paste it at the location where you've uploaded the SkinnerUI program.

(1) Open SkinnerUI and load that char_load_01.igb file. It should have the offsets already, so loading it shouldn't be a problem. You'll see an upside-down image of a SHIELD logo. This is normal. Click "Export," name it whatever you want, and hit Enter. Wait for it to upload the image to your folder.

You'll see a bitmap (.BMP) image and a .igb.dds file of the image appear. Keep skinnerui open.

(2) Now comes the fun part: Take any image you want to create the loading screen of your character. I recommend using Google to look for images, but make sure they are wallpaper large. The ideal size is 1820 x 1024. If you find an image that is 1920 x 1080, that's fine too, because you can then scale it to the ideal size. (Don't use an image that is too small, for it will make the image appear distorted and unappealing.) Save that image to your computer and drag it into your photoshop program.

(3) Now scale the image to 1820 x 1024 if it's not that size already. Or if the image is larger, crop it to that size. What you see now is how the loading screen will look in your game.

If you're skilled at photoshop as I am, you can take several images and put them together to create an awesome custom-made image! Just make sure that the completed image is 1820 x 1024 when you're done.

(4) Now, scale it again to 2048 x 1024. Then flip it upside-down. Trust me, this is important.. Now save it as a PNG file so you get lossless quality. (If you save it as a JPG or JPEG file, it will lose quality every time you save it, so go with PNG.) Now you can exit that image.

(5) Remember that BMP file that appeared before? Drag that file now to your photoshop program. Notice that the size is 2048 x 1024, and that it's upside down. Now drag the new image you just created to the photoshop program. Your new image will overlap the BMP image. Make sure to check all corners and lines to make sure that the new image is completely overlapping the BMP image. Save it and exit.

(6) Finally, go back to the skinnerui program and click "Import." Choose the BMP file that now has your new image on it, and hit Enter. Wait for it to do its thing. After a short while, the image inside the char_load_01.igb file changes to your new image. You will also see a .bak file appear confirming the successful change. Congratulations -- you've made your first loading screen! You can then delete the BMP file, the igb.dds file, and the bak file. They are no longer needed.

(7) Copy the char_load_01.igb file that now has your new image inside (you'll know based on the date), paste it elsewhere, and rename it whatever you want. That is your new loading screen. You will have to name it ###01.igb, ###02.igb, or ###03.igb according to your mod's number. Don't get rid of the "char_load_01.igb" in the skinnerui folder though. Because you can use that igb file to create new loading screens over and over again, regardless of what the previous image was.

ALTERNATE PATH: Recently, Nikita488 and ak2yny made "image2igb" which uses batch files to process certain aesthetics, such as loading screens. Look for the "Image 2 IGB batch pack" here (https://marvelmods.com/forum/index.php/topic,10969.msg200476.html#msg200476), then follow the instructions carefully as Alchemy 5 is required. Once you have the image you want for a loading screen that's 1920 x 1080 or 1820 x 1024 (either will do), simply drag and drop into the batch file that says image2igb-ls. It will convert the image for you, and that's it. I can confirm that this relatively newer method works as well, and is easier.




HUDS

HUDs are the images that appear on the lower left corner of your screen during gameplay and during conversations with NPCs (non-playable characters). Open your game's hud folder. See those? Those are all of the HUDs for every playable character, boss, minion, and NPC in the game. In that folder, highlight and right-click on hud_head_0201.igb. Copy it, and paste it at the location where you've uploaded the SkinnerUI program.

(1) Open SkinnerUI and load that hud_head_0201.igb file. It should have the offsets already, so loading it shouldn't be a problem. You'll see an upside-down headshot of :daredevil: Daredevil. This is normal. Click "Export," name it whatever you want, and hit Enter. Wait for it to upload the image to your folder.

You'll see two images appear -- a bitmap (.BMP) image and a color-swapped .igb.dds file of the image appear. The BMP image is the one we'll use. Keep skinnerui open.

(2) Right-click the images below, and save them to your skinnerui folder...

(https://images2.imgbox.com/d2/2c/BdFviuiX_o.png) & (https://images2.imgbox.com/a5/c8/sJLmnQJd_o.png)

These are png files that you will need to create HUDs. Note that in the past, I couldn't acquire ithe official-looking metal grate so I had to use a different one you'll see below. But hey, I've made so many mods for this game, that it practically is official! :laugh:

(3) Now use Google and find a PNG headshot image of your character, or a full body shot PNG that is large, open it, drag it, or copy it to GIMP. and then use Rectangle Select Tool to crop it to the headshot. Transparent PNG images are best because there's no background already. The ideal size is 256 x 256, so scale the image to that size (Image/Scale Image). Save your image to your folder as a PNG file.

If you are using a JPG image or an image with a background, then you'll have to first add an alpha channel for transparency (Layer/Transparency/Add Alpha Channel). Then use the eraser tool and carefully remove the background so that only the headshot remains. Then save it as a PNG file. For this lesson, we will use this headshot of Ms. Marvel from Marvel Future Fight, the size of which is exactly 256 x 256.

(https://images2.imgbox.com/2c/6c/7xjpzwzb_o.png)

Well, hello Miss Danvers... :naughty:

(4) Now, drag that BMP file of Daredevil into your photoshop program. Then drag the metal image you saved into it to overlap the image. Blur it a little. Next, drag your headshot image (or Ms. Marvel's headshot if you don't have anything) to overlap the metal image. Blur it a little (Filters/Blur/Blur). Finally, drag the black circle in to overlap everything. Finally, merge all of the layers (Ctrl + M, pick Clipped to Image, Merge). What you see now is how the HUD will look in your game. Using Ms. Marvel, it will look like this...

(http://www.mediafire.com/convkey/d5f0/cjlyfptsgd0r22jzg.jpg)

OPTIONAL: If you want to add a glow effect to a HUD like the official characters do it, then with GIMP, you can use either Drop Shadow (Filters/Light and Shadow/Drop Shadow), or locate the GC Shadow plugin file, which is what I use. You can Google "gimp gc shadow plugin," and only get it from a trusted source. Follow their instructions to add it into GIMP. You'll have to restart GIMP afterwards. Then, before you add the black circle to the HUD image, use GC Shadow (Filters/Light and Shadow/GC Shadow), find a nice shade of blue, and enter as seen below...

(http://www.mediafire.com/convkey/f564/8eqtm0ukylv9pc1zg.jpg)

If you do that, a blue glow will cover your headshot image. Now you can add the black circle, and then merge all of the layers. The HUD will then look like this...

(http://www.mediafire.com/convkey/b5af/haet7bqer2a687wzg.jpg)

(5) Now flip the image upside-down (Image/Transform/Flip Vertically) and save. The BMP will now change to the headshot of your image. Exit the image.

(6) Finally, go back to the skinnerui program and click "Import." Choose the BMP file that now has your new image on it, and hit Enter. Wait for it to do its thing. After a short while, the image inside the hud_head_0201.igb file changes to your new image. You will also see a .bak file appear confirming the successful change. Congratulations -- you've made your first HUD! You can then delete the BMP file, the igb.dds file, and the bak file. They are no longer needed.

Some people have reported inverted colors after importing. While I personally have not seen this happen in the years I've created HUDs, just in case you see it, before Step 5, use the Channel Mixer to change the RGB colors to BGR. Then continue to Step 5. It is possible they are editing the igb.dds file that appears color-swapped. As it says it Step 4, use the BMP image that appears, not the DDS image.

(7) Copy the hud_head_0201.igb file that now has your new image inside (you'll know based on the date), paste it elsewhere, and rename it whatever you want. That is your new HUD. You will have to name it hud_head_##01.igb or whatever you want according to your skin's number. Create HUDs for each skin/costume that your character has. Don't get rid of the "hud_head_0201.igb" in the skinnerui folder though. Because you can use that igb file to create new HUDs over and over again, regardless of what the previous image was.

For those of you who prefer a visual aid on creating HUDs, Bloodymares created a video (using a later version of GIMP) showing how to create HUDs: Click on this link to view it: https://www.youtube.com/watch?v=faQXO2cDpII

Sometimes, hex-editing the HUD to match the number you named it is needed if it's replacing the HUD of an in-game NPC. In which case, use XVI32 to change the digits.

ALTERNATE PATH: Recently, MrKablamm0fish and ak2yny made "TextReplHUD&Team" which uses batch files to process HUDs. Look for the "Batch Texture Replacement" here (https://marvelmods.com/forum/index.php/topic,10969.msg200476.html#msg200476), then follow the instructions carefully as Alchemy 5 is required. Once you have the HUD image you want, simply drag and drop into the batch file that says hud_head_e. It will convert the image for you in a separate folder, and that's it. I can confirm that this relatively newer method works as well, and is easier.




ICONS

Icons are the small images that appear on your character's power set, and during gameplay when displaying your powers. They also contain the banner that appears as you're checking your character's stats. Open your game's textures folder, then the ui folder. See those? Those are all of the icon files for every playable character in the game, and even the generic icons that passives use. In that folder, highlight and right-click on drstr_icons.igb. Copy it, and paste it at the location where you've uploaded the SkinnerUI program.

(1) Open SkinnerUI and load that drstr_icons.igb file. It should have the offsets already, so loading it shouldn't be a problem. You'll see the icon set for :strange: Dr. Strange. Click "Export," name it whatever you want, and hit Enter. Wait for it to upload the image to your folder.

You'll see a bitmap (.BMP) image appear. Keep skinnerui open.

(2) Right-click the image below, and save them to your skinnerui folder...

(https://images2.imgbox.com/94/b1/G6tbtuOo_o.png)

This is an icon template that you can use to determine where to place your icons. As you can see, icons 12-15 are not used as the banner goes there.

(3) Go on Google or any search engine and find any images you want of your character in action, to make these your icons representing the powers you gave your mod, or for special passives. Also find a background to be your character's banner. (It is best to use a banner where the main symbol or image is on the right hand side, not the center. Why? Because your character's name will appear on the left, blocking images you put in the center. I'll show you what I mean in a bit.) Save each of them.

(4) Open each of those images via GIMP, Use the Ellipse Select Tool (the circle near the Rectangle Select Tool) at the toolbox and hold the mouse to draw a perfect circle (where height & width are the same) over the image you want for the icon. Copy it (Ctrl + C). Then go to Image/Crop To Selection. Then go to Select/None to get rid of the circle. Then go to Layer/Transparency and click Add Alpha Channel. Now click on the Eraser Tool on the toolbox. Go to where it says "Brush", and click the circle seen there. It will bring up a small menu of shapes -- the first of which will be the image you just copied. Click on that. Hold the mouse and erase the image completely. Now hit Paste (Ctrl + V). The image you copied will appear over a transparent background. Click anywhere but the circle itself to anchor the image. Now you can hit Image/Scale Image to scale it down to 62 x 62. There's your icon for one of your character's powers. Save as a PNG file, as Icon #, coinciding with wherever on the icon template you plan to put that icon. Do this for all of your icons.

(5) The banner should have the ideal size of 768 x 60. So, first add alpha channel for transparency, then shrink or crop the image to the ideal size. Once you've done that, scale it down to 256 x 60 and save it as a PNG file. As I mentioned before, important images on the banner should be on the right hand side, not the center. The character's name will appear on the left, so plan the banner accordingly. To show you what I mean, here is the icon set I made for my booster of the :punisher_logo: Punisher.

(http://www.mediafire.com/convkey/fbe8/jpu8aaqwwo3vf4lzg.jpg)

(6) Open or drag the icon template into your photoshop program. Now, just place your icon files over whichever number from 0 to 11 to set up your power icons. Merge all of the layers. Save.
OPTIONAL: Some icons have an inner glow -- if you want that, enter GC Shadow (or Drop Shadow if you prefer that), choose a color, and enter as below.

(http://www.mediafire.com/convkey/357e/at6l15sqkjhraspzg.jpg)

Press enter and the icon will have an inner glow. Using the SHIELD logo as an icon example, it will look like this...

(http://www.mediafire.com/convkey/4b1d/5ikfg5vujw545zbzg.jpg)

Do that for all of your icons, merge all of the layers, then save. Now place your created banner completely over the banner area of the template. (The next part is optional if you want it to look professional.) Use the eraser at only 40% opacity and gradually erase the far left and far right of the banner to give off a "faded effect." That's why the template's black banner wasn't all of the way across. Space was left for transparency, just like the official characters. (End of optional part.) Now merge all of the layers and save as a .bmp file. What you see now is how the icon set will look in your game. Don't worry about the black background around the icons when you save it, because the transparency was already in the template.

(7) Finally, go back to the skinnerui program and click "Import." Choose the BMP file that now has your new icon set on it, and hit Enter. Wait for it to do its thing. After a short while, the icon set inside the drstr_icons.igb file changes to your new set. You will also see a .bak file appear confirming the successful change. Congratulations -- you've made your first set of icons! You can then delete the BMP file and the bak file. They are no longer needed.

(8) Copy the drstr_icons.igb file that now has your new icon set inside (you'll know based on the date), paste it elsewhere, and rename it whatever you want. That is your new icon set. You will have to name it ?????_icons.igb based on your character's name or abbreviation. Don't get rid of the "drstr_icons.igb" in the skinnerui folder though. Because you can use that igb file to create new icon sets over and over again, regardless of what the previous image was.

NOTE: You can also use Maegawa's template for icons that have a glow included in them to start you off.

(https://images2.imgbox.com/f8/5b/5bR9GRjG_o.png)

ALTERNATE PATH: Recently, Nikita488 and ak2yny made "image2igb" which uses batch files to process certain aesthetics, such as icons. Look for the "Image 2 IGB batch pack" (https://marvelmods.com/forum/index.php/topic,10969.msg200476.html#msg200476), then follow the instructions carefully as Alchemy 5 is required. Once you have the icon set you want, simply drag and drop into the batch file that says image2igb-pngicons. It will convert the image for you, and that's it. I can confirm that this relatively newer method works as well, and is easier.



I hope I explained this in an understandable way, as this is how I've always done it. You've seen the results of my work, and I firmly stand by these methods. However, BaconWizard and I will draft a more general tutorial in the not-too-distant future to create your aesthetics, in case you prefer different ways.




Lesson Takeaway:
-Loading screens must be large wallpaper-size images to avoid distorted screens. Only three per mod number.
-HUDs should use a metal background and black circle to look official.
-Icon banners should have important images on the right hand side, not the center, so the name won't block them.
-GIMP is best used, but other photoshop programs can be used. Adjust this lesson to whatever works best for you.
-All images should be saved in PNG format for lossless quality.

Title: The Outsider's Guide To Modding - Lesson 19
Post by: Outsider on March 28, 2020, 07:41PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 19: Sounds

You're near the finish line towards mod completion. You've made your character visually appealing with effects, and you've added some flair with aesthetics. But, it can't just be pleasing to the eyes. It has to be pleasing to the ears as well. You're going to need sounds.

For this lesson, you will need two tools: ZSMeditor, which is the program that allows the creation of sound and voice files for MUA, and a sound editing program. I personally use Wavepad Sound Editor, as the base version is free and has an variety of features, so I'll base the lesson on this. If you're using another program, adjust accordingly.

There are two sound files that need to be made for your mod -- a master file, which is mainly the sound effects of your character's powers, and a voice file, which contains many lines for when your character talks, if they talk. I like to work on the voice file first, as that is the harder file to work on.

First things first, you have to find lines for your character. I search through Youtube to find voice clips from a video game, TV show, or movie that your character has been in. If he/she is not a character that's been in anything, then look for a voice that sounds closest to your character. Games like Street Fighter X Tekken, Marvel vs. Capcom 3, Mortal Kombat X, Mortal Kombat 11, or both Injustice games are good examples, as they all have voice clips you can use.

Once you found a video (or videos) of voice clips that you like, look on the web for a Youtube-to-MP3 online converter. These sites will convert the Youtube video address of the videos you've found, and convert them to MP3 files that you can download.
WARNING: Most online converter sites have have pop-ups that may contain viruses or malware. Make sure you have a good anti-virus security system like Norton or McAfee that can effectively block them so you can use the converter sites safely.




VOICE FILE

Now that you got the MP3s you need, open your sound editing program so you can edit them. Cut and crop the MP3 to take only the lines and grunts that you need, then save them. Make them louder than what you want it to sound like, because MUA will lower the volume a bit.
IMPORTANT: Make sure to save each line/grunt as a .wav sound. The encoding MUST be PCM Uncompressed, and  that it MUST be at 22050 Hz, 16-bit, Mono. Otherwise, it won't work.

When creating voice files, the following are the lines you should try to acquire, as they are essential. You can have more than one of each line.

EPITAPH: The line a character says after he/she dies in battle. Something like "I'll be back!" or "Didn't see that coming..."
LEVELUP: The line a character says when he/she gains an experience level. Something like, "I feel even stronger!" or "Yeah! I like this!"
LOWHEALTH: The line a character says when he/she is in danger and needs health quickly. Something like, "I can't go down yet!" or "I don't know how much longer I can last..."
NOPOWER: The line a character says when he/she doesn't have enough energy to perform a certain power. Something like, "I need more power to do that." or "Dammit!"
RESPAFFIRM: The line a character says when he/she responds to a CMD command, or when you cycle to play as that character. Something like, "Yes" or "Okay, sure."
TAUNTKD: The line a character says when he/she knocks an enemy down but didn't kill them yet. Something like, "Is that all you got?" or "You're not going to last very long..." Lines that insult the enemy are good here as well.
THROWTAUNT: The line a character says when he/she throws an enemy. Something like, "Get outta my face!" or "Away with you!" It should be something quick.
TOOHEAVY: The line a character says when he/she can't lift up a heavy object (doesn't have Might). Something like, "I can't lift that" or "Are you kidding? That's way too heavy."
VICTORY: The line a character says when he/she has defeated/killed an enemy. Something like, "That's why I'm number one!" or "You had no chance of beating me." Various lines that sound confident or arrogant can go here.
XTREME: The line a character says when he/she is about to release his/her Xtreme power attack. Usually they'll say the name of what the Xtreme is. If that's not possible, then something like, "Here comes the finish!" or "Time to end this!" IMPORTANT -- these lines should have some kind of echo effect that travels, and should be louder than all other lines. Use your sound editing program to add an echo effect to it.

In Wavepad, once you have the line for the Xtreme, go to the end of it, hit Record to allow some extra space, then stop recording. Go to the Effects tab, and click Echo. You can then customize settings and hear how it sounds as you change them.

The following lines can also go into the voice file, but are not used all that often, and not as important.

BORED: The line a character says when he/she stands around idle for a long period of time. For MUA being a fast paced game, it's useless.
CANTGO: The line a character says when he/she cannot move in a certain direction. Not used often.
CMDATTACKANY: The line a character says when he/she commands their teammates to attack any enemy on screen.
CMDATTACKTARGET: The line a character says when he/she commands their teammates to attack a specific target.
CMDFOLLOW: The line a character says when he/she wants their teammates to follow him/her. Not useful, as most times they already follow.
ISEEYOU: The line a character says when he/she notices an enemy in battle. Not useful for MUA, but enemies/NPCs use it.
NOWORK: The line a character says when he/she is attempting to unlock something but isn't working. Not used often in MUA.
STATS: The line a character says when he/she has won a multiplayer battle. Not used often.


Once you have the lines as .wav sounds and at the correct format, open up ZSMeditor. Hit "File" then "New." Type whatever file name you want, but it must end in "_v" (the v stands for voice), and please note that the character name must be 7 letters or less, or it won't work.
For example, colossus_v won't work because :colossus: Colossus is eight letters, but colos_v will work fine because it's five letters. The "_v" doesn't count. Once you name it, you cannot rename it something else. We'll call this one "char_v" for this lesson. Pick the PC Version.

NOTE: You MUST name both the voice file and master file (later in this lesson) the exact same thing. And it MUST be the exact same thing as what you put in your character's herostat, under "sounddir." For example, if you name your voice file "united_v," then your master file MUST be "united_m," and in your herostat under sounddir, it MUST say "united_m" or something won't work.

Now, on ZSMeditor, go to Tools, then Import Sounds. Navigate to your game's sounds folder, then eng folder. The folders you see there are for every sound for all characters and stages in the game. They are in ABC order, pertaining to the first letter of the sound files. So, :iceman: Iceman's sound files let's say, would be in the I folder, so go there. You'll now see a second set of folders, pertaining to the second letter of a character's sound files. Iceman's files would be inside the C folder, so go there... You'll now see sound files for Iceman and a couple of others. Notice that Iceman has two files -- an iceman_m.zsm file (that's his sounds), and an iceman_v.zss file (that's his voice). Open the latter one, and wait for it to load.

On the importing side (right-hand side) of the program, you'll see his voice lines. On this side, click the "Files" tab, and checkmark where it says "Auto copy files's informations." The file information side (left-hand side) is where you'll construct your character's voice file. On this side, click the "Files" tab, and checkmark where it says both "Auto calculate file size" and "Auto calculate files hash."

Now drag and drop your .wav sounds containing your voice lines on the left-hand side. I usually do them three maximum at a time to set them up. (You can hit "Play" to hear what each of them sound like.) Now on BOTH left and right sides, click the "Event" tab. You'll now see on the right-hand side what action each of Iceman's lines are used for. It's the same actions I mentioned before. You can highlight one of them, and drag it to the left-hand side, depending on what it is. For example, if the first line that you put for your character was a TAUNTKD line, then drag a TAUNTKD line from the right and drag it to the left. You will now see that your character has a TAUNTKD line at number 00. That's how it works.
I don't use the drop-down Event option at the bottom of the left-hand side, because some commands like THROWTAUNT are not there, and XTREME_LAUNCH is there, but that's incorrect. You can always rename an event for each line by clicking on the name twice.

Notice that some of Iceman's lines have brackets with a number in the center on them? That's because he has more than one. If your character has more than one of a certain line, you can place a [number] next to it. For example, if you have more than one VICTORY line, then don't use VICTORY. Instead, use VICTORY[1] and so on, depending on how many you have. 8 is the maximum you can have for each.

As you drag and drop more of your .wav sounds into the Files tab, and naming what they are for in the Events tab. You can play how each of them sound. The Event is what the game will recognize the line as. So for example, if one line you have is a VICTORY line, then don't call it TAUNTKD. Or you'll only hear it if you knock an enemy down. Once you are done, click "File" then "Save." Choose to save it as a .zss file, then where it says "char_v" type the .zss entension when saving it. So it should say "char_v.zss" when saving it. Pick the PC format. And you're done. Congrats, you made a voice file!
This is to properly set up your character's sound files in the correct place so that they will work correctly.





MASTER FILE

Now that you created a voice file, you also have to create a main file. This is where power sound effects and character grunts go. It's called the master file because on your character's herostat where it says "sounddir" -- next to it is the character's master file that ends with "_m." Anyway, the process that you did for the voice file is the same for the master file, but it's easier.

When creating voice files, the following are the grunts you should try to acquire, as they are essential. You can have more than one of each line.

DEATH: The sound a character makes when he/she dies in battle.
JUMP: The sound a character makes when he/she jumps.
LAND: The sound a character makes when he/she lands from a jump.
PAIN: The sound a character makes when he/she is hit by an enemy attack or environmental hazard.
PICKUP: The sound a character makes when he/she grab an enemy or lifts an object.
THROW: The sound a character makes when he/she throws an object at an enemy.

The rest will be sounds based on powers, such as...
FLYBEGIN: The sound effect a character makes when he/she starts flying, if they can fly.
FLYEND: The sound effect a character makes when he/she lands from flying, if they can fly.
P1_POWER: The sound a character makes when he/she releases a power. It can be from power 1 to 10. More might be possible if you type it in.
P1_CHARGE: The sound a character makes when he/she is charging up for a power. It can be from power 1 to 10. More might be possible if you type it in.
P1_LOOP: The sound a character makes when he/she is holding to release a power. It can be from power 1 to 10. More might be possible if you type it in. This sound is supposed to be ongoing until release, but sometimes it doesn't work.
P1_IMPACT: The sound a character makes when the character's power connects to an enemy or a wall. It can be from power 1 to 10. More might be possible if you type it in. (You've seen these in entities files under "deathsound.")

The method is the same. You have to find them, then edit them with your sound editing program to make sure that they are all .wav sounds, and are PCM Uncompressed, 22050 hz, 16-bit, Mono.

Now, open ZSMeditor, click "File," then "New." Name it the exact same file name as you did for the voice file. They have to be identical, except that instead of a "_v" at the end, it will be a "_m" at the end. (The m stands for master.) We'll use "char_m" for this lesson.

The process is the same as with the voice file. You import an existing mod's sound file (this time, their master file -- iceman_m for example) and it will appear on the right-hand side. Drag and drop your .wav sounds to the left-hand side under the "Files" tab, and name the event for them under the "Event" tab. Use [number] if there are multiple sounds of the same type, such as PAIN[1], PAIN[2], PAIN[3], etc.

What makes the master file easier? Well, if you don't want to create all-new power sound effects, then don't. You can use any power sound effects from any existing mod that you already have in the game! Just import them on the right-hand side, press play to hear what they sound like, and if they fit your character's power, drag it to the left-hand side under the Files tab. But then rename that power under the Events tab. Easy, right? This is especially good for Xtreme power sounds.
When you are done, save the file, but this time, save it as a .zsm file, and type "char_m.zsm" when saving it. Congrats, you just made sounds files for your mod! Remember where you placed your new voice file? Place your new master file there as well.

NOTE: After you've made your sound files, you can't just rename them to something else -- it doesn't work that way. I mentioned this earlier, but to reiterate, if you try to rename a sound file, the game won't recognize it, making it useless. If you have to rename sound files, you must do them over again.




SETTING UP YOUR SOUNDS

Now that you've successfully created your sounds files, you need to do two things. First thing, check your herostat. Look under the line "sounddir." It should precisely match the name of your master file. (For example, if you named your master file "char_m" then that's what it should say in your herostat. Because this is what the game is going by. Plus, your voice file should have the same name, but with a _v at the end ("char_v" for example). If it's not identical, then you didn't follow this lesson correctly -- you did something wrong. If it's identical, then good. You can move on to the second thing.

Second thing, open up your character's powerstyle file (ps_character.engb). Look in the coding for your powers and your grab smash. They should have sound triggers that will look something like this...

      trigger {
      name = sound ;
      sound = char/ghost_m/p5_charge ;
      time = 0.415 ;
      }

By now, you know what each mean. Now you can plug the power sounds to correspond with the powers they are used for. The sound will always be "char/(whatever you named your master file)/(whatever you named the event) ;" (Example: sound = char/char_m/p1_power ;)
You can now go through your powerstyle file and time each of your sounds to each of your powers, then play the game as your character to make sure that your sounds and voice are working fine. If the timing of the sound effects are a little off, adjust the time of the sound trigger accordingly until it's just right.

And remember, you can connect an effect trigger to a sound trigger if they are supposed to happen at the same time, such as the example below.

      trigger {
      bolt = Bip01 Head ;
      effect = char/ghost/p5_power ;
      fxlevel = 1 ;
      name = effect_sound ;
      sound = char/ghost_m/p5_charge ;
      time = 0.415 ;
      }

Personally, I always work on sounds last, because that is the time when you have to check out your mod to make sure that everything is functioning correctly anyway. Don't be in a rush to release. Check everything, and make sure that everything works without a problem.




X_VOICE

If you'd like to make a custom sound for x_voice.zss such as character callouts or character breaks, you can press F3 for the Text To Hash box. Type what you want in the bar, then hit the convert button. This will create a set of numbers for you. This is what you will place in the Event tab for the sound you want.


Character Callouts are when someone like an announcer calls out your character's name when you select them. You can type the following in the Text To Hash bar:
COMMON/MENUS/CHARACTER/AN_name
Note that this says "name", not "charactername." There is a difference. Check the character's herostat. For example, in the case of Black Widow, you can't put "Black Widow" or "blackwidow" -- it won't work. You have to put the name it says on the herostat, which in her case is "blackwidowv." The name is not case-sensitive.

If a character has more than one callout line (not common), you can type the following in the Text To Hash bar instead:
COMMON/MENUS/CHARACTER/AN_name/***RANDOM***/0 (for the first callout)
COMMON/MENUS/CHARACTER/AN_name/***RANDOM***/1 (for the second callout)
COMMON/MENUS/CHARACTER/AN_name/***RANDOM***/2 (for a third callout if any, and so on)
Notice the last number there? Any callouts you have for a character will be heard randomly, but goes here in numerical order.

NOTE: Currently, a fellow admin here named Ceamonks890 does callouts for every single mod, once the mod is officially released. So you can add those using this method. However, do so only with your own personal x_voice file. Do not release the sound file publicly.


Character Breaks are when a character says something just before leaving the character select screen (team stage). You can type the following in the Text To Hash bar:
COMMON/MENUS/CHARACTER/BREAK_name
Again, it says "name", not "charactername." The computer only recognizes the "name" of the character.

If a character has more than one break line, you can type the following in the Text To Hash bar instead:
COMMON/MENUS/CHARACTER/BREAK_name/***RANDOM***/0 (for the first break line)
COMMON/MENUS/CHARACTER/BREAK_name/***RANDOM***/1 (for the second break line)
COMMON/MENUS/CHARACTER/BREAK_name/***RANDOM***/2 (for a third break line if any, and so on)
Again, notice the last number there? Any break lines you have for a character will be heard randomly, but goes here in numerical order.


NOTE:
If you need visuals on learning how to edit your x-voice, Nicaras created a more visual tutorial on this in particular: You can find it here: https://marvelmods.com/forum/index.php/topic,11055.0.html






Lesson Takeaway:
-Use a trusted Youtube to MP3 converter to avoid viruses or malware, or make sure your security system is solid.
-Use an echo effect for your character's Xtreme power attack.
-Sounds must be in .wav format, PCM Uncompressed, at 22050 hz, 16-bit, mono.
-Voice files and master files must match the name given in your herostat's "sounddir." Up to 7 letters long, then _m or _v. Can't rename them once done.
-Test out your sounds by playing the game as your character. Don't be in a rush to release.

Title: The Outsider's Guide To Modding - Lesson 20
Post by: Outsider on March 28, 2020, 08:31PM
(http://www.mediafire.com/convkey/a28b/hx62dfmx49927evzg.jpg)
Lesson 20: Project Finish

The finish line is so close that you can taste it! You've officially covered all of the bases and are confident that you pulled it off nicely. So, here's your final lesson, consisting of some simple steps.


STEP 1
Check your character's herostat -- make sure it's correct, uses the correct numbers, has attributes/stats that are not too overpowered, "name" and "sounddir" are correct, etc. Place it as a .txt file, to be opened easily via Notepad.


STEP 2
Play through the first stage -- the Hellicarrier, as your new character mod. Check everything. (1) Make sure your icons are correctly aligned to the correct power. (2) Make sure your character's skins are hex-edited. (3) Make sure your character's sounds are timed perfectly to your character's powers. (4) Make sure the power descriptions are referring to the same power, and check for spelling/grammatical errors.


STEP 3
Set up your character's folders to set up for public release, and put your files in the correct folder.
FOLDERS
actors
data / entities (if any), fightstyles (if any), powerstyles, talents
effects / char/ (whatever you named your character)
hud
models (if any) / bolton, weapons
packages / generated / characters
scripts / common (if any)
sounds / eng / (first letter of sound files) / (second letter of sound files)
textures / loading, ui
ui / models / mannequin

This is very important, because if you put files in the wrong places, then when others play as your mod, there will be problems with it. Set it up the way you set yours up.


STEP 4
Create a .txt file and name it "ReadMe." This is the file where you introduce your mod, mention its features & any pertinent information such as potential bugs or special instructions. This is also where you will write credits to anyone who helped you on the creation of your character. Always give credit where it's due. Also, mention if your mod crashes with another mod in mannequin and/or loading screens. This is REQUIRED.


STEP 5
Create either a compressed (zipped) folder, a 7-Zip file, or a .rar file, and place all the contents of your mod inside. Name that zip or rar whoever the mod is followed by your name. The idea is that when they open it, they can just drag and drop your character mod's contents into their game easily. Upload it to a file storing website such as Mediafire or Box. (I personally use Mediafire.) Copy the link that they give you leading to the file.


STEP 6
On your own thread, create a release post announcing your new character mod. You can mention features, his/her power moveset, potential bugs etc. However, you MUST include a warning saying which mod that your mod will clash with in terms of mannequin and/or loading screens. (And at this point, it will clash with another.) Obviously, include the link to the mod so people can download it.





Congratulations!!!! You have crossed the finish line and have successfully completed your first mod project!!!

Remember that your first mod will always be your hardest. The more you do it, the easier it gets. But, it's still a lot of work, so the Marvel Mods community does give props to those who pull it off. For many dream of creating their own mods, but few actually push themselves to do it, and even fewer see it through to completion. So, give yourself props as well.

BTW, no one is perfect. If someone reports to you that there is a problem with your mod, don't panic. Just listen to what they have to say -- as it could be a legit problem, or something you didn't notice initially. That's alright, we all go through that from time to time -- myself included. If you check the mod yourself and see that the issue reported is valid, then see what you can do to fix the issue. If on the other hand, you don't see the error in question, then the issue is something to do with their game, not your mod. In which case, kindly inform them of such.






Lesson Takeaway:
-Create the necessary folders and place your files in the correct folders.
-Play through the Hellicarrier as your character, and make sure it's all running smoothly.
-Create a ReadMe file that includes pertinent information about the mod and all credits.
-After uploading it and receiving the link, post it to the public with the link to it.
-Place a warning of which other mod that your mod will clash with. It is required, so do not forget to.





I thank you for following these lessons, as I know it was a LOT of information. But now you know all that I have done for many years. I may make it look easy, but it isn't. Hopefully, you've gained an appreciation for each of the modders here, now seeing how it's done. Follow these lessons, and perhaps one day you'll join our ranks. Good luck on any attempted modding projects. This concludes the lessons.

Class dismissed.

Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Pichoon04 on May 01, 2020, 10:08PM
Hello, I wanted to thank you for this guide, it really helped me a lot, I speak a little English, my language is Spanish, however I understood everything perfectly, thank you very much for your time.  :punisher_logo:  :bowdown1:
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: BarryAllen on May 02, 2020, 09:18AM
Very busy with uni right now, but soon I'm gonna give this my all. Thank you so much for taking the time to do this. It was so hard to find this sort of info, let alone in one place with such detailed explanation!
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Putine on August 16, 2021, 02:43AM
Hello Outsiders and all talented mod moderators, I'm new to modding. I am interested in making mods. Can you help solve this problem? When I open pkgb format with XMLBCUI and pkgb gives an error, do I need to download a new version of the program?

(https://sun9-70.userapi.com/impg/lSEAThetsyjg1Gt770c21TeNBkkBy1cIKDfSXw/m0tscxdnL4A.jpg?size=1000x500&quality=96&sign=eb4d69e898efe4d92f5617bf24ca283c&type=album)

(https://sun9-15.userapi.com/impg/iNFU7gcT8KwMVGvZc4w223_ta62oYp8r5wrygw/j6JPwGEvMZw.jpg?size=1000x500&quality=96&sign=a37f948a9a1e24f53c6d30a5016d193b&type=album)

(https://sun9-76.userapi.com/impg/tVCxExJH-ZByASYw-4rhzaU8KXkp6fdzdte2Zg/7GF6aLNxO6I.jpg?size=1000x500&quality=96&sign=37f6b790b3d43851e1fe14b3441dd4d2&type=album)

Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: BaconWizard17 on August 16, 2021, 01:49PM
The special characters in your folder's name are likely what's causing the issue
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: ak2yny on August 17, 2021, 12:27AM
Quote from: Putine on August 16, 2021, 02:43AM
When I open pkgb format with XMLBCUI and pkgb gives an error, do I need to download a new version of the program?

Quote from: BaconWizard17 on August 16, 2021, 01:49PM
The special characters in your folder's name are likely what's causing the issue

I can't see the images, but if the special characters are a problem, there is another solution (other than moving/copying the pkgb file to a path with standard characters): https://marvelmods.com/forum/index.php/topic,10969.msg200476.html#msg200476
Scroll down to "Raven Formats Conversion Tools". The tool should be able to do the job with a path that includes special characters (BloodyMares tested it on his machine, using cyrillic letters). If you don't want to install Python, you can use xmlb-compile (the actual program behind XMLBCUI), which is included in the pack too.
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Putine on August 17, 2021, 02:48AM
The problem is solved, it seemed to me that everything would work out smoothly with Russian characters, I did not even notice that the program does not accept such characters. Anyway, thank you two.
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: spidermatt on August 05, 2023, 12:46PM
I have three questions when it comes to creating Loading Screens and Hud Heads for myself. Which version of SkinnerUI should I use, does all of this require Alchemy 5, and do I have to worry about viruses?
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: BaconWizard17 on August 07, 2023, 01:06PM
Quote from: spidermatt on August 05, 2023, 12:46PM
I have three questions when it comes to creating Loading Screens and Hud Heads for myself. Which version of SkinnerUI should I use, does all of this require Alchemy 5, and do I have to worry about viruses?

SkinnerUI only has one version and it does not require Alchemy 5. You don't have t worry about viruses with any of our tools. However, SkinnerUI does not work for most people on Windows 10 or Windows 11, so you will likely have better luck with Alchemy 5 tools. Loading screens can be created with image2igb, and you can use the Alchemy 5 texture replacement method for hud heads. You can find tools here (https://marvelmods.com/forum/index.php/topic,10969.msg204521.html#new) and the tutorial for Alchemy 5 texture replacement can be found here (https://marvelmods.com/forum/index.php/topic,11009.0.html). If you need additional help, our Discord server is much more active in terms of assisting people, as it's easier to talk and reply in real time.
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: spidermatt on October 04, 2023, 09:11AM
I got the loading screens taken care of and I'm still figuring out how to create hud heads. Now is there a way to change images in the Objectives section?
Title: Re: [MUA1] The Outsider's Guide To Modding
Post by: Outsider on October 06, 2023, 06:22AM
Quote from: spidermatt on October 04, 2023, 09:11AM
I got the loading screens taken care of and I'm still figuring out how to create hud heads. Now is there a way to change images in the Objectives section?

Sorry, but this tutorial is about character modding, so you're in the wrong place. Send me a direct message. I'm currently at work, so I'll respond when I can.