mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-20 22:16:51 +00:00
## About The Pull Request As the title says. Adds a bunch more stat changes to various different items and a somewhat simple way of modifying them whilst minimizing side-effects as much as possible. Added a new negative curse of polymorph suffix that can randomly polymorph you once you pick up the item. Curse of hunger items won't start on items that are not on a turf. Curse of polymorph will only activate when equipped. Bodyparts, two-handed melees, bags, guns and grenades, to name a few, have a bunch of type-specific stat changes depending on their quality. Some items won't gain fantasy suffixes during the RPG loot event, like stacks, chairs and paper, to make gamifying the stats a bit harder. I'm sure there'll still be other ways to game the event, but it's not that big of a deal since these are the easiest ways to game it. High level items also have a cool unusual effect aura ## Why It's Good For The Game Makes the RPG item event cooler. Right now, it's a bit lame since everything only gains force value and wound bonus on attack. This makes the statistic increases more type-based and make it interesting to use It's okay for some items to be powerful since this is a wizard event and a very impactful one too. By making the curse of hunger items not spawn on people, it'll also make it a less painful event too. ## Changelog 🆑 add: Expanded the RPG loot wizard event by giving various different items their own statistic boost. /🆑 --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
274 lines
9.3 KiB
Plaintext
274 lines
9.3 KiB
Plaintext
/datum/fantasy_affix/cosmetic_suffixes
|
|
name = "purely cosmetic suffix"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_GOOD | AFFIX_EVIL
|
|
|
|
var/list/goodSuffixes
|
|
var/list/badSuffixes
|
|
|
|
/datum/fantasy_affix/cosmetic_suffixes/New()
|
|
goodSuffixes = list(
|
|
"dexterity",
|
|
"constitution",
|
|
"intelligence",
|
|
"wisdom",
|
|
"charisma",
|
|
"the forest",
|
|
"the hills",
|
|
"the plains",
|
|
"the sea",
|
|
"the sun",
|
|
"the moon",
|
|
"the void",
|
|
"the world",
|
|
"many secrets",
|
|
"many tales",
|
|
"many colors",
|
|
"rending",
|
|
"sundering",
|
|
"the night",
|
|
"the day",
|
|
)
|
|
badSuffixes = list(
|
|
"draining",
|
|
"burden",
|
|
"discomfort",
|
|
"awkwardness",
|
|
"poor hygiene",
|
|
"timidity",
|
|
)
|
|
|
|
weight = (length(goodSuffixes) + length(badSuffixes)) * 10
|
|
|
|
/datum/fantasy_affix/cosmetic_suffixes/apply(datum/component/fantasy/comp, newName)
|
|
if(comp.quality > 0 || (comp.quality == 0 && prob(50)))
|
|
. = "[newName] of [pick(goodSuffixes)]"
|
|
if(comp.quality >= 10)
|
|
START_PROCESSING(SSprocessing, src)
|
|
if(comp.quality >= 15)
|
|
comp.parent.AddComponent(/datum/component/unusual_effect, color = "#FFEA0030", include_particles = TRUE)
|
|
else
|
|
comp.parent.AddComponent(/datum/component/unusual_effect, color = "#FFBF0030")
|
|
else
|
|
. = "[newName] of [pick(badSuffixes)]"
|
|
return .
|
|
|
|
//////////// Good suffixes
|
|
/datum/fantasy_affix/bane
|
|
name = "of <mobtype> slaying (random species, carbon or simple animal)"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_GOOD
|
|
var/list/target_types_by_comp = list()
|
|
|
|
/datum/fantasy_affix/bane/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
// This is set up to be easy to add to these lists as I expect it will need modifications
|
|
var/static/list/possible_mobtypes
|
|
if(!possible_mobtypes)
|
|
// The base list of allowed mob/species types
|
|
possible_mobtypes = zebra_typecacheof(list(
|
|
/mob/living/simple_animal = TRUE,
|
|
/mob/living/carbon = TRUE,
|
|
/datum/species = TRUE,
|
|
// Some types to remove them and their subtypes
|
|
/mob/living/carbon/human/species = FALSE,
|
|
))
|
|
// Some particular types to disallow if they're too broad/abstract
|
|
// Not in the above typecache generator because it includes subtypes and this doesn't.
|
|
possible_mobtypes -= list(
|
|
/mob/living/simple_animal/hostile,
|
|
)
|
|
|
|
var/mob/picked_mobtype = pick(possible_mobtypes)
|
|
// This works even with the species picks since we're only accessing the name
|
|
|
|
var/obj/item/master = comp.parent
|
|
master.AddElement(/datum/element/bane, target_type = picked_mobtype)
|
|
target_types_by_comp[comp] = picked_mobtype
|
|
return "[newName] of [initial(picked_mobtype.name)] slaying"
|
|
|
|
/datum/fantasy_affix/bane/remove(datum/component/fantasy/comp)
|
|
var/picked_mobtype = target_types_by_comp[comp]
|
|
var/obj/item/master = comp.parent
|
|
master.RemoveElement(/datum/element/bane, picked_mobtype)
|
|
target_types_by_comp -= comp
|
|
|
|
/datum/fantasy_affix/summoning
|
|
name = "of <mobtype> summoning (dangerous, can pick all but megafauna tier stuff)"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_GOOD
|
|
weight = 5
|
|
|
|
/datum/fantasy_affix/summoning/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
// This is set up to be easy to add to these lists as I expect it will need modifications
|
|
var/static/list/possible_mobtypes
|
|
if(!possible_mobtypes)
|
|
// The base list of allowed mob/species types
|
|
possible_mobtypes = zebra_typecacheof(list(
|
|
/mob/living/simple_animal = TRUE,
|
|
/mob/living/carbon = TRUE,
|
|
/datum/species = TRUE,
|
|
// Some types to remove them and their subtypes
|
|
/mob/living/carbon/human/species = FALSE,
|
|
/mob/living/simple_animal/hostile/asteroid/elite = FALSE,
|
|
/mob/living/simple_animal/hostile/megafauna = FALSE,
|
|
))
|
|
// Some particular types to disallow if they're too broad/abstract
|
|
// Not in the above typecache generator because it includes subtypes and this doesn't.
|
|
possible_mobtypes -= list(
|
|
/mob/living/simple_animal/hostile,
|
|
)
|
|
|
|
var/mob/picked_mobtype = pick(possible_mobtypes)
|
|
// This works even with the species picks since we're only accessing the name
|
|
|
|
var/obj/item/master = comp.parent
|
|
var/max_mobs = max(CEILING(comp.quality/2, 1), 1)
|
|
var/spawn_delay = 300 - 30 * comp.quality
|
|
comp.appliedComponents += master.AddComponent(/datum/component/summoning, list(picked_mobtype), 100, max_mobs, spawn_delay)
|
|
return "[newName] of [initial(picked_mobtype.name)] summoning"
|
|
|
|
/datum/fantasy_affix/shrapnel
|
|
name = "shrapnel"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_GOOD
|
|
|
|
/datum/fantasy_affix/shrapnel/validate(obj/item/attached)
|
|
if(isgun(attached))
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/datum/fantasy_affix/shrapnel/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
// higher means more likely
|
|
var/list/weighted_projectile_types = list(/obj/projectile/meteor = 1,
|
|
/obj/projectile/energy/nuclear_particle = 1,
|
|
/obj/projectile/beam/pulse = 1,
|
|
/obj/projectile/bullet/honker = 15,
|
|
/obj/projectile/temp = 15,
|
|
/obj/projectile/ion = 15,
|
|
/obj/projectile/magic/door = 15,
|
|
/obj/projectile/magic/locker = 15,
|
|
/obj/projectile/magic/fetch = 15,
|
|
/obj/projectile/beam/emitter = 15,
|
|
/obj/projectile/magic/flying = 15,
|
|
/obj/projectile/energy/net = 15,
|
|
/obj/projectile/bullet/incendiary/c9mm = 15,
|
|
/obj/projectile/temp/hot = 15,
|
|
/obj/projectile/beam/disabler = 15)
|
|
|
|
var/obj/projectile/picked_projectiletype = pick_weight(weighted_projectile_types)
|
|
|
|
var/obj/item/master = comp.parent
|
|
comp.appliedComponents += master.AddComponent(/datum/component/mirv, picked_projectiletype)
|
|
return "[newName] of [initial(picked_projectiletype.name)] shrapnel"
|
|
|
|
/datum/fantasy_affix/strength
|
|
name = "of strength (knockback)"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_GOOD
|
|
|
|
/datum/fantasy_affix/strength/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
var/obj/item/master = comp.parent
|
|
master.AddElement(/datum/element/knockback, CEILING(comp.quality/2, 1), FLOOR(comp.quality/10, 1))
|
|
return "[newName] of strength"
|
|
|
|
/datum/fantasy_affix/strength/remove(datum/component/fantasy/comp)
|
|
var/obj/item/master = comp.parent
|
|
master.RemoveElement(/datum/element/knockback, CEILING(comp.quality/2, 1), FLOOR(comp.quality/10, 1))
|
|
|
|
//////////// Bad suffixes
|
|
|
|
/datum/fantasy_affix/fool
|
|
name = "of the fool (honking)"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_EVIL
|
|
|
|
/datum/fantasy_affix/fool/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
var/obj/item/master = comp.parent
|
|
comp.appliedComponents += master.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50, falloff_exponent = 20)
|
|
return "[newName] of the fool"
|
|
|
|
/datum/fantasy_affix/curse_of_hunger
|
|
name = "curse of hunger"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_EVIL
|
|
weight = 5
|
|
|
|
/datum/fantasy_affix/curse_of_hunger/validate(obj/item/attached)
|
|
// Curse of hunger can be really unbearable to deal with,
|
|
// so it should not start on someone or in a bag.
|
|
if(!isturf(attached.loc))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/fantasy_affix/curse_of_hunger/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
var/obj/item/master = comp.parent
|
|
var/filter_color = "#8a0c0ca1" //clarified args
|
|
var/new_name = pick(", eternally hungry", " of the glutton", " cursed with hunger", ", consumer of all", " of the feast")
|
|
master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of hunger!", filter_color, "", comp)
|
|
comp.appliedComponents += master.AddComponent(/datum/component/curse_of_hunger)
|
|
return "[newName][new_name]"
|
|
|
|
/datum/fantasy_affix/curse_of_hunger/remove(datum/component/fantasy/comp)
|
|
var/obj/item/master = comp.parent
|
|
master.RemoveElement(/datum/element/curse_announcement) //just in case
|
|
|
|
/datum/fantasy_affix/curse_of_polymorph
|
|
name = "curse of polymorph"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_EVIL
|
|
|
|
/datum/fantasy_affix/curse_of_polymorph/validate(obj/item/attached)
|
|
// Don't start on someone so that it doesn't immediately polymorph them.
|
|
if(ismob(attached.loc))
|
|
return FALSE
|
|
if(!isclothing(attached))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/fantasy_affix/curse_of_polymorph/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
var/obj/item/master = comp.parent
|
|
var/filter_color = "#800080a1" //clarified args
|
|
var/new_name = pick(", transforming", " of the polymorph", " cursed with polymorphing", ", changer of all", " of changing")
|
|
var/static/list/possible_results = list(
|
|
WABBAJACK_MONKEY,
|
|
WABBAJACK_ROBOT,
|
|
WABBAJACK_SLIME,
|
|
WABBAJACK_XENO,
|
|
WABBAJACK_HUMAN,
|
|
WABBAJACK_ANIMAL,
|
|
)
|
|
master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of polymorph!", filter_color, "", comp)
|
|
comp.appliedComponents += master.AddComponent(/datum/component/curse_of_polymorph, pick(possible_results))
|
|
return "[newName][new_name]"
|
|
|
|
/datum/fantasy_affix/curse_of_polymorph/remove(datum/component/fantasy/comp)
|
|
var/obj/item/master = comp.parent
|
|
master.RemoveElement(/datum/element/curse_announcement) //just in case
|
|
|
|
/datum/fantasy_affix/speed
|
|
name = "of speed"
|
|
placement = AFFIX_SUFFIX
|
|
alignment = AFFIX_GOOD
|
|
|
|
/datum/fantasy_affix/speed/validate(obj/item/attached)
|
|
if(!istype(attached, /obj/item/clothing/shoes))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/fantasy_affix/speed/apply(datum/component/fantasy/comp, newName)
|
|
. = ..()
|
|
var/obj/item/master = comp.parent
|
|
master.slowdown = min(-comp.quality / 5, master.slowdown)
|
|
return "[newName] of speed"
|
|
|
|
/datum/fantasy_affix/speed/remove(datum/component/fantasy/comp)
|
|
var/obj/item/master = comp.parent
|
|
master.slowdown = initial(master.slowdown)
|