diff --git a/code/__DEFINES/mob_stats.dm b/code/__DEFINES/mob_stats.dm index 069b4ca6171..df5bd4e5d6e 100644 --- a/code/__DEFINES/mob_stats.dm +++ b/code/__DEFINES/mob_stats.dm @@ -1,5 +1,5 @@ -#define STAT_VALUE_DEFAULT 0 -#define STAT_VALUE_MAXIMUM 150 +#define STAT_VALUE_DEFAULT 0 +#define STAT_VALUE_DEFAULT_MAXIMUM 150 #define STAT_MEC "Mechanical" #define STAT_COG "Cognition" @@ -15,13 +15,17 @@ #define ALL_STATS_FOR_DEFIBS list(STAT_MEC,STAT_COG,STAT_BIO,STAT_ROB,STAT_TGH,STAT_VIG) //Used for defibs (no ana/viv) #define ALL_STATS_TO_IMPRINT list(STAT_MEC,STAT_COG,STAT_BIO,STAT_ROB,STAT_VIG) //So that people stop memeing the imprinter -#define STAT_LEVEL_NONE 0 -#define STAT_LEVEL_NOVICE 7 -#define STAT_LEVEL_BASIC 15 -#define STAT_LEVEL_ADEPT 25 -#define STAT_LEVEL_EXPERT 40 -#define STAT_LEVEL_PROF 60 -#define STAT_LEVEL_GODLIKE 80 +#define STAT_LEVEL_NONE 0 +#define STAT_LEVEL_NOVICE 7 +#define STAT_LEVEL_BASIC 15 +#define STAT_LEVEL_ADEPT 25 +#define STAT_LEVEL_EXPERT 40 +#define STAT_LEVEL_PROF 60 +#define STAT_LEVEL_MASTER 80 +#define STAT_LEVEL_HIGHER 100 +#define STAT_LEVEL_COSMIC 120 +#define STAT_LEVEL_UNIVERSAL 150 +#define STAT_LEVEL_BYOND 200 #define STAT_LEVEL_MIN 0 // Min stat value selectable #define STAT_LEVEL_MAX 60 // Max stat value selectable diff --git a/code/__DEFINES/perks.dm b/code/__DEFINES/perks.dm index 91ddf13c97e..1bbad39b099 100644 --- a/code/__DEFINES/perks.dm +++ b/code/__DEFINES/perks.dm @@ -231,6 +231,9 @@ //Task Perks #define PERK_FORCEFUL_REJECTION /datum/perk/forceful_rejection +//Bluecross perks +#define PERK_SKILL_CAP_ADDITION /datum/perk/skill_cap_addition +#define PERK_SKILL_CAP_EXPANDING /datum/perk/skill_cap_expanding ////////////////// //Cooldown perks// diff --git a/code/datums/mob_stats.dm b/code/datums/mob_stats.dm index cf172e5a501..245d57f0274 100644 --- a/code/datums/mob_stats.dm +++ b/code/datums/mob_stats.dm @@ -68,17 +68,26 @@ var/datum/stat/S = stat_list[statName] S.setValue(Value) +/datum/stat_holder/proc/add_Stat_cap(statName, amount) + var/datum/stat/S = stat_list[statName] + S.add_stat_cap(amount) + +/datum/stat_holder/proc/grab_Stat_cap(statName) + var/datum/stat/S = stat_list[statName] + var/number = S.grabbed_stat_cap() + return number + /datum/stat_holder/proc/getStat(statName, pure = FALSE, require_direct_value = TRUE) if (!islist(statName)) var/datum/stat/S = stat_list[statName] LEGACY_SEND_SIGNAL(holder, COMSIG_STAT, S.name, S.getValue(), S.getValue(TRUE)) var/stat_value = S ? S.getValue(pure) : 0 if(holder?.stats.getPerk(PERK_NO_OBSUCATION) || require_direct_value) - return stat_value + return stat_value else return statPointsToLevel(stat_value) else - log_debug("passed list to getStat(), statName without a list: [statName]") + log_debug("passed list to getStat(), statName without a list: [statName]") // Those are accept list of stats // Compound stat checks. @@ -179,6 +188,7 @@ var/desc = "Basic characteristic, you are not supposed to see this. Report to admins." var/value = STAT_VALUE_DEFAULT var/list/mods = list() + var/stat_cap = STAT_VALUE_DEFAULT_MAXIMUM /datum/stat/proc/addModif(delay, affect, id) for(var/elem in mods) @@ -209,11 +219,11 @@ value = value + affect /datum/stat/proc/changeValue_withcap(affect) - if(value > STAT_VALUE_MAXIMUM) + if(value > stat_cap) return - if(value + affect > STAT_VALUE_MAXIMUM) - value = STAT_VALUE_MAXIMUM + if(value + affect > stat_cap) + value = stat_cap else value = value + affect @@ -236,11 +246,17 @@ //Unused but might be good for later additions /datum/stat/proc/setValue_withcap(value) - if(value > STAT_VALUE_MAXIMUM) - src.value = STAT_VALUE_MAXIMUM + if(value > stat_cap) + src.value = stat_cap else src.value = value +/datum/stat/proc/add_stat_cap(amount) + stat_cap += amount + +/datum/stat/proc/grabbed_stat_cap() + return stat_cap + /datum/stat/productivity name = STAT_MEC desc = "The world hadn't ever had so many moving parts or so few labels. Character's ability in building and using various tools." @@ -281,11 +297,15 @@ /proc/statPointsToLevel(var/points) switch(points) - if (-1000 to -50) + if (-1000 to -100) return "Hopeless" - if (-50 to -25) + if (-100 to -50) + return "Blundering" + if (-50 to -20) + return "Incompetent" + if (-20 to -15) return "Inept" - if (-25 to -1) + if (-15 to -1) return "Misinformed" if (STAT_LEVEL_NONE to STAT_LEVEL_BASIC) return "Untrained" @@ -295,5 +315,15 @@ return "Adept" if (STAT_LEVEL_EXPERT to STAT_LEVEL_PROF) return "Expert" - if (STAT_LEVEL_PROF to INFINITY) - return "Master" + if (STAT_LEVEL_PROF to STAT_LEVEL_MASTER) + return "Proficient" + if (STAT_LEVEL_MASTER to STAT_LEVEL_HIGHER) + return "Mastery" + if (STAT_LEVEL_HIGHER to STAT_LEVEL_COSMIC) + return "Skill Mastery" + if (STAT_LEVEL_COSMIC to STAT_LEVEL_UNIVERSAL) + return "Grand Mastery" + if (STAT_LEVEL_UNIVERSAL to STAT_LEVEL_BYOND) + return "Theoretical Understanding" + if (STAT_LEVEL_BYOND to INFINITY) + return "Higher Understanding" diff --git a/code/datums/perks/special.dm b/code/datums/perks/special.dm index 6c2e91ea4a8..faa667afc9b 100644 --- a/code/datums/perks/special.dm +++ b/code/datums/perks/special.dm @@ -54,3 +54,49 @@ return ..() +/////////////////// +//Bluecross Perks// +/////////////////// + +/datum/perk/skill_cap_expanding + name = "Celestial Gift" + desc = "The normal limit of the mind has been exspanded by 50%" + gain_text = "It came in a dream." + lose_text = "It was but a nightmare." + icon_state = "celestial" + var/statis_amount = 0 + active = FALSE + passivePerk = FALSE + +/datum/perk/skill_cap_expanding/assign(mob/living/carbon/human/H) + ..() + for(var/stat in ALL_STATS) + var/gather_increase = holder.stats.grab_Stat_cap(stat) + gather_increase *= 0.5 + statis_amount = gather_increase + holder.stats.add_Stat_cap(gather_increase) + +/datum/perk/skill_cap_expanding/remove() + for(var/stat in ALL_STATS) + holder.stats.add_Stat_cap(-statis_amount) + ..() + +/datum/perk/skill_cap_addition + name = "Comsic Gazing" + desc = "The normal limit of the mind has been exspanded by 30" + gain_text = "Looking into the stars is starting to becoming productive!" + lose_text = "The void above is the same as below." + icon_state = "void_eye" + active = FALSE + passivePerk = FALSE + +/datum/perk/skill_cap_addition/assign(mob/living/carbon/human/H) + ..() + for(var/stat in ALL_STATS) + holder.stats.add_Stat_cap(30) + +/datum/perk/skill_cap_addition/remove() + for(var/stat in ALL_STATS) + holder.stats.add_Stat_cap(-30) + ..() + diff --git a/code/game/machinery/autolathe/artist_bench.dm b/code/game/machinery/autolathe/artist_bench.dm index 87f25c01154..381fcc2fa87 100644 --- a/code/game/machinery/autolathe/artist_bench.dm +++ b/code/game/machinery/autolathe/artist_bench.dm @@ -281,7 +281,7 @@ return flick("[initial(icon_state)]_work", src) working = TRUE - if(!do_after(user, 15 * user.stats.getMult(STAT_MEC, STAT_LEVEL_GODLIKE), src)) + if(!do_after(user, 15 * user.stats.getMult(STAT_MEC, STAT_LEVEL_MASTER), src)) error = "Lost artist." working = FALSE return diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 15a3427c183..f72acf0220b 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -214,6 +214,10 @@ bees_spell(M, able_to_cast) continue + if((spell.message == "Sky." || spell.message == "Above.") && candle_amount >= 1) + sun_spell(M, able_to_cast) + continue + if(spell.message == "Scribe." && candle_amount >= 7) scribe_spell(M, able_to_cast) continue @@ -688,6 +692,30 @@ qdel(G) return +// Sky: / Above: +// Converts a open omega book into a drawing of the sun, a oddity with a perk that exspands the skill cap by 30 points. +/obj/effect/decal/cleanable/crayon/proc/sun_spell(mob/living/carbon/human/M, able_to_cast = FALSE) + var/datum/reagent/organic/blood/B = M.get_blood() + if(!able_to_cast) + return + + M.maxHealth -= 5 + M.health -= 5 + for(var/obj/item/oddity/common/book_omega/opened/BOOK in oview(3)) + + to_chat(M, "A cold voice creeks. With this messy canvas, I can only provide you a glance of that.") + + if(!body_checks(M)) + to_chat(M, "A cold voice sighs. You will not do. Waste the others time.") + bluespace_entropy(3, get_turf(src)) //Wasting an artists time is rather rude + return + + to_chat(M, "The pages of [BOOK.name] slowly turn into paint.") + new /obj/item/oddity/rare/drawing_of_sun(BOOK.loc) + B.remove_self(140) //Base is 540 + qdel(BOOK) + return + // Pouch: Spawns a pouch with a dimensional-linked shared storage. Every person holding one of these can access the same storage from anywhere. // Works only if the pouch is opened, and accessed while being held in-hand /obj/effect/decal/cleanable/crayon/proc/pouch_spell(mob/living/carbon/human/M, able_to_cast = FALSE) diff --git a/code/game/objects/items/oddities.dm b/code/game/objects/items/oddities.dm index 40bca00b23a..db864f72618 100644 --- a/code/game/objects/items/oddities.dm +++ b/code/game/objects/items/oddities.dm @@ -483,6 +483,35 @@ price_tag = 2000 //Its a good tie for a collector perk = PERK_SURE_STEP //Insainly rare and ok stats, but really its the perk. In Disco-E this perk would save you so much making this the perfect joke +/obj/item/oddity/rare/moon_fragment + name = "Fragment of Moon" + desc = "A glowing, white, glass like shard of the Amethyn Moon." + icon_state = "moon_fragment" + min_stats = 16 + //Its 1 then done so we give quite a bit + oddity_stats = list( + STAT_COG = 18, + STAT_VIG = 18 + ) + price_tag = 2500 //Bluecross spawn + prob_perk = 0 + kill_stats = TRUE + perk = PERK_SKILL_CAP_EXPANDING + +/obj/item/oddity/rare/drawing_of_sun + name = "Drawing of a Unknown Sun" + desc = "A drawing of a type of sun no one has ever seen before done in crayon." + icon_state = "crayon_sun" + min_stats = 3 + oddity_stats = list( + STAT_COG = 1, + STAT_VIG = 2 + ) + price_tag = 5 + perk = PERK_SKILL_CAP_ADDITION + prob_perk = 0 + kill_stats = TRUE + //Non-Spawn //Odditys that are event only or spawned in on map gen /obj/item/oddity/rare/golden_cup diff --git a/code/game/objects/random/oddities.dm b/code/game/objects/random/oddities.dm index cf338bc5274..62c97a82819 100644 --- a/code/game/objects/random/oddities.dm +++ b/code/game/objects/random/oddities.dm @@ -86,7 +86,8 @@ /obj/item/gun_upgrade/mechanism/brass_kit = 1, //Misc - things that are not a "gun" but still good for this /obj/item/oddity/nt/seal = 1, - /obj/item/soap/bluespase = 0.5)) + /obj/item/soap/bluespase = 0.5, + /obj/item/oddity/rare/moon_fragment = 0.2)) /obj/random/uplink/low_chance name = "really really really low chance random uplink" diff --git a/code/modules/hivemind/machines.dm b/code/modules/hivemind/machines.dm index 69a52b6d8ef..000bcd313a3 100644 --- a/code/modules/hivemind/machines.dm +++ b/code/modules/hivemind/machines.dm @@ -326,13 +326,15 @@ /obj/item/reagent_containers/glass/beaker) var/list/reward_oddity = list( /obj/item/oddity/common/old_radio, - /obj/item/oddity/common/old_pda) + /obj/item/oddity/common/old_pda, + /obj/item/oddity/rare/eldritch_tie) /obj/machinery/hivemind_machine/node/proc/gift() var/gift = prob(GLOB.hive_data_float["core_oddity_drop_chance"]) ? pick(reward_oddity) : pick(reward_item) new gift(get_turf(loc)) state("leaves behind an item!") +//Seems unused, added it to reward oddity /obj/machinery/hivemind_machine/node/proc/core() state("leaves behind a weird looking tie!") new /obj/item/oddity/rare/eldritch_tie(get_turf(loc)) diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index b3bb236eb66..fb3616763da 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -221,7 +221,7 @@ var/stat_multiplier = 1 if(usr.stats) // Uses best of BIO and COG - stat_multiplier = min(usr.stats.getMult(STAT_BIO, STAT_LEVEL_GODLIKE), usr.stats.getMult(STAT_COG, STAT_LEVEL_GODLIKE)) + stat_multiplier = min(usr.stats.getMult(STAT_BIO, STAT_LEVEL_MASTER), usr.stats.getMult(STAT_COG, STAT_LEVEL_MASTER)) seed.modified += round(rand(30, 70) * stat_multiplier) if(seed.modified >= 100) @@ -268,7 +268,7 @@ var/stat_multiplier = 1 if(usr.stats) // Uses best of BIO and COG - stat_multiplier = min(usr.stats.getMult(STAT_BIO, STAT_LEVEL_GODLIKE), usr.stats.getMult(STAT_COG, STAT_LEVEL_GODLIKE)) + stat_multiplier = min(usr.stats.getMult(STAT_BIO, STAT_LEVEL_MASTER), usr.stats.getMult(STAT_COG, STAT_LEVEL_MASTER)) if(!isnull(plant_controller.seeds[seed.seed.name])) seed.seed = seed.seed.diverge(1) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index f8129cfef03..bc8030fa275 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -668,9 +668,9 @@ proc/is_blind(A) prob_evade += base_prob_evade if(!stats) return prob_evade - prob_evade += base_prob_evade * (stats.getStat(STAT_VIG)/STAT_LEVEL_GODLIKE - weight_coeff()) + prob_evade += base_prob_evade * (stats.getStat(STAT_VIG)/STAT_LEVEL_MASTER - weight_coeff()) if(stats.getPerk(PERK_SURE_STEP)) - prob_evade += base_prob_evade*30/STAT_LEVEL_GODLIKE + prob_evade += base_prob_evade*30/STAT_LEVEL_MASTER //if(stats.getPerk(PERK_RAT)) // prob_evade += base_prob_evade/1.5 return prob_evade diff --git a/code/modules/projectiles/ammunition/ammo_kits.dm b/code/modules/projectiles/ammunition/ammo_kits.dm index 5ed66d5cb75..0c48ca1b043 100644 --- a/code/modules/projectiles/ammunition/ammo_kits.dm +++ b/code/modules/projectiles/ammunition/ammo_kits.dm @@ -44,9 +44,9 @@ material_points += 6 if(STAT_LEVEL_EXPERT to STAT_LEVEL_PROF) material_points += 9 - if(STAT_LEVEL_PROF to STAT_LEVEL_GODLIKE) + if(STAT_LEVEL_PROF to STAT_LEVEL_MASTER) material_points += 12 - if(STAT_LEVEL_GODLIKE to INFINITY) + if(STAT_LEVEL_MASTER to INFINITY) material_points += 15 var/list/array = list( diff --git a/code/modules/sanity/inspiration_component.dm b/code/modules/sanity/inspiration_component.dm index 51e34b3f2b9..80d34a08841 100644 --- a/code/modules/sanity/inspiration_component.dm +++ b/code/modules/sanity/inspiration_component.dm @@ -15,7 +15,7 @@ //perk var/datum/perk/perk //If we after we are used set are stats to 0 - var/kill_stats = FALSE + var/self_destroy = FALSE /// Statistics can be a list (static) or a callback to a proc that returns a list (of the same format) /datum/component/inspiration/Initialize(statistics, datum/perk/new_perk, kill_stats) @@ -28,7 +28,7 @@ else return COMPONENT_INCOMPATIBLE if(kill_stats) - kill_stats = TRUE + self_destroy = TRUE if(new_perk) perk = new_perk else @@ -142,7 +142,7 @@ var/datum/perk/oddity/OD = GLOB.all_perks[perk] to_chat(user, SPAN_NOTICE("Instinct tells you more about this anomaly: [OD]. [OD.desc]")) - if(kill_stats) + if(self_destroy) to_chat(user, SPAN_NOTICE("An unstable decaying aura radiates from this one. It seems this type will one be useable once...")) diff --git a/code/modules/sanity/sanity_mob.dm b/code/modules/sanity/sanity_mob.dm index 3ec3248c8c2..8ef0ef04518 100644 --- a/code/modules/sanity/sanity_mob.dm +++ b/code/modules/sanity/sanity_mob.dm @@ -342,7 +342,7 @@ GLOBAL_VAR_INIT(GLOBAL_INSIGHT_MOD, 1) resting_times = 1 for(var/stat in L) var/stat_up = L[stat] * 2 * resting_times - if((owner.stats.getStat(stat)) >= STAT_VALUE_MAXIMUM) + if((owner.stats.getStat(stat)) >= owner.stats.grab_Stat_cap(stat)) stat_up = 0 to_chat(owner, SPAN_NOTICE("You feel that you can't grow anymore better for today in [stat] with oddities")) else @@ -353,7 +353,7 @@ GLOBAL_VAR_INIT(GLOBAL_INSIGHT_MOD, 1) if(owner.stats.addPerk(I.perk)) I.perk = null - if(I.kill_stats) + if(I.self_destroy) qdel(I, FALSE, TRUE) //Forcefully remove are component resting = 0 @@ -380,7 +380,7 @@ GLOBAL_VAR_INIT(GLOBAL_INSIGHT_MOD, 1) LAZYAPLUS(stat_change, pick(ALL_STATS_FOR_LEVEL_UP), 3) for(var/stat in stat_change) - if((owner.stats.getStat(stat)) >= STAT_VALUE_MAXIMUM) + if((owner.stats.getStat(stat)) >= owner.stats.grab_Stat_cap(stat)) to_chat(owner, SPAN_NOTICE("You can not increase [stat] anymore with simple resting.")) else to_chat(owner, SPAN_NOTICE("Your [stat] stat goes up by [stat_change[stat]]")) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 19745cdeebb..199732e722a 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -88,7 +88,7 @@ // At STAT_LEVEL_GODLIKE, there is no pain from the surgery at all // This supports negative stat values if(user && user.stats) - strength *= max((STAT_LEVEL_GODLIKE - user.stats.getStat(required_stat)) / STAT_LEVEL_GODLIKE, 0) + strength *= max((STAT_LEVEL_MASTER - user.stats.getStat(required_stat)) / STAT_LEVEL_MASTER, 0) organ.owner_pain(strength) @@ -367,10 +367,10 @@ proc/calculate_expert_surgery_bonus(mob/living/user) var/stat_bonus = 0 if(user_stat > STAT_LEVEL_EXPERT && user_stat <= STAT_LEVEL_PROF) stat_bonus = user_stat - STAT_LEVEL_EXPERT - else if(user_stat > STAT_LEVEL_PROF && user_stat <= STAT_LEVEL_GODLIKE) + else if(user_stat > STAT_LEVEL_PROF && user_stat <= STAT_LEVEL_MASTER) stat_bonus = 20 + (user_stat - STAT_LEVEL_PROF) * 0.5 - else if(user_stat > STAT_LEVEL_GODLIKE) - stat_bonus = 30 + (user_stat - STAT_LEVEL_GODLIKE) * 0.1 + else if(user_stat > STAT_LEVEL_MASTER) + stat_bonus = 30 + (user_stat - STAT_LEVEL_MASTER) * 0.1 return stat_bonus // Same logic as above, but instead gives a bonus to reduce surgery step duration @@ -383,10 +383,10 @@ proc/bio_time_bonus(mob/living/user) var/time_bonus = 0 // Maximum of 80 if(user_stat > STAT_LEVEL_EXPERT && user_stat <= STAT_LEVEL_PROF) // Average doctor gets 40 BIO, bonuses start from 41 MEC/BIO onwards time_bonus = (user_stat - 40) // Minimum of 1 up to 20 at 60 MEC/BIO - else if(user_stat > STAT_LEVEL_PROF && user_stat <= STAT_LEVEL_GODLIKE) + else if(user_stat > STAT_LEVEL_PROF && user_stat <= STAT_LEVEL_MASTER) time_bonus = 20 + (user_stat - STAT_LEVEL_PROF) // 21 up to 40 at 80 MEC/BIO - else if(user_stat > STAT_LEVEL_GODLIKE && user_stat <= 120) // Soft cap to prevent going over the surgical step duration - time_bonus = 40 + (user_stat - STAT_LEVEL_GODLIKE) // 41 to 80 (instant!) at 120 MEC/BIO and over + else if(user_stat > STAT_LEVEL_MASTER && user_stat <= 120) // Soft cap to prevent going over the surgical step duration + time_bonus = 40 + (user_stat - STAT_LEVEL_MASTER) // 41 to 80 (instant!) at 120 MEC/BIO and over else if(user_stat >= 120) // Sanity check time_bonus = 80 // Hardcap met at 120 MEC/BIO already, don't ever make it go over this no matter how insane our stats are return time_bonus diff --git a/icons/effects/perks.dmi b/icons/effects/perks.dmi index 40ddc3031ae..5b2ef67827e 100644 Binary files a/icons/effects/perks.dmi and b/icons/effects/perks.dmi differ diff --git a/icons/obj/oddities.dmi b/icons/obj/oddities.dmi index 8d43ef0d50c..81f2a970f3f 100644 Binary files a/icons/obj/oddities.dmi and b/icons/obj/oddities.dmi differ