Skip to content
This repository was archived by the owner on Jun 29, 2024. It is now read-only.
129 changes: 129 additions & 0 deletions code/game/objects/structures/tangler.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@

/obj/structure/flora/roguegrass/tangler
name = "grass"
desc = "Green, soft and....I think I saw it move!"
icon = 'icons/roguetown/mob/monster/tangler.dmi'
icon_state = "tangler"
max_integrity = 5
var/faction = list("plants")

/obj/structure/flora/roguegrass/tangler/update_icon()
return

/obj/structure/flora/roguegrass/tangler/real
var/aggroed = 1
max_integrity = 40
integrity_failure = 0.15
attacked_sound = 'sound/misc/woodhit.ogg'
var/list/eatablez = list(/obj/item/bodypart, /obj/item/organ, /obj/item/reagent_containers/food/snacks/rogue/meat)
var/last_eat
buckle_lying = 0
buckle_prevents_pull = 1

/obj/structure/flora/roguegrass/tangler/real/Initialize()
. = ..()
proximity_monitor = new(src, 1)

/obj/structure/flora/roguegrass/tangler/real/Destroy()
QDEL_NULL(proximity_monitor)
unbuckle_all_mobs()
STOP_PROCESSING(SSobj, src)
. = ..()

/obj/structure/flora/roguegrass/tangler/real/obj_break(damage_flag)
..()
QDEL_NULL(proximity_monitor)
unbuckle_all_mobs()
STOP_PROCESSING(SSobj, src)
update_icon()

/obj/structure/flora/roguegrass/tangler/real/process()
if(!has_buckled_mobs())
if(world.time > last_eat + 5)
var/list/around = view(1, src)
for(var/mob/living/M in around)
HasProximity(M)
return
for(var/obj/item/F in around)
if(is_type_in_list(F, eatablez))
aggroed = world.time
last_eat = world.time
playsound(src,'sound/misc/eat.ogg', rand(30,60), TRUE)
qdel(F)
return
if(world.time > aggroed + 60 SECONDS)
aggroed = 0
update_icon()
STOP_PROCESSING(SSobj, src)
return TRUE

/obj/structure/flora/roguegrass/tangler/real/update_icon()
if(obj_broken)
name = "dry vine"
desc = "" // i think this might break, dunno
icon_state = "tangler-dead"
return
if(aggroed)
name = "twisting vine"
icon_state = "tangler"
else
name = "twisting vine"
icon_state = "tangler-hidden"

/obj/structure/flora/roguegrass/tangler/real/user_unbuckle_mob(mob/living/M, mob/user)
if(obj_broken)
..()
return
if(isliving(user))
var/mob/living/L = user
var/time2mount = CLAMP((L.STASTR * 2), 1, 99)
user.changeNext_move(CLICK_CD_RAPID)
if(user != M)
if(prob(time2mount))
..()
else
user.visible_message("<span class='warning'>[user] tries to pull [M] free of [src]!</span>")
return
if(prob(time2mount))
..()
else
user.visible_message("<span class='warning'>[user] tries to break free of [src]!</span>")

/obj/structure/flora/roguegrass/tangler/real/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking
return

/obj/structure/flora/roguegrass/tangler/real/HasProximity(atom/movable/AM)
if(has_buckled_mobs())
return
if(world.time > last_eat + 5)
var/list/around = view(src, 1) // scan for enemies
if(!(AM in around))
return
if(istype(AM, /mob/living))
var/mob/living/L = AM
if(!aggroed)
if(L.m_intent != MOVE_INTENT_RUN)
return
aggroed = world.time
last_eat = world.time
update_icon()
buckle_mob(L, TRUE, check_loc = FALSE)
START_PROCESSING(SSobj, src)
if(!HAS_TRAIT(L, TRAIT_NOPAIN))
L.emote("painscream", forced = FALSE)
src.visible_message("<span class='danger'>[src] snatches [L]!</span>")
playsound(src.loc, "plantcross", 100, FALSE, -1)
if(istype(AM, /obj/item))
if(is_type_in_list(AM, eatablez))
aggroed = world.time
last_eat = world.time
START_PROCESSING(SSobj, src)
update_icon()
playsound(src,'sound/misc/eat.ogg', rand(30,60), TRUE)
qdel(AM)
return
aggroed = world.time
/obj/structure/flora/roguegrass/tangler/real/attackby(obj/item/W, mob/user, params)
. = ..()
aggroed = world.time
update_icon()
7 changes: 7 additions & 0 deletions code/modules/clothing/rogueclothes/neck.dm
Original file line number Diff line number Diff line change
Expand Up @@ -241,3 +241,10 @@
resistance_flags = FIRE_PROOF
sellprice = 15
anvilrepair = /datum/skill/craft/armorsmithing

/obj/item/clothing/neck/roguetown/dherbs
name = "druid herbs"
desc = "Crafted from natural materials"
icon_state = "herbs"
sellprice = 5
slot_flags = ITEM_SLOT_NECK|ITEM_SLOT_HIP|ITEM_SLOT_WRISTS
7 changes: 7 additions & 0 deletions code/modules/hydroponics/grown/roguetown.dm
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,10 @@ GLOBAL_LIST_EMPTY(berrycolors)

/obj/item/seeds/berryrogue/poison
product = /obj/item/reagent_containers/food/snacks/grown/berries/rogue/poison

/obj/item/reagent_containers/food/snacks/grown/berries/rogue/blood
seed = null
icon_state = "berries"
tastes = list("berry" = 1, "red" = 1)
list_reagents = list(/datum/reagent/medicine/healthpot = 1.5, /datum/reagent/consumable/nutriment = 2)
color = "#ff0000"
3 changes: 3 additions & 0 deletions code/modules/jobs/job_types/roguetown/church/druid.dm
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@
H.change_stat("intelligence", 1)
H.change_stat("endurance", 1)
H.change_stat("perception", -1)
H.mind.AddSpell(new/obj/effect/proc_holder/spell/invoked/bloodberry)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/growvines)
H.mind.AddSpell(new/obj/effect/proc_holder/spell/invoked/budlet)

var/datum/devotion/C = new /datum/devotion(H, H.patron)
C.grant_spells(H)
Expand Down
113 changes: 113 additions & 0 deletions code/modules/mob/living/simple_animal/rogue/creacher/budlet.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/mob/living/simple_animal/hostile/retaliate/rogue/budlet
icon = 'icons/roguetown/mob/monster/budlet.dmi'
name = "budlet"
icon_state = "budlet"
icon_living = "budlet"
gender = FEMALE
emote_hear = null
emote_see = null
speak_chance = 2
turns_per_move = 2
move_to_delay = 5
base_intents = list(/datum/intent/unarmed/shove)
butcher_results = null
faction = list("plants")
health = 40
maxHealth = 40
melee_damage_lower = 5
melee_damage_upper = 2
vision_range = 4
aggro_vision_range = 5
retreat_distance = 0
minimum_distance = 0
milkies = FALSE
food_type = list(/obj/item/reagent_containers/food/snacks/rogue/meat, /obj/item/bodypart, /obj/item/organ)
footstep_type = FOOTSTEP_MOB_BAREFOOT
pooptype = null
STACON = 5
STASTR = 4
STASPD = 2
deaggroprob = 50
defprob = 60
defdrain = 5
del_on_deaggro = TRUE
del_on_death = TRUE
retreat_health = 0.3
food = 0
attack_sound = "plantcross"
dodgetime = 30
aggressive = 1
// stat_attack = UNCONSCIOUS
remains_type = null

/mob/living/simple_animal/hostile/retaliate/rogue/budlet/Initialize()
. = ..()
gender = FEMALE
if(prob(33))
gender = MALE
update_icon()

/mob/living/simple_animal/hostile/retaliate/rogue/budlet/get_sound(input)
switch(input)
if("aggro")
return pick('sound/vo/mobs/plant/attack (2).ogg','sound/vo/mobs/plant/attack (3).ogg')
if("pain")
return pick('sound/vo/mobs/plant/pain (1).ogg','sound/vo/mobs/plant/pain (2).ogg','sound/vo/mobs/plant/pain (3).ogg','sound/vo/mobs/plant/pain (4).ogg')
if("death")
return pick('sound/misc/woodhit.ogg')

/mob/living/simple_animal/hostile/retaliate/rogue/budlet/taunted(mob/user)
emote("aggro")
Retaliate()
GiveTarget(user)
return

/mob/living/simple_animal/hostile/retaliate/rogue/budlet/Life()
..()
if(pulledby)
Retaliate()
GiveTarget(pulledby)


/mob/living/simple_animal/hostile/retaliate/rogue/budlet/simple_limb_hit(zone)
if(!zone)
return ""
switch(zone)
if(BODY_ZONE_PRECISE_R_EYE)
return "head"
if(BODY_ZONE_PRECISE_L_EYE)
return "head"
if(BODY_ZONE_PRECISE_NOSE)
return "nose"
if(BODY_ZONE_PRECISE_MOUTH)
return "mouth"
if(BODY_ZONE_PRECISE_SKULL)
return "head"
if(BODY_ZONE_PRECISE_EARS)
return "head"
if(BODY_ZONE_PRECISE_NECK)
return "neck"
if(BODY_ZONE_PRECISE_L_HAND)
return "foreleg"
if(BODY_ZONE_PRECISE_R_HAND)
return "foreleg"
if(BODY_ZONE_PRECISE_L_FOOT)
return "leg"
if(BODY_ZONE_PRECISE_R_FOOT)
return "leg"
if(BODY_ZONE_PRECISE_STOMACH)
return "stomach"
if(BODY_ZONE_PRECISE_GROIN)
return "tail"
if(BODY_ZONE_HEAD)
return "head"
if(BODY_ZONE_R_LEG)
return "leg"
if(BODY_ZONE_L_LEG)
return "leg"
if(BODY_ZONE_R_ARM)
return "foreleg"
if(BODY_ZONE_L_ARM)
return "foreleg"
return ..()

7 changes: 7 additions & 0 deletions code/modules/roguetown/roguecrafting/leather.dm
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,10 @@
name = "Drum"
result = /obj/item/rogue/instrument/drum
reqs = list(/obj/item/natural/hide = 1,/obj/item/grown/log/tree/small = 1)

/datum/crafting_recipe/roguetown/leather/dherbs
name = "druid herbs"
result = /obj/item/clothing/neck/roguetown/dherbs
reqs = list(/obj/item/natural/hide = 1,/obj/item/seeds/wheat = 1, /obj/item/seeds/apple = 1,
/obj/item/seeds/pipeweed = 1, /obj/item/seeds/sweetleaf = 1 ,/obj/item/seeds/berryrogue = 1,
/obj/item/natural/fibers = 1, /obj/item/reagent_containers/powder = 1, /obj/item/natural/thorn = 1)
68 changes: 68 additions & 0 deletions code/modules/spells/roguetown/druid.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@

/obj/effect/proc_holder/spell/invoked/growvines
name = "Grow vines"
overlay_state = "tangling"
releasedrain = 30
chargedrain = 0
chargetime = 0
range = 15
warnie = "spellwarning"
movement_interrupt = FALSE
chargedloop = null
req_items = list(/obj/item/clothing/neck/roguetown/dherbs)
sound = 'sound/magic/webspin.ogg'
associated_skill = /datum/skill/magic/druidic
antimagic_allowed = TRUE
charge_max = 60 SECONDS

/obj/effect/proc_holder/spell/invoked/growvines/cast(list/targets, mob/living/user)
. = ..()
user.blood_volume -= BLOOD_VOLUME_SURVIVE/3
var/turf/T = get_turf(targets[1])
user.visible_message("<font color='green'>[user] points at [T]!</font>","<span class='notice'>You feel light-headed!</span>")
if(!isclosedturf(T) && !locate(/turf/open/transparent/openspace) in T)
new /obj/structure/flora/roguegrass/tangler/real(T)

/obj/effect/proc_holder/spell/invoked/budlet
name = "Summon Buds"
range = 5
overlay_state = "dendor"
releasedrain = 30
charge_max = 120 SECONDS
req_items = list(/obj/item/clothing/neck/roguetown/dherbs)
cast_without_targets = TRUE
sound = 'sound/magic/webspin.ogg'
associated_skill = /datum/skill/magic/druidic
antimagic_allowed = TRUE
invocation = "By the power of Dendor, come forth!"
invocation_type = "shout" //can be none, whisper, emote and shout

/obj/effect/proc_holder/spell/invoked/budlet/cast(list/targets, mob/living/user)
. = ..()
var/turf/T = user.loc
for(var/X in GLOB.cardinals)
user.faction |= "plants"
user.blood_volume -= BLOOD_VOLUME_SURVIVE/2
var/turf/TT = get_step(T, X)
if(!isclosedturf(TT) && !locate(/mob/living/simple_animal/hostile/retaliate/rogue/budlet) in TT)
new /mob/living/simple_animal/hostile/retaliate/rogue/budlet(TT)
return TRUE

/obj/effect/proc_holder/spell/invoked/bloodberry
name = "Blood berry"
range = 2
overlay_state = "bberry"
releasedrain = 15
charge_max = 30 SECONDS
req_items = list(/obj/item/clothing/neck/roguetown/dherbs)
cast_without_targets = TRUE
sound = 'sound/magic/webspin.ogg'
associated_skill = /datum/skill/magic/druidic
antimagic_allowed = TRUE
invocation = "I clench my fist"
invocation_type = "emote" //can be none, whisper, emote and shout

/obj/effect/proc_holder/spell/invoked/bloodberry/cast(list/targets, mob/living/user)
. = ..()
var/obj/item/reagent_containers/food/snacks/grown/berries/rogue/blood/I = new
user.put_in_hands(I)
Binary file modified icons/mob/actions/roguespells.dmi
Binary file not shown.
Binary file modified icons/roguetown/clothing/neck.dmi
Binary file not shown.
Binary file added icons/roguetown/mob/monster/budlet.dmi
Binary file not shown.
Binary file added icons/roguetown/mob/monster/tangler.dmi
Binary file not shown.
Binary file added sound/magic/grow_vine.ogg
Binary file not shown.