diff --git a/code/datums/components/pact_weapon.dm b/code/datums/components/pact_weapon.dm
index ab2c3dd56..859e58cfe 100644
--- a/code/datums/components/pact_weapon.dm
+++ b/code/datums/components/pact_weapon.dm
@@ -20,12 +20,10 @@
weapon = parent
weapon.name += " of the [patronchoice]"
weapon.desc += " It is enchanted to use arcane skill rather than its regular skill. Right click with an empty hand to change this weapon's form."
- weapon.force *= 1.2
weapon.max_blade_int *= 1.2
weapon.blade_int = weapon.max_blade_int
weapon.max_integrity *= 1.2
weapon.obj_integrity = weapon.max_integrity
- weapon.minstr = 1
weapon.associated_skill = /datum/skill/magic/arcane
//var/mutable_appearance/magic_overlay = mutable_appearance('icons/effects/effects.dmi', "electricity")
//item.add_overlay(magic_overlay)
diff --git a/code/game/objects/items/rogueweapons/melee/flail.dm b/code/game/objects/items/rogueweapons/melee/flail.dm
index 49df40332..ef5f61567 100644
--- a/code/game/objects/items/rogueweapons/melee/flail.dm
+++ b/code/game/objects/items/rogueweapons/melee/flail.dm
@@ -93,40 +93,43 @@
/datum/intent/whip/lash
- name = "lash"
- blade_class = BCLASS_BLUNT
- attack_verb = list("lashes", "cracks")
- hitsound = list('sound/combat/hits/blunt/flailhit.ogg')
- chargetime = 5
- recovery = 7
- penfactor = 10
- reach = 2
- icon_state = "inlash"
- item_d_type = "slash"
+ name = "lash"
+ blade_class = BCLASS_BLUNT
+ attack_verb = list("lashes", "cracks")
+ hitsound = list('sound/combat/hits/blunt/flailhit.ogg')
+ chargetime = 5
+ recovery = 7
+ penfactor = 10
+ damfactor = 1.1
+ reach = 1
+ icon_state = "inlash"
+ item_d_type = "blunt"
/datum/intent/whip/crack
- name = "crack"
- blade_class = BCLASS_CUT
- attack_verb = list("cracks", "strikes") //something something dwarf fotresss
- hitsound = list('sound/combat/hits/blunt/flailhit.ogg')
- chargetime = 0
- recovery = 10
- penfactor = 40
- reach = 1
- icon_state = "incrack"
- item_d_type = "slash"
+ name = "crack"
+ blade_class = BCLASS_CUT
+ attack_verb = list("cracks", "strikes") //something something dwarf fotresss
+ hitsound = list('sound/combat/hits/blunt/flailhit.ogg')
+ chargetime = 0
+ recovery = 10
+ penfactor = 40
+ reach = 2
+ icon_state = "incrack"
+ item_d_type = "slash"
/datum/intent/whip/punish
- name = "punish"
- blade_class = BCLASS_BLUNT
- attack_verb = list("lashes")
- hitsound = list('sound/combat/hits/blunt/flailhit.ogg')
- chargetime = 0
- recovery = 10
- penfactor = 0
- reach = 2
- icon_state = "inpunish"
- item_d_type = "blunt"
+ name = "punish"
+ blade_class = BCLASS_CUT
+ attack_verb = list("lashes")
+ hitsound = list('sound/combat/hits/blunt/flailhit.ogg')
+ chargetime = 5
+ swingdelay = 6
+ recovery = 10
+ penfactor = 0
+ damfactor = 0.9
+ reach = 3
+ icon_state = "inpunish"
+ item_d_type = "slash"
/obj/item/rogueweapon/whip
force = 21
diff --git a/code/modules/client/customizer/customizers/organ/snout.dm b/code/modules/client/customizer/customizers/organ/snout.dm
index 52c79d1d0..512b547bb 100644
--- a/code/modules/client/customizer/customizers/organ/snout.dm
+++ b/code/modules/client/customizer/customizers/organ/snout.dm
@@ -200,6 +200,8 @@
/datum/sprite_accessory/snout/front/sharplight,
/datum/sprite_accessory/snout/front/roundlight,
/datum/sprite_accessory/snout/shortnosed,
+ /datum/sprite_accessory/snout/front/cownose,
+ /datum/sprite_accessory/snout/cownose,
)
/datum/customizer/organ/snout/akula
diff --git a/code/modules/clothing/rogueclothes/shirts.dm b/code/modules/clothing/rogueclothes/shirts.dm
index 96de8811a..b592cd22f 100644
--- a/code/modules/clothing/rogueclothes/shirts.dm
+++ b/code/modules/clothing/rogueclothes/shirts.dm
@@ -32,6 +32,7 @@
allowed_sex = list(MALE, FEMALE)
allowed_race = NON_DWARVEN_RACE_TYPES
body_parts_covered = CHEST|GROIN|ARMS|VITALS
+ flags_inv = HIDECROTCH
/obj/item/clothing/suit/roguetown/shirt/undershirt/black
color = CLOTHING_BLACK
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessory/snouts.dm
index fe1f2edce..9a06e0320 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/snouts.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/snouts.dm
@@ -458,3 +458,7 @@
/datum/sprite_accessory/snout/cownose
name = "Cow Nose"
icon_state = "cownose"
+
+/datum/sprite_accessory/snout/front/cownose
+ name = "Cow Nose(Top)"
+ icon_state = "cownose"
diff --git a/code/modules/spells/roguetown/warlock.dm b/code/modules/spells/roguetown/warlock.dm
index bfa8a2fdc..3a8089f3b 100644
--- a/code/modules/spells/roguetown/warlock.dm
+++ b/code/modules/spells/roguetown/warlock.dm
@@ -183,30 +183,27 @@
invocation = ""
invocation_type = "shout" //can be none, whisper, emote and shout
-
var/mob/living/fam
/obj/effect/proc_holder/spell/self/findfamiliar/cast(mob/user = usr)
..()
-
var/familiars = list(
- /mob/living/carbon/human/species/goblin/hell, //imp
- /mob/living/simple_animal/hostile/retaliate/rogue/mossback, //psuedodragon
- /mob/living/carbon/human/species/skeleton, //quasit(skeleton?)
- /mob/living/simple_animal/shade //sprite
- )
+ "Imp" = /mob/living/carbon/human/species/goblin/hell,
+ "Crab" = /mob/living/simple_animal/hostile/retaliate/rogue/mossback,
+ "Skeleton" = /mob/living/carbon/human/species/skeleton,
+ "Sprite" = /mob/living/simple_animal/shade,
+ "Wolf" = /mob/living/simple_animal/hostile/retaliate/rogue/wolf,
+ "Mutated Spider" = /mob/living/simple_animal/hostile/retaliate/rogue/spider/mutated,
+ "Buck" = /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck
+ )
var/familiarchoice = input("Choose your familiar", "Available familiars") as anything in familiars
-
+ var/familiar_type = familiars[familiarchoice]
to_chat(user, span_notice("Trying to find familiar..."))
- var/list/L = pollCandidatesForMob(
- Question = "Do you want to play as [span_notice("[span_danger("[user.real_name]'s")] familiar")]?",
- jobbanType = ROLE_PAI,
- poll_time = 20 SECONDS,
- ignore_category = POLL_IGNORE_SENTIENCE_POTION,
- )
- if(L.len > 0)
+ var/list/L = pollGhostCandidates("Do you want to play as [span_notice("[span_danger("[user.real_name]'s")] familiar")]?", ROLE_PAI)
+
+ if(LAZYLEN(L))
var/mob/chosen_one = pick(L)
- fam = new familiarchoice(user.loc)
+ fam = new familiar_type(user.loc)
fam.key = chosen_one.key
to_chat(user, span_notice("Your familiar appears..."))
chosen_one.mind.transfer_to(fam)
diff --git a/icons/mob/actions/roguespells.dmi b/icons/mob/actions/roguespells.dmi
index c981fe73a..1b3c84d5e 100644
Binary files a/icons/mob/actions/roguespells.dmi and b/icons/mob/actions/roguespells.dmi differ
diff --git a/icons/mob/sprite_accessory/snouts/snouts.dmi b/icons/mob/sprite_accessory/snouts/snouts.dmi
index e7c7ed339..eadb8ee7c 100644
Binary files a/icons/mob/sprite_accessory/snouts/snouts.dmi and b/icons/mob/sprite_accessory/snouts/snouts.dmi differ
diff --git a/modular_causticcove/code/modules/spells/wizard.dm b/modular_causticcove/code/modules/spells/wizard.dm
new file mode 100644
index 000000000..5b1286092
--- /dev/null
+++ b/modular_causticcove/code/modules/spells/wizard.dm
@@ -0,0 +1,149 @@
+/obj/effect/proc_holder/spell/targeted/touch/sizespell
+ name = "Reduce/Grow Person"
+ desc = "A basic trick many apprentices would use to prank their master."
+ clothes_req = FALSE
+ drawmessage = "I prepare to perform a arcyne incantation."
+ dropmessage = "I release my arcyne focus."
+ school = "transmutation"
+ overlay_state = "size-change"
+ castdrain = 50
+ chargetime = 10
+ charge_max = 2 MINUTES
+ cost = 2
+ chargedloop = /datum/looping_sound/invokegen
+ associated_skill = /datum/skill/magic/arcane
+ hand_path = /obj/item/melee/touch_attack/sizespell
+
+/obj/item/melee/touch_attack/sizespell
+ name = "\improper magic touch"
+ desc = "You recall the following incantations you've learned:\n \
+ Reduce: Will Shrink whoever you touch.\n \
+ Grow: Will grow whoever you touch, you may also touch yourself. (huehue, get it?)"
+ catchphrase = null
+ possible_item_intents = list(INTENT_HELP, INTENT_DISARM)
+ icon = 'icons/mob/roguehudgrabs.dmi'
+ icon_state = "pulling"
+ icon_state = "grabbing_greyscale"
+ color = "#ff0000" // this produces green because the icon base is yellow but someone else can fix that if they want
+
+
+/obj/item/melee/touch_attack/sizespell/attack_self()
+ qdel(src)
+
+/obj/item/melee/touch_attack/sizespell/afterattack(atom/target, mob/living/carbon/user, proximity)
+ if(!proximity)
+ return
+
+ switch (user.used_intent.type)
+ if(INTENT_HELP) //Reduce
+ shrink_target(target, user)
+ if(INTENT_DISARM) //Grow
+ grow_target(target, user)
+
+/obj/item/melee/touch_attack/sizespell/proc/shrink_target(mob/living/target, mob/living/carbon/human/user)
+ if(!isliving(target))
+ return
+
+ if(user == target)
+ user.visible_message(span_notice("[user] rapidly changes in size!"), span_notice("I rapidly shrink down!"))
+ else
+ user.visible_message(span_notice("[user] touch [target], and they changes in size!"), span_notice("I touch [target] and they shrink in size!"))
+ target.apply_status_effect(/datum/status_effect/buff/shrinked)
+ qdel(src)
+
+
+/obj/item/melee/touch_attack/sizespell/proc/grow_target(mob/living/target, mob/living/carbon/human/user)
+ if(!isliving(target))
+ return
+
+ if(user == target)
+ user.visible_message(span_notice("[user] rapidly changes in size!"), span_notice("I rapidly grow up!"))
+ else
+ user.visible_message(span_notice("[user] touch [target], and they changes in size!"), span_notice("I touch [target] and they grow in size!"))
+ target.apply_status_effect(/datum/status_effect/buff/growth)
+ qdel(src)
+
+/datum/status_effect/buff/shrinked
+ id = "shrink"
+ alert_type = /atom/movable/screen/alert/status_effect/buff/shrinked
+ effectedstats = list("speed" = 3, "strength" = -6, "fortune" = -3)
+ var/removable = FALSE
+
+/datum/status_effect/buff/shrinked/on_apply()
+ . = ..()
+ var/mob/living/target = owner
+ target.transform = target.transform.Scale(0.5, 0.5)
+ target.update_transform()
+ target.pass_flags = PASSTABLE | PASSMOB
+ spawn(300) //is that how it work? i remember there being a better wait timer but i forgor
+ if(owner && istype(owner, /mob/living))
+ to_chat(owner, span_userdanger("You feel like you might be able to return to your size by pressing on the status effect!"))
+ removable = TRUE
+
+/datum/status_effect/buff/shrinked/on_remove()
+ var/mob/living/target = owner
+ target.transform = target.transform.Scale(2, 2)
+ target.update_transform()
+ target.pass_flags = 0
+ . = ..()
+
+/atom/movable/screen/alert/status_effect/buff/shrinked
+ name = "Shrinked"
+ desc = "I've been shrinked! (After 30 seconds, you can press this button to return to your original size.)"
+ icon_state = "debuff"
+ /datum/status_effect/buff/shrinked
+
+/atom/movable/screen/alert/status_effect/buff/shrinked/Click()
+ . = ..()
+ var/mob/living/L = usr
+ if(!istype(L)) // how though
+ return
+ var/datum/status_effect/buff/shrinked/effect = L.has_status_effect(/datum/status_effect/buff/shrinked)
+ if(!effect.removable)
+ to_chat(L, span_userdanger("I can't turn back yet!"))
+ return
+ L.remove_status_effect(/datum/status_effect/buff/shrinked)
+
+
+/datum/status_effect/buff/growth
+ id = "growth"
+ alert_type = /atom/movable/screen/alert/status_effect/buff/growth
+ effectedstats = list("speed" = -6, "strength" = 3)
+ var/removable = FALSE
+
+/datum/status_effect/buff/growth/on_apply()
+ . = ..()
+ var/mob/living/target = owner
+ target.transform = target.transform.Scale(2, 2)
+ target.transform = target.transform.Translate(0, (1 * 16))
+ target.update_transform()
+ target.add_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT, update=TRUE, priority=100, multiplicative_slowdown=4, movetypes=GROUND)
+ spawn(300) //is that how it work? i remember there being a better wait timer but i forgor, so i'm using this one
+ if(owner && istype(owner, /mob/living))
+ to_chat(owner, span_userdanger("You feel like you might be able to return to your size now by pressing on the status effect!"))
+ removable = TRUE
+
+/datum/status_effect/buff/growth/on_remove()
+ var/mob/living/target = owner
+ target.transform = target.transform.Scale(0.5, 0.5)
+ target.transform = target.transform.Translate(0, -(1 * 16))
+ target.update_transform()
+ target.remove_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT, TRUE)
+ . = ..()
+
+/atom/movable/screen/alert/status_effect/buff/growth
+ name = "Growth"
+ desc = "I've became bigger! (After 30 seconds, you can press this button to return to your original size.)"
+ icon_state = "debuff"
+ /datum/status_effect/buff/growth
+
+/atom/movable/screen/alert/status_effect/buff/growth/Click()
+ . = ..()
+ var/mob/living/L = usr
+ if(!istype(L)) // how though
+ return
+ var/datum/status_effect/buff/growth/effect = L.has_status_effect(/datum/status_effect/buff/growth)
+ if(!effect.removable)
+ to_chat(L, span_userdanger("I can't turn back yet!"))
+ return
+ L.remove_status_effect(/datum/status_effect/buff/growth)
diff --git a/modular_hearthstone/code/modules/spells/roguetown/wizard.dm b/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
index 63e9849c4..848b35349 100644
--- a/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
+++ b/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
@@ -226,7 +226,8 @@
/obj/effect/proc_holder/spell/invoked/magicstone5e,
/obj/effect/proc_holder/spell/invoked/mending5e,
/obj/effect/proc_holder/spell/self/primalsavagery5e,
- /obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e
+ /obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e,
+ /obj/effect/proc_holder/spell/targeted/touch/sizespell
)
for(var/i = 1, i <= spell_choices.len, i++)
choices["[spell_choices[i].name]: [spell_choices[i].cost]"] = spell_choices[i]
diff --git a/roguetown.dme b/roguetown.dme
index 99a9f3bc4..9b36d94b9 100644
--- a/roguetown.dme
+++ b/roguetown.dme
@@ -3631,6 +3631,7 @@
#include "modular_causticcove\code\modules\roguetown\roguecrafting\alchemy.dm"
#include "modular_causticcove\code\modules\roguetown\roguejobs\alchemist\containers.dm"
#include "modular_causticcove\code\modules\roguetown\roguejobs\alchemist\reagent.dm"
+#include "modular_causticcove\code\modules\spells\wizard.dm"
#include "modular_causticcove\code\modules\spells\pantheon\Divine\noc.dm"
#include "modular_causticcove\code\modules\vore\persistence.dm"
#include "modular_causticcove\code\modules\vore\SSbellies.dm"