1. Please be advised of a few specific rules and guidelines for this section.

RELEASED RPG Growth 1.92

Adds RPG-like growth (stat points and classes) to Starbound

  1. RedCore22

    RedCore22 Void-Bound Voyager

    Okay.
     
  2. LordRuin

    LordRuin Scruffy Nerf-Herder

    Yeah, I've noticed that. What about 2 handed katanas?
     
  3. RedCore22

    RedCore22 Void-Bound Voyager

    And Scythes?
     
  4. ElvenArcher

    ElvenArcher Space Spelunker

    great mod. great idea.
    tho i wish some items in game could enhance my stat points. At least some additions of stimpacks and food buffs would add some diversity to the game.

    also, how about farmer and builder classes ? :) possibilities are endless ...
     
  5. Lucky_Mole

    Lucky_Mole Big Damn Hero

    Hey, ThornyFlora great mod you've made! I've kept playing Starbound after I've done everything else only thanks to this gem. So is there any way to keep it so - any command to remove the level cap? :) On several occasions now I've been opening the book to level up only to remember I can't anymore, hah.
    Also regarding the weapon you get from the quest. Could you maybe make it a choice of several distinct ones. Been playing with a sniper primary and the one that I got was more like a shotgun that had the damage of a sniper, which was more powerful than my other guns, but I kept my old one, because of my preferred style. Maybe a more specialised one, once you are able to choose a sub-class to go with it?
     
  6. ThornyFlora

    ThornyFlora Pangalactic Porcupine

    Not affected yet, but I can always add it later.

    Also not included, but the Necromancer Subclass will have a Scythe, so I will add them too.

    Herbalist and Miner are planned Specializations, among others. Not exactly Farmer and Builder, but close in concept.

    There will be a Sniper Subclass for the Soldier which will have a Sniper Rifle as their Class Weapon, but I've been taking a bit of a break, since I have a lot to do for classes, and I've burned out. I'll be returning to the mod soon.
     
  7. Lucky_Mole

    Lucky_Mole Big Damn Hero

    You've certainly updated it a lot and fast in the past weeks. Take your time, finish your classes, we will be waiting you for sure. :)
     
  8. RedCore22

    RedCore22 Void-Bound Voyager

    Well, could you add an "Critical Hit" Subclass of Ranger/Knight (Huntress/Hunter) which has the Ruyi Bang and Jingu Bang / Rakuyo?
     
  9. AngleWyrm

    AngleWyrm Scruffy Nerf-Herder

    Is there somewhere that shows the current bonuses for my level and stat upgrade choices?
     
  10. ThornyFlora

    ThornyFlora Pangalactic Porcupine

    Info Tab in the book. It's the tab labeled 'I'.
     
    AngleWyrm likes this.
  11. Segenam

    Segenam Phantasmal Quasar

    After ThatThunderCookie/quiqksilver did a video on using admin commands to spawn in faster aim-able fist weapons it seems more and more are switching to that style as well (including Frackin' Universe) will you be making the Rogue's Siphon follow FU's/Quiqksilver's style?

    Video Here
     
  12. AngleWyrm

    AngleWyrm Scruffy Nerf-Herder

    I'm putting this here as a thought development post; as more useful aspects become apparent I'll update the post.
    No action is needed, it's an exercise in comprehension.

    The three tiers of experience level
    1. level/xp^0 -- origin -- the starting point of level
    2. level/xp^1 -- rate -- the rate of level gain in levels/xp
    3. level/xp^2 -- deceleration -- the change in rate, in levels/xp per xp
    The result is a quadratic polynomial equation of the form y = ax^2 + bx + c
    level = deceleration*xp^2 + rate*xp + origin

    So the graph is a parabola, the same arc drawn by throwing things

    [​IMG]

    Designing a Curve
    The vertex form of a quadratic equation is quite handy for design.
    Vertex form: a(x-h)^2 + k, which can be restated as level = deceleration(xp - xPeak)^2 + yPeak
    Then we can just specify xPeak=250,000 xp, yPeak=50 levels and a desired deceleration = -1/1.24e9 levels/xp^2 to get the graph.

    If in addition we want the starting level to be zero, it can be even simpler. Then all that is needed are the coordinates of the peak, so that the final formula is
    level = -yPeak/xPeak^2 * (xp - xPeak)^2 + yPeak
     
    Last edited: Oct 18, 2017
  13. yay855

    yay855 Scruffy Nerf-Herder

    I have been experiencing a strange glitch with this mod- Novakid Explorers do not give off a glow. At least, a glow stronger than they normally do.
     
  14. Ryuuze

    Ryuuze Void-Bound Voyager

    So, i got my hands on the Versa, and got smacked with this particularly lovely error supposedly caused by an inconsistency with FU's critical stuff

    The above is from the log, not some popup error, the game didn't crash either, but it froze for a moment the first time, and afterwards, only the gun locked aim direction whenever i tried to fire normally, and i had to change to another wep and back to aim with it again. The gatling ability worked just fine though.

    I tried adding in critChance and critBonus in the activeitem file, but that pretty much did nothing..

    ...

    After a while of fiddling about, i found out, that all i had to do, was add in the fu vars and crit damage script regions in gunfire.lua from fu into the soldiergunfire.lua... and change the damagePerShot function to match, so the entire file ended up looking like below.

    Code:
    require "/scripts/util.lua"
    require "/scripts/interp.lua"
    
    -- Base gun fire ability
    GunFire = WeaponAbility:new()
    
    function GunFire:init()
      self.weapon:setStance(self.stances.idle)
    
      self.cooldownTimer = self.fireTime
      self.fireTimer = self.fireTime
    
      self.weapon.onLeaveAbility = function()
        self.weapon:setStance(self.stances.idle)
      end
    
    -- **** FU VARS
      local heldItem = world.entityHandItem(activeItem.ownerEntityId(), "primary")
      local heldItem2 = world.entityHandItem(activeItem.ownerEntityId(), "alt")
      local opposedhandHeldItem = world.entityHandItem(activeItem.ownerEntityId(), activeItem.hand() == "primary" and "alt" or "primary")
    end
    
    
      -- *******************************************************
      -- FU Crit Damage Script
    
    function GunFire:setCritDamage(damage)
        if not self.critChance then
            self.critChance = config.getParameter("critChance", 0)
        end
        if not self.critBonus then
            self.critBonus = config.getParameter("critBonus", 0)
        end
    
         local heldItem = world.entityHandItem(activeItem.ownerEntityId(), activeItem.hand())
         local opposedhandHeldItem = world.entityHandItem(activeItem.ownerEntityId(), activeItem.hand() == "primary" and "alt" or "primary")
         local weaponModifier = config.getParameter("critChance",0)
        
      if heldItem then
            self.critChance = 0 + weaponModifier            
      end
    
      self.critBonus = (status.stat("critBonus",0) + config.getParameter("critBonus",0))/2
      self.critChance = (self.critChance  + config.getParameter("shieldCritChance",0) + config.getParameter("critChanceMultiplier",0) + status.stat("critChanceMultiplier",0) + status.stat("critChance",0))
      self.critRoll = math.random(200)
      local crit = self.critRoll <= self.critChance
      damage = crit and ((damage*2) + self.critBonus) or damage
      self.critChance = 0
    
      if crit then
        if heldItem then
          -- exclude mining lasers
          if not root.itemHasTag(heldItem, "mininggun") then
            status.addEphemeralEffect("crithit", 0.3, activeItem.ownerEntityId())
          end
        end
      end
    
      return damage
    end
      -- *******************************************************
    
    function GunFire:update(dt, fireMode, shiftHeld)
      WeaponAbility.update(self, dt, fireMode, shiftHeld)
    
      self.cooldownTimer = math.max(0, self.cooldownTimer - self.dt)
    
      if animator.animationState("firing") ~= "fire" then
        animator.setLightActive("muzzleFlash", false)
      end
    
      if self.fireMode == (self.activatingFireMode or self.abilitySlot)
        and not self.weapon.currentAbility
        and self.cooldownTimer == 0
        and not status.resourceLocked("energy")
        and not world.lineTileCollision(mcontroller.position(), self:firePosition()) then
    
        if self.fireType == "auto" and status.overConsumeResource("energy", self:energyPerShot()) then
          self:setState(self.auto)
          self.fireTime = math.max(self.fireTime - 0.01, 0.1)
        end
      end
    
      if self.fireMode ~= (self.activatingFireMode or self.abilitySlot) or status.resourceLocked("energy") then
        self.fireTime = self.fireTimer
      end
    end
    
    function GunFire:auto()
      self.weapon:setStance(self.stances.fire)
    
      self:fireProjectile()
      self:muzzleFlash()
    
      if self.stances.fire.duration then
        util.wait(self.stances.fire.duration)
      end
    
      self.cooldownTimer = self.fireTime
      self:setState(self.cooldown)
    end
    
    function GunFire:cooldown()
      self.weapon:setStance(self.stances.cooldown)
      self.weapon:updateAim()
    
      local progress = 0
      util.wait(self.stances.cooldown.duration, function()
        local from = self.stances.cooldown.weaponOffset or {0,0}
        local to = self.stances.idle.weaponOffset or {0,0}
        self.weapon.weaponOffset = {interp.linear(progress, from[1], to[1]), interp.linear(progress, from[2], to[2])}
    
        self.weapon.relativeWeaponRotation = util.toRadians(interp.linear(progress, self.stances.cooldown.weaponRotation, self.stances.idle.weaponRotation))
        self.weapon.relativeArmRotation = util.toRadians(interp.linear(progress, self.stances.cooldown.armRotation, self.stances.idle.armRotation))
    
        progress = math.min(1.0, progress + (self.dt / self.stances.cooldown.duration))
      end)
    end
    
    function GunFire:muzzleFlash()
      animator.setPartTag("muzzleFlash", "variant", math.random(1, 3))
      animator.setAnimationState("firing", "fire")
      animator.burstParticleEmitter("muzzleFlash")
      animator.playSound("arfire")
    
      animator.setLightActive("muzzleFlash", true)
    end
    
    function GunFire:fireProjectile(projectileType, projectileParams, inaccuracy, firePosition, projectileCount)
      local params = sb.jsonMerge(self.projectileParameters, projectileParams or {})
      params.power = self:damagePerShot()
      params.powerMultiplier = activeItem.ownerPowerMultiplier()
      params.speed = util.randomInRange(params.speed)
    
      if not projectileType then
        projectileType = self.projectileType
      end
      if type(projectileType) == "table" then
        projectileType = projectileType[math.random(#projectileType)]
      end
    
      local projectileId = 0
      for i = 1, (projectileCount or self.projectileCount) do
        if params.timeToLive then
          params.timeToLive = util.randomInRange(params.timeToLive)
        end
    
        projectileId = world.spawnProjectile(
            projectileType,
            firePosition or self:firePosition(),
            activeItem.ownerEntityId(),
            self:aimVector(inaccuracy or self.inaccuracy),
            false,
            params
          )
      end
      return projectileId
    end
    
    function GunFire:firePosition()
      return vec2.add(mcontroller.position(), activeItem.handPosition({self.weapon.muzzleOffset[1], self.weapon.muzzleOffset[2]-0.1}))
    end
    
    function GunFire:aimVector(inaccuracy)
      local aimVector = vec2.rotate({1, 0}, self.weapon.aimAngle + sb.nrand(inaccuracy, 0))
      aimVector[1] = aimVector[1] * mcontroller.facingDirection()
      return aimVector
    end
    
    function GunFire:energyPerShot()
      return self.energyUsage * self.fireTime * (self.energyUsageMultiplier or 1.0)
    end
    
    function GunFire:damagePerShot()  --return (self.baseDamage or (self.baseDps * self.fireTimer)) * (self.baseDamageMultiplier or 1.0) * config.getParameter("damageLevelMultiplier") / self.projectileCount
      return  GunFire:setCritDamage(self.baseDamage or (self.baseDps * self.fireTime) * (self.baseDamageMultiplier or 1.0) * config.getParameter("damageLevelMultiplier") / self.projectileCount)
    end
    
    function GunFire:uninit()
    end
    Note: the fu vars region is inside the GunFire:init() function (i failed to notice this initially when i was adding it xD)


    please do say if i should remove the spoiler block -and it's content- above btw!

    EDIT: i actually didn't check if just the vars or the crit function was enough, i just went ahead and added all of it.. too sleepy to bother doing otherwise xD
     
    Last edited: Oct 17, 2017
  15. ComradePierre

    ComradePierre Void-Bound Voyager

    Hello, hi... Just a question, Ive i stalled a mod that adds enemy spawns how do i make them drop exp orbs?? Also.. Is this compatible with FU?? TNX
     
  16. Ryuuze

    Ryuuze Void-Bound Voyager

    it is indeed compatible with FU, and in order to add exp to new mobs, you have to add the treasurepools with the exp to the monsters. (take a look at fumonsters.treasurepools.patch inside this mod for some hints)

    keep in mind though, FU is updated very frequently, so any enemies added after the last update of this mod probably won't be included in that...
     
  17. ThornyFlora

    ThornyFlora Pangalactic Porcupine

    ThornyFlora updated RPG Growth with a new update entry:

    Patch 1.25

    Read the rest of this update entry...
     
  18. Creld

    Creld Void-Bound Voyager

    Bit o' feedback: Overall, extremely solid mod. It does resemble Classic rpg stats very well. I have 2 complaints (though that might be things already considered and decided against).

    First, dexterity does too much. It's the sole damage scaling source for the majority of the game's weapons and is the source of bleed, which is another damage increaser. It's also the primary stat for 3 classes and an important stat for shield knights and explorers.

    My suggestion for fixing it would be allow 1 handed weapons, bows, and thrown weapons scale of the higher of Dex or Strength. Knights would be less multiple attribute dependent (MAD, thank dnd 3.5) and it would set up for a monk (fists and quarterstaffs) or barbarian classes (axes/hammers) in the future.

    Second complaint, obviously a much bigger problem, there's no luck stat! Half joking, but it would be nice to have a generalist stat that does a lot of things less efficiently. It might increase everything (health, energy, energy regen, energy recharge delay, damage, jump height etc) at 1/10th the rate of other attributes while giving a bonus to xp gain. Basically a go to for explorer types that don't fight as often and therefore get xp more slowly.

    Once again, great job I can't wait to see what else you do with this!
     
  19. semenmen23

    semenmen23 Space Spelunker

    Where I can get parasitic goo?(is is stupid question I know)
     
  20. LaughingAlex

    LaughingAlex Ketchup Robot

    If I may have some constructive criticism as well: Nerf Vigor and Vitality some. Vitality booosts health multiplicably by 5% every point you put in it, you can make your character into a massive health bag very early, and going for a tank route vitality far out-shines endurance due to how endurance doesn't reach multiplicative scaling itself(that is, %'s in the 70s+ range of resistance, where each individual extra % above that is more powerful than the last). Vigor also simply does to much. I'd lower the %'s down to like 2% per point.

    Also I actually agree with the idea of a luck stat, also; it's ok to have a "God stat", that is a generalist stat that rules the rest a little. But you want to avoid letting any one stat become a "Dump stat" and be careful over-nerfing stats to. I mean I looked at the google doc and the upcoming dex nerf to the critical strikes, and can see why thats coming up. But be careful with that. And also are the damage increases from strength, dex, intelligence(just the raw increases) additive or multiplicative? Cause if they are the former, imo thats way to weak at high gear levels. Even in Frackin Universe, where lots of equipment provides less damage%, a 2% increase in damage per point amounts to a net increase per stat point of 1% or even less per point and even less if you go for armor increasing damage further.

    And Agility is also a majorly powerful stat that makes characters run like the wind. Maybe half it and/or soft-cap run speeds and give agility another benefit should player hit max running/jump? I mean maxing agility would make your character as fast as a bike.

    This brings me to what I feel are balanced stats atm. So far, I feel endurance is fairly balanced. Because while I haven't gotten to max stats yet, I know most part unless you play a glitch with Frackin races installed or maybe nova-kid(for environmental resists) that it takes a lot of endurance to get a noticable increase. Maybe to much, but I also know that if resistance is literal damage reduction, then it's a stat that if buffed even slightly would be potentially overpowered. If the max is say, 50 then 37.5% resistance to physical and 25% resistance to everything may not seem like much but stacking it with other things makes it huge. A glitch with 15%(unless it's 20% maybe?) base resistance maxing endurance would be over 50%, slap a suit of densinium or war-angel and the glitch is nearly unaffected by physical attacks and the weakness to electrial/cosmic is also mitigated sharply already. Thats even before stat-scaling. But it's a stat that by itself isn't overpowered and imo it's the most balanced.

    Also consider: Defense and offense multiply one another. If I make a stat adjustment to sacrifice 20% raw offense to double my defense, I'm actually gaining 80% more offensive capacity overall due to survivability increase. Thats why I feel currently except for dex vitality is so much more powerful(5% health increase vs a diminishing return damage increase) then any damage stat.

    Again, I'd look at how the stats add up. ATM I feel vitality and vigor are to powerful and agility is a close second. Damage boosts themselves with the damage stats I'm unsure of, but suspect that except for dex they are "Dump stats"(stats to weak to be worth investing in) if they don't scale with armor damage increases. Dex is the exception to this atm, even the upcoming bleed nerf it'll still be powerful(and I'd be ticked to see it devolve into a dump stat). Endurance seems weak but is more powerful then it lets on in FU, and imo is pretty balanced.
     

Share This Page