Glamour Experimentation (#17003)

* Glamour Experimentation

Added a new stable glamour crafting material that can be used to craft various items.

Added a new unstable glamour item, that has a few risky effects when used and picked up without protection.

Added a new particle smasher recipe to turn unstable glamour into stable glamour.

Added new items to the lleill transmute ability.

Added new glamour bow and arrow items.

* Fixed a bit of phrasing

* Consolidates TF procs

Changed TF procs and belly transfer procs to be called from one location rather than being repeated in various different procs across the code.

* forgot to include

* Fixed size change effect

* timer instead of spawn

* Added new glamour turfs for whitespace maps.
This commit is contained in:
SatinIsle
2025-02-01 19:28:56 +00:00
committed by GitHub
parent 4c8b23497c
commit cd89f4d237
20 changed files with 469 additions and 300 deletions
@@ -107,12 +107,15 @@
"Transparent Glamour" = /obj/item/potion_material/glamour_transparent,
"Shrinking Glamour" = /obj/item/potion_material/glamour_shrinking,
"Twinkling Glamour" = /obj/item/potion_material/glamour_twinkling,
"Unstable Glamour" = /obj/item/glamour_unstable,
"Glamour Shard" = /obj/item/potion_material/glamour_shard,
"Glamour Cell" = /obj/item/capture_crystal/glamour,
"Face of Glamour" = /obj/item/glamour_face,
"Speaking Glamour" = /obj/item/universal_translator/glamour,
"Glamour Bubble" = /obj/item/clothing/mask/gas/glamour,
"Pocket of Glamour" = /obj/item/clothing/under/permit/glamour
"Pocket of Glamour" = /obj/item/clothing/under/permit/glamour,
"glamour arrow" = /obj/item/arrow/standard/glamour,
"glamour bow" = /obj/item/gun/launcher/crossbow/bow/glamour
)
var/energy_cost = 50
@@ -286,5 +286,167 @@
icon = 'icons/obj/glamour.dmi'
icon_state = "pocket"
//Glamour Floor
//Glamour Wall
//Unstable Glamour
/obj/item/glamour_unstable
name = "unstable glamour"
desc = "A bright white glowing object that appears to move about on its own."
icon = 'icons/obj/glamour.dmi'
icon_state = "unstable"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_BLUESPACE = 7, TECH_MATERIAL = 2)
var/tele_range = 4
var/tf_type = /mob/living/simple_mob/animal/passive/mouse
var/tf_possible_types = list(
"mouse" = /mob/living/simple_mob/animal/passive/mouse,
"rat" = /mob/living/simple_mob/animal/passive/mouse/rat,
"giant rat" = /mob/living/simple_mob/vore/aggressive/rat,
"dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
"woof" = /mob/living/simple_mob/vore/woof,
"corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
"cat" = /mob/living/simple_mob/animal/passive/cat,
"chicken" = /mob/living/simple_mob/animal/passive/chicken,
"cow" = /mob/living/simple_mob/animal/passive/cow,
"lizard" = /mob/living/simple_mob/animal/passive/lizard,
"rabbit" = /mob/living/simple_mob/vore/rabbit,
"fox" = /mob/living/simple_mob/animal/passive/fox,
"fennec" = /mob/living/simple_mob/vore/fennec,
"cute fennec" = /mob/living/simple_mob/animal/passive/fennec,
"fennix" = /mob/living/simple_mob/vore/fennix,
"red panda" = /mob/living/simple_mob/vore/redpanda,
"opossum" = /mob/living/simple_mob/animal/passive/opossum,
"horse" = /mob/living/simple_mob/vore/horse,
"goose" = /mob/living/simple_mob/animal/space/goose,
"sheep" = /mob/living/simple_mob/vore/sheep,
"space bumblebee" = /mob/living/simple_mob/vore/bee,
"space bear" = /mob/living/simple_mob/animal/space/bear,
"voracious lizard" = /mob/living/simple_mob/vore/aggressive/dino,
"giant frog" = /mob/living/simple_mob/vore/aggressive/frog,
"jelly blob" = /mob/living/simple_mob/vore/jelly,
"wolf" = /mob/living/simple_mob/vore/wolf,
"direwolf" = /mob/living/simple_mob/vore/wolf/direwolf,
"great wolf" = /mob/living/simple_mob/vore/greatwolf,
"sect queen" = /mob/living/simple_mob/vore/sect_queen,
"sect drone" = /mob/living/simple_mob/vore/sect_drone,
"panther" = /mob/living/simple_mob/vore/aggressive/panther,
"giant snake" = /mob/living/simple_mob/vore/aggressive/giant_snake,
"deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw,
"otie" = /mob/living/simple_mob/vore/otie,
"mutated otie" =/mob/living/simple_mob/vore/otie/feral,
"red otie" = /mob/living/simple_mob/vore/otie/red,
"defanged xenomorph" = /mob/living/simple_mob/vore/xeno_defanged,
"catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
"monkey" = /mob/living/carbon/human/monkey,
"wolpin" = /mob/living/carbon/human/wolpin,
"sparra" = /mob/living/carbon/human/sparram,
"saru" = /mob/living/carbon/human/sergallingm,
"sobaka" = /mob/living/carbon/human/sharkm,
"farwa" = /mob/living/carbon/human/farwa,
"neaera" = /mob/living/carbon/human/neaera,
"stok" = /mob/living/carbon/human/stok,
"weretiger" = /mob/living/simple_mob/vore/weretiger,
"dragon" = /mob/living/simple_mob/vore/bigdragon/friendly,
"leopardmander" = /mob/living/simple_mob/vore/leopardmander
)
/obj/item/glamour_unstable/attack_self(mob/user)
var/mob/living/M = user
if(!istype(M))
return
user.visible_message(span_warning("[user] triggers \the [src]!"), span_danger("You trigger \the [src]!"))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
s.set_up(5, 1, get_turf(src))
s.start()
var/effect_choice = rand(1,4)
switch(effect_choice)
if(1) //teleport
blink_mob(M)
if(2) //mob_tf, uses polymorph potion code
if(!M.allow_spontaneous_tf)
M.AdjustWeakened(50)
else
mob_tf(M)
if(3)
size_change(M)
if(4)
M.apply_effect(200, IRRADIATE)
/obj/item/glamour_unstable/proc/blink_mob(mob/living/L)
var/starting_loc = (get_turf(src))
var/list/target_loc = list()
for(var/turf/simulated/floor/T in range(tele_range, starting_loc)) //Only appear on floors
if(!istype(T))
continue
if(T == starting_loc)
continue
target_loc |= T
if(target_loc.len)
var/final_loc = pick(target_loc)
do_teleport(L, final_loc, asoundin = 'sound/effects/phasein.ogg')
/obj/item/glamour_unstable/proc/mob_tf(mob/living/target)
var/mob/living/M = target
if(!istype(M))
return
if(M.tf_mob_holder)
var/mob/living/ourmob = M.tf_mob_holder
if(ourmob.ai_holder)
var/datum/ai_holder/our_AI = ourmob.ai_holder
our_AI.set_stance(STANCE_IDLE)
M.tf_mob_holder = null
ourmob.ckey = M.ckey
var/turf/get_dat_turf = get_turf(target)
ourmob.loc = get_dat_turf
ourmob.forceMove(get_dat_turf)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
ourmob.mob_belly_transfer(M)
ourmob.Life(1)
if(ishuman(M))
for(var/obj/item/W in M)
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
continue
M.drop_from_inventory(W)
qdel(target)
return
else
if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
return
var/mob/living/new_mob = spawn_mob(M)
new_mob.faction = M.faction
new_mob.mob_tf(M)
/obj/item/glamour_unstable/proc/spawn_mob(var/mob/living/target)
var/choice = pick(tf_possible_types)
tf_type = tf_possible_types[choice]
if(!ispath(tf_type))
return
var/new_mob = new tf_type(get_turf(target))
return new_mob
/obj/item/glamour_unstable/proc/size_change(mob/living/L)
var/new_size = (rand(25,200))/100
L.resize(new_size, ignore_prefs = FALSE)
/obj/item/glamour_unstable/attack_hand(mob/user)
. = ..()
var/mob/living/M = user
if(!istype(M))
return
if(ishuman(M))
var/mob/living/carbon/human/H = user
var/obj/item/clothing/gloves/G = H.gloves
if(istype(G) && ((G.flags & THICKMATERIAL && prob(70)) || istype(G, /obj/item/clothing/gloves/gauntlets)))
return
if((H.species.name == SPECIES_HANNER) || (H.species.name == SPECIES_LLEILL))
return
attack_self(H)
@@ -223,12 +223,7 @@
ourmob.forceMove(get_dat_turf)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = ourmob
B.forceMove(ourmob)
B.owner = ourmob
M.vore_organs -= B
ourmob.vore_organs += B
ourmob.mob_belly_transfer(M)
ourmob.Life(1)
if(ishuman(M))
@@ -245,51 +240,9 @@
var/mob/living/new_mob = spawn_mob(M)
new_mob.faction = M.faction
if(new_mob && isliving(new_mob))
for(var/obj/belly/B as anything in new_mob.vore_organs)
new_mob.vore_organs -= B
qdel(B)
new_mob.vore_organs = list()
new_mob.name = M.name
new_mob.real_name = M.real_name
for(var/lang in M.languages)
new_mob.languages |= lang
M.copy_vore_prefs_to_mob(new_mob)
new_mob.vore_selected = M.vore_selected
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
new_mob.gender = H.gender
else
new_mob.gender = M.gender
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.identifying_gender = M.gender
new_mob.mob_tf(M)
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = new_mob
B.forceMove(new_mob)
B.owner = new_mob
M.vore_organs -= B
new_mob.vore_organs += B
new_mob.ckey = M.ckey
if(M.ai_holder && new_mob.ai_holder)
var/datum/ai_holder/old_AI = M.ai_holder
old_AI.set_stance(STANCE_SLEEP)
var/datum/ai_holder/new_AI = new_mob.ai_holder
new_AI.hostile = old_AI.hostile
new_AI.retaliate = old_AI.retaliate
M.loc = new_mob
M.forceMove(new_mob)
new_mob.tf_mob_holder = M
spawn(30 SECONDS)
new_mob.revert_mob_tf() //TF them back after 30 seconds, basically takes them out of the fight for a short time.
addtimer(CALLBACK(new_mob, TYPE_PROC_REF(/mob/living, revert_mob_tf)), 30 SECONDS, TIMER_DELETE_ME)
/obj/item/projectile/beam/mouselaser/ddraig/spawn_mob(var/mob/living/target)
var/list/tf_list = list(/mob/living/simple_mob/animal/passive/mouse,