The one big thing that Pro offers are Data Structures, though, and the main good thing with those are that they're faster than arrays, especially if you're gonna do lots of maths with them since there's built-in area operations saving you from having to for-loop through them. But for a simple RPG, you can likely do without them.
As for formulas, I would use a system like this:
- Each characters has the stats MAXHP, MAXSP, ATK, DEF, MAG, RES, HIT and EVA.
- Each character also have eight more stats called BASEMAXHP, BASEMAXSP, BASEATK, BASEDEF, etc.
- Each character starts out with all stats being equal to their base stats.
- Whenever a character levels up, their stats gets increased with 0.5 times the appropriate base stat. This means that stats aren't integers most of the time, but don't worry about that. Just display the floor() of numbers in menus, it looks prettier than decimal numbers. HP gain is larger, though, you gain 2x your base stat of MAXHP each time you level up.
- When you equip an item, it increases your normal stats and not your base stats. When you unequip it, all stats are decreased instead. (If you make an item equip script, give it another argument that lets you multiply all stat change values with either +1 or -1, that'll let you unequip stuff easily)
- The damage formula should be something like this: damage = ((((player attack stat)*attack buff factor + attack bonuses)^2) / ((enemy defence stat + defence bonuses)*defence buff factor))*(elemental damage multiplier)*(all other damage multipliers)
As you can see, ATK values grows quadtratically while DEF values grows linearly, which means that later in the game you have high numbers of damage while early in the game you have low numbers.
- The hit formula should be something like this: HITBASE = (your HIT*(0.5*hitbonusmultiplier + random(0.5)))/(max(1,target EVA*(random(0.5) + 0.5*evadebonusmultiplier)))
The chance to hit is 1 - exp(-HITBASE), so you could compare random(1) with 1 - exp(-HITBASE) and if the random value is smaller, the attack hit. As you can see, if HITBASE is near zero the chance to hit is around 1 - 1 which is zero, and for large values of HITBASE (where HIT is a lot larger than the enemy EVA, or if the enemy EVA is near zero) the chance to hit gets closer and closer to 1, but never actually reaching there.
Specifically, if HITBASE is 1, the chance to hit is 1 - exp(-1) which is 1 - 1/e which is around 67% or two thirds.
Oh, and don't listen to DannyJenn about switching the values of the party characters altogether! It's much better to make one static array where you store player data, and then make another array for the party that just stores the index of the player data array where all the player data is.
global.party = 6
we go to the playerdata array in position 6 and see:
global.name = "Lucas"
global.sprite = spr_lucas
global.hpmax = 401
global.hp = 325
...and so on. We now know enough to draw the status card for the first-place party member.