Help me balance my Homebrew Born-Lycanthrope Race please

I’ve built a homebrew race for born lycanthropes of different varieties. I’ve referenced the Order of the Lycan Blood Hunter class and NPC Werewolves while I was building it and used my imagination for some of the other strains of Lycanthropy (Weredrake, Bat, Etc.)
I had two aims while making this race. My first aim was to have all the different types be obviously part of the same group but all offer something a little different in terms of their flavor and what they offer mechanically. The second aim was to really convey that Lycanthropy was both a powerful gift and an impractical curse in the life of a person, but as a born lycanthrope they could slowly learn to control it over time if they wished to try, and as a result function more normally in everyday life. Could you help me get to a point where benefits and drawbacks are well balanced and suggest any points where some more flavor might be needed to explain some mechanical decisions? The aim, while making sure the class isn’t too OP is to have some really strong abilities that balance out with some big drawbacks rather than nerfing it to have small benefits and small drawbacks.

Link to the class page on DND Beyond is Here.

Many Thanks

How should i balance my monsters

I have created a few new classes and races for my game they all have the strengths and weaknesses but are still very powerfull.What is the best way to balance monsters or if I should simply put in more powerful creatures.My players are currently playing my campaign were they are traveling to the astral plane to kill an empyrean as a favor for having a devil save them in battle.I don’t want to keep throwing out powerful creatures but don’t want them obliterating all the weaker ones so how should I balance these monsters either give me tip on the best way to balance monsters or send me custom rules and monsters that can be fought at a medium difficulty.This game is in 5e

How to balance enemies in BESM 4e?

I’m only somewhat experienced in DMing, and decided to run a game of Big Eyes Small Mouth 4th edition. I’ve started world building around the other characters, and during creation I found that one of the characters can deal 44 damage on a hit. While I’m not worried (yet) about him overpowering the other characters, how would I go about making enemies to fight the group if they can deal that much damage? Do I just make them at higher point pools? Or should I just ignore point pools to a certain extent?

I ask because of how open the system is and how few generic monsters and npcs are given in the system compared to D&D 5e, which I’m more experienced in in comparison.

The main thing I’m worried about is enemies not having enough help and just dying in 2 hits.

How can you find a balance between effective/optimised characters and creative characters?

When creating characters, I often face a dilemma between making a character. It feels like they can either be optimized so they can "pull their own weight" or having a character I think is creative and fun to play.

When I say ‘pull their own weight’, by and large I mean by filling out the role expected of them (e.g. doing your best to maximize your DPS as a striker in 4E D&D, or choosing useful life paths in Traveller as opposed to interesting ones) and contribute to encounters at the same level as the rest of the group.

I was wondering if there were situations or game systems where one is categorically not OK? For instance, 4E as a system seems more inclined towards optimisation than others. How have people handled this as a group before? Was it handled IC or OOC?

Examples

In D&D 4e

  1. I’ve tried to play a scholarly warlock, buying magic items with flavour (goggles that let you read any language, for example) which was criticized by my gaming group because I had to spend money wisely so the group was strong enough to defeat encounters.

In Vampire

  1. I’ve created a Tremere with no Thaumaturgy, as the character in life was a skeptic; it was resolved in character by the sire co-ercing him into learning those powers eventually.

I saw this graph the other day on the WotC forums: Optimisation Graph

It made me realise the issues I’ve had before were due to not wanting to sit in the blue box, or that close to it, for roleplay reasons. Hopefully this should clarify my points above.

Necromancy subclass balance suggestion? [closed]

I am using This as the base. My homebrew is a subclass added to the ones already existing: Guides of the Forgotten

GUIDE OF THE FORGOTTEN

Necromancer subclass Lore: Guides of the Forgotten are determined to make the new world remember the old, the ones that once were. To uncover the potential of those long forgotten. The fossils of Dinosaurs revived by necrotic magic, brought to new life. They are trained in the mastery of will. Determination is key. To force one’s beliefs on the World is the essence of necromancy, to force the dead to raise because you want them to raise. Guides of the forgotten have mastered this ancient art of WILL. Their strength of conviction combined with necromancy allows them to restore and revive bodies which haven’t moved for millions of years. For a given amount of time, that is. However, they can extend this time through use of WILL. The will of a Soul can be captured after death. In the moments where the Soul leaves the Body a skilled necromancer can capture the will of a Soul for later use such as lengthening the time a body can be sustained with necrotic energy.

Body decay system

Determines duration and Strength of reanimated things:

  • missing limbs etc.
  • Disfigured Necrotic energy recreates the missing body parts, this energy lasts for a set amount of time, depending on the creature. After this time, the dismembered body drops to the ground, it then has a 1 in 3 chance of breaking. Roll a d6, 1 or 2 means it breaks.
  • after death, a body can be reanimated into a undead who remains under your control till death
  • after decay (3 hours), can be reanimated into a zombie. This zombie remains under your control for 24h, after that he will remain still, only defending himself from attacks
  • fossilized bones and other remains of creatures, need to be found or bought. Fossils can be assembled into a fossilized skeleton if all pieces of one creature are obtained. They then count as a body.

All creatures summoned have an ac of 10, while HP is based on CR

CR : HP

  • 1: 11hp
  • 2: 17hp
  • 3: 26hp
  • 4: 42hp
  • 5: 51hp
  • 6: 62hp

Restriction from level 1: Guides of the forgotten cannot cast spells higher than fourth level. The power of will comes with a curse, the arcanum is limited to guides of the forgotten, since magic is like a river, searching for the way of least resistance. The stubborn way of the guides builds a dam for magic, only allowing drips to run through.

Passive ability at level 3: Guides of the Forgotten gain a feeling for the will of others, especially shortly before dying. They can harness will-points after a soul leaves a body, or a will gets reincarnated into a body. Roll a d4-1 to determine the amount of will-points gathered if a creature died within 20 feet of you or any undead under your control. You can spend will points on your turn, with a maximum of your level per round.

Will: When a Will is captured, it can enchant a fossil through a ritual (4h) The enchanted fossil is protected from breaking of natural/spell(self) causes. It can still be destroyed by Players/NPCs. If a will enchanted fossil is destroyed, the will escapes, unless you cast bound will in your next round. Will points: You can have a maximum of your level times 4 Will-points.

Free use

  • For 1 will point you can issue a command to one undead under your control. This does not count as an action/bonus action.
  • For 1 will point you can give your undead 1d4 temporary health. This does not count as an action/bonus action (max. is the double of the creatures maximum hp)
  • For 1 will point you can expand the time of a disfigured undead for (in combat for 1 round) 3 hours. This does not count as an action/bonus action Bonus Action
  • For 2 will points you can double the speed of an undead under your control. (does not stack)
  • For 2 will points you can increase the AC of an undead you control by 2. (max. AC of 17)
  • For 2 will points you can transfer hp from yourself to one undead creature (as temporary hp) under your control, or the other way around. (maximum of 15 temp. hp above max hp through this ability) Action
  • For 3 will points one undead creature under your control deals 3d4 extra damage
  • For 5 will points you can prevent a fatal blow to an undead under your control, but its hit points drop to 1d6 (this can be used as a reaction in an enemies turn) Ability at level 6: your fossils count as one CR higher, this affects hp only. Their default AC increases by 2.

Ability at level 10: you gather twice as many will points.

Spells:

  • Reanimate fossil: second level (V; S; M) a fossil, after spell ends there is a 1/3 chance of it breaking fossil needs to be as close as 40 feet to the caster Action-instant cast: Reanimate Fossil for three rounds in combat if the CR of this creature is 3 or less. If it is higher it will last for two rounds of combat. If outside of combat, it lasts an hour no matter the CR.
  • Explode undead First level spell (S; M) an undead under your control Undead needs to be in 100 feet of caster Action-instant cast: target an undead you control; through your power of mind their body attracts necrotic energy and will collect it for a maximum of three rounds. You can detonate it manually for a bonus action. It explodes in an 20ft radius. In the first round it deals 2d4 plus2 necrotic damage. In the second 4d4 plus4, and in the third 6d4 plus6 necrotic damage.

Cantrips:

Bound will Bonus Action (S,M – An empty glass vial):

To capture the Will of a dying creature, one has to possess an empty glass container and cast the cantrip bound will within your next turn after the creature’s death. You can posses a number of Wills equal to half your level rounded down. If a Will is captured, roll a d4-1 to determine the gathered will-points.

Fossil pieces:

  • Tooth
  • Claw
  • Spine
  • Rib
  • Skull – needed to summon a creature
  • Arm
  • Leg

These are the components needed to create one fossilized skeleton. A fossilized skeleton will not decay and is counted as a body. For every additional part of the same skeleton you pay half of the previous price

Fossil costs:

  • T-rex (CR 12) = 650 gp
  • Tarbosaurus (CR 8) = 400 gp
  • Yutyrannos (CR 3) = 20 gold
  • Troodon (CR 1/8) = 5 silber
  • Therizinosaurus (CR 5) = 100 gp
  • Stegosaurus (CR 5) = 100 gp
  • Hatzegopteryx (CR 2) = 10 gold
  • Plateosaurus (CR 2) = 8 gold
  • Pachycephalosaurs (CR ½) = 2 gold
  • Nodosaurus (CR 3) = 20 gold
  • Gallimimus (CR 2) = 8 gold
  • (Feathered) Velociraptor (CR ¼) = 1 gold
  • Dilophosaurus (CR 2) = 10 gold
  • Carnotaurus(CR 4) = 45 gold
  • Allosaurus(CR 2) = 8 gold
  • Compsognathus (C ½) = 2 gold
  • Dimetrodon (CR 2) = 8 gold
  • Plesiosaurus (CR 2) = 10 gold
  • Pteranodon (CR ¼) = 1 gold
  • Deinonychus (CR 1) = 5 gold
  • Triceratops (CR 5) = 100 gp

Translating PHP function to SQL, sometimes the balance becomes 0

We have a very big PHP function that gets all the orders we have to renew, it takes between 2h and 9h to finish depending on the server and whether it’s running PHP 5 or 7.

None of the queries are in the slow query log except the first query which gets all the orders and takes 40s, after that, all the filtering is done through PHP and that’s why I’m trying to rewrite the whole thing in SQL

The main query of our function is this

(SELECT * FROM orders WHERE extended_duration=0 AND extend_access!=1 AND is_paid=1 AND duration!=0 AND is_renew=1 AND was_renewed=0 AND object_name IS NULL AND (service_id IS NOT NULL OR bundle_id IS NOT NULL OR pkg_id_fk IS NOT NULL) AND DATE_ADD(paid_on, INTERVAL duration HOUR)< NOW() AND DATE(DATE_ADD(paid_on, INTERVAL duration HOUR)) BETWEEN DATE(NOW() - INTERVAL 15 DAY) AND DATE(NOW()) GROUP BY username,service_id,bundle_id,object_name,pkg_id_fk) UNION  (SELECT * FROM orders WHERE extended_duration!=0 AND extend_access!=1 AND is_paid=1 AND duration!=0 AND is_renew=1 AND was_renewed=0 AND object_name IS NULL AND (service_id IS NOT NULL OR bundle_id IS NOT NULL OR pkg_id_fk IS NOT NULL) AND DATE_ADD(paid_on, INTERVAL extended_duration HOUR)< NOW() AND DATE(DATE_ADD(paid_on, INTERVAL extended_duration HOUR)) BETWEEN DATE(NOW() - INTERVAL 15 DAY) AND DATE(NOW())  GROUP BY username,service_id,bundle_id,object_name,pkg_id_fk)"); 

After that we start filtering, one of the things we do is check if the user signed up for a free trial then we have to renew his plan for another paid plan

if ($  order['renewal_price_id'] != 0){     $  order['price_id'] = $  order['renewal_price_id']; }  $  check_if_active_plan = $  this->db->prepare("SELECT * FROM prices WHERE id=:price_id LIMIT 1");  $  sub_plan = $  check_if_active_plan->fetch(PDO::FETCH_ASSOC); 

And also we check if he has a discount and update the balance accordingly, I have problems with translating this line to SQL

 if ($  sub_plan['discount_rate'] > 0 && $  sub_plan['discount_start'] <= date("Y-m-d") && $  sub_plan['discount_end'] >= date("Y-m-d")) {   $  orders[$  i]['balance'] = $  sub_plan['balance'] - ($  sub_plan['balance'] * $  sub_plan['discount_rate'] / 100);  } 

On the other hand, My SQL query takes between 20 and 40 seconds to finish on a big data set in MySQL 8, but I have two problems:

  • Whenever I try to update the balance for someone who has a free trial or a discount, it sets the balance to 0
  • My query should get either the same number of results as the query above or less due to the filtering, my query returns more results after all the filtering is done.

DBFidle, My Query

(   SELECT     ord.orderid,     ord.username,     ord.msisdn,     ord.order_type,     ord.bundle_id,     ord.service_id,     ord.object_name,     ord.app_id,     ord.is_paid,     ord.is_renew,     ord.is_test,     ord.extended_duration,     ord.created,     ord.paid_on,     ord.was_renewed,     ord.renew_orderid,     ord.renewed_at,     ord.generated_by,     ord.gift_to,     ord.renewal_price_id,     ord.bypass,     ord.bypass_reason,     ord.reset_access,     ord.extend_access,     ord.pkg_id_fk,     ord.is_revoked,     dv.device_type,     CASE       WHEN ord.renewal_price_id > 0 THEN ord.renewal_price_id       ELSE ord.price_id     END AS price_id,     CASE       WHEN ord.renewal_price_id > 0 THEN p.duration       ELSE ord.duration     END AS duration,     CASE       WHEN ord.renewal_price_id > 0 THEN p.disconnect_time       ELSE ord.disconnect_time     END AS disconnect_time,     CASE       WHEN p.discount_rate > 0       AND p.discount_start <= CURDATE()       AND p.discount_end >= CURDATE() THEN p.balance - (p.balance * p.discount_rate / 100)       ELSE p.balance     END AS balance   FROM     orders as ord     JOIN devices as dv on ord.username = dv.username     JOIN prices as p ON price_id = p.id     AND (       (         ord.bundle_id IS NOT NULL         AND ord.bundle_id = p.bundle_id       )       OR (         ord.service_id IS NOT NULL         AND ord.service_id = p.service_id       )     )   WHERE     ord.pkg_id_fk IS NULL     AND ord.extended_duration = 0     AND ord.extend_access = 0     AND ord.is_paid = 1     AND ord.duration != 0     AND ord.is_renew = 1     AND ord.was_renewed = 0     AND dv.is_verified = 1     AND dv.is_banned = 0     AND ord.object_name IS NULL     AND (       (p.is_approved IN (1, 4))       OR (         p.is_approved = 2         AND dv.device_type = 'Mobile'       )       OR (         p.is_approved = 3         AND dv.device_type = 'STB'       )     )     AND DATE_ADD(ord.paid_on, INTERVAL ord.duration HOUR) < NOW()     AND DATE(       DATE_ADD(ord.paid_on, INTERVAL ord.duration HOUR)     ) BETWEEN DATE(NOW() - INTERVAL 15 DAY)     AND DATE(NOW())   GROUP BY     ord.username,     ord.service_id,     ord.bundle_id   order by     ord.paid_on desc ) UNION(     SELECT       ord.orderid,       ord.username,       ord.msisdn,       ord.order_type,       ord.bundle_id,       ord.service_id,       ord.object_name,       ord.app_id,       ord.is_paid,       ord.is_renew,       ord.is_test,       ord.extended_duration,       ord.created,       ord.paid_on,       ord.was_renewed,       ord.renew_orderid,       ord.renewed_at,       ord.generated_by,       ord.gift_to,       ord.renewal_price_id,       ord.bypass,       ord.bypass_reason,       ord.reset_access,       ord.extend_access,       ord.pkg_id_fk,       ord.is_revoked,       dv.device_type,       CASE         WHEN ord.renewal_price_id > 0 THEN ord.renewal_price_id         ELSE ord.price_id       END AS price_id,       CASE         WHEN ord.renewal_price_id > 0 THEN p.duration         ELSE ord.duration       END AS duration,       CASE         WHEN ord.renewal_price_id > 0 THEN p.disconnect_time         ELSE ord.disconnect_time       END AS disconnect_time,       CASE         WHEN p.discount_rate > 0         AND p.discount_start <= CURDATE()         AND p.discount_end >= CURDATE() THEN p.balance - (p.balance * p.discount_rate / 100)         ELSE p.balance       END AS balance     FROM       orders as ord       JOIN devices as dv on ord.username = dv.username       JOIN prices as p ON price_id = p.id       AND (         (           ord.bundle_id IS NOT NULL           AND ord.bundle_id = p.bundle_id         )         OR (           ord.service_id IS NOT NULL           AND ord.service_id = p.service_id         )       )     WHERE       ord.pkg_id_fk IS NULL       AND ord.extended_duration != 0       AND ord.extend_access = 0       AND ord.is_paid = 1       AND ord.duration != 0       AND ord.is_renew = 1       AND ord.was_renewed = 0       AND dv.is_verified = 1       AND dv.is_banned = 0       AND ord.object_name IS NULL       AND (         (p.is_approved IN (1, 4))         OR (           p.is_approved = 2           AND dv.device_type = 'Mobile'         )         OR (           p.is_approved = 3           AND dv.device_type = 'STB'         )       )       AND DATE_ADD(ord.paid_on, INTERVAL ord.extended_duration HOUR) < NOW()       AND DATE(         DATE_ADD(ord.paid_on, INTERVAL ord.extended_duration HOUR)       ) BETWEEN DATE(NOW() - INTERVAL 15 DAY)       AND DATE(NOW())     GROUP BY       ord.username,       ord.service_id,       ord.bundle_id     order by       ord.paid_on desc   ) UNION   (     SELECT       ord.orderid,       ord.username,       ord.msisdn,       ord.order_type,       ord.bundle_id,       ord.service_id,       ord.object_name,       ord.app_id,       ord.is_paid,       ord.is_renew,       ord.is_test,       ord.extended_duration,       ord.created,       ord.paid_on,       ord.was_renewed,       ord.renew_orderid,       ord.renewed_at,       ord.generated_by,       ord.gift_to,       ord.renewal_price_id,       ord.bypass,       ord.bypass_reason,       ord.reset_access,       ord.extend_access,       ord.pkg_id_fk,       ord.is_revoked,       ord.price_id,       ord.duration,       ord.disconnect_time,       ord.balance,       dv.device_type     FROM       orders as ord       JOIN devices as dv on ord.username = dv.username     WHERE       ord.pkg_id_fk IS NOT NULL       AND ord.extended_duration = 0       AND ord.extend_access = 0       AND ord.is_paid = 1       AND ord.duration != 0       AND ord.is_renew = 1       AND ord.was_renewed = 0       AND ord.object_name IS NULL       AND dv.is_verified = 1       AND dv.is_banned = 0       AND DATE_ADD(ord.paid_on, INTERVAL ord.duration HOUR) < NOW()       AND DATE(         DATE_ADD(ord.paid_on, INTERVAL ord.duration HOUR)       ) BETWEEN DATE(NOW() - INTERVAL 15 DAY)       AND DATE(NOW())     GROUP BY       ord.username,       ord.pkg_id_fk     order by       ord.paid_on desc   ) UNION(     SELECT       ord.orderid,       ord.username,       ord.msisdn,       ord.order_type,       ord.bundle_id,       ord.service_id,       ord.object_name,       ord.app_id,       ord.is_paid,       ord.is_renew,       ord.is_test,       ord.extended_duration,       ord.created,       ord.paid_on,       ord.was_renewed,       ord.renew_orderid,       ord.renewed_at,       ord.generated_by,       ord.gift_to,       ord.renewal_price_id,       ord.bypass,       ord.bypass_reason,       ord.reset_access,       ord.extend_access,       ord.pkg_id_fk,       ord.is_revoked,       ord.price_id,       ord.duration,       ord.disconnect_time,       ord.balance,       dv.device_type     FROM       orders as ord       JOIN devices as dv on ord.username = dv.username     WHERE       ord.pkg_id_fk IS NOT NULL       AND ord.extended_duration != 0       AND ord.extend_access = 0       AND ord.is_paid = 1       AND ord.duration != 0       AND ord.is_renew = 1       AND ord.was_renewed = 0       AND dv.is_verified = 1       AND dv.is_banned = 0       AND ord.object_name IS NULL       AND DATE_ADD(ord.paid_on, INTERVAL ord.extended_duration HOUR) < NOW()       AND DATE(         DATE_ADD(ord.paid_on, INTERVAL ord.extended_duration HOUR)       ) BETWEEN DATE(NOW() - INTERVAL 15 DAY)       AND DATE(NOW())     GROUP BY       ord.username,       ord.pkg_id_fk     order by       ord.paid_on desc   ) 

show create tables orders, devices, prices

orders | CREATE TABLE `orders` (   `orderid` varchar(50) COLLATE utf8_unicode_ci NOT NULL,   `username` varchar(128) COLLATE utf8_unicode_ci NOT NULL,   `msisdn` varchar(150) COLLATE utf8_unicode_ci NOT NULL,   `order_type` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Subscription',   `bundle_id` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,   `service_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   `object_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   `app_id` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,   `balance` float NOT NULL,   `is_paid` int(11) NOT NULL DEFAULT '0',   `is_renew` tinyint(1) NOT NULL DEFAULT '1',   `is_test` tinyint(1) NOT NULL DEFAULT '0',   `duration` int(11) NOT NULL DEFAULT '0',   `extended_duration` int(11) NOT NULL DEFAULT '0',   `disconnect_time` int(11) NOT NULL DEFAULT '0',   `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,   `paid_on` timestamp NULL DEFAULT NULL,   `was_renewed` tinyint(1) NOT NULL DEFAULT '0',   `renew_orderid` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,   `renewed_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',   `generated_by` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,   `gift_to` varchar(125) COLLATE utf8_unicode_ci DEFAULT NULL,   `price_id` int(11) NOT NULL DEFAULT '0',   `renewal_price_id` int(11) NOT NULL DEFAULT '0',   `bypass` tinyint(1) NOT NULL DEFAULT '0',   `bypass_reason` text COLLATE utf8_unicode_ci,   `reset_access` tinyint(1) NOT NULL DEFAULT '0',   `extend_access` tinyint(1) NOT NULL DEFAULT '0',   `pkg_id_fk` int(11) DEFAULT NULL,   `is_revoked` tinyint(4) NOT NULL DEFAULT '0',   PRIMARY KEY (`orderid`),   KEY `service_id_index` (`service_id`),   KEY `index_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |   devices | CREATE TABLE `devices` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,   `device_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,   `imei` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,   `serial_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   `mac_address` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   `msisdn` varchar(150) COLLATE utf8_unicode_ci NOT NULL,   `auth` varchar(255) COLLATE utf8_unicode_ci NOT NULL,   `old_auth` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   `device_type` varchar(50) COLLATE utf8_unicode_ci NOT NULL,   `device_os` varchar(50) COLLATE utf8_unicode_ci NOT NULL,   `device_osversion` varchar(50) COLLATE utf8_unicode_ci NOT NULL,   `device_appversion` varchar(50) COLLATE utf8_unicode_ci NOT NULL,   `device_pushtoken` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   `language` varchar(50) COLLATE utf8_unicode_ci DEFAULT 'en',   `verification_code` varchar(10) COLLATE utf8_unicode_ci NOT NULL,   `is_verified` tinyint(4) NOT NULL DEFAULT '0',   `is_notification` tinyint(1) NOT NULL DEFAULT '1',   `is_refresh` tinyint(1) NOT NULL DEFAULT '0',   `is_test` tinyint(1) NOT NULL DEFAULT '0',   `is_banned` tinyint(1) NOT NULL DEFAULT '0',   `is_external` tinyint(1) NOT NULL DEFAULT '0',   `lastlogin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',   `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,   PRIMARY KEY (`id`),   KEY `wtb_devices_idx_id_is_verified` (`is_verified`) ) ENGINE=InnoDB AUTO_INCREMENT=414709 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci    prices | CREATE TABLE `prices` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `plan_model` tinyint(1) NOT NULL DEFAULT '0',   `service_id` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,   `bundle_id` int(11) DEFAULT NULL,   `balance` float NOT NULL,   `cost` float NOT NULL,   `costBundle` float NOT NULL,   `duration` int(11) NOT NULL,   `disconnect_time` int(11) NOT NULL DEFAULT '0',   `one_time` tinyint(1) NOT NULL DEFAULT '0',   `discount_rate` int(11) NOT NULL DEFAULT '0',   `discount_start` date DEFAULT NULL,   `discount_end` date DEFAULT NULL,   `is_approved` int(11) NOT NULL DEFAULT '0',   `is_renew` int(11) NOT NULL DEFAULT '1',   `double_play` varchar(50) COLLATE utf8_unicode_ci NOT NULL,   `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2653 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  

Does adding multiple skills when combining creatures cause balance issues?

I’m creating a Svirfneblin Evil Mage by combining the stat blocks for each Evil Mage and Svirfneblin.

A Svirfneblin has the skills Investigation +3, Perception +2, Stealth +4. An Evil Mage has the skills Arcana +5, History +5 and saving throw proficiencies INT +5, WIS +3.

Does having 5 skills and 2 saving throw proficiencies cause major balance issues?

Is letting a player use a Large or larger race a bad idea from the game balance point of view?

Pathfinder ruleset assumes players to be Medium or Small humanoids. Not so many rules exist for non-standard characters.

  • The only "official" way to play as a bigger dude that I know of is using race building rules. With explicit DM permission, it’s possible to create an 11-RP race that will be Large and still have the reach of a Medium/Small creature. Also, this race probably won’t fit into the world of Golarion unless you work for it.
  • Bestiary creatures that are Large or Larger typically have racial Hit Dice, and I’ve heard it many times that mixing racial and class HD for players is generally a bad idea.
  • Some monstrous humanoids, e.g. Trox, have official racial stats and are Large, but playing them is usually frowned upon, as their appearance creates certain social difficulties unless the campaign is set in a monstrous setting.
  • Half-Giants published by Dreamscarred Press are up to 8 ft. 4 in. tall, but still Medium. They are treated as being Large for certain purposes, but not for reach, although they can use Large weapons.

Threads about PCs being Large usually bring up all the related bonuses: CMD/CMB, reach, extra damage, extra STR, and say that it all makes such races vo. Very often they also talk about Enlarge Person alongside Haste creating Huge Barbarians that one-shot everything they see, and about enemies that can’t even retaliate because of limited reach. What makes me a bit interested here, though, is that it’s usually mundane characters who benefit most from increasing their melee potential, and melee characters are rarely overpowered compared to casters.

However, lacking any first-hand experience, I wish to know:

Is it actually a bad idea to allow players to choose Large races for their characters?

By "Large races" I mean races that are properly Large, have all the related benefits, including reach. This race can be custom-made, adapted from another source, or an existing one can be used.

Please remember about the Good Subjective/Bad Subjective guidelines and state your experience of seeing Large or larger races in actual play if you decide to post an answer. Let’s not get this question closed.

Balance implications of +3 racial bonuses

Many races have a +2 bonus to one ability and a +1 bonus to another ability. They do not usually have +3 to a single ability.

I am wondering about the implications of having races with such bonuses in my game.

I am considering point buy only. What I see is possible that was not possible before (with +2/+1), is

  • 18 in the primary stat at level 1
  • 20 in primary stat with first ASI

However, this 20 in the primary stat means that I cannot exceed 15 in the secondary stat. It seems to me that no class in 5e benefits from less than two abilities (at least constitution and one other).

Furthermore

  • The changeling race can already have a +3 bonus
  • It is entirely possible to have 18 on level one with rolled stats, yet rolling stats is, so far as I know, not considered unbalanced.

Is my analysis above correct and does this mean that a +3 racial bonus instead of +2/+1 does not pose severe balance issues?

How do you balance an NPC ally with regards to the DMG combat balancing?

My players want an NPC to fight alongside them. They don’t like it when he is "cut out" of the fight and they don’t want it to feel like he isn’t being helpful at all since he’s proven to be competent. I’m okay with having him at their side but I don’t know how to balance the game where he joins as if he’s a party member.

For reference, the DMG has a chart that shows level-to-exp threshold in order to determine encounter difficulty. Since the NPC doesn’t have a level, he can’t be directly added.

Should I:

  1. Add his exp directly to the threshold. So if he has 200 exp, then normal exp threshold + 200

  2. Convert CR to level via Xanathar’s Table for 1-1 player matchups? CR 1/4 = LVL 1 character. CR 10 = LVL 10 character

  3. Subtract EXP from the encounters. Encounter difficulty exp - 200exp

I want to keep the game fairly balanced based on RAW.