diff --git a/.gitignore b/.gitignore
index dd20fecd22c4..ed4b6b4d7e2c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -215,13 +215,14 @@ tools/CreditsTool/obj/*
#dmdoc default folder
/dmdoc
+/config/*
+!/config/example
+!/config/example/*
+
# Ignore custom music and title screens (amend as appropriate)
-/config/jukebox_music/sounds/*
-!/config/jukebox_music/sounds/exclude
-/config/title_music/sounds/*
-!/config/title_music/sounds/exclude
-/config/title_screens/images/*
-!/config/title_screens/images/exclude
+/config/example/jukebox_music/sounds/exclude
+/config/example/title_music/sounds/exclude
+/config/example/title_screens/images/exclude
#Linux docker
tools/LinuxOneShot/SetupProgram/obj/*
diff --git a/ModularTegustation/Teguicons/48x48.dmi b/ModularTegustation/Teguicons/48x48.dmi
index 600f142b46d1..120f5f678551 100644
Binary files a/ModularTegustation/Teguicons/48x48.dmi and b/ModularTegustation/Teguicons/48x48.dmi differ
diff --git a/ModularTegustation/Teguicons/96x48.dmi b/ModularTegustation/Teguicons/96x48.dmi
index dc0daa343c83..c104292bfef1 100644
Binary files a/ModularTegustation/Teguicons/96x48.dmi and b/ModularTegustation/Teguicons/96x48.dmi differ
diff --git a/ModularTegustation/Teguicons/blood_fiend_gear.dmi b/ModularTegustation/Teguicons/blood_fiend_gear.dmi
new file mode 100644
index 000000000000..4efc991e824f
Binary files /dev/null and b/ModularTegustation/Teguicons/blood_fiend_gear.dmi differ
diff --git a/ModularTegustation/Teguicons/blood_fiend_gear_worn.dmi b/ModularTegustation/Teguicons/blood_fiend_gear_worn.dmi
new file mode 100644
index 000000000000..080fa45865b5
Binary files /dev/null and b/ModularTegustation/Teguicons/blood_fiend_gear_worn.dmi differ
diff --git a/ModularTegustation/Teguicons/blood_fiends_32x32.dmi b/ModularTegustation/Teguicons/blood_fiends_32x32.dmi
new file mode 100644
index 000000000000..27da885dde7b
Binary files /dev/null and b/ModularTegustation/Teguicons/blood_fiends_32x32.dmi differ
diff --git a/ModularTegustation/Teguicons/lc13_coloreffect.dmi b/ModularTegustation/Teguicons/lc13_coloreffect.dmi
index 87c167897f8f..9e665f619548 100644
Binary files a/ModularTegustation/Teguicons/lc13_coloreffect.dmi and b/ModularTegustation/Teguicons/lc13_coloreffect.dmi differ
diff --git a/ModularTegustation/Teguicons/resurgence_32x48.dmi b/ModularTegustation/Teguicons/resurgence_32x48.dmi
index 97f81d02aaef..2b89b5e2f2e8 100644
Binary files a/ModularTegustation/Teguicons/resurgence_32x48.dmi and b/ModularTegustation/Teguicons/resurgence_32x48.dmi differ
diff --git a/ModularTegustation/Teguicons/resurgence_48x48.dmi b/ModularTegustation/Teguicons/resurgence_48x48.dmi
index 4b8e7a9a69fa..c451f33dc8e7 100644
Binary files a/ModularTegustation/Teguicons/resurgence_48x48.dmi and b/ModularTegustation/Teguicons/resurgence_48x48.dmi differ
diff --git a/ModularTegustation/Teguicons/room_spawners/29x22.dmi b/ModularTegustation/Teguicons/room_spawners/29x22.dmi
new file mode 100644
index 000000000000..b9573c5b8b8e
Binary files /dev/null and b/ModularTegustation/Teguicons/room_spawners/29x22.dmi differ
diff --git a/ModularTegustation/Teguicons/status_sprites.dmi b/ModularTegustation/Teguicons/status_sprites.dmi
index ed24c8afac4e..6b9eb8ab9d31 100644
Binary files a/ModularTegustation/Teguicons/status_sprites.dmi and b/ModularTegustation/Teguicons/status_sprites.dmi differ
diff --git a/ModularTegustation/Teguicons/tegumobs.dmi b/ModularTegustation/Teguicons/tegumobs.dmi
index af8d95b24e0b..ecdba5c1980a 100644
Binary files a/ModularTegustation/Teguicons/tegumobs.dmi and b/ModularTegustation/Teguicons/tegumobs.dmi differ
diff --git a/ModularTegustation/delivery_doors.dm b/ModularTegustation/delivery_doors.dm
new file mode 100644
index 000000000000..1b66c52bb124
--- /dev/null
+++ b/ModularTegustation/delivery_doors.dm
@@ -0,0 +1,106 @@
+// Doors for parcels to be delivered to. Simulated mailman.
+// A good way to get money without combat.
+/obj/structure/delivery_door
+ name = "locked door"
+ desc = "A doorway to somewhere your not allowed to be."
+ icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
+ icon_state = "closed"
+ anchored = TRUE
+ layer = CLOSED_DOOR_LAYER
+ var/address = "000"
+ var/list/item_order = list()
+
+/obj/structure/delivery_door/Initialize()
+ . = ..()
+ address = "[x]-[y]"
+ name += " ([address])"
+
+/obj/structure/delivery_door/attackby(obj/item/I, mob/user)
+ var/ordered_item = locate(I) in item_order
+ if(ordered_item)
+ Reward(user, I, item_order[ordered_item])
+ item_order -= ordered_item
+ return
+ if(istype(I, /obj/item/delivery_parcel))
+ // Deliver the item.
+ var/obj/item/delivery_parcel/D = I
+ if(D.address == address)
+ Reward(user, D, 150 + rand(-1,20))
+ return
+ return ..()
+
+// Create parcel to be delivered.
+/obj/structure/delivery_door/proc/OrderParcel(origin)
+ if(!isturf(origin) && !isatom(origin))
+ return FALSE
+ var/obj/item/delivery_parcel/D = new (get_turf(origin))
+ D.labelParcel(address)
+ return TRUE
+
+// Order items that are not safety sealed.
+/obj/structure/delivery_door/proc/OrderItems(origin, obj/item/T = /obj/item/food/pizza/margherita, delivery_payment = 30)
+ if(!isturf(origin) && !isatom(origin))
+ return FALSE
+ item_order += T
+ item_order[T] = delivery_payment
+ var/obj/item/paper/P = new (get_turf(origin))
+ P.setText("
[address] orders a [initial(T.name)] for [delivery_payment] Ahn.
")
+ return TRUE
+
+// Pay the pizzaman
+/obj/structure/delivery_door/proc/Reward(mob/living/user, obj/item/delivery, amt)
+ var/obj/item/holochip/H = new (get_turf(user), amt)
+ user.put_in_hands(H)
+ to_chat(user, span_notice("The parcel is taken and payment is quickly tossed into your hand before the door locks again."))
+ qdel(delivery)
+ playsound(get_turf(src), 'sound/effects/bin_close.ogg', 35, 3, 3)
+
+// Delivery Object
+/obj/item/delivery_parcel
+ name = "delivery parcel"
+ desc = "A large delivery parcel that has a J corp lock on it."
+ icon = 'icons/obj/tank.dmi'
+ icon_state = "plasmaman_tank"
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ worn_icon = 'icons/mob/clothing/back.dmi'
+ var/address = "000"
+
+/obj/item/delivery_parcel/proc/labelParcel(num)
+ address = num
+ name += " ([address])"
+
+/*
+* TRACKER
+*/
+
+/obj/item/pinpointer/coordinate
+ name = "coordinate pinpointer"
+ desc = "Use in hand to set target cordnates."
+ icon_state = "pinpointer_syndicate"
+ custom_price = PAYCHECK_MEDIUM * 4
+ custom_premium_price = PAYCHECK_MEDIUM * 6
+ var/coords
+
+/obj/item/pinpointer/coordinate/examine(mob/user)
+ . = ..()
+ if(!active || !target)
+ return
+ if(coords)
+ . += coords
+
+/obj/item/pinpointer/coordinate/attack_self(mob/living/user)
+ if(active)
+ toggle_on()
+ user.visible_message(span_notice("[user] deactivates [user.p_their()] pinpointer."), span_notice("You deactivate your pinpointer."))
+ return
+
+ var/target_x = input(user, "x coordinate", "Pinpoint") as null|num
+ var/target_y = input(user, "y coordinate", "Pinpoint") as null|num
+ if(!target_x || !target_y || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated())
+ return
+
+ target = locate(target_x, target_y, user.z)
+ coords = "X:[target_x]|Y:[target_y]"
+ toggle_on()
+ user.visible_message(span_notice("[user] activates [user.p_their()] pinpointer."), span_notice("You activate your pinpointer."))
diff --git a/ModularTegustation/ego_weapons/melee/subtype/lance.dm b/ModularTegustation/ego_weapons/melee/subtype/lance.dm
index 82303d1f151c..22900cbe7995 100644
--- a/ModularTegustation/ego_weapons/melee/subtype/lance.dm
+++ b/ModularTegustation/ego_weapons/melee/subtype/lance.dm
@@ -126,6 +126,9 @@
if(charge_speed > -(bump_threshold))
RaiseLance(user)
return
+ if(istype(A, /mob/living/simple_animal/projectile_blocker_dummy))
+ var/mob/living/simple_animal/projectile_blocker_dummy/pbd = A
+ A = pbd.parent
if(isliving(A))
if(ishuman(A) && user.faction_check_mob(A))
var/mob/living/carbon/human/H = A
diff --git a/ModularTegustation/ego_weapons/melee/teth.dm b/ModularTegustation/ego_weapons/melee/teth.dm
index b9716a0a1d02..da6f6f4750f4 100644
--- a/ModularTegustation/ego_weapons/melee/teth.dm
+++ b/ModularTegustation/ego_weapons/melee/teth.dm
@@ -576,6 +576,17 @@
charge_speed_cap = 2
couch_cooldown_time = 3 SECONDS
+/obj/item/ego_weapon/kikimora
+ name = "kiki mora"
+ desc = "Many would speak her name."
+ icon_state = "kikimora"
+ force = 35
+ attack_speed = 1.6
+ damtype = RED_DAMAGE
+ attack_verb_continuous = list("beats", "smacks")
+ attack_verb_simple = list("beat", "smack")
+ hitsound = 'sound/weapons/fixer/generic/gen1.ogg'
+
/obj/item/ego_weapon/denial
name = "denial"
desc = "Unregulated ingestion of Enkephalin may cause a wide range of unverified psychopathological symptoms."
diff --git a/ModularTegustation/ego_weapons/melee/waw.dm b/ModularTegustation/ego_weapons/melee/waw.dm
index 0006b7a80031..b2e53763144d 100644
--- a/ModularTegustation/ego_weapons/melee/waw.dm
+++ b/ModularTegustation/ego_weapons/melee/waw.dm
@@ -2319,3 +2319,64 @@
qdel(src)
return TRUE
+/obj/item/ego_weapon/contempt
+ name = "contempt, awe"
+ desc = "From the excavated brain, geysers of hatred and contempt erupt. It's as if those feelings were inside you all along."
+ icon_state = "contempt"
+ force = 50
+ reach = 2
+ stuntime = 5
+ throwforce = 80
+ throw_speed = 5
+ throw_range = 7
+ damtype = BLACK_DAMAGE
+ attack_verb_continuous = list("pokes", "jabs", "tears", "lacerates", "gores")
+ attack_verb_simple = list("poke", "jab", "tear", "lacerate", "gore")
+ hitsound = 'sound/abnormalities/spiral_contempt/spiral_hit.ogg'
+ attribute_requirements = list(
+ FORTITUDE_ATTRIBUTE = 80
+ )
+ var/list/targets = list()
+ var/ranged_damage = 70
+ var/mode = FALSE
+ var/toggle_cooldown
+ var/toggle_cooldown_time = 1 SECONDS
+
+/obj/item/ego_weapon/contempt/attack(mob/living/M, mob/living/user)
+ if(!CanUseEgo(user))
+ return
+
+ if(!mode)
+ if(!(M in targets))
+ targets+= M
+ if(mode)
+ if(M in targets)
+ playsound(M, 'sound/abnormalities/spiral_contempt/spiral_bleed.ogg', 100, FALSE, 4)
+ M.apply_damage(ranged_damage, BLACK_DAMAGE, null, M.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ new /obj/effect/temp_visual/contempt_blood(get_turf(M))
+ targets -= M
+ ..()
+ hitsound = initial(hitsound)
+
+/obj/item/ego_weapon/contempt/attack_self(mob/user)
+ if(!CanUseEgo(user))
+ return
+ if(toggle_cooldown > world.time)//spam prevention
+ return
+ toggle_cooldown = world.time + toggle_cooldown_time
+ if(mode)
+ mode = FALSE
+ to_chat(user,span_warning("Your [src] now drips with blood."))
+ targets = list()
+ playsound(src, 'sound/abnormalities/spiral_contempt/spiral_grow.ogg', 20, FALSE)
+ return
+
+ if(!mode)
+ mode = TRUE
+ to_chat(user,span_warning("Your [src] now menances with spikes of gold."))
+ playsound(src, 'sound/abnormalities/spiral_contempt/spiral_whine.ogg', 20, FALSE)
+ return
+
+
+/obj/item/ego_weapon/contempt/get_clamped_volume()
+ return 25
diff --git a/ModularTegustation/ego_weapons/ranged/ego_bullets/waw.dm b/ModularTegustation/ego_weapons/ranged/ego_bullets/waw.dm
index a2071b26d982..93fc88111bf6 100644
--- a/ModularTegustation/ego_weapons/ranged/ego_bullets/waw.dm
+++ b/ModularTegustation/ego_weapons/ranged/ego_bullets/waw.dm
@@ -28,12 +28,12 @@
return BULLET_ACT_BLOCK
switch(damage_type)
if(WHITE_DAMAGE)
- H.adjustSanityLoss(-damage*0.2)
+ H.adjustSanityLoss(-10)
if(BLACK_DAMAGE)
- H.adjustBruteLoss(-damage*0.1)
- H.adjustSanityLoss(-damage*0.1)
+ H.adjustBruteLoss(-5)
+ H.adjustSanityLoss(-5)
else // Red or pale
- H.adjustBruteLoss(-damage*0.2)
+ H.adjustBruteLoss(-10)
H.visible_message("[src] vanishes on contact with [H]!")
qdel(src)
return BULLET_ACT_BLOCK
diff --git a/ModularTegustation/fishing/code/fish_market.dm b/ModularTegustation/fishing/code/fish_market.dm
index c5d7231cd188..705e513386fa 100644
--- a/ModularTegustation/fishing/code/fish_market.dm
+++ b/ModularTegustation/fishing/code/fish_market.dm
@@ -103,14 +103,15 @@
var/obj/item/storage/bag/fish/bag = I
var/fish_value = 0
for(var/item in bag.contents)
+ if(istype(item, /obj/item/stack/fish_points))
+ continue
+
if(istype(item, /obj/item/fishing_component/hook/bone))
fish_value += 5
if(istype(item, /obj/item/food/fish))
fish_value += ValueFish(item)
- else
- continue
qdel(item)
AdjustPoints(fish_value)
diff --git a/ModularTegustation/fishing/code/fishing_items/fishing_net.dm b/ModularTegustation/fishing/code/fishing_items/fishing_net.dm
index 5c62ed2381ac..efb12f721c23 100644
--- a/ModularTegustation/fishing/code/fishing_items/fishing_net.dm
+++ b/ModularTegustation/fishing/code/fishing_items/fishing_net.dm
@@ -186,3 +186,23 @@
fishin_power = 1
enemy_chance = 95
capacity = 1
+
+//Clan Nets
+/obj/item/fishing_net/resurgence
+ name = "resurgence clan fishing net"
+ desc = "Resurgence Clan nets are slightly better then the normal fishing net, and have a slightly higher chance at catching foes"
+ icon = 'ModularTegustation/fishing/icons/fishing.dmi'
+ icon_state = "clan_net"
+ w_class = WEIGHT_CLASS_HUGE
+ deploy_type = /obj/structure/destructible/fishing_net/resurgence
+
+/obj/structure/destructible/fishing_net/resurgence
+ name = "resurgence clan fishing net"
+ desc = "A wall of twine and wires that traps fish. Alt click to harvest."
+ icon_state = "trawling_net_clan"
+ icon_state_fished = "trawling_net_clan_full"
+ debris = list(/obj/item/fishing_net/resurgence = 1)
+ net_type = /obj/item/fishing_net/resurgence
+ fishin_cooldown = 30 SECONDS
+ fishin_power = 1
+ enemy_chance = 25
diff --git a/ModularTegustation/fishing/code/rod_components/fishing_lines.dm b/ModularTegustation/fishing/code/rod_components/fishing_lines.dm
index f3b301e4236a..5aec028e5f51 100644
--- a/ModularTegustation/fishing/code/rod_components/fishing_lines.dm
+++ b/ModularTegustation/fishing/code/rod_components/fishing_lines.dm
@@ -39,3 +39,10 @@
icon_state = "green"
fishing_value = 0.4
line_color = "#2b9c2b"
+
+/obj/item/fishing_component/line/clan
+ name = "resurgence clan fishing line reel"
+ desc = "Essential for fishing in the outskirts."
+ icon_state = "clan"
+ fishing_value = 0.6
+ line_color = "#057A71"
diff --git a/ModularTegustation/fishing/icons/fishing.dmi b/ModularTegustation/fishing/icons/fishing.dmi
index 98ee1afa0326..eb66107f9a2b 100644
Binary files a/ModularTegustation/fishing/icons/fishing.dmi and b/ModularTegustation/fishing/icons/fishing.dmi differ
diff --git a/ModularTegustation/fishing/icons/fishing_lines.dmi b/ModularTegustation/fishing/icons/fishing_lines.dmi
index eb5f7260fbf0..0a8760e7eee0 100644
Binary files a/ModularTegustation/fishing/icons/fishing_lines.dmi and b/ModularTegustation/fishing/icons/fishing_lines.dmi differ
diff --git a/ModularTegustation/lc13_machinery.dm b/ModularTegustation/lc13_machinery.dm
index 02610c39ddf9..40e294ec0706 100644
--- a/ModularTegustation/lc13_machinery.dm
+++ b/ModularTegustation/lc13_machinery.dm
@@ -353,9 +353,9 @@
if(length(B.initial_traits) == 0)
B.initial_traits = H.status_traits
-/*---------------\
+/*---------------------\
|Body Preservation Unit|
-\---------------*/
+\---------------------*/
/obj/machinery/body_preservation_unit
name = "body preservation unit"
@@ -376,6 +376,14 @@
resistance_flags = INDESTRUCTIBLE
max_integrity = 1000000
+/obj/machinery/body_preservation_unit/Initialize()
+ . = ..()
+ if(SSmaptype.maptype == "office")
+ public_use = TRUE
+ clone_delay_seconds = 60
+ revival_attribute_penalty = -4
+ cost_multiplier = 2
+
/obj/machinery/body_preservation_unit/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/holochip))
var/obj/item/holochip/H = I
@@ -461,7 +469,7 @@
//var/mob/living/carbon/human/H = locate(stored_bodies[mob_name]["ref"])
//if(H && ishuman(H))
// if(try_payment(revival_fee, H))
- revive_body(mob_name)
+ revive_body(mob_name, usr.ckey)
updateUsrDialog()
@@ -483,6 +491,16 @@
atr.level = old_atr.level
preserved_data["attributes"] = attributes
+/obj/machinery/body_preservation_unit/proc/store_actions(mob/living/carbon/human/H, list/preserved_data)
+ var/list/action_types = list()
+ for(var/datum/action/A in H.actions)
+ if(ispath(A, /datum/action/item_action))
+ continue
+ if(ispath(A, /datum/action/spell_action))
+ continue
+ action_types += A.type
+ preserved_data["action_types"] = action_types
+
/obj/machinery/body_preservation_unit/proc/preserve_body(mob/living/carbon/human/H)
if(!H || !H.mind)
@@ -493,16 +511,17 @@
preserved_data["ckey"] = M.key
preserved_data["real_name"] = H.real_name
preserved_data["species"] = H.dna.species.type
+ preserved_data["gender"] = H.gender
var/datum/dna/D = new /datum/dna
H.dna.copy_dna(D)
preserved_data["dna"] = D
preserved_data["assigned_role"] = H.mind.assigned_role
-
- store_attributes(H, preserved_data)
-
preserved_data["underwear"] = H.underwear
preserved_data["underwear_color"] = H.underwear_color
+ store_attributes(H, preserved_data)
+ store_actions(H, preserved_data)
+
stored_bodies[H.real_name] = preserved_data
@@ -535,6 +554,7 @@
// Set up the new body with stored data
new_body.real_name = stored_data["real_name"]
+ new_body.gender = stored_data["gender"]
// Check if the stored DNA is valid
if(istype(stored_data["dna"], /datum/dna))
@@ -581,10 +601,22 @@
new_body.revive(full_heal = TRUE, admin_revive = FALSE)
new_body.updateappearance()
- if (isnull(usr))
- new_body.ckey = ckey
- else
- new_body.ckey = usr.ckey
+ // if (isnull(usr))
+ // new_body.ckey = ckey
+ // else
+ new_body.ckey = ckey
+
+ var/list/stored_action_types = stored_data["action_types"]
+ if (islist(stored_action_types))
+ for (var/T in stored_action_types)
+ var/datum/action/G = new T()
+ G.Grant(new_body)
+
+
+ if (!new_body.ckey)
+ log_game("Body Preservation Unit: Created a new body for [real_name] without a ckey.")
+ qdel(new_body)
+ return
var/assigned_role = stored_data["assigned_role"]
if (assigned_role)
@@ -622,12 +654,13 @@
// Define this as a global proc
/proc/offer_respawn_global(real_name, obj/machinery/body_preservation_unit/BPU)
var/mob/dead/observer/ghost = find_dead_player(real_name)
+ to_chat(ghost, "BPU is now ready to rebuild your body, click on the BPU as a ghost to re-build yourself or accept this offer.")
if(!ghost || !ghost.client)
return
if (!istype(BPU) || !BPU.loc)
return
- var/response = alert(ghost, "Do you want to respawn?", "Respawn Offer", "Yes", "No")
+ var/response = alert(ghost, "Do you want to be cloned at the BPU?", "Respawn Offer", "Yes", "No")
if(response == "Yes")
// var/obj/machinery/body_preservation_unit/BPU = locate() in GLOB.machines
if(BPU.stored_bodies[real_name])
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/aleph/army_in_black.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/aleph/army_in_black.dm
new file mode 100644
index 000000000000..58ece028c601
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/aleph/army_in_black.dm
@@ -0,0 +1,46 @@
+/**Army ends up being a combination between an abnormality focused on trying to share the burden of being human,
+ *and the corruption of trying to do good turning into doing evil.
+ *Both ideas are present in how it operates, and I want to make the options try and capture that.
+ *-ML
+ */
+/datum/adventure_event/army_in_black
+ name = "Army in Black"
+ description = "YOU SEE A BUNCH OF SOLDIERS IN GELATINOUS HEARTS"
+ required_abno = /mob/living/simple_animal/abnormality/aleph/army_in_black
+ adventure_cords = (
+ "Inside the facility rows and rows of gelatinous hearts sit, \
+ Each of them containing a person in bright pink military gear. \
+ You approach one, it’s impossible to see any expression on their face. \
+ One of them turns towards you and gives a quick salute before asking: \
+ \"What color are human’s hearts?\"",
+
+ "\"Of course, that is the color in every human’s heart.\" They say warmly. \
+ You don’t see them move, but you feel them with you as you leave. \
+ Protecting you from what comes next.",
+
+ "\"Can’t the human heart exist without Darkness?\" \
+ You once again refute what it’s saying. \
+ The gelatinous substance it’s in starts to darken, \
+ Along with the thing’s armor. \
+ \"We’re able to protect humanity from it.\" \
+ \"So why won’t you let us bear the burden for you?\" \
+ It begins to spark, strands of black lighting leaping out at you. \
+ You turn to run as the bubbles begin to spark as they turn black. \
+ \"Why won’t you let us take your darkness?\"",
+
+ "\"Why can’t the human heart be more than just an organ?\" \
+ With that they go silent, allowing you to leave.",
+ )
+/datum/adventure_event/army_in_black/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "PINK", M)
+ BUTTON_FORMAT(3, "BLACK", M)
+ BUTTON_FORMAT(4, "FLESH", M)
+ return
+ if(2)
+ AdjustHealth(+35)
+ if(3)
+ AdjustHealth(-50)
+ if(4)
+ return..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/he/singing_machine.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/he/singing_machine.dm
new file mode 100644
index 000000000000..fe3f07bdaa77
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/he/singing_machine.dm
@@ -0,0 +1,59 @@
+/datum/adventure_event/singing_machine
+ name = "Singing_Machine"
+ desc = "YOU SEE A BOXY MACHINE"
+ require_abno = /mob/living/simple_animal/hostile/abnormality/singing_machine
+ adventure_cords = list(
+ "A sharp smell of iron and violence fills the room as you enter. \
+ Inside, is a large boxy machine with a person slumped against it. \
+ Each of their limbs has been ripped to shreds, with small fleshy gibs hanging from the machine. \
+ \"You there!\" Turning towards you. \
+ \"Throw yourself into the Machine! I need to hear it one more time!\"",
+
+ "Putting yourself into the machine seems a bit extreme. \
+ However, if the sound it makes is that good you might have to listen. \
+ Against your better judgement you open the machine slipping a finger inside trying to keep it above the gnashing teeth. \
+ Slowly you inch closer, until it grabs you, yanking you towards the machine. \
+ Before you can stop yourself your arm is dragged into the depths, a new tune bursting forth amidst your screams. \
+ It is the most beautiful thing you’ve heard.",
+
+ "Ability Challenge",
+
+ "In a single fluid motion you pick up the person and toss them into the machine. \
+ Their cry isn’t one of fear, but exaltation thanking you for feeding them into the machine. \
+ As their body falls into the mesh of teeth and gears music begins to play. \
+ It’s a sound so lovely you understand the mperson's cheers.",
+
+ "Reaching down you try to pick the person up, but they smack you away cutting your arm with a shard of bone. \
+ \"Stay away! If you aren’t going to give me music, then leave!\ \
+ Sighing, you try again to pick them up, this time succeeding. \
+ However when you try to throw them they thrash around, falling out of your grasp. \
+ And knocking your arm into the machine. \
+ You scream as the machine tears into your arm. \
+ But the music it makes transcends beauty.",
+
+ "Deciding you want nothing to do with any of this you turn to leave. \
+ \"Wait! Where are you going?\" The person cries reaching out with it’s jagged stump. \"Don’t you want to listen to ecstasy?\" \
+ You simply leave them there to rot.",
+ )
+
+/datum/adventure_event/singing_machine/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "PUT YOUR FINGER IN THE MACHINE", M)
+ BUTTON_FORMAT(3, "THROW THE PERSON IN THE MACHINE", M)
+ BUTTON_FORMAT(4, "JUST LEAVE", M)
+ return
+ if(2)
+ AdjustHitPoint(-30)
+ AdjustStatNum(LUST_STAT, ADV_EVENT_STAT_EASY)
+ if(3)
+ CHANCE_BUTTON_FORMAT(ReturnStat(WRATH_STAT), "WRATH", M)
+ CHANCE_BUTTON_FORMAT(ReturnStat(LUST_STAT), "LUST", M)
+ . += CoinFlipping(M)
+ return
+ if(4)
+ AdjustStatNum(LUST_STAT, ADV_EVENT_STAT_EASY)
+ if(5)
+ AdjustStatNum(LUST_STAT, ADV_EVENT_STAT_EASY)
+ AdjustHitPoint(-30)
+ return..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/teth/ppodae.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/teth/ppodae.dm
new file mode 100644
index 000000000000..0edba7829a4f
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/teth/ppodae.dm
@@ -0,0 +1,61 @@
+/**
+ *Ppodae is the cutist.
+ *-ML
+ */
+/datum/adventure_event/ppodae
+ name = "Ppodae"
+ desc = "YOU SEE THE CUTEST THING EVER"
+ require_abno = /mob/living/simple_animal/hostile/abnormality/ppodae
+ adventure_cords = list(
+ "Entering the room, you notice it's near identical to a Lobotomy Corporation Contaiment Unit. \
+ Specifically one for a large sized Abnormality \
+ The only thing in it is a small fluffy boy with a petite mouth and large adorable eyes. \
+ It hops over to you, tail eagerly wagging as it looks up at you with pleading eyes. \
+ It is so adorable, so cute! Nothing could ever compare! \
+ There has to be SOMETHING you can do for him!",
+
+ "Clearly no one has fed him recently! His bowl is nearly half empty! \
+ This can not go uncorrected! Thus, you being your quest to correc this neglect! \
+ The hallway outside the containment unit is devoid of anything. \
+ Returning to the chambers you strangely find the food in a closet inside the containment unit. \
+ Clearly someone had the good idea to alter the unit to make it more hospitable! \
+ There’s a few bones from a sekeleton for the good boy to chew on as well, you take some with as a treat. \
+ He looks so cute chowing down! It warms your soul to see him so happy.",
+
+ "How could something this photogenic possibly exist? \
+ Taking out your phone you snap picture after picture, catching the good boy from every angle. \
+ Every single one of these pictures is too good to keep to yourself. \
+ As quickly as you take them you share them with others, deluging the net with Ppodae. \
+ Comments roll in, all of them in love with this most wonderous cutie.",
+
+ "This little cutie can’t be left like this! \
+ He’s so lonely and needs attention. \
+ Thankfully you’re able to find a bone in a closet that shouldn’t be there for him to fetch! \
+ You toss it a couple of times, each time he takes it back showing off just how powerful his adorable body is! \
+ Wait, why’s he growing larger?",
+
+ "Surely the managers didn’t make a mistake and put an actual dog in containment. \
+ After searching around you find the management notes in the workstation. \
+ Sure enough this is an abnormality, with a very long list of deaths it caused. \
+ Maybe playing with it isn’t the best idea...",
+ )
+
+/datum/adventure_event/ppodae/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "FEED THE GOODEST BOY!", M)
+ BUTTON_FORMAT(3, "TAKE PICTURES! SO MANY PICTURES!", M)
+ BUTTON_FORMAT(4, "PLAY WITH HIM!", M)
+ BUTTON_FORMAT(5, "ISN'T THIS STILL AN ABNORMALITY?", M)
+ return
+ if(2)
+ AdjustHitPoint(5)
+ if(3)
+ AdjustCurrency(ADV_EVENT_COIN_EASY)
+ if(4)
+ CauseBattle(
+ "Ppodae: A mountiain of muscle with the facade of a puppy.",
+ MON_DAMAGE_EASY,
+ 30
+ )
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/teth/void_dream.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/teth/void_dream.dm
new file mode 100644
index 000000000000..b028b09833a7
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/teth/void_dream.dm
@@ -0,0 +1,61 @@
+/**
+ *Void Dream is fairly straight forward.
+ *It’s about dreams and the desire to give up on the waking world
+ *and instead live in a place where things are more pleasant
+ *either generally or for things more specifically. -ML
+ */
+/datum/adventure_event/void_dream
+ name = "Void Dream"
+ desc = "YOU SEE A WOOLY CREATURE SLEEPING IN THE VOID."
+ require_abno = /mob/living/simple_animal/hostile/abnormality/voiddream
+ adventure_cords = list("The cold darkness of the void embraces you and the creature before you. \
+ Its wool is white, illuminated by the light of countless stars. \
+ From the mass of wool two eyes peak at you, it's head tucked away elsewhere. \
+ Brushing your hand against it you feel at ease, like it’s inviting you to join it's slumber. \
+ You feel drowsy, and some other feeling. \
+ Like a part of your heart is fading into the past. \
+ Maybe, you could take a moment to rest your eyes?",
+
+ "Ability Challenge",
+
+ "The floating ball of fluff and wool is warm and oh so comfortable. \
+ It doesn't take long to drift off to sleep,and when you do you dream. \
+ You’re taken back to a time you’d almost forgotten. \
+ There’s someone else there, together you walk, you talk, and you laugh. \
+ It feels so deeply nostalgic, but you can’t remember why. \
+ \"Hey !@)(!@&)&*%(%@!@#*(#\" \
+ You stop. That isn’t right, they had a name. \
+ You wake with start, sleep blurring your thoughts as they mix together. \
+ Wondering why you're here you look around, and seeing nothing but a ball of void, leave. \
+ It feels like you left something important behind",
+
+ "You lay down to rest, nestling up into its warm, inviting, wool. \
+ You toss and turn, trying to get some rest, trying to escape into a dream. \
+ Then everything begins to fade away, and you wake up with a start. \
+ Turning around you see its eyes watching you and a thin tongue reaching out from a beak to lick you. \
+ It slowly tastes you and you feel your memories of the dream slowly fade. \
+ No, you can’t let it take them. Those are your memories, and you have to keep it that way. \
+ Turning you flee, and it drifts back to sleep.",
+
+ "No, now isn’t the time for rest. \
+ Sleep is inviting, but this is still an abnormality and you shouldn’t trust it. \
+ Turning away you leave it to sleep.",
+ )
+
+
+/datum/adventure_event/void_dream/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "FALL ASLEEP", M)
+ BUTTON_FORMAT(5, "STAY AWAKE", M)
+ return
+ if(2)
+ CHANCE_BUTTON_FORMAT(ReturnStat(GLOOM_STAT), "Gloom", M)
+ CHANCE_BUTTON_FORMAT(ReturnStat(SLOTH_STAT), "Sloth", M)
+ . += CoinFlipping(M)
+ return
+ if(3)
+ AdjustStatNum(GLOOM_STAT, ADV_EVENT_STAT_EASY)
+ if(4)
+ AdjustCurrency(ADV_EVENT_COIN_EASY)
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/big_wolf.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/big_wolf.dm
new file mode 100644
index 000000000000..e81e549ddd5f
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/big_wolf.dm
@@ -0,0 +1,71 @@
+/**The wolf is something that becomes the villain because it was always expected to be one.
+ *While it still acts as on it’s instincts,
+ *What ultimately makes it a monster is other’s expectations.
+ *-ML
+ */
+/datum/adventure_event/big_wolf
+ name = "Big and Will Be Bad Wolf"
+ description = "YOUS SEE A WOLF IN THE MOONLIGHT"
+ require_abno = /mob/living/simple_animal/hostile/abnormality/big_wolf
+ adventure_cords = list(
+ "A pale silver moon illuminates the field. \
+ The only sounds are the wind whistling through the grass, \
+ and the whimpering of the beast in front of you. \
+ It isn’t quite a wolf, it’s too round and plump, closer to a toy then an an animal. \
+ But its stomach is too full, occasionally wiggling like something is fighting to escape. \
+ As if it’s asking you for something it looks at you with large soulful eyes. \
+ Something you could provide. \
+ It may appear innocent now, \
+ but you might end up helping a monster.",
+
+ "This monster is clearly asking for what it deserves. \
+ It knows the sins it has and will commit. \
+ And those must be punished at all costs.",
+
+ "It accepts its fate, it will become the monster. \
+ And you the hunter. \
+ The Wolf’s body dissapears into the shadows, \
+ Elongating and sharpening as it stalks around you waiting for an opening. \
+ Then it pounces. \
+ But you are swift and brutal. \
+ In a moment the threat is gone, and its victim freed.",
+
+ "You have to kill it before it becomes a monster. \
+ It’s a simple matter of preventing it from ever reaching that point. \
+ So you approach it, picking up your weapon ready to drive it into the beast. \
+ It doesn’t give you the chance. \
+ It’s body seems to melt into darkness as it lunges onto you, \
+ Pinning you under its weight as its teeth rip and tear into you. \
+ Then as fast as it attacked, it’s gone. \
+ Disappearing into the dark grass.",
+
+ "You can see the sins that it will commit. \
+ Along with the ones it’s already committed. \
+ But that doesn’t matter, you forgive it. \
+ You offer some food as an offering of peace, and it takes it. \
+ Laying down, it eats, treasuring each and every bite. \
+ Eventually it starts to hack, releasing a person from it’s stomach. \
+ Damaged, but still in good enough shape to run away screaming. \
+ Surely they can see the wolf doesn't have to be bad. \
+ Right?",
+ )
+
+/datum/adventure_event/big_wolf/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "PUNISH IT", M)
+ BUTTON_FORMAT(3, "FORGIVE IT", M)
+ return
+ if(2)
+ CHANCE_BUTTON_FORMAT(ReturnStat(WRATH_STAT), "WRATH", M)
+ CHANCE_BUTTON_FORMAT(ReturnStat(ENVY_STAT), "ENVY", M)
+ .+= CoinFlipping(M)
+ return
+ if(3)
+ AdjustStatNum(WRATH_STAT, ADV_EVENT_STAT_EASY)
+ if(4)
+ AdjustHealth(-40)
+ if(5)
+ AdjustStatNum(WRATH_STAT, -2)
+ AdjustStatNum(PRIDE_STAT, 4)
+ return..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/general_bee.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/general_bee.dm
new file mode 100644
index 000000000000..cf477f996653
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/general_bee.dm
@@ -0,0 +1,50 @@
+/datum/adventure_event/general_bee
+ name = "Arms Inspection"
+ desc = "THE SOUND OF TRUMPETS"
+ require_abno = /mob/living/simple_animal/hostile/abnormality/general_b
+ adventure_cords = list(
+ "Passing underneath a gate on the road, you are accosted by \
+ a woman wearing a bright yellow and black jacket. \
+ 'HALT. Lay down your arms!' \
+ She demands you hand over your weapons. \
+ 'You are entering the domain of the queen!",
+
+ "You lay your weapons down. \
+ The guard picks them up for inspection before handing them back. \
+ 'Nothing seems to be out of order.' \
+ She gives you a puzzled look. \
+ 'But I've never seen anything like these before.' \
+ The guard hands you your weapons back, and waves you on.",
+
+ "You don't think that's quite a good idea. \
+ Shaking your head, you turn and leave. \
+ You hope you never pass this way again.",
+
+ "You grip your weapon tightly. You will not be stopped. \
+ The guard sighs and draws her weapon. \
+ You both know how this is going to end, \
+ and you decide that bloodshed is better than inconvenience.",
+
+ )
+
+/datum/adventure_event/general_bee/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "LAY DOWN YOUR WEAPONS", M)
+ BUTTON_FORMAT(3, "REFUSE AND TURN AWAY", M)
+ BUTTON_FORMAT(4, "ASSAULT THE GUARD", M)
+ return
+ if(2)
+ AdjustStatNum(PRIDE_STAT, -1)
+ AdjustStatNum(WRATH_STAT, ADV_EVENT_STAT_EASY *2)
+ //No option for 3, because you just leave.
+ if(4)
+ AdjustStatNum(PRIDE_STAT, ADV_EVENT_STAT_NORMAL)
+ CauseBattle(
+ "Yellow-Clad Guard: A somewhat tall guard carrying a large spear. She's clad in yellow and black.",
+ MON_DAMAGE_NORMAL,
+ MON_HP_RAND_NORMAL,
+ )
+ gamer.travel_mode = ADVENTURE_MODE_BATTLE
+
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/red_riding_hood_mercenary.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/red_riding_hood_mercenary.dm
new file mode 100644
index 000000000000..759c4c85068a
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/waw/red_riding_hood_mercenary.dm
@@ -0,0 +1,47 @@
+/**Red is the counterpart to Wolf (obviously), about the cycle of violence.
+ *While the wolf is about how something can be turned into a monster by treating it as it will,
+ *Red is the obsession that ensures that someone will be turned into that monster.
+ *This characterization is a bit different then that in LC13 currently, so let me know if I should rewrite it.
+ *-ML
+ */
+/datum/adventure_event/red_riding_hood_mercenary
+ name = "Little Red Riding Hooded Mercenary"
+ description = "YOU SEE A PERSON IN RED RAGS"
+ required_abno = /mob/living/simple_animal/abnormality/waw/red_riding_hood_mercenary
+ adventure_cords = list(
+ "You enter a home filled with pictures of the same beast \
+ plastered across the walls, each one ripped or torn or shot or covered. \
+ The only other things in the room are a set of weapons, \
+ and a person dressed in crimson rags. \
+ She looks at you, her face shadowed by her hood. \
+ \"Can you show me where that Bastard is?\"",
+
+ "\"Where!\" The girl exclaims. \
+ As they hurry you along you explain where to go. \
+ They don’t bother to thank you, grabbing their weapons and charging off. \
+ There is no way anything deserves the horrors she will commit.",
+
+ "The girl sighs, taking out her gun. \
+ She points it at you, and fires. \
+ \"No one is killing that mutt but me!\" \
+ Pain shoots through your leg as she approaches. \
+ \"Now tell me where the fuck that bastard is.\" \
+ Silently you point somewhere and they charge off. \
+ Taking the opportunity you escape before they come back.",
+
+ "\"Then why are you here?\"",
+ )
+
+/datum/adventure_event/red_riding_hood_mercenary/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "I CAN SHOW YOU", M)
+ BUTTON_FORMAT(3, "I CAN BRING YOU THE WOLF", M)
+ BUTTON_FORMAT(4, "I CAN'T", M)
+ return
+ if(2)
+ AdjustStatNum(PRIDE_STAT, ADV_EVENT_STAT_EASY)
+ if(3)
+ AdjustHealth(-40)
+ if(4)
+ return..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/fairy_festival.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/fairy_festival.dm
new file mode 100644
index 000000000000..eeef68f1d7ce
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/fairy_festival.dm
@@ -0,0 +1,64 @@
+/**
+ *Both Ruina and Lobotomy Corporation have the fairies as something that’s predatory, but they show it in two different ways.
+ *In their first appearance, they attempt to eat people if they think that it endangers their food supply, and in their second they are all under the rule of a Fairy queen who eats them to sate her hunger.
+ *I wanted to include both these aspects, while also keeping some of the innocence they use to attract agents as prey.
+ */
+/datum/adventure_event/festival
+ name = "Fairy Festival"
+ desc = "YOU SEE FAIRY LIGHTS HOVERING IN THE GROVE"
+ require_abno = /mob/living/simple_animal/hostile/abnormality/fairy_festival
+ adventure_cords = list(
+ "You enter a forest grove, ripe with dew and the scents of spring. \
+ Small lights flit between the trees, hiding amongst the greenery as they observe you. \
+ Slowy they come closer their tiny round forms coming into focus. Beating their small wings, they rush around you investigating this new intruder. \
+ Eventually one brave little one approaches you, hugging you it’s plump face grins up at you. \
+ After the first, the others follow hovering around you as they poke and prod, seemingly curious about what you are. \
+ Amid the commotion, one larger than the rest grabs onto you trying to tug you deeper into the grove.",
+
+ "Following the fairy it brings you deeper and deeper into the forest, as the trees close in around you feel something's eyes.",
+
+ "Ability Challenge",
+
+ "Something shifts in the darkness, looking around you see it rise out of the undergrowth. \
+ It's gaunt, it's limbs practically skeletal, but still unmistakably a massive fairy. \
+ Its eyes fixate on the thing the fairy brought to it and you can feel its hungering gaze bore into you. \
+ Drool slowly drips from its mouth as it stares down at it's next meal. \
+ Thinking quickly, you grab the fairy that led you here and a few others presenting them to the beast. \
+ It takes them, turning its kin into a pulp in the flash of an eye before swallowing just as quickly. \
+ Unsatisfied, its eyes turn back to you, and you present another fairy, then another and another. \
+ As it feast you take the chance to sneak away, leaving the grove behind you.",
+
+ "A sound of snapping branches and crunching leaves fills the forest as something rises out of the woods behind you. \
+ It looks like the fairies, but near skeletal and far far larger towering over not just them but you. \
+ The fairy tugs you forward, and you follow it just one more step. \
+ The giant grabs at you, mouth watering at the thought of the delectable meal you'll make. \
+ Pain erupts in your limbs as it's teeth rip into you, panicing you tear away running away from the grove.",
+
+ "After a few minutes it stops, letting go of you and disappearing into the woods. \
+ The others don’t care, instead continuing to surround you as they find more and more of interest. \
+ Eventually either wandering away, or hunkering down around you. \
+ With nothing left to find you turn and leave the grove, feeling strangely refreshed though it feels like something’s watching you.",
+
+ "With a smack the fairy turns into a green stain on your hand. The others freeze. \
+ Suddenly their gentle airs are gone, their lips peel back showing sharpened teeth. \
+ Then they swarm you. Swatting them away, you fight your way out of the grove as they gnaw at you. \
+ Eventually they let up, leaving gashes in your body that nothing that small should be able to.",
+ )
+
+/datum/adventure_event/festival/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "FOLLOW IT", M)
+ BUTTON_FORMAT(3, "RESIST IT", M)
+ BUTTON_FORMAT(4, "SQUISH IT", M)
+ return
+ if(2)
+ CHANCE_BUTTON_FORMAT(ReturnStat(PRIDE_STAT), "PRIDE", M)
+ CHANCE_BUTTON_FORMAT(ReturnStat(GLUTT_STAT), "GLUTTONY", M)
+ . += CoinFlipping(M)
+ return
+ if(3)
+ AdjustHitPoint(10)
+ if(4)
+ AdjustHitPoint(-5)
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/oceanic.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/oceanic.dm
new file mode 100644
index 000000000000..473809ce4121
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/oceanic.dm
@@ -0,0 +1,100 @@
+/datum/adventure_event/oceanic_waves
+ name = "An old orange vending machine"
+ desc = "YOU SEE A FAINT LIGHT" //All of the vending machine ones will use this.
+ require_abno = /mob/living/simple_animal/hostile/abnormality/oceanicwaves
+ adventure_cords = list(
+ "In front of you is a bright orange vending machine. \
+ There's dozens of buttons, and it's prompting you to pick one. \
+ You pass over the 'STALE BLOOD' and 'BABY FORMULA' flavors, \
+ and about 6 catch your eye.",
+
+ "You press the button labelled INFINITE WEALTH. \
+ A wide-brimmed mason jar is dispensed with an orange liquid inside. \
+ It tastes strongly of orange. \
+ ... \
+ Something falls onto your teeth from inside the can, and it hurts a little. \
+ reaching in, you pull out a few coins.",
+
+
+ "You press the button labelled DOUBLE COCAINE. \
+ An unlabeled silver can is dispensed. \
+ It tastes like a mixture of bitterness and pennies. \
+ ... \
+ You feel awful.",
+
+
+ "You press the button labelled WELLCHEERS CHAOS MAX. \
+ A can with cobalt blue labeling is dispensed. \
+ It is rather tasty. It's quite sweet and has a light blueberry taste. \
+ ... \
+ You feel pretty good.",
+
+ "You press the button labelled DOCTOR PEPPER. \
+ A red can is dispensed with the brand name in silver wording on it. \
+ Taking a sip, it tastes somewhat similar to cola. \
+ You have a hard time describing the taste, but you do really enjoy it. \
+ Despite never hearing of this soda before, you decide to keep an eye out for it again.",
+
+ "You press the button labelled SKIN. \
+ A beige can is dispensed. \
+ Picking up the can, it's textured similar to skin, but you manage to open it. \
+ ... \
+ You recognize this metallic taste, and decide to not continue drinking.",
+
+ "You press the button labelled SWEAT OF FREEDOM. \
+ A dark grey can with yellow accents is dispensed. \
+ Cracking it open, you take a cautious swig. \
+ It tastes like sweat. You don't know what you were expecting. \
+ ... \
+ You were so thirsty, you managed to choke it all back. \
+ Despite that, you feel pretty good.",
+
+ "You press the button labelled SUPER DEATH. \
+ A black can with a white skull is dispensed. There is no other labelling. \
+ You take a drink. \
+ It tastes like sparkling water. \
+ ... \
+ You feel your mind drift into darkness.",
+
+ )
+
+//This machine doesn't favor any one stat, it's random which ones show up.
+/datum/adventure_event/oceanic_waves/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "INFINITE WEALTH", M)
+ BUTTON_FORMAT(3, "DOUBLE COCAINE", M)
+ BUTTON_FORMAT(4, "WELLCHEERS CHAOS MAX ", M)
+ BUTTON_FORMAT(5, "DOCTOR PEPPER", M)
+ BUTTON_FORMAT(6, "SKIN", M)
+ BUTTON_FORMAT(7, "SWEAT OF FREEDOM", M)
+ BUTTON_FORMAT(8, "SUPER DEATH", M)
+ return
+ if(2)
+ AdjustCurrency(3)
+ AdjustHitPoint(-1) //funny
+ if(3)
+ AdjustStatNum(RAND_STAT,-3)
+ AdjustStatNum(RAND_STAT,3)
+ AdjustStatNum(RAND_STAT,-3)
+ AdjustStatNum(RAND_STAT,3)
+ if(4)
+ AdjustHitPoint(30) //Heals you a bit
+ if(5)
+ AdjustStatNum(RAND_STAT,1) //I like doctor pepper
+ if(6)
+ AdjustHitPoint(-10)
+ AdjustStatNum(RAND_STAT,2)
+ if(7)
+ AdjustHitPoint(100)
+ AdjustStatNum(RAND_STAT,-1)
+ if(7)
+ AdjustHitPoint(-100)
+ AdjustStatNum(WRATH_STAT,1)
+ AdjustStatNum(LUST_STAT,1)
+ AdjustStatNum(SLOTH_STAT,1)
+ AdjustStatNum(GLUTT_STAT,1)
+ AdjustStatNum(GLOOM_STAT,1)
+ AdjustStatNum(PRIDE_STAT,1)
+ AdjustStatNum(ENVY_STAT,1)
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/we_can_change_anything.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/we_can_change_anything.dm
new file mode 100644
index 000000000000..bc9e0d024900
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/abnormality/zayin/we_can_change_anything.dm
@@ -0,0 +1,37 @@
+/datum/adventure_event/wcca
+ name = "Pain Machine"
+ desc = "YOUR VOICE SCREAMING"
+ require_abno = /mob/living/simple_animal/hostile/abnormality/we_can_change_anything
+ adventure_cords = list(
+ "In front of you is a machine with space for one.",
+
+ "As you enter the machine, the door closes behind you. \
+ You hear a dinging noise as a spike plunges into your back, \
+ and something clinks to the ground outside of the machine.",
+
+ "The machine spits you out. \
+ You call back to the clinking outside of the machine, seeing \
+ a pile of coins lie outside for you to take."
+ )
+ var/machine_coins = 0
+
+/datum/adventure_event/wcca/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "ENTER THE MACHINE", M)
+ BUTTON_FORMAT(2, "ENTER THE MACHINE", M)
+ BUTTON_FORMAT(2, "ENTER THE MACHINE", M)
+ return
+ if(2)
+ BUTTON_FORMAT(2, "ENJOY THE MACHINE", M)
+ BUTTON_FORMAT(2, "ENJOY THE MACHINE", M)
+ BUTTON_FORMAT(3, "LEAVE THE MACHINE", M)
+ BUTTON_FORMAT(2, "ENJOY THE MACHINE", M)
+ BUTTON_FORMAT(2, "ENJOY THE MACHINE", M)
+ AdjustHitPoint(-10)
+ machine_coins++
+ return
+ if(3)
+ AdjustCurrency(machine_coins)
+
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/Man_Sand.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/Man_Sand.dm
new file mode 100644
index 000000000000..72c9c31f2301
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/Man_Sand.dm
@@ -0,0 +1,47 @@
+/**
+ * This event was just based on the way some rich people flaunt their wealth as a way of escaping the lonliness that comes from their position.
+ * -ML
+ */
+/datum/adventure_event/Man_Sand
+ name = "All the Sand in the World"
+ desc = "SAND IS EVERYWHERE"
+ adventure_cords = list(
+ "As you enter the room it opens up, its ceiling so high that it disappears into a single point. \
+ The only thing in it is a pile of glistening grains of sand, piled so high that it disappears into the ceiling. \
+ \"Welcome!\" a voice shouts. At first you see nothing, and then a figure begins to form itself from the sand. \
+ It slowly rises. \"Isn’t it wondrous? My collection?\" It grins, waving around at the empty room. \
+ \"Feel free to indulge yourself in its splendor!\" \
+ When you don’t immediately begin applauding it backs away, confused. \
+ In a flash it builds a few effigies of itself, each of them clapping until they collapse.",
+
+ "You decide to humor the thing, telling it how impresive all the sand is.",
+
+ "\"See?\" The figure says, turning towards the smaller versions of itself. \
+ \"Even this intruder recognizes how spectacular I am!\" \
+ They continue boasting to their constructed audience, ignoring you taking your leave.",
+
+ "\"Why do you mock me?\" The figure cries, thrashing around kicking up clouds of sand. \
+ Throwing fistfuls of sand that carry their own degrading hands with them they shout: \"Begone, begone!\" \
+ As you leave you notice the sand solidifying into nuggets of gold in your hand.",
+
+ "\"Wait,\" The figure cries rushing to try and grab you. \"Where are you going?\" \
+ As soon as its foot leaves the pile it’s body crumbles into sand. \
+ You simply leave. Behind you it continues to whine, demanding you come back.",
+ )
+
+/datum/adventure_event/Man_Sand/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "HUMOR IT", M)
+ BUTTON_FORMAT(5, "LEAVE", M)
+ return
+ if(2)
+ CHANCE_BUTTON_FORMAT(ReturnStat(GLUTT_STAT), "GLUTTONY", M)
+ CHANCE_BUTTON_FORMAT(ReturnStat(SLOTH_STAT), "SLOTH", M)
+ . += CoinFlipping(M)
+ return
+ if(3)
+ AdjustStatNum(SLOTH_STAT, ADV_EVENT_STAT_EASY)
+ if(4)
+ AdjustCurrency(ADV_EVENT_COIN_EASY)
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/fun_contract.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/fun_contract.dm
new file mode 100644
index 000000000000..efec948116f7
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/fun_contract.dm
@@ -0,0 +1,26 @@
+/**
+ *This on just started as a joke of an event that straight up killed you.
+ */
+/datum/adventure_event/fun_contract
+ name = "Sign away your life!"
+ desc = "YOU SEE A PAPER AND PEN"
+ adventure_cords = list(
+ "\"Hello.\" A light turns on, illuminating a desk with only a pen and paper on it. \
+ \"I'm here to offer you a deal.\" \
+ The paper reads, sign here to die. \
+ \"Please,\" The voice says as a line begins to appear on the paper. \"Sign here.\"",
+
+ "You sign the paper, and everything goes black.",
+
+ "What sort of idiot would sign?",
+ )
+
+/datum/adventure_event/fun_contract/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "SIGN", M)
+ BUTTON_FORMAT(3, "DON'T SIGN", M)
+ return
+ if(2)
+ AdjustHitPoint(-100)
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/vending machine.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/vending machine.dm
new file mode 100644
index 000000000000..295602ffcf88
--- /dev/null
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/general/vending machine.dm
@@ -0,0 +1,31 @@
+/datum/adventure_event/vending_machine
+ name = "Vending Machine"
+ desc = "YOU SEE A FAINT LIGHT"
+ adventure_cords = list(
+ "As you are walking down the alley, you see a faint light. \
+ After first checking to see if you are being followed, you \
+ investigate to find a vending machine in the darkness. \
+ It's simply asking you for a coin.",
+
+ "A coin is inserted into the machine, and a drink is dispensed. \
+ It tastes like the faint memory of cherry cola. \
+ ... \
+ You don't think it tastes very good, but it's likely not poison. \
+ Walking off into the night, you quickly forget what transpired.",
+
+ "You leave the vending machine be. Who knows what it could dispense? \
+ Forgetting where you were going, you continue back the way you came.",
+ )
+
+/datum/adventure_event/vending_machine/EventChoiceFormat(obj/machinery/M, mob/living/carbon/human/H)
+ switch(cords)
+ if(1)
+ BUTTON_FORMAT(2, "INSERT A COIN", M)
+ BUTTON_FORMAT(3, "LEAVE IT BE", M)
+ return
+ if(2)
+ AdjustCurrency(-1)
+ AdjustHitPoint(100)
+ if(3)
+ AdjustStatNum(SLOTH_STAT,1)
+ return ..()
diff --git a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/limbus_company/ambling_pearl.dm b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/limbus_company/ambling_pearl.dm
index d59af5311802..790f4602ff2b 100644
--- a/ModularTegustation/lc13_obj/_adventure_console/adventure_events/limbus_company/ambling_pearl.dm
+++ b/ModularTegustation/lc13_obj/_adventure_console/adventure_events/limbus_company/ambling_pearl.dm
@@ -1,6 +1,6 @@
/datum/adventure_event/ambling_pearl
name = "Mirror Shard:Ambling Pearl"
- desc = null
+ desc = "THE SMELL OF ROT"
adventure_cords = list(
"The barren mudflat reeks of salt and rot. \
What little jade-colored seawater is left there \
diff --git a/ModularTegustation/tegu_items/associations/!overwrites.dm b/ModularTegustation/tegu_items/associations/!overwrites.dm
index f0e210128eca..b495b05028d1 100644
--- a/ModularTegustation/tegu_items/associations/!overwrites.dm
+++ b/ModularTegustation/tegu_items/associations/!overwrites.dm
@@ -1,5 +1,49 @@
+/mob/living/simple_animal/hostile/ordeal/steel_dawn/Initialize()
+ . = ..()
+ if(SSmaptype.maptype in SSmaptype.citymaps)
+ guaranteed_butcher_results += list(/obj/item/food/meat/slab/human/mutant/moth = 1)
+
/mob/living/simple_animal/hostile/ordeal/steel_dawn/steel_noon/Initialize()
. = ..()
if(SSmaptype.maptype in SSmaptype.citymaps)
maxHealth = 500
health = 500
+ melee_damage_lower = 8
+ melee_damage_upper = 10
+
+/mob/living/simple_animal/hostile/ordeal/green_bot_big/Initialize()
+ . = ..()
+ if(SSmaptype.maptype in SSmaptype.citymaps)
+ rapid = 10
+ rapid_fire_delay = 3
+ projectiletype = /obj/projectile/bullet/c9x19mm/greenbot/city
+ firing_cooldown = 2.4
+
+/mob/living/simple_animal/hostile/ordeal/amber_dusk/Initialize()
+ . = ..()
+ if(SSmaptype.maptype in SSmaptype.citymaps)
+ melee_damage_lower = 45
+ melee_damage_upper = 50
+ maxHealth = 700
+ health = 700
+ can_burrow = FALSE
+ attack_cooldown = 100
+
+/mob/living/simple_animal/hostile/ordeal/dog_corrosion/Initialize()
+ . = ..()
+ if(SSmaptype.maptype in SSmaptype.citymaps)
+ gibbing = FALSE
+ maxHealth = 1500
+ health = 1500
+
+/mob/living/simple_animal/hostile/ordeal/snake_corrosion/Initialize()
+ . = ..()
+ if(SSmaptype.maptype in SSmaptype.citymaps)
+ maxHealth = 2000
+ health = 2000
+
+/mob/living/simple_animal/hostile/ordeal/snake_corrosion/strong/Initialize()
+ . = ..()
+ if(SSmaptype.maptype in SSmaptype.citymaps)
+ maxHealth = 3000
+ health = 3000
diff --git a/ModularTegustation/tegu_items/associations/cityspawners.dm b/ModularTegustation/tegu_items/associations/cityspawners.dm
index 215c61cb5d67..e797895a2613 100644
--- a/ModularTegustation/tegu_items/associations/cityspawners.dm
+++ b/ModularTegustation/tegu_items/associations/cityspawners.dm
@@ -77,6 +77,7 @@ GLOBAL_VAR_INIT(city_east_enemies, FALSE)
"gcorp",
"sweeper",
"bots",
+ "worms",
)
/obj/effect/landmark/backstreetspawn/Initialize()
@@ -99,10 +100,15 @@ GLOBAL_VAR_INIT(city_east_enemies, FALSE)
spawning = /mob/living/simple_animal/hostile/ordeal/green_bot
if(prob(30))
spawning = /mob/living/simple_animal/hostile/ordeal/green_bot_big
- new spawning(get_turf(src))
-
+ if("worms")
+ spawning = /mob/living/simple_animal/hostile/ordeal/amber_bug
+ if(prob(30))
+ spawning = /mob/living/simple_animal/hostile/ordeal/amber_dusk
+ new spawning(get_turf(src))
+ if (GLOB.city_center_enemies == "worms")
+ new /mob/living/simple_animal/hostile/ordeal/amber_bug (get_turf(src))
/obj/effect/landmark/backstreetspawnwest
name = "cityspawn landmark"
@@ -111,6 +117,7 @@ GLOBAL_VAR_INIT(city_east_enemies, FALSE)
"gcorp",
"sweeper",
"bots",
+ "worms",
)
/obj/effect/landmark/backstreetspawnwest/Initialize()
@@ -134,7 +141,15 @@ GLOBAL_VAR_INIT(city_east_enemies, FALSE)
spawning = /mob/living/simple_animal/hostile/ordeal/green_bot
if(prob(30))
spawning = /mob/living/simple_animal/hostile/ordeal/green_bot_big
+
+ if("worms")
+ spawning = /mob/living/simple_animal/hostile/ordeal/amber_bug
+ if(prob(30))
+ spawning = /mob/living/simple_animal/hostile/ordeal/amber_dusk
+
new spawning(get_turf(src))
+ if (GLOB.city_west_enemies == "worms")
+ new /mob/living/simple_animal/hostile/ordeal/amber_bug (get_turf(src))
/obj/effect/landmark/backstreetspawneast
@@ -144,6 +159,7 @@ GLOBAL_VAR_INIT(city_east_enemies, FALSE)
"gcorp",
"sweeper",
"bots",
+ "worms",
)
/obj/effect/landmark/backstreetspawneast/Initialize()
@@ -166,5 +182,12 @@ GLOBAL_VAR_INIT(city_east_enemies, FALSE)
spawning = /mob/living/simple_animal/hostile/ordeal/green_bot
if(prob(30))
spawning = /mob/living/simple_animal/hostile/ordeal/green_bot_big
- new spawning(get_turf(src))
+ if("worms")
+ spawning = /mob/living/simple_animal/hostile/ordeal/amber_bug
+ if(prob(30))
+ spawning = /mob/living/simple_animal/hostile/ordeal/amber_dusk
+
+ new spawning(get_turf(src))
+ if (GLOB.city_east_enemies == "worms")
+ new /mob/living/simple_animal/hostile/ordeal/amber_bug (get_turf(src))
diff --git a/ModularTegustation/tegu_items/associations/items.dm b/ModularTegustation/tegu_items/associations/items.dm
index fc028c31aa32..be2ea9085bdd 100644
--- a/ModularTegustation/tegu_items/associations/items.dm
+++ b/ModularTegustation/tegu_items/associations/items.dm
@@ -59,10 +59,11 @@
icon = 'ModularTegustation/Teguicons/teguitems.dmi'
icon_state = "tcorp_syringe"
amount = 1
+ var/list/usable_roles = list("Civilian", "Office Director", "Office Fixer")
/obj/item/attribute_increase/fixer/attack_self(mob/living/carbon/human/user)
//only civilians can use this.
- if(user?.mind?.assigned_role != "Civilian")
+ if(!(user?.mind?.assigned_role in usable_roles))
to_chat(user, span_danger("You cannot use this item, as you must not belong to an association."))
return
diff --git a/ModularTegustation/tegu_items/associations/machines.dm b/ModularTegustation/tegu_items/associations/machines.dm
index 45d05639f959..1ecdb5df7cf7 100644
--- a/ModularTegustation/tegu_items/associations/machines.dm
+++ b/ModularTegustation/tegu_items/associations/machines.dm
@@ -14,7 +14,10 @@
/obj/item/food/meat/slab/sweeper,
/obj/item/food/meat/slab/worm,
/obj/item/food/meat/slab/robot,
- /obj/item/food/meat/slab/human/mutant/moth,
+ /obj/item/food/meat/slab/buggy,
+ /obj/item/food/meat/slab/corroded,
+ /obj/item/food/meat/slab/sinnew,
+ /obj/item/food/meat/slab/crimson,
/obj/item/rawpe,
/obj/item/reagent_containers/food/drinks/bottle/wine/unlabeled,
)
@@ -25,9 +28,9 @@
/obj/item/head_trophy,
/obj/item/tape/resurgence,
/obj/item/refinedpe,
+ /obj/item/raw_anomaly_core,
)
var/list/level_3 = list(
- /obj/item/raw_anomaly_core,
/obj/item/documents,
/obj/item/folder/syndicate,
/obj/item/folder/documents,
@@ -173,6 +176,11 @@
JUSTICE_ATTRIBUTE,
)
+/obj/structure/potential/Initialize()
+ . = ..()
+ new /obj/item/paper/fluff/fixer_skills (get_turf(src))
+ new /obj/item/paper/fluff/fixer_skills (get_turf(src))
+
//Very dumb way to implement "empty hand AND full hand."
//These two code blocks are the same except for their triggers - if you've got a better idea, please use it.
/obj/structure/potential/proc/calculate_grade(mob/living/user)
diff --git a/ModularTegustation/tegu_items/associations/vending.dm b/ModularTegustation/tegu_items/associations/vending.dm
index 69e2a542ae84..e99d2966d21a 100644
--- a/ModularTegustation/tegu_items/associations/vending.dm
+++ b/ModularTegustation/tegu_items/associations/vending.dm
@@ -100,6 +100,7 @@
/obj/item/book/granter/crafting_recipe/carnival/weaving_wedge = 1,
/obj/item/book/granter/crafting_recipe/carnival/weaving_molar_boatworks = 1,
/obj/item/book/granter/crafting_recipe/carnival/weaving_rosespanner = 1,
+ /obj/item/book/granter/crafting_recipe/carnival/weaving_masquerade = 1,
)
default_price = 100
@@ -133,7 +134,8 @@
/obj/item/kitchen/knife/combat/survival = 100,
/obj/item/weldingtool/mini = 100,
/obj/item/reagent_containers/hypospray/medipen/mental = 100,
- /obj/item/reagent_containers/hypospray/medipen/salacid = 100
+ /obj/item/reagent_containers/hypospray/medipen/salacid = 100,
+ /obj/item/gps/fixer = 100,
)
premium = list(
diff --git a/ModularTegustation/tegu_items/backstreets/templates.dm b/ModularTegustation/tegu_items/backstreets/templates.dm
index bff3c5316384..02c7a0f9d68f 100644
--- a/ModularTegustation/tegu_items/backstreets/templates.dm
+++ b/ModularTegustation/tegu_items/backstreets/templates.dm
@@ -33,6 +33,11 @@
room_id = "abandoned_lcorp"
mappath = "_maps/RandomRooms/backstreetlayout/lcorp_backstreets.dmm"
+/datum/map_template/random_room/backstreet_template/outskirts
+ name = "Outskirts Template"
+ room_id = "outskirts"
+ mappath = "_maps/RandomRooms/backstreetlayout/outskirts.dmm"
+
/datum/map_template/random_room/backstreet_template/la_mancha_land
name = "La Mancha Land Template"
room_id = "la_mancha_land_backstreets"
diff --git a/ModularTegustation/tegu_items/debug_items.dm b/ModularTegustation/tegu_items/debug_items.dm
index ff3276c3f2a3..b26dbdcc946b 100644
--- a/ModularTegustation/tegu_items/debug_items.dm
+++ b/ModularTegustation/tegu_items/debug_items.dm
@@ -374,3 +374,26 @@
say("Restarting...")
SLEEP_CHECK_DEATH(10)
DeepsCheckStart()
+
+//breach tester
+/obj/item/lc_debug/breachtester//for testing many abnormalities very quickly
+ name = "Breach tester"
+ desc = "For testing use only, DO NOT DISTRIBUTE! Breach types can be checked under _DEFINES/abnormalities.dm"
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "nanoimplant"
+ var/breach_type = BREACH_NORMAL
+ var/list/breach_list = list(
+ BREACH_NORMAL, BREACH_PINK, BREACH_MINING,
+ )
+
+/obj/item/lc_debug/breachtester/attack_self(mob/user)
+ breach_type = input(user, "Which breach will you test?") as null|anything in breach_list
+
+/obj/item/lc_debug/breachtester/attack(mob/living/simple_animal/hostile/abnormality/target, mob/living/carbon/human/user)
+ if(!isabnormalitymob(target))
+ to_chat(user, span_warning("\"[target]\" isn't an Abnormality."))
+ return
+ target.BreachEffect(user, breach_type)
+ to_chat(user, span_nicegreen("You triggered a [breach_type] breach!"))
+
+
diff --git a/ModularTegustation/tegu_items/prosthetics/resurgence_core.dm b/ModularTegustation/tegu_items/prosthetics/resurgence_core.dm
new file mode 100644
index 000000000000..a84ca7a21729
--- /dev/null
+++ b/ModularTegustation/tegu_items/prosthetics/resurgence_core.dm
@@ -0,0 +1,43 @@
+/obj/item/organ/cyberimp/chest/resurgence_core
+ name = "Resurgence Clan Augment: Echo Step"
+ desc = "An augment designed by the resurgence clan, which lets the user teleport a short distance a the cost of their sanity."
+ syndicate_implant = TRUE
+ actions_types = list(/datum/action/item_action/organ_action/use/resurgence_core)
+ implant_overlay = "chest_resurgence_core"
+
+/datum/action/item_action/organ_action/use/resurgence_core
+ var/tp_distance = 2
+
+/datum/action/item_action/organ_action/use/resurgence_core/Trigger()
+ if(!IsAvailable())
+ return
+ get_teleport_loc()
+ var/turf/T
+ if(owner.dir == 1)
+ T = get_teleport_loc(owner.loc, owner, tp_distance, FALSE, 0, 0, 0, tp_distance)
+ if(owner.dir == 2)
+ T = get_teleport_loc(owner.loc, owner, tp_distance, FALSE, 0, 0, 0, (-1 * tp_distance))
+ if(owner.dir == 4)
+ T = get_teleport_loc(owner.loc, owner, tp_distance, FALSE, 0, 0, tp_distance, 0)
+ if(owner.dir == 8)
+ T = get_teleport_loc(owner.loc, owner, tp_distance, FALSE, 0, 0, (-1 * tp_distance), 0)
+ if(T.density)
+ to_chat(owner, span_danger("ERROR: Dense object detected in Echo Step destination."))
+ return
+ if(T.x>world.maxx || T.x<1)
+ to_chat(owner, span_danger("ERROR: Dense object detected in Echo Step destination."))
+ return
+ if(T.y>world.maxy || T.y<1)
+ to_chat(owner, span_danger("ERROR: Dense object detected in Echo Step destination."))
+ return
+ if (ishuman(owner))
+ var/mob/living/carbon/human/human = owner
+ playsound(owner, 'sound/effects/contractorbatonhit.ogg', 20, FALSE, 9)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out (get_turf(owner))
+ if (T in view(tp_distance, owner))
+ human.adjustSanityLoss(human.maxSanity * 0.025)
+ else
+ human.adjustSanityLoss(human.maxSanity * 0.25)
+ to_chat(human, span_danger("WARNING: Echo Step destination is not visible, increasing power usage by 1000%."))
+ human.loc = T
+ new /obj/effect/temp_visual/dir_setting/ninja/phase (get_turf(owner))
diff --git a/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm b/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm
index 8fc9b49b0657..321da10e7489 100644
--- a/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm
+++ b/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm
@@ -52,7 +52,9 @@
//Porccubus gets a much shorter dash cooldown to better maneuver itself with how big of a commitment dashing is.
/mob/living/simple_animal/hostile/abnormality/porccubus/Initialize()
if(IsCombatMap())
- ranged_cooldown_time = 3 SECONDS
+ maxHealth = 3000
+ health = 3000
+ ranged_cooldown_time = 0.5 SECONDS
return ..()
// Fairy gentleman gets a bump to his survival, damage, and a bigger ass.
@@ -75,6 +77,24 @@
bullet_damage = 200
return ..()
+//Due to Redblooded's very low damage and health, which is normaly fitting for a Teth. That causes them to underperform in R-Corp since they don't have any utility.
+//For that reason his health is increased and let his ammo gimmick work by reducing his ranged cooldown.
+/mob/living/simple_animal/hostile/abnormality/redblooded/Initialize()
+ if(SSmaptype.maptype == "rcorp")
+ ranged_cooldown_time = 0.5 SECONDS
+ maxHealth = 1200
+ health = 1200
+ melee_damage_lower = 15
+ melee_damage_upper = 20
+ casingtype = /obj/item/ammo_casing/caseless/rcorp_true_patriot
+ return ..()
+
+/mob/living/simple_animal/hostile/abnormality/ppodae/Initialize()
+ if(IsCombatMap())
+ smash_damage_low = 32
+ smash_damage_high = 40
+ return ..()
+
//Warden deals even less damage then more bodies they eat, and they take more damage from all attacks.
//Warden currently slowballs far to quickly, so this nerf should give R-Corp a better chance at fighting back against them.
/mob/living/simple_animal/hostile/abnormality/warden/Initialize()
@@ -96,3 +116,9 @@
heal_percent_per_second = 0.01275
r_corp_regen_start = 0.5
return ..()
+
+/mob/living/simple_animal/hostile/abnormality/greed_king/Initialize()
+ if(IsCombatMap())
+ initial_charge_damage = 200
+ growing_charge_damage = 80
+ return ..()
diff --git a/ModularTegustation/tegu_items/rcorp/button.dm b/ModularTegustation/tegu_items/rcorp/button.dm
new file mode 100644
index 000000000000..09f00e32a315
--- /dev/null
+++ b/ModularTegustation/tegu_items/rcorp/button.dm
@@ -0,0 +1,37 @@
+/obj/machinery/button/door/indestructible/rcorp
+ name = "rcorp button"
+ id = "inside"
+
+/obj/machinery/button/door/indestructible/rcorp/setup_device()
+ if(!device)
+ var/obj/item/assembly/control/rcorp/A = new(src)
+ device = A
+ ..()
+
+/obj/machinery/button/door/indestructible/rcorp/Destroy()
+ qdel(device)
+ return ..()
+
+/obj/item/assembly/control/rcorp
+ name = "rcorp door controller"
+
+/obj/item/assembly/control/rcorp/activate()
+ if(cooldown)
+ return
+ // check abnos
+ var/count = 0
+ var/mob/living/simple_animal/hostile/better_memories_minion/B = locate()
+ var/mob/living/carbon/human/species/pinocchio/P = locate()
+ if (P)
+ count++
+ if (B)
+ count++
+ for(var/mob/living/simple_animal/hostile/abnormality/A in GLOB.abnormality_mob_list)
+ if (A.rcorp_team == "easy")
+ count++
+ if (count > 2)
+ break
+ if (count > 2)
+ to_chat(usr, "There are still enemies around!")
+ return
+ ..()
diff --git a/ModularTegustation/tegu_items/rcorp/landmarks.dm b/ModularTegustation/tegu_items/rcorp/landmarks.dm
index 347efe1ebe19..4f32f0d57c90 100644
--- a/ModularTegustation/tegu_items/rcorp/landmarks.dm
+++ b/ModularTegustation/tegu_items/rcorp/landmarks.dm
@@ -85,10 +85,10 @@ GLOBAL_LIST_INIT(raidboss, list(/mob/living/simple_animal/hostile/distortion/shr
/obj/effect/landmark/abnospawn/easycombat/Initialize()
..()
var/spawning = pick_n_take(GLOB.easycombat)
- new spawning(get_turf(src))
+ var/mob/living/simple_animal/hostile/abnormality/A = new spawning(get_turf(src))
+ A.rcorp_team = "easy"
return INITIALIZE_HINT_QDEL
-
/obj/effect/landmark/abnospawn/easysupport
name = "easy support abno spawner"
desc = "It spawns an abno. Notify a coder. Thanks!"
@@ -98,10 +98,10 @@ GLOBAL_LIST_INIT(raidboss, list(/mob/living/simple_animal/hostile/distortion/shr
/obj/effect/landmark/abnospawn/easysupport/Initialize()
..()
var/spawning = pick_n_take(GLOB.easysupport)
- new spawning(get_turf(src))
+ var/mob/living/simple_animal/hostile/abnormality/A = new spawning(get_turf(src))
+ A.rcorp_team = "easy"
return INITIALIZE_HINT_QDEL
-
/obj/effect/landmark/abnospawn/easytank
name = "easy tank abno spawner"
desc = "It spawns an abno. Notify a coder. Thanks!"
@@ -111,7 +111,8 @@ GLOBAL_LIST_INIT(raidboss, list(/mob/living/simple_animal/hostile/distortion/shr
/obj/effect/landmark/abnospawn/easytank/Initialize()
..()
var/spawning = pick_n_take(GLOB.easytank)
- new spawning(get_turf(src))
+ var/mob/living/simple_animal/hostile/abnormality/A = new spawning(get_turf(src))
+ A.rcorp_team = "easy"
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/abnospawn/hardcombat
diff --git a/ModularTegustation/tegu_items/rcorp/objective.dm b/ModularTegustation/tegu_items/rcorp/objective.dm
index e87a0e7b31ba..f015037688dd 100644
--- a/ModularTegustation/tegu_items/rcorp/objective.dm
+++ b/ModularTegustation/tegu_items/rcorp/objective.dm
@@ -162,19 +162,24 @@ GLOBAL_VAR_INIT(rcorp_payload, null)
light_on = FALSE
update_light()
- //Round End Effects
- SSticker.SetRoundEndSound('sound/abnormalities/donttouch/end.ogg')
- SSticker.force_ending = 1
- for(var/mob/M in GLOB.player_list)
- to_chat(M, span_userdanger("[uppertext(user.real_name)] has collected the bough!"))
-
- switch(GLOB.rcorp_wincondition)
- if(0)
- to_chat(M, span_userdanger("R-CORP MAJOR VICTORY."))
- if(1)
- to_chat(M, span_userdanger("R-CORP MINOR VICTORY."))
- if(2)
- to_chat(M, span_userdanger("R-CORP SUPREME VICTORY."))
+ if(!SSticker.force_ending)
+ //Round End Effects
+ SSticker.SetRoundEndSound('sound/abnormalities/donttouch/end.ogg')
+ SSticker.force_ending = 1
+ for(var/mob/M in GLOB.player_list)
+ to_chat(M, span_userdanger("[uppertext(user.real_name)] has collected the bough!"))
+
+ switch(GLOB.rcorp_wincondition)
+ if(0)
+ to_chat(M, span_userdanger("R-CORP MAJOR VICTORY."))
+ if(1)
+ to_chat(M, span_userdanger("R-CORP MINOR VICTORY."))
+ if(2)
+ to_chat(M, span_userdanger("R-CORP SUPREME VICTORY."))
+ else
+ var/turf/turf = get_turf(src)
+ new /obj/effect/decal/cleanable/confetti(turf)
+ playsound(turf, 'sound/misc/sadtrombone.ogg', 100)
else
user.gib() //lol, idiot.
@@ -186,16 +191,231 @@ GLOBAL_VAR_INIT(rcorp_payload, null)
icon = 'ModularTegustation/Teguicons/32x32.dmi'
icon_state = "executive"
icon_living = "executive"
- health = 300 //Fragile so they protect you
- maxHealth = 300
+ health = 1000 //Fragile so they protect you
+ maxHealth = 1000
+ damage_coeff = list(BRUTE = 1, RED_DAMAGE = 1, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1, PALE_DAMAGE = 1)
+ var/max_protection = 0.9
+ var/base_resistance = 1
+ var/guarding_allies = 0
+ var/final_resistance = 1
+ var/total_ally_protection = 0
+ var/per_ally_protection = 0.25
+ var/view_check_time = 1 SECONDS
+ var/view_check
+ var/barrier_count
+ var/max_barrier_count = 6
+ var/sniper
+ var/warning
+ var/danger = FALSE
+ var/sniper_time = 0.5
+ var/warning_time = 0.25
+ var/sniper_safe = 1
+
+ var/list/shrimp_abilities = list(
+ /obj/effect/proc_holder/spell/pointed/shrimp_airstrike,
+ /obj/effect/proc_holder/spell/pointed/shrimp_barricade,
+ /obj/effect/proc_holder/spell/pointed/shrimp_heal,
+ )
+
+/mob/living/simple_animal/hostile/shrimp_vip/Initialize()
+ . = ..()
+ for (var/A in shrimp_abilities)
+ if (ispath(A, /obj/effect/proc_holder/spell))
+ var/obj/effect/proc_holder/spell/AS = new A(src)
+ AddSpell(AS)
+
+/mob/living/simple_animal/hostile/shrimp_vip/Login()
+ . = ..()
+ to_chat(src, "
"
- dat += GLOB.data_core.get_manifest_html()
+ if(!GLOB.crew_manifest_tgui)
+ GLOB.crew_manifest_tgui = new /datum/crew_manifest(src)
- src << browse(dat, "window=manifest;size=387x420;can_close=1")
+ GLOB.crew_manifest_tgui.ui_interact(src)
/mob/dead/new_player/Move()
return 0
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 78134dd79575..0b1cd300229e 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -698,11 +698,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
client.crew_manifest_delay = world.time + (1 SECONDS)
- var/dat
- dat += "
Crew Manifest
"
- dat += GLOB.data_core.get_manifest_html()
+ if(!GLOB.crew_manifest_tgui)
+ GLOB.crew_manifest_tgui = new /datum/crew_manifest(src)
- src << browse(dat, "window=manifest;size=387x420;can_close=1")
+ GLOB.crew_manifest_tgui.ui_interact(src)
//this is called when a ghost is drag clicked to something.
/mob/dead/observer/MouseDrop(atom/over)
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 6122c3434f97..cff4e8777f96 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -6,18 +6,17 @@
//// Damage Effects
/mob/living/carbon/human/adjustRedLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(stat != DEAD)
+ DamageEffect(amount, RED_DAMAGE)
. = ..()
- //Failsafe
- if(. && !forced)
- if(. > 0)
- new /obj/effect/temp_visual/damage_effect/red(get_turf(src))
+
/mob/living/carbon/human/adjustWhiteLoss(amount, updating_health = TRUE, forced = FALSE, white_healable = FALSE)
var/damage_amt = amount
if(sanity_lost && white_healable) // Heal sanity instead.
damage_amt *= -1
- if(damage_amt > 0 && !forced)
- new /obj/effect/temp_visual/damage_effect/white(get_turf(src))
+ if(stat != DEAD)
+ DamageEffect(damage_amt, WHITE_DAMAGE)
adjustSanityLoss(damage_amt, forced)
if(updating_health)
updatehealth()
@@ -27,29 +26,26 @@
var/damage_amt = amount
if(sanity_lost && white_healable) // Heal sanity instead.
damage_amt *= -1
- if(amount > 0 && !forced)
- new /obj/effect/temp_visual/damage_effect/black(get_turf(src))
+ if(stat != DEAD)
+ DamageEffect(amount, BLACK_DAMAGE)
adjustBruteLoss(amount, forced = forced)
adjustSanityLoss(damage_amt, forced = forced)
return damage_amt
/mob/living/carbon/human/adjustPaleLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(stat != DEAD)
+ DamageEffect(amount, PALE_DAMAGE)
. = ..()
- if(. && !forced)
- if(. > 0)
- new /obj/effect/temp_visual/damage_effect/pale(get_turf(src))
/mob/living/carbon/human/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(stat != DEAD)
+ DamageEffect(amount, TOX)
. = ..()
- if(. && !forced)
- if(. > 0)
- new /obj/effect/temp_visual/damage_effect/tox(get_turf(src))
/mob/living/carbon/human/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_status)
+ if(stat != DEAD)
+ DamageEffect(amount, BURN)
. = ..()
- if(. && !forced)
- if(. > 0)
- new /obj/effect/temp_visual/damage_effect/burn(get_turf(src))
//
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 512a4dc09e89..3380cd9c847d 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -331,9 +331,10 @@
return
client.crew_manifest_delay = world.time + (1 SECONDS)
- var/datum/browser/popup = new(src, "airoster", "Crew Manifest", 387, 420)
- popup.set_content(GLOB.data_core.get_manifest_html())
- popup.open()
+ if(!GLOB.crew_manifest_tgui)
+ GLOB.crew_manifest_tgui = new /datum/crew_manifest(src)
+
+ GLOB.crew_manifest_tgui.ui_interact(src)
/mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals).
if(!radio)
diff --git a/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm b/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm
index 8afc96970f05..d9ef65c50b5d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm
@@ -123,13 +123,22 @@
/// Offset for secret skins in the Y axis
var/secret_vertical_offset = 0
- /// Final Observation details
- var/observation_in_progress = FALSE
+ /// Final Observation stuffs
+ /// The prompt we get alongside our choices for observing it
var/observation_prompt = "The abnormality is watching you. What will you do?"
- var/list/observation_choices = list("Approach", "Leave")
- var/list/correct_choices = list("Approach", "Leave")
- var/observation_success_message = "Final Observation Success!"
- var/observation_fail_message = "Final Observation Failed!"
+ /**
+ * observation_choices is made in the format of:
+ * "Choice" = list(TRUE or FALSE [depending on if the answer is correct], "Response"),
+ */
+ var/list/observation_choices = list(
+ "Approach" = list(TRUE, "You approach the abnormality... and obtain a gift from it."),
+ "Leave" = list(TRUE, "You leave the abnormality... and before you notice a gift is in your hands."),
+ )
+ /// Is there a currently on-going observation?
+ var/observation_in_progress = FALSE
+
+ // rcorp stuff
+ var/rcorp_team
/mob/living/simple_animal/hostile/abnormality/Initialize(mapload)
SHOULD_CALL_PARENT(TRUE)
@@ -339,13 +348,6 @@
/mob/living/simple_animal/hostile/abnormality/proc/PostSpawn()
SHOULD_CALL_PARENT(TRUE)
HandleStructures()
- var/condition = FALSE //Final observation debug
- for(var/answer in observation_choices)
- if(answer in correct_choices)
- condition = TRUE
- if(!condition)
- CRASH("Abnormality has no correct choice for final observation!")
- return
// Moves structures already in its datum; Overrides can spawn structures here.
/mob/living/simple_animal/hostile/abnormality/proc/HandleStructures()
@@ -552,25 +554,29 @@
return
to_chat(user, span_warning("You already have a gift in the [gift_type.slot] slot, dissolve it first!"))
return
- var/condition = FALSE
+
if(observation_in_progress)
to_chat(user, span_notice("Someone is already observing [src]!"))
return
observation_in_progress = TRUE
- var/answer = final_observation_alert(user, "[observation_prompt]", "Final Observation of [src]", observation_choices, timeout = 60 SECONDS)
- if(answer in correct_choices)
- condition = TRUE
- ObservationResult(user, condition, answer) //We pass along the answer just in case
+ var/answer = final_observation_alert(user, "[observation_prompt]", "Final Observation of [src]", shuffle(observation_choices), timeout = 60 SECONDS)
+ if(answer == "timed out")
+ ObservationResult(user, reply = answer)
+ else
+ var/list/answer_vars = observation_choices[answer]
+ ObservationResult(user, answer_vars[1], answer_vars[2])
+
observation_in_progress = FALSE
-/mob/living/simple_animal/hostile/abnormality/proc/ObservationResult(mob/living/carbon/human/user, condition, answer)
- if(condition) //Successful, could override for longer observations as well.
- final_observation_alert(user,"[observation_success_message]", "OBSERVATION SUCCESS",list("Ok"), timeout=20 SECONDS) //Some of these take a long time to read
+/mob/living/simple_animal/hostile/abnormality/proc/ObservationResult(mob/living/carbon/human/user, success = FALSE, reply = "")
+ if(success) //Successful, could override for longer observations as well.
+ final_observation_alert(user, "[reply]", "OBSERVATION SUCCESS", list("Ok"), timeout = 20 SECONDS) //Some of these take a long time to read
if(gift_type)
user.Apply_Gift(new gift_type)
playsound(get_turf(user), 'sound/machines/synth_yes.ogg', 30 , FALSE)
else
- final_observation_alert(user,"[observation_fail_message]", "OBSERVATION FAIL",list("Ok"), timeout=20 SECONDS)
+ if(reply != "timed out")
+ final_observation_alert(user, "[reply]", "OBSERVATION FAIL", list("Ok"), timeout = 20 SECONDS)
playsound(get_turf(user), 'sound/machines/synth_no.ogg', 30 , FALSE)
datum_reference.observation_ready = FALSE
@@ -594,6 +600,11 @@
if(5)
C.icon = 'ModularTegustation/Teguicons/abno_cores/aleph.dmi'
+/mob/living/simple_animal/hostile/abnormality/spawn_gibs()
+ if(blood_volume <= 0)
+ return
+ return new /obj/effect/gibspawner/generic(drop_location(), src, get_static_viruses())
+
// Actions
/datum/action/innate/abnormality_attack
name = "Abnormality Attack"
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_lefthand.dmi b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_lefthand.dmi
index 51ac2c6cfea6..25adf0c65e1d 100644
Binary files a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_lefthand.dmi and b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_lefthand.dmi differ
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_righthand.dmi b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_righthand.dmi
index a2a73606faf0..bd8e259acddd 100644
Binary files a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_righthand.dmi and b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_righthand.dmi differ
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi
index 7422e03d3dc7..d45dda656afa 100644
Binary files a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi and b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi differ
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_armor.dm b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_armor.dm
index 5b7af06bece7..b8ad342504f1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_armor.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_armor.dm
@@ -47,7 +47,7 @@
// Waw
/obj/item/clothing/suit/armor/ego_gear/waw/ochre
name = "ochre sheet"
- desc = "You shall not pass!"
+ desc = "The soul is not a single unity; that is what it is destined to become, and that is what we call \"Immortality\"."
icon_state = "ochre"
icon = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_armor.dmi'
worn_icon = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_worn.dmi'
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm
index 7656c33438fd..5d2b489e2e2a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm
@@ -29,6 +29,8 @@
desc = "Some old bandages that look like they have been worn for a long time."
icon_state = "desert"
icon = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi'
+ lefthand_file = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_lefthand.dmi'
+ righthand_file = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_righthand.dmi'
force = 21
attack_speed = 0.7
hitsound = 'sound/weapons/fixer/generic/fist1.ogg'
@@ -194,6 +196,10 @@
special = "Use in hand to prepare a powerful area attack. This attack becomes more powerful when charged."
icon_state = "sunspit"
icon = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi'
+ lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
force = 54
attack_speed = 1.6
swingstyle = WEAPONSWING_LARGESWEEP
@@ -467,11 +473,14 @@
/obj/item/ego_weapon/wield/ochre
name = "ochre sheet"
- desc = "Everyone says its a myth until one day something happens in the streets that brings it back to life."
+ desc = "Everyone says its a myth until one day something happens that brings it back to life."
special = "This weapon can fire a damaging projectile that scales with justice when held with both hands."
icon_state = "ochre"
icon = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi'
- special = "This weapon deals RED damage when wielded and WHITE otherwise."
+ lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
force = 98
wielded_force = 98
reach = 2 //Has 2 Square Reach.
@@ -528,6 +537,9 @@
G.damage*=justicemod
firing_cooldown = firing_cooldown_time + world.time
user.changeNext_move(CLICK_CD_MELEE * attack_speed)
+ user.Immobilize(stuntime)
+ //Visual stuff to give you better feedback
+ new /obj/effect/temp_visual/weapon_stun(get_turf(user))
/obj/projectile/ego_bullet/ochre
name = "ochre sheet"
@@ -666,6 +678,8 @@
This weapon has a fast attack speed, is capable of closing short gaps when attacking, and heals a small amount on a combo finsiher."
icon_state = "limos"
icon = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_weapons.dmi'
+ lefthand_file = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_lefthand.dmi'
+ righthand_file = 'code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/!icons/ego_righthand.dmi'
force = 14 // VERY fast attacks potentially
damtype = BLACK_DAMAGE
swingstyle = WEAPONSWING_THRUST
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm
index f134732caea4..96f3f295870b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm
@@ -55,11 +55,11 @@ GLOBAL_LIST_EMPTY(army)
observation_prompt = "\"We're here to help sir, to keep the hearts of humans a clean pink, we're willing to dirty our own. We won't overlook a single speck of black.\" \
The soldier in pink makes a salute. You..."
- observation_choices = list("Don't salute", "Salute him back")
- correct_choices = list("Don't salute")
- observation_success_message = "The soldier frowns. \"As expected. You're only human, a clean heart is only ever temporary for you. Yours is rife with sin. Ours are...\" \
- The soldier falls silent, as if in deep thought."
- observation_fail_message = "The soldier in pink smiles. \"Glad to have you on board Sir, with our help, there will be no more black hearts.\""
+ observation_choices = list(
+ "Don't salute" = list(TRUE, "The soldier frowns. \"As expected. You're only human, a clean heart is only ever temporary for you. \
+ Yours is rife with sin. Ours are...\" The soldier falls silent, as if in deep thought."),
+ "Salute him back" = list(FALSE, "The soldier in pink smiles. \"Glad to have you on board Sir, with our help, there will be no more black hearts.\""),
+ )
//Unique variables
var/death_counter = 0
@@ -150,9 +150,14 @@ GLOBAL_LIST_EMPTY(army)
//*--Combat Mechanics--*
/mob/living/simple_animal/hostile/abnormality/army/BreachEffect(mob/living/carbon/human/user, breach_type)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ABNORMALITY_BREACH, src)
- FearEffect()
- Blackify()
- SpawnAdds()//set its alpha to 0 and make it non-dense
+ if(breach_type == BREACH_MINING)
+ for(var/i in 1 to 3)
+ var/mob/living/simple_animal/hostile/army_enemy/E = new(get_turf(src))
+ RegisterSignal(E, COMSIG_PARENT_QDELETING, PROC_REF(ArmyDeath))
+ else
+ FearEffect()
+ Blackify()
+ SpawnAdds()//set its alpha to 0 and make it non-dense
for(var/mob/living/L in protected_targets)
L.remove_status_effect(STATUS_EFFECT_PROTECTION)
density = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm
index 22a3a780e2b9..3bfba962a511 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm
@@ -42,7 +42,7 @@
StageChange()
/mob/living/simple_animal/hostile/abnormality/black_sun/proc/StageChange()
- stage+=1
+ stage++
//Add 10 stats to everyone.
if(stage == 1)
affected_players = list() //Clear the list, then fill it up
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm
index ec9e78aa5d29..102fe30b4cfd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm
@@ -48,13 +48,13 @@
observation_prompt = "A group of employees worship this abnormality, despite the fact nothing can be sacred in this place. \
You recall how you pulled away one employee away from it in the past, even as she screamed and wailed that you were keeping her chained to this world. You thought you were saving her. \
You can hear a distant howl emanating from the centre of the blue-coloured heart. It's the sound of stars. They're welcoming you, asking you to join them as a star."
- observation_choices = list("Be pulled in", "Hold yourself tight")
- correct_choices = list("Be pulled in")
- observation_success_message = "You don't hesitate as you approach the centre of the void. Sensation in your hands and legs are the first things to go, creeping up your body until you couldn't feel anything physical at all. \
- Despite how scary it should have been, you feel at peace, this isn't an end it's a new beginning - You're a martyr. \
- Let's meet everyone again, as stars."
- observation_fail_message = "You wrapped your arms around yourself and shut your eyes, turning your senses inward until the temptation passes and the sounds become distant howls again. \
- You opened your eyes and looked again at the heart. It remains in the air, floating towards a new beginning."
+ observation_choices = list(
+ "Be pulled in" = list(TRUE, "You don't hesitate as you approach the centre of the void. Sensation in your hands and legs are the first things to go, creeping up your body until you couldn't feel anything physical at all. \
+ Despite how scary it should have been, you feel at peace, this isn't an end it's a new beginning - You're a martyr. \
+ Let's meet everyone again, as stars."),
+ "Hold yourself tight" = list(FALSE, "You wrapped your arms around yourself and shut your eyes, turning your senses inward until the temptation passes and the sounds become distant howls again. \
+ You opened your eyes and looked again at the heart. It remains in the air, floating towards a new beginning."),
+ )
var/pulse_cooldown
var/pulse_cooldown_time = 12 SECONDS
@@ -138,6 +138,7 @@
. = ..()
var/turf/T = pick(GLOB.department_centers)
soundloop.start()
- forceMove(T)
+ if(breach_type != BREACH_MINING)
+ forceMove(T)
BluePulse()
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm
index 48b82aa4f999..3647b6de267f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm
@@ -46,12 +46,12 @@
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
observation_prompt = "This is the containment unit of \[CENSORED\]. Many managers went mad, before they implemented the cognition filter, from the sight of it."
- observation_choices = list("Enter the containment unit", "Don't enter")
- correct_choices = list("Enter the containment unit")
- observation_success_message = "You enter the containment unit of \[CENSORED\], the smell of \[REDACTED\] and the sound of \[ANULLED\] filled the air. \
- After steeling yourself, you finally saw \[CENSORED\]. You manage to face the fear."
- observation_fail_message = "A wave of nausea rises up within at the thought of entering the containment unit, and you turn on your heels to leave. \
- You're not ready to build the future."
+ observation_choices = list(
+ "Enter the containment unit" = list(TRUE, "You enter the containment unit of \[CENSORED\], the smell of \[REDACTED\] and the sound of \[ANULLED\] filled the air. \
+ After steeling yourself, you finally saw \[CENSORED\]. You manage to face the fear."),
+ "Don't enter" = list(FALSE, "A wave of nausea rises up within at the thought of entering the containment unit, and you turn on your heels to leave. \
+ You're not ready to build the future."),
+ )
var/can_act = TRUE
var/ability_damage = 150
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm
index 5d5d8e8b2053..b1fed263ab80 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm
@@ -51,21 +51,21 @@
But the largest creature of all surrounds me entirely. Every direction is covered in a undulating mass of flesh, blood, fur, and feathers. \
I am always butchering monsters like these. I tear them limb from limb. \
Bringing death in brutal fashion. Am I not a fitting piece of the scenery before me?"
- observation_choices = list("I am a monster", "I am not a monster")
- correct_choices = list("I am not a monster")
- observation_success_message = "It is hard to live in the city. \
- To pretend to be a civilized human when living in this manner. \
- It is easy to give into the temptation of giving up all pretenses of humanity. \
- But I do it because it is hard. \
- ... \
- I am not a monster. \
- I will never become a monster."
- observation_fail_message = "\"Do you wish to be so?\" \
- \"Then it can be as you wish.\" \
- ... \
- Her voice is like sunshine. \
- ... \
- I am a monster. "
+ observation_choices = list(
+ "I am not a monster" = list(TRUE, "It is hard to live in the city. \
+ To pretend to be a civilized human when living in this manner. \
+ It is easy to give into the temptation of giving up all pretenses of humanity. \
+ But I do it because it is hard. \
+ ... \
+ I am not a monster. \
+ I will never become a monster."),
+ "I am a monster" = list(FALSE, "\"Do you wish to be so?\" \
+ \"Then it can be as you wish.\" \
+ ... \
+ Her voice is like sunshine. \
+ ... \
+ I am a monster. "),
+ )
//Work vars
var/transform_timer
@@ -300,6 +300,9 @@
//Breach
/mob/living/simple_animal/hostile/abnormality/distortedform/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ qdel(src)
+ return
. = ..()
if(breached)
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/last_shot.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/last_shot.dm
index 9a6efb684e8f..91fa240b8eb5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/last_shot.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/last_shot.dm
@@ -38,16 +38,16 @@ GLOBAL_LIST_EMPTY(meat_list)
\"You won't survive out there. Every single day in this facility is a constant, unending battle.\" \
\"The only way you'll survive is if you join me. To serve L-Corp til your last breath.\" \
A tendril of rotten meat is held out to you, beckoning for you to join it."
- observation_choices = list("EMBRACE IT", "REJECT IT")
- correct_choices = list("EMBRACE IT")
- observation_success_message = "You grab onto the tendril. You can feel your flesh tingling. \
- \"Good choice.\" \
- \"Don't worry. You won't regret this, you know? This is the only path you had.\" \
- \"You're dead meat out there. Might as well accept who you are.\""
- observation_fail_message = "You slap the tendril away. \
- \"Feh. So be it. You won't survive out there, you know?\" \
- \"When there's nothing left of the staff but blood and gore, I'll remain. Do you understand?\" \
- You can't help but to shudder in disgust as you exit the cell. Was it right? You'll never know."
+ observation_choices = list(
+ "EMBRACE IT" = list(TRUE, "You grab onto the tendril. You can feel your flesh tingling. \
+ \"Good choice.\" \
+ \"Don't worry. You won't regret this, you know? This is the only path you had.\" \
+ \"You're dead meat out there. Might as well accept who you are.\""),
+ "REJECT IT" = list(FALSE, "You slap the tendril away. \
+ \"Feh. So be it. You won't survive out there, you know?\" \
+ \"When there's nothing left of the staff but blood and gore, I'll remain. Do you understand?\" \
+ You can't help but to shudder in disgust as you exit the cell. Was it right? You'll never know."),
+ )
var/list/gremlins = list() //For the meatballs
var/list/meat = list() //For the floors
@@ -61,7 +61,9 @@ GLOBAL_LIST_EMPTY(meat_list)
/mob/living/simple_animal/hostile/abnormality/last_shot/Move()
return FALSE
-/mob/living/simple_animal/hostile/abnormality/last_shot/BreachEffect()
+/mob/living/simple_animal/hostile/abnormality/last_shot/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ return ..()
var/turf/T = pick(GLOB.department_centers)
forceMove(T)
..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm
index 4385c6ce5ccf..163a65634c16 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm
@@ -52,11 +52,11 @@
observation_prompt = "The slime craves affection, it covers the cell's floor, walls and celing. \
It clings to your clothes, your mask and your skin as you enter. At the centre of the cell, where the deluge conglomerates most, is the facismile of a girl. \
She waves at you shyly. You..."
- observation_choices = list("Retreat from the slime", "Reach out to her")
- correct_choices = list("Retreat from the slime")
- observation_success_message = "You retreat from the cell in a hurry, the slime clinging to you turns acidic. If she won't find affection from you, she'll find it another way..."
- observation_fail_message = "You reach out your hand and she does the same, your fingers entwine with the slimy appendage and she giggles. \"Let's be together forever.\" \
- You pull your hand away, but it comes out with the slime. You try to retreat, but you are already caught in her trap. \"Don't betray me, okay?\" Those are the last words you ever hear..."
+ observation_choices = list(
+ "Retreat from the slime" = list(TRUE, "You retreat from the cell in a hurry, the slime clinging to you turns acidic. If she won't find affection from you, she'll find it another way..."),
+ "Reach out to her" = list(FALSE, "You reach out your hand and she does the same, your fingers entwine with the slimy appendage and she giggles. \"Let's be together forever.\" \
+ You pull your hand away, but it comes out with the slime. You try to retreat, but you are already caught in her trap. \"Don't betray me, okay?\" Those are the last words you ever hear..."),
+ )
var/mob/living/carbon/human/gifted_human = null
/// Amount of BLACK damage done to all enemies around main target on melee attack. Also includes original target
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm
index ae6194359a24..1135ab1462a5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm
@@ -49,10 +49,10 @@
observation_prompt = "It smells like death itself in its containment unit, the mound of rotted, half-purtefied flesh stares at you with its many faces. \
Arms and legs bent at odd angles, entrails draped like lazy christmas decorations, innumerable limbs twisted and distorted into a sphere - all blanketed black with necrotic skin. \
Yet the faces remain intact, pale from a lack of blood, but still as recognizable as they've always been. They're smiling at you."
- observation_choices = list("I recognize those faces", "I don't recognize them")
- correct_choices = list("I recognize those faces")
- observation_success_message = "From the mountain of bodies; the dead give their life to be something greater. Why shouldn't they be smiling? You should be smiling too."
- observation_fail_message = "They're holding all the laughter of those who cannot be seen here. The mounds begins to shamble, upon borrowed hands and feet, it has your scent now and it will never be satisfied."
+ observation_choices = list(
+ "I recognize those faces" = list(TRUE, "From the mountain of bodies; the dead give their life to be something greater. Why shouldn't they be smiling? You should be smiling too."),
+ "I don't recognize them" = list(FALSE, "They're holding all the laughter of those who cannot be seen here. The mounds begins to shamble, upon borrowed hands and feet, it has your scent now and it will never be satisfied."),
+ )
/// Is user performing work hurt at the beginning?
var/agent_hurt = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm
index 148b47f23906..097af62c51a3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm
@@ -37,10 +37,12 @@
observation_prompt = "I have no plans or destination. I'm too tired to fly. With no one to guide me, and no path open to me. It is my fate to play the fool. \
Before I do, I turn to face the 4 Magical Girls. Are they just like me, or am I just like them?"
- observation_choices = list("They've become me", "I came to resemble them")
- correct_choices = list("They've become me", "I came to resemble them")
- observation_success_message = "It doesn't matter. My choices do not matter. \
- Nothing matters. We will repeat this song and dance until the end of time. I can only laugh at this pointless endeavor."
+ observation_choices = list(
+ "They've become me" = list(TRUE, "It doesn't matter. My choices do not matter. \
+ Nothing matters. We will repeat this song and dance until the end of time. I can only laugh at this pointless endeavor."),
+ "I came to resemble them" = list(TRUE, "It doesn't matter. My choices do not matter. \
+ Nothing matters. We will repeat this song and dance until the end of time. I can only laugh at this pointless endeavor."),
+ )
var/can_act = TRUE
//Teleports
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm
index 8e967b5c9a37..2acde60cb37e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm
@@ -47,11 +47,11 @@
observation_prompt = "No matter where you walk to in the cell, the mirror is always facing you. You trace a path around it but all you ever see is your own reflection. \
\"It's not fair, why do you get to be you and not me?\" Your reflection mutters, parroting your voice. \"Why are you, you and not I? I could be you so much better than you can, just let me try.\" \
Your reflection is holding out its hand, waiting for a handshake."
- observation_choices = list("Shake their hand", "Turn away and leave")
- correct_choices = list("Turn away and leave")
- observation_success_message = "You make to exit the cell. \"Don't just leave me! I'm somebody, I'm real! I'm..! What's my name?! Just give me your name!\" \
- You don't give your name to the imitation, the closer it starts to mirrors another, the more its mimicry becomes mockery."
- observation_fail_message = "The you in the mirror smiles. \"Just you wait, I'll show you what we can do.\""
+ observation_choices = list(
+ "Turn away and leave" = list(TRUE, "You make to exit the cell. \"Don't just leave me! I'm somebody, I'm real! I'm..! What's my name?! Just give me your name!\" \
+ You don't give your name to the imitation, the closer it starts to mirrors another, the more its mimicry becomes mockery."),
+ "Shake their hand" = list(FALSE, "The you in the mirror smiles. \"Just you wait, I'll show you what we can do.\""),
+ )
//Contained Variables
var/reflect_timer
@@ -231,7 +231,7 @@
datum_reference.qliphoth_change(-1)
/mob/living/simple_animal/hostile/abnormality/nobody_is/BreachEffect(mob/living/carbon/human/user, breach_type)
- if(!(status_flags & GODMODE)) // Already breaching
+ if(current_stage > 1)
return
if(reflect_timer)
deltimer(reflect_timer)
@@ -240,6 +240,8 @@
return
CheckMirrorIcon() //Clear overlays
next_stage()
+ if(breach_type == BREACH_MINING)
+ return
// Teleport us somewhere where nobody will see us at first
var/list/priority_list = list()
for(var/turf/T in GLOB.xeno_spawn)
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm
index 697aed7b31f4..dbcb2945a3c7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm
@@ -50,16 +50,16 @@
observation_prompt = "*Teeth grinding* Incomprehensible sounds can be heard. \
Its body was already broken long time ago. \
The twisted mouth opens, the crushed down tongue undulates. \"M-ma......man-ag......r.......\" It's calling for the manager."
- observation_choices = list("Approach it", "Ignore it")
- correct_choices = list("Ignore it")
- observation_success_message = "A chunk of flesh dropped from the mouth to the ground, depriving the abnormality an ability to talk. \
- It's talking inside the body of an employee. But it is not the employee who speaks. \
- The sound of calling me. Is nothing but an empty shell mimicking a dead person. \
- How many employees would have suffered to this sound? It keeps getting closer to human. \
- It keeps trying. However, as always, at the end, Nothing there."
- observation_fail_message = "I think of people who were friends with this employee. \
- Those eyes, shoulders, and every bit of muscle belong to someone else. \
- It smiles. No, it pretends to smile. Who could be it?"
+ observation_choices = list(
+ "Ignore it" = list(TRUE, "A chunk of flesh dropped from the mouth to the ground, depriving the abnormality an ability to talk. \
+ It's talking inside the body of an employee. But it is not the employee who speaks. \
+ The sound of calling me. Is nothing but an empty shell mimicking a dead person. \
+ How many employees would have suffered to this sound? It keeps getting closer to human. \
+ It keeps trying. However, as always, at the end, Nothing there."),
+ "Approach it" = list(FALSE, "I think of people who were friends with this employee. \
+ Those eyes, shoulders, and every bit of muscle belong to someone else. \
+ It smiles. No, it pretends to smile. Who could be it?"),
+ )
var/mob/living/disguise = null
var/saved_appearance
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm
index 58e3f6ce6d54..6c72ba7c8440 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm
@@ -53,14 +53,14 @@
observation_prompt = "I'm standing outside a forest I both have never seen before, yet know well. There is no City, no civilization on the horizon, I am utterly alone. \
Dauntlessly, I press into the forest, seeing no other path forward, and encounter a cute-looking, pink forest spirit. \
The spirits of the forest are playful, but it's best not to offend them by forgetting to make an offering"
- observation_choices = list("Make an offering", "Continue on")
- correct_choices = list("Make an offering")
- observation_success_message = "I ask the spirit to lead me to an altar to make my offering and it leads me off a beaten path... \
- It felt as though I had walked for miles and days, my clothes torn and skin pricked by brambles and thorns but finally we arrived. \
- Before me is a skull-headed pagan God hanging ominously over its altar, fear grips my heart as the pink spirit leads me to lay down on the altar..."
- observation_fail_message = "I pass by the spirit and hear it giggle ominously... \
- ... \
- In the end, I am never able to find a way out of the forest."
+ observation_choices = list(
+ "Make an offering" = list(TRUE, "I ask the spirit to lead me to an altar to make my offering and it leads me off a beaten path... \
+ It felt as though I had walked for miles and days, my clothes torn and skin pricked by brambles and thorns but finally we arrived. \
+ Before me is a skull-headed pagan God hanging ominously over its altar, fear grips my heart as the pink spirit leads me to lay down on the altar..."),
+ "Continue on" = list(FALSE, "I pass by the spirit and hear it giggle ominously... \
+ ... \
+ In the end, I am never able to find a way out of the forest."),
+ )
//Var Lists
var/list/season_stats = list(
@@ -322,8 +322,9 @@
ZeroQliphoth()
return
. = ..()
- var/turf/T = pick(GLOB.department_centers)
- forceMove(T)
+ if(breach_type != BREACH_MINING)
+ var/turf/T = pick(GLOB.department_centers)
+ forceMove(T)
//Weather controlling
/mob/living/simple_animal/hostile/abnormality/seasons/proc/CheckWeather()
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm
index f59c6b39bbe2..4633fa6f3632 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm
@@ -38,10 +38,10 @@
observation_prompt = "I was the conductor of Lobotomy Corporation, I put my everything into it. \
Now, I conduct the song of apocalypse to make everything right. As if he is about to start the performance, he stretches his arm. \
The conductor, who thought he is the freest soul, was not free at all. The performance ended. I......."
- observation_choices = list("Gave an applause.", "Did not give applause.")
- correct_choices = list("Did not give applause.")
- observation_success_message = "I am not worthy to give an applause yet. The music replays. Angelos, my movement."
- observation_fail_message = "The performance never ends. And Da Capo."
+ observation_choices = list(
+ "Did not give applause" = list(TRUE, "I am not worthy to give an applause yet. The music replays. Angelos, my movement."),
+ "Gave an applause" = list(FALSE, "The performance never ends. And Da Capo."),
+ )
/// Range of the damage
var/symphony_range = 20
@@ -154,8 +154,9 @@
/mob/living/simple_animal/hostile/abnormality/silentorchestra/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
- var/turf/T = pick(GLOB.department_centers)
- forceMove(T)
+ if(breach_type != BREACH_MINING)
+ var/turf/T = pick(GLOB.department_centers)
+ forceMove(T)
DamagePulse()
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm
index 7bf0e34b9883..3411a393b14c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm
@@ -37,16 +37,15 @@
observation_prompt = "What touched this place cannot be quantified or understood by human science. It was just a color out of space. \
It exists on the border of our waking minds, where darkness and light are one, and time and space do not intersect. She has a message, from another place, another time."
- observation_choices = list("Hear the past", "Hear the present", "Hear the future")
- correct_choices = list("Hear the past", "Hear the present", "Hear the future")
- observation_success_message = "What I learned and saw during those two hideous days and nights, it is better not to tell."
- //Extra correct answers
- var/observation_success_message_2 = "A thousand years compressed into a day, a countably infinite number of people work, die and live in its corridors; \
- the line between them and the monsters they keep gets blurrier and blurrier. \
- A seed is about to sprout..."
- var/observation_success_message_3 = "The Library is what the Bookhunters call it, a mystical place of life and death. \
- Should you conquer its trials, they say, you can find the book that will grant the answers to whatever it is you seek. \
- Black feathers and regret..."
+ observation_choices = list(
+ "Hear the past" = list(TRUE, "What I learned and saw during those two hideous days and nights, it is better not to tell."),
+ "Hear the present" = list(TRUE, "A thousand years compressed into a day, a countably infinite number of people work, die and live in its corridors; \
+ the line between them and the monsters they keep gets blurrier and blurrier. \
+ A seed is about to sprout..."),
+ "Hear the future" = list(TRUE, "The Library is what the Bookhunters call it, a mystical place of life and death. \
+ Should you conquer its trials, they say, you can find the book that will grant the answers to whatever it is you seek. \
+ Black feathers and regret..."),
+ )
var/explosion_timer = 2 SECONDS
var/explosion_state = 3
@@ -54,16 +53,6 @@
var/can_act = TRUE
var/negative_range = 10
-/mob/living/simple_animal/hostile/abnormality/space_lady/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answers
- switch(answer)
- if("Hear the present")
- observation_success_message = observation_success_message_2
- if("Hear the future")
- observation_success_message = observation_success_message_3
- else
- observation_success_message = initial(observation_success_message)
- return ..()
-
//She can't move or attack.
/mob/living/simple_animal/hostile/abnormality/space_lady/Move()
if(!can_act)
@@ -261,7 +250,8 @@
/mob/living/simple_animal/hostile/abnormality/space_lady/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
- Teleport()
+ if(breach_type != BREACH_MINING)
+ Teleport()
//Bullets
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/staining_rose.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/staining_rose.dm
index 543547368a77..3021d1820aa9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/staining_rose.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/staining_rose.dm
@@ -35,10 +35,10 @@
observation_prompt = "This isn't worth being called a sacrifice, is it? I've always wanted to be a hero, but... Even when I'm ordered forth to die a worthless death... \
I find myself laughable for deciding to do it still. I joined this company to save people. If I can save the lives of those I love, I have no regrets."
- observation_choices = list("100 paper roses")
- correct_choices = list("100 paper roses")
- observation_success_message = "I was the only one who could do it... \
- ... that's all."
+ observation_choices = list(
+ "100 paper roses" = list(TRUE, "I was the only one who could do it... \
+ ... that's all."),
+ )
var/chosen
var/list/sacrificed = list()
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm
index 031ada2a568e..61ac54db2a42 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm
@@ -37,10 +37,11 @@
abnormality_origin = ABNORMALITY_ORIGIN_WONDERLAB
observation_prompt = "Is that you Oberon? My nemesis, my beloved devil. Is it you, who applied the concotion of baneful herb to my eyes?"
- observation_choices = list("I am the Oberon you seek", "I am not him", "Stay silent")
- correct_choices = list("I am the Oberon you seek")
- observation_success_message = "The abhorrent name of the one who stole my child. By your death, I shall finally have my revenge."
- observation_fail_message = "Ah... A mere human, human, human. Cease your fear, I shall rid you of your pains. Be reborn as a flower."
+ observation_choices = list(
+ "I am the Oberon you seek" = list(TRUE, "The abhorrent name of the one who stole my child. By your death, I shall finally have my revenge."),
+ "I am not him" = list(FALSE, "Ah... A mere human, human, human. Cease your fear, I shall rid you of your pains. Be reborn as a flower."),
+ "Stay silent" = list(FALSE, "Ah... A mere human, human, human. Cease your fear, I shall rid you of your pains. Be reborn as a flower."),
+ )
var/fairy_spawn_number = 2
var/fairy_spawn_time = 5 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm
index eb7ece82cc32..1eb98f8c4c18 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm
@@ -54,10 +54,11 @@ GLOBAL_LIST_EMPTY(apostles)
observation_prompt = "Thou knocked the door, now it hath opened. \
Thou who carries burden, came to seek the answer."
- observation_choices = list("Who are you?", "Where did you come from?", "Why have you come?")
- correct_choices = list("Where did you come from?")
- observation_success_message = "I am from the end." //TODO: multiple messages, the answer should be irrelevant, code should check for wing gift.
- observation_fail_message = "Thy question is empty, I cannot answer"
+ observation_choices = list( // TODO IN A FEW YEARS: multiple messages, the answer should be irrelevant, code should check for wing gift.
+ "Where did you come from?" = list(TRUE, "I am from the end." ),
+ "Who are you?" = list(FALSE, "Thy question is empty, I cannot answer"),
+ "Why have you come?" = list(FALSE, "Thy question is empty, I cannot answer"),
+ )
var/holy_revival_cooldown
var/holy_revival_cooldown_base = 75 SECONDS
@@ -221,6 +222,9 @@ GLOBAL_LIST_EMPTY(apostles)
return
/mob/living/simple_animal/hostile/abnormality/white_night/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ qdel(src)
+ return
holy_revival_cooldown = world.time + holy_revival_cooldown_base
. = ..()
for(var/mob/M in GLOB.player_list)
diff --git a/code/modules/mob/living/simple_animal/abnormality/final_observations.dm b/code/modules/mob/living/simple_animal/abnormality/final_observations.dm
index 644bc23b0e08..bf6253461cd8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/final_observations.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/final_observations.dm
@@ -61,9 +61,9 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
var/dat = {"
[message]
"}
var/menu_width = 200
- for(var/i in 1 to buttons.len)
+ for(var/i in 1 to length(buttons))
menu_width += 150
- switch(buttons.len)
+ switch(length(buttons))
if(1)
dat += {"[buttons[i]]"}
if(2)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/KHz.dm b/code/modules/mob/living/simple_animal/abnormality/he/KHz.dm
index 72f0f11cbf53..995466a98a6d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/KHz.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/KHz.dm
@@ -36,17 +36,17 @@
\"Sierra... Oscar... Sierra...\" \
What could this callsign mean? \
Are you in danger, or is someone else? What will you do?"
- observation_choices = list("Tune your radio to 680 KHz", "Ignore it")
- correct_choices = list("Tune your radio to 680 KHz")
- observation_success_message = "Suddenly, you hear something from your radio, clear as day. \
- \"We hear you loud and clear.\" \
- \"You've done a great service.\" \
- The operator on the other end continues babbling, completely obscured by the returning static. \
- However, it seems you somehow managed solve their problem somehow."
- observation_fail_message = "You turn off your radio and leave the room. \
- All abnormalities are dangerous, right? \
- This cry for help could just be a trick to make you let your guard down. \
- If there is anyone really out there, they are going to have to fend for themselves."
+ observation_choices = list(
+ "Tune your radio to 680 KHz" = list(TRUE, "Suddenly, you hear something from your radio, clear as day. \
+ \"We hear you loud and clear.\" \
+ \"You've done a great service.\" \
+ The operator on the other end continues babbling, completely obscured by the returning static. \
+ However, it seems you somehow managed solve their problem somehow."),
+ "Ignore it" = list(FALSE, "You turn off your radio and leave the room. \
+ All abnormalities are dangerous, right? \
+ This cry for help could just be a trick to make you let your guard down. \
+ If there is anyone really out there, they are going to have to fend for themselves."),
+ )
var/input
var/bitposition = 4 //You write in bits. You need to successfully write a string of 5 to sucessfully work
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm b/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
index 01200cdfbd8e..c2a38ab4f8bb 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
@@ -58,17 +58,17 @@
Is that leakage antifreeze, or blood? \
While you were wondering, the terminal on its chest flashed to life. \
Looks like you can write something."
- observation_choices = list("Hello", "Goodbye")
- correct_choices = list("Hello")
- observation_success_message = "The robot lifts both arms with some struggle. \
- The terminal prints out its words: \
- \
- A smile is displayed on the terminal, \
- but in the robot’s gestures, you feel a plea for help."
- observation_fail_message = "The terminal’s light goes red, and warnings start to blare. \
- The robot shakes intensely as if in pain. \
- Farewell, FarewellFarewellFarewellFarewellFarewellFarewellFarewellFarewellFarewell>"
+ observation_choices = list(
+ "Hello" = list(TRUE, "The robot lifts both arms with some struggle. \
+ The terminal prints out its words: \
+ \
+ A smile is displayed on the terminal, \
+ but in the robot’s gestures, you feel a plea for help."),
+ "Goodbye" = list(FALSE, "The terminal’s light goes red, and warnings start to blare. \
+ The robot shakes intensely as if in pain. \
+ Farewell, FarewellFarewellFarewellFarewellFarewellFarewellFarewellFarewellFarewell>"),
+ )
var/can_act = TRUE
var/grab_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/ardor_blossom_moth.dm b/code/modules/mob/living/simple_animal/abnormality/he/ardor_blossom_moth.dm
index 7fe79a3374cc..39ea7bfee4dd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/ardor_blossom_moth.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/ardor_blossom_moth.dm
@@ -9,6 +9,7 @@
portrait = "blossom_moth"
maxHealth = 1200
health = 1200
+ blood_volume = 0
ranged = TRUE
attack_verb_continuous = "sears"
attack_verb_simple = "sear"
@@ -47,18 +48,18 @@
The lights flutter and dance in the air, creating a haze. \
Something is burning to death within. \
Would you be scorched as well if the flames touched you?"
- observation_choices = list("Turn around", "Reach out")
- correct_choices = list("Reach out")
- observation_success_message = "Enchanted by the haze, you extend a finger, \
- waiting for one of the lights to land. \
- A glimmering ball gently perches on your digit. \
- Then, a fire engulfs it. \
- Another glow attaches to your body, then four, then eight. \
- They multiply until you have been entirely shrouded in light."
- observation_fail_message = "Resisting the temptation to reach out, \
- you decide it’s better to stay away from such dubious warmth. \
- You feel a cold wave crawl up your spine in an instant, but it may be the right choice. \
- Even children know not to play with fire."
+ observation_choices = list(
+ "Reach out" = list(TRUE, "Enchanted by the haze, you extend a finger, \
+ waiting for one of the lights to land. \
+ A glimmering ball gently perches on your digit. \
+ Then, a fire engulfs it. \
+ Another glow attaches to your body, then four, then eight. \
+ They multiply until you have been entirely shrouded in light."),
+ "Turn around" = list(FALSE, "Resisting the temptation to reach out, \
+ you decide it’s better to stay away from such dubious warmth. \
+ You feel a cold wave crawl up your spine in an instant, but it may be the right choice. \
+ Even children know not to play with fire."),
+ )
var/stoked
@@ -87,6 +88,8 @@
qdel(floor_fire)
new /obj/structure/turf_fire(T)
+/mob/living/simple_animal/hostile/abnormality/ardor_moth/spawn_gibs()
+ return new /obj/effect/decal/cleanable/ash(drop_location(), src)
// Turf Fire
/obj/structure/turf_fire
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm b/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm
index ffcab6d3f22a..ddb350595253 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm
@@ -44,10 +44,10 @@
abnormality_origin = ABNORMALITY_ORIGIN_LIMBUS
observation_prompt = "In front of me is a brass soup cauldron with a wooden ladle, I look inside the pot and see only water and a singular stone, boiling over an open fire."
- observation_choices = list("Taste the soup", "Knock it over")
- correct_choices = list("Taste the soup")
- observation_success_message = "I take the ladle and sip the contents, the taste is indescribably good. It truly is magic."
- observation_fail_message = "The contents put out the flames as the pot tumbles the floor, water and a singular stone coat the floor. Soup from a stone? Ridiculous."
+ observation_choices = list(
+ "Taste the soup" = list(TRUE, "I take the ladle and sip the contents, the taste is indescribably good. It truly is magic."),
+ "Knock it over" = list(FALSE, "The contents put out the flames as the pot tumbles the floor, water and a singular stone coat the floor. Soup from a stone? Ridiculous."),
+ )
var/spit_cooldown
var/spit_cooldown_time = 12 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm b/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm
index 4da625147411..4c90b4d99f2e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm
@@ -38,11 +38,11 @@
observation_prompt = "In the pile around the abnormality, you find a old card. You almost forgot about them. \
A pink light grows and you feel a tug on your memory."
- observation_choices = list("Let go", "Hold on")
- correct_choices = list("Let go")
- observation_success_message = "You let go of the memory forever. You look forward to the day you can make a memory like that again."
- observation_fail_message = "You pull the letter back from the pink light inside the abnormality's gate. \
- The memory becomes more and more vivid as if its happening now... when you finally break free you cannot recall what you fought so hard for."
+ observation_choices = list(
+ "Let go" = list(TRUE, "You let go of the memory forever. You look forward to the day you can make a memory like that again."),
+ "Hold on" = list(FALSE, "You pull the letter back from the pink light inside the abnormality's gate. \
+ The memory becomes more and more vivid as if its happening now... when you finally break free you cannot recall what you fought so hard for."),
+ )
var/minions = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm b/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm
index c975fded23b4..8fd1263f5a06 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm
@@ -55,11 +55,11 @@
observation_prompt = "Got nothing better to do than to watch me? Anyway, while I'm lazing around... \
The wolf is coming down the hill. I'm the only one who can stop it, if you let me out I'll save you from the Wolf. \
So, how about it?"
- observation_choices = list("Release him", "You're a liar")
- correct_choices = list("You're a liar")
- observation_success_message = "Hmph. Sad ain't it? It only waits for me, I'm free to abandon it all I wish. \
- Lifeless things like that mutt and I don't deserve love but it'll wait for me all the same. Does anyone wait for you?"
- observation_fail_message = "Good choice, don't worry about the rest - I won't hurt them, pinky swear."
+ observation_choices = list(
+ "You're a liar" = list(TRUE, "Hmph. Sad ain't it? It only waits for me, I'm free to abandon it all I wish. \
+ Lifeless things like that mutt and I don't deserve love but it'll wait for me all the same. Does anyone wait for you?"),
+ "Release him" = list(FALSE, "Good choice, don't worry about the rest - I won't hurt them, pinky swear."),
+ )
var/death_counter //He won't go off a timer, he'll go off deaths. Takes 8 for him.
var/slash_current = 4
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/der_freischutz.dm b/code/modules/mob/living/simple_animal/abnormality/he/der_freischutz.dm
index 3c4f8946c466..287708da1645 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/der_freischutz.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/der_freischutz.dm
@@ -38,11 +38,11 @@
observation_prompt = "Before you stands a man with an ornate rifle. \
\"My bullets never miss, whatever I take aim at will have its head pierced true by the inevitability of my bullets. \
If you have a target, you only need to make the payment.\""
- observation_choices = list("Pay for his services", "Don't pay")
- correct_choices = list("Pay for his services")
- observation_success_message = "True to his word, the marksman racks a bullet into his rifle, takes aim and fires at your target, piercing their head, but it travels on. \
- Piercing the heads of others, forever."
- observation_fail_message = "The man scowls. \"Don't waste my time with such shaky conviction.\""
+ observation_choices = list(
+ "Pay for his services" = list(TRUE, "True to his word, the marksman racks a bullet into his rifle, takes aim and fires at your target, piercing their head, but it travels on. \
+ Piercing the heads of others, forever."),
+ "Don't pay" = list(FALSE, "The man scowls. \"Don't waste my time with such shaky conviction.\""),
+ )
var/can_act = TRUE
var/bullet_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm b/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm
index acc1dcd9d956..3239d01b4ff8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm
@@ -47,11 +47,11 @@
observation_prompt = "I'm standing before an altar on top of an impossibly long flight of stairs, the sky is crimson red and the heat from the air licks at my skin painfully. The world is ending. \
On the altar is a tied and bound man with a clay mask on his head, he squirms and is clearly crying but I cannot hear his words. \
In my hand is a dagger. I know what I have to do."
- observation_choices = list("Plunge the dagger into his chest", "Cut his bindings")
- correct_choices = list("Plunge the dagger into his chest")
- observation_success_message = "I'm laying on an altar, a heavy clay mask is on my head, my arms and legs are tied with thick rope and the air is hot enough to scald my skin. \
- I see the priest through the pinholes of the mask and plead for him to spare me, before I feel cold metal plunge into my chest."
- observation_fail_message = "I cut the man free and he thanks me profusely before he speeds down the stairs. He won't make it. I close my eyes and accept the end."
+ observation_choices = list(
+ "Plunge the dagger into his chest" = list(TRUE, "I'm laying on an altar, a heavy clay mask is on my head, my arms and legs are tied with thick rope and the air is hot enough to scald my skin. \
+ I see the priest through the pinholes of the mask and plead for him to spare me, before I feel cold metal plunge into my chest."),
+ "Cut his bindings" = list(FALSE, "I cut the man free and he thanks me profusely before he speeds down the stairs. He won't make it. I close my eyes and accept the end."),
+ )
var/player_count
var/other_works_maximum
@@ -188,9 +188,10 @@
//***Breach Mechanics***//
/mob/living/simple_animal/hostile/abnormality/doomsday_calendar/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
- var/turf/T = pick(GLOB.department_centers)
+ if(breach_type != BREACH_MINING)
+ var/turf/T = pick(GLOB.department_centers)
+ forceMove(T)
icon_state = "doomsday_active"
- forceMove(T)
AnnounceBreach()
SpawnAdds()
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm b/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm
index 8edc2fd37fd5..43160193074f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm
@@ -55,20 +55,20 @@
The umbrellas jiggled. It belongs to someone who was assigned to work on \"Eris\", not too long ago. \
\"Not hungry? Perhaps you'd like to visit my boudoir?\" \
Vile, disgusting. I want to get out of here."
- observation_choices = list("Accept her proposal", "Run")
- correct_choices = list("Run")
- observation_success_message = "I get up from the table, make an excuse, and bolt for the door as fast as I can. \
- Surprisingly, it's not locked. I hear the imitation of a young woman's voice on my way out. \
- \"Come back soon, sweetie!\" \"You're always invited to dinner, and i'll be sure to serve you one day!\""
- observation_fail_message = "How bad can it be? I follow Eris as she leads me into a room. \
- Hours later, Eris dines with another stranger. My head is resting on that very same plate."
+ observation_choices = list(
+ "Run" = list(TRUE, "I get up from the table, make an excuse, and bolt for the door as fast as I can. \
+ Surprisingly, it's not locked. I hear the imitation of a young woman's voice on my way out. \
+ \"Come back soon, sweetie!\" \"You're always invited to dinner, and i'll be sure to serve you one day!\""),
+ "Accept her proposal" = list(FALSE, "How bad can it be? I follow Eris as she leads me into a room. \
+ Hours later, Eris dines with another stranger. My head is resting on that very same plate."),
+ )
var/girlboss_level = 0
- var/can_heal = TRUE
/mob/living/simple_animal/hostile/abnormality/eris/Login()
. = ..()
@@ -64,7 +63,7 @@
|Humanoid Disguise|: You are only able to attack humans who only have a very low amount of health, or if they are dead. \
If they attack a human who fulfills the above conditions, you will devor them, and gain a stack of 'Girl Boss' \
\
- |Dine with me...|: Every second, you heal ALL targets that you can see if they are bellow half health. \
+ |Dine with me...|: Every second, you heal ALL targets that you can see. \
Your healing increases depending on the amount of 'Girl Boss' you have. \
\
|Elegant Form|: When you are attacked by a human, deal WHITE damage to the attack. This damage is increase depending on your 'Girl Boss' stacks.")
@@ -192,17 +191,12 @@
//Okay, but here's the math
/mob/living/simple_animal/hostile/abnormality/eris/proc/healpulse()
for(var/mob/living/H in view(10, get_turf(src)))
- can_heal = TRUE
if(H.stat >= SOFT_CRIT)
continue
//Shamelessly fucking stolen from risk of rain's teddy bear. Maxes out at 20.
- if(SSmaptype.maptype == "rcorp")
- if(H.health > H.maxHealth*0.5)
- can_heal = FALSE
- if (can_heal == TRUE)
- var/healamount = 20 * (TOUGHER_TIMES(girlboss_level))
- H.adjustBruteLoss(-healamount) //Healing for those around.
- new /obj/effect/temp_visual/heal(get_turf(H), "#FF4444")
+ var/healamount = 20 * (TOUGHER_TIMES(girlboss_level))
+ H.adjustBruteLoss(-healamount) //Healing for those around.
+ new /obj/effect/temp_visual/heal(get_turf(H), "#FF4444")
//Okay but here's the defensive options
/mob/living/simple_animal/hostile/abnormality/eris/bullet_act(obj/projectile/Proj)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/fan.dm b/code/modules/mob/living/simple_animal/abnormality/he/fan.dm
index cfd7e649c539..860ddbb56832 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/fan.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/fan.dm
@@ -29,13 +29,12 @@
observation_prompt = "It's an ordinary office fan, made of metal. It's turned off for now and you're feeling warm. \
Turn it on?"
- observation_choices = list("Leave it off", "Set it to 1", "Set it to 2", "Set it to 3") //Waiting for multiple answers
- correct_choices = list("Set it to 3")
- observation_success_message = "You set it to its highest setting. The breeze feels pleasant, a nap would be nice..."
- observation_fail_message = "It's just an old urban legend, but, they say fans like this one can kill people if you slept with them on..."
- //extra wrong answers
- var/observation_fail_message_2 = "It's not enough, you're still too hot!"
- var/observation_fail_message_3 = "You can barely feel a breeze, you just need a little more..."
+ observation_choices = list(
+ "Set it to 3" = list(TRUE, "You set it to its highest setting. The breeze feels pleasant, a nap would be nice..."),
+ "Leave it off" = list(FALSE, "It's just an old urban legend, but, they say fans like this one can kill people if you slept with them on..."),
+ "Set it to 1" = list(FALSE, "It's not enough, you're still too hot!"),
+ "Set it to 2" = list(FALSE, "You can barely feel a breeze, you just need a little more..."),
+ )
var/list/safe = list()
var/list/warning = list()
@@ -45,16 +44,6 @@
var/successcount
var/turned_off = FALSE
-/mob/living/simple_animal/hostile/abnormality/fan/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answers
- switch(answer)
- if("Set it to 1")
- observation_fail_message = observation_fail_message_2
- if("Set it to 2")
- observation_fail_message = observation_fail_message_3
- else
- observation_fail_message = initial(observation_success_message)
- return ..()
-
/mob/living/simple_animal/hostile/abnormality/fan/examine(mob/user)
. = ..()
if(turned_off)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm b/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm
index 22579ba67f24..bec5674e7fdb 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm
@@ -9,6 +9,7 @@
del_on_death = FALSE
maxHealth = 1350 //I am a menace to society.
health = 1350
+ blood_volume = 0
ranged = TRUE
minimum_distance = 2
@@ -47,19 +48,18 @@
observation_prompt = "A tall butterfly-faced man stands before, clad in an undertakers's garment. \
Between the two of you is a coffin and he gestures you towards it with all 3 of his hands."
- observation_choices = list("Enter the coffin", "Don't enter the coffin")
- correct_choices = list("Enter the coffin", "Don't enter the coffin")
- observation_success_message = "You lie down in the coffin as the butterfly-faced man stands by, his head angled and all 3 hands crossed together over his waist in a solemn gesture. \
- It's a perfect fit for you. \
- You feel the weight of innumerable lifetimes and the weariness that came with them. \
- The butterflies lift you and the coffin as pallbearers, they lament for you in place of the people who cannot."
- //Special answer for choice 2
- var/observation_success_message_2 = "You don't enter because it's not your coffin. \
- The undertaker reaches out his middle hand to his waiting, insectile audience and one of the butterflies lands upon his fingers. \
- He offers you the butterfly and you place it into the coffin, gently. \
- The butterflies are the souls of the dead, waiting to be put to rest, but are still mourning for the living. \
- You and the butterfly-faced man stand in silent vigil. You both now share a vow; to grieve for the living and dead. \
- A kaledioscope of butterflies follows you as you leave the containment unit."
+ observation_choices = list(
+ "Enter the coffin" = list(TRUE, "You lie down in the coffin as the butterfly-faced man stands by, his head angled and all 3 hands crossed together over his waist in a solemn gesture. \
+ It's a perfect fit for you. \
+ You feel the weight of innumerable lifetimes and the weariness that came with them. \
+ The butterflies lift you and the coffin as pallbearers, they lament for you in place of the people who cannot."),
+ "Don't enter the coffin" = list(TRUE, "You don't enter because it's not your coffin. \
+ The undertaker reaches out his middle hand to his waiting, insectile audience and one of the butterflies lands upon his fingers. \
+ He offers you the butterfly and you place it into the coffin, gently. \
+ The butterflies are the souls of the dead, waiting to be put to rest, but are still mourning for the living. \
+ You and the butterfly-faced man stand in silent vigil. You both now share a vow; to grieve for the living and dead. \
+ A kaledioscope of butterflies follows you as you leave the containment unit."),
+ )
var/gun_cooldown
var/gun_cooldown_time = 4 SECONDS
@@ -85,13 +85,6 @@
toggle_message = span_colossus("You will now fire butterflies from your hands.")
button_icon_toggle_deactivated = "funeral_toggle0"
-/mob/living/simple_animal/hostile/abnormality/funeral/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answer for cake result
- if(answer == "Don't enter the coffin")
- observation_success_message = observation_success_message_2
- else
- observation_success_message = initial(observation_success_message)
- return ..()
-
/mob/living/simple_animal/hostile/abnormality/funeral/AttackingTarget(atom/attacked_target)
return OpenFire()
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm b/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm
index 095b60e7985d..f97dff0f18ab 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm
@@ -31,12 +31,12 @@
observation_prompt = "You entered the containment chamber. \
A child is standing there. \"I know who you are.\" \
\"Of course. We were born from each other.\" You decided to......."
- observation_choices = list("Stay", "Exit the chamber")
- correct_choices = list("Exit the chamber")
- observation_success_message = "You turned your back to the child and walked out. \
- The pebble in your hands sparkles sways, and tickles. It becomes the universe. \
- \"Goodbye. I hope you never come back.\" As the child bid the cold farewell, he was smiling."
- observation_fail_message = "\"Will you stay here with me?\" \"If you won't, I don't need you.\""
+ observation_choices = list(
+ "Exit the chamber" = list(TRUE, "You turned your back to the child and walked out. \
+ The pebble in your hands sparkles sways, and tickles. It becomes the universe. \
+ \"Goodbye. I hope you never come back.\" As the child bid the cold farewell, he was smiling."),
+ "Stay" = list(FALSE, "\"Will you stay here with me?\" \"If you won't, I don't need you.\""),
+ )
var/heal_cooldown_time = 2 SECONDS
var/heal_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm b/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm
index c64e06360d4c..a615a31ce644 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm
@@ -77,12 +77,12 @@
observation_prompt = "A giant, glistening golden apple stands before you. \
Radiant, shining, and pure. There is a tempting crack in it, what could possibly be inside?"
- observation_choices = list("Slice it open", "Destroy it")
- correct_choices = list("Destroy it")
- observation_success_message = "You put the golden apple to the torch. You hear a sickening pops and sizzling as the swarm of maggots inside begins to burn and scatter. \
- The mass of maggots falls apart in a hail of silent screams."
- observation_fail_message = "You slice open the apple, and a tidal wave of disgusting maggots bursts out. \
- You are swept in the tide. Your flesh is riddled with wounds as they slowly devour you."
+ observation_choices = list(
+ "Destroy it" = list(TRUE, "You put the golden apple to the torch. You hear a sickening pops and sizzling as the swarm of maggots inside begins to burn and scatter. \
+ The mass of maggots falls apart in a hail of silent screams."),
+ "Slice it open" = list(FALSE, "You slice open the apple, and a tidal wave of disgusting maggots bursts out. \
+ You are swept in the tide. Your flesh is riddled with wounds as they slowly devour you."),
+ )
var/is_maggot = FALSE
var/can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/happy_teddy_bear.dm b/code/modules/mob/living/simple_animal/abnormality/he/happy_teddy_bear.dm
index 06ebd8c9da67..81db9a187aa3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/happy_teddy_bear.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/happy_teddy_bear.dm
@@ -35,11 +35,11 @@
observation_prompt = "Here lies a piece of rubbish, a teddy bear. Its wool sticks out here and there. \
The amount of dust piled up on it tells how long this teddy has been abandoned. One of the buttons, which are eyes, is hanging loose."
- observation_choices = list("Leave it alone", "Take the button off")
- correct_choices = list("Take the button off")
- observation_success_message = "You took the button off. It was disturbing for some reason. The button is old and rotten and makes you uncomfortable. \
- You replace the button with one off your suit with great care. While the teddy looks awkward because of the mismatching buttons, it adds to its charm."
- observation_fail_message = "You don't know what to do with it so you just left it alone. The teddy sits there without any movement."
+ observation_choices = list(
+ "Take the button off" = list(TRUE, "You took the button off. It was disturbing for some reason. The button is old and rotten and makes you uncomfortable. \
+ You replace the button with one off your suit with great care. While the teddy looks awkward because of the mismatching buttons, it adds to its charm."),
+ "Leave it alone" = list(FALSE, "You don't know what to do with it so you just left it alone. The teddy sits there without any movement."),
+ )
/// if the same person works on Happy Teddy Bear twice in a row, the person will die unless certain requirements are met.
var/last_worker = null
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm b/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm
index 8884cfb82e27..e85c6efb1559 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm
@@ -45,12 +45,12 @@
observation_prompt = "Deep, deep, at the bottom of the sea, a creature lies, dreaming. \
It seems to be holding on to a sack of fluid. What will you do?"
- observation_choices = list("Try and swim away", "Puncture the sack")
- correct_choices = list("Try and swim away")
- observation_success_message = "You swim upwards, hoping it doesn't notice you. \
- Surprisingly, after a few seconds you break the water's surface and make your escape. You find a trinket in your pocket."
- observation_fail_message = "You cannot get close enough, the water slows your movements. \
- The creature notices you, and prepares an attack. It is impossible to evade, and you are torn to shreds."
+ observation_choices = list(
+ "Try and swim away" = list(TRUE, "You swim upwards, hoping it doesn't notice you. \
+ Surprisingly, after a few seconds you break the water's surface and make your escape. You find a trinket in your pocket."),
+ "Puncture the sack" = list(FALSE, "You cannot get close enough, the water slows your movements. \
+ The creature notices you, and prepares an attack. It is impossible to evade, and you are torn to shreds."),
+ )
var/can_act = TRUE
var/jump_cooldown = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/helper.dm b/code/modules/mob/living/simple_animal/abnormality/he/helper.dm
index db599e2cff4d..1dce0f740d9a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/helper.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/helper.dm
@@ -14,6 +14,7 @@
death_message = "falls to the ground, deactivating."
maxHealth = 1000
health = 1000
+ blood_volume = 0
rapid_melee = 4
ranged = TRUE
attack_verb_continuous = "slashes"
@@ -53,11 +54,11 @@
)
observation_prompt = "Is fun to clean. I was..."
- observation_choices = list("You are special")
- correct_choices = list("You are special")
- observation_success_message = "There were many friends who looked like me. I was special. \
- My creator always said to me. \"You have to be sent to her. You are special. You can give them a very special present.\" \
- Numbers of tools, which were devoid of for my friends, were put into me. When I was sent to a new home, I gave them a present."
+ observation_choices = list(
+ "You are special" = list(TRUE, "There were many friends who looked like me. I was special. \
+ My creator always said to me. \"You have to be sent to her. You are special. You can give them a very special present.\" \
+ Numbers of tools, which were devoid of for my friends, were put into me. When I was sent to a new home, I gave them a present."),
+ )
var/charging = FALSE
var/dash_num = 50
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/highway_devotee.dm b/code/modules/mob/living/simple_animal/abnormality/he/highway_devotee.dm
index f10a2c18fd2e..e86523788ca4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/highway_devotee.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/highway_devotee.dm
@@ -39,17 +39,17 @@
\"This is a one-way road. No U-turns.\" \
\"If you take this road, it'll take ages to come back here.\" \
As the person claims, the road seems to be stretched almost endlessly into the distance."
- observation_choices = list("Go back the way you came instead of taking the main road", "Take the byway instead of taking the main road")
- correct_choices = list("Go back the way you came instead of taking the main road")
- observation_success_message = "\"The road might seem vacant right now, but take it for a bit and you'll see. That the road is jam-packed with cars, and you'd be slowed to a crawl.\" \
- \"Turning around is not an option, either. There would be a car right behind you by the time you decide to go back.\" \
- \"You made the right choice.\" \
- It lightly smiled. \
- The sign was still held high for whoever might enter this highway in the future."
- observation_fail_message = "\"Not a good choice.\" \
- \"Everyone is following the same rules to traverse this road. In any case, this highway is for everyone.\" \
- \"I assure you, the god of traffic won't forgive cheap shortcuts like that.\" \
- As you take the byway, you endured the piercing glare on your back for a good while."
+ observation_choices = list(
+ "Go back the way you came instead of taking the main road" = list(TRUE, "\"The road might seem vacant right now, but take it for a bit and you'll see. That the road is jam-packed with cars, and you'd be slowed to a crawl.\" \
+ \"Turning around is not an option, either. There would be a car right behind you by the time you decide to go back.\" \
+ \"You made the right choice.\" \
+ It lightly smiled. \
+ The sign was still held high for whoever might enter this highway in the future."),
+ "Take the byway instead of taking the main road" = list(FALSE, "\"Not a good choice.\" \
+ \"Everyone is following the same rules to traverse this road. In any case, this highway is for everyone.\" \
+ \"I assure you, the god of traffic won't forgive cheap shortcuts like that.\" \
+ As you take the byway, you endured the piercing glare on your back for a good while."),
+ )
var/talk = FALSE
var/list/structures = list()
@@ -90,8 +90,9 @@
/mob/living/simple_animal/hostile/abnormality/highway_devotee/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
- var/turf/T = pick(GLOB.xeno_spawn)
- forceMove(T)
+ if(breach_type != BREACH_MINING)
+ var/turf/T = pick(GLOB.xeno_spawn)
+ forceMove(T)
addtimer(CALLBACK(src, PROC_REF(KillYourself)), 3 MINUTES)
dir = pick(list(NORTH, SOUTH, WEST, EAST))
for(var/turf/open/U in range(2, src))
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/jangsan.dm b/code/modules/mob/living/simple_animal/abnormality/he/jangsan.dm
index ca564b2af7ac..b78b3eb7c62d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/jangsan.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/jangsan.dm
@@ -46,13 +46,13 @@
observation_prompt = "I'm in a field of flowers, the flowers are my friends. There are many kinds of friends but I wish to pluck them all. \
Some friends have thorns and hurt when I try to pick them. Before me is a particularly juicy, thornless flower."
- observation_choices = list("Pluck the flower", "Smell it")
- correct_choices = list("Smell it")
- observation_success_message = "The flower shuffles away from me as I draw near, the scent is enticing but I do not pluck it. \
- There's always time to stop and enjoy the flowers."
- observation_fail_message = "The flower lets out a scream as I pluck it with my teeth, its ichor stains my teeth and fur red - \
- the other thornless flowers scream in unison and flee in all directions whilst the thorniest ones scratch my fur and skin. \
- Flowers are my friends and I shall pluck them all."
+ observation_choices = list(
+ "Smell it" = list(TRUE, "The flower shuffles away from me as I draw near, the scent is enticing but I do not pluck it. \
+ There's always time to stop and enjoy the flowers."),
+ "Pluck the flower" = list(FALSE, "The flower lets out a scream as I pluck it with my teeth, its ichor stains my teeth and fur red - \
+ the other thornless flowers scream in unison and flee in all directions whilst the thorniest ones scratch my fur and skin. \
+ Flowers are my friends and I shall pluck them all."),
+ )
var/bullet_threshold = 40
//breach related
@@ -193,7 +193,8 @@
. = ..()
if(!datum_reference.abno_radio)
AbnoRadio()
- addtimer(CALLBACK(src, PROC_REF(TryTeleport)), 5)
+ if(breach_type != BREACH_MINING)
+ addtimer(CALLBACK(src, PROC_REF(TryTeleport)), 5)
/mob/living/simple_animal/hostile/abnormality/jangsan/proc/TryTeleport() //stolen from knight of despair
dir = 2
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm b/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm
index 5cde37ce7594..b237c364e6a8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm
@@ -34,14 +34,18 @@
observation_prompt = "This place is so gloomy, everyone always seems so sad and they don't smile. \
It's lonely to be sad, so, this little lady has been secretly giving them all presents filled with friends! \
Did they like the surprise?"
- observation_choices = list("Tell the truth", "Lie and say they did")
- correct_choices = list("Tell the truth")
- observation_success_message = "Oh, that's sad... Even if they're my friends, that doesn't mean they're your friends as well. \
- I won't give you a present, but, could you stay and play with me some more today?"
- observation_fail_message = "I'm glad! I wish I could have seen their faces, I bet they were so surprised! \
- You look lonely too, I hope my present will make you laugh as well!"
+ observation_choices = list(
+ "Tell the truth" = list(TRUE, "Oh, that's sad... Even if they're my friends, that doesn't mean they're your friends as well. \
+ I won't give you a present, but, could you stay and play with me some more today?"),
+ "Lie and say they did" = list(FALSE, "I'm glad! I wish I could have seen their faces, I bet they were so surprised! \
+ You look lonely too, I hope my present will make you laugh as well!"),
+ )
attack_action_types = list(/datum/action/cooldown/laetitia_gift, /datum/action/cooldown/laetitia_summon)
+ var/breaching = FALSE
+ var/summon_cooldown
+ var/summon_cooldown_time = 60 SECONDS
+ var/summon_count = 0
/datum/action/cooldown/laetitia_summon
name = "Call for Friends"
@@ -49,7 +53,7 @@
button_icon_state = "prank_gift"
check_flags = AB_CHECK_CONSCIOUS
transparent_when_unavailable = TRUE
- cooldown_time = 40 SECONDS
+ cooldown_time = 60 SECONDS
var/delete_timer
var/delete_cooldown = 30 SECONDS
var/mob/living/simple_animal/hostile/gift/G1
@@ -139,6 +143,12 @@
qdel(src)
opening = FALSE
+/mob/living/simple_animal/hostile/abnormality/laetitia/Life()
+ . = ..()
+ if(!breaching)
+ return
+ if((summon_cooldown < world.time) && !(status_flags & GODMODE))
+ SummonAdds()
/mob/living/simple_animal/hostile/abnormality/laetitia/NeutralEffect(mob/living/carbon/human/user, work_type, pe)
. = ..()
@@ -168,6 +178,19 @@
P.TriggerPrank()
return
+/mob/living/simple_animal/hostile/abnormality/laetitia/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ breaching = TRUE
+ return ..()
+
+/mob/living/simple_animal/hostile/abnormality/laetitia/proc/SummonAdds()//Mining breach summon
+ summon_cooldown = world.time + summon_cooldown_time
+ if(summon_count > 9)//this list is not subtracted when minions are killed. Limited to 10 per breach
+ return
+ var/turf/target_turf = get_turf(src)
+ new /mob/living/simple_animal/hostile/gift(target_turf)
+ summon_count += 1
+
//Her friend
/mob/living/simple_animal/hostile/gift
name = "Little Witch's Friend"
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm b/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm
index 592bdc5f7a3d..2b66b610840b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm
@@ -37,11 +37,10 @@
observation_prompt = "She was so pale at the end, she looked more like a porcelain doll than the little girl I knew, \
laughing and smiling that bright colourful smile I loved so much. I sat next to her bed, powerless to do anything."
- observation_choices = list("Hold her hand")
- correct_choices = list("Hold her hand")
- observation_success_message = "Her skin was clammy and cool to the touch and not a trace of a pulse to be found, she passed the night before. \
- It didn't mean anything. In the corner of the room, I saw the reaper bow his head in apology."
-
+ observation_choices = list(
+ "Hold her hand" = list(TRUE, "Her skin was clammy and cool to the touch and not a trace of a pulse to be found, she passed the night before. \
+ It didn't mean anything. In the corner of the room, I saw the reaper bow his head in apology."),
+ )
var/meltdown_cooldown //no spamming the meltdown effect
var/meltdown_cooldown_time = 15 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm b/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm
index 49d3371c0710..26639dd3739a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm
@@ -31,13 +31,13 @@
observation_prompt = "The baby never cries. It kept that way forever. \
As a lack of words doesn't necessarily mean a lack of emotions, a lack of crying doesn't mean lack of desire. \
Since time unknown, the baby has had a mouth. The baby who does not understand cries, expresses hunger, and causes pain for the others. You..."
- observation_choices = list("Call its name.", "Didn't call its name.")
- correct_choices = list("Call its name.")
- observation_success_message = "No one else knows the name of the fetus. \
- But you know. You called its name. \
- The unstoppable desire shut its mouth for a while. Even only for a short time, the desire silenced."
- observation_fail_message = "The fetus is still crying. \
- You plugged your ears silently. No sound is heard."
+ observation_choices = list(
+ "Call its name" = list(TRUE, "No one else knows the name of the fetus. \
+ But you know. You called its name. \
+ The unstoppable desire shut its mouth for a while. Even only for a short time, the desire silenced."),
+ "Didn't call its name" = list(FALSE, "The fetus is still crying. \
+ You plugged your ears silently. No sound is heard."),
+ )
var/mob/living/carbon/human/calling = null
var/criesleft
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm b/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm
index b022b656de48..9083b339d94e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm
@@ -46,22 +46,22 @@
You have been tasked to work on this creature. \
What type of work will you attempt? \
Choose carefully."
- observation_choices = list("Try to make friends with it", "Inject Cogito")
- correct_choices = list("Inject Cogito")
- observation_success_message = "You prepare to start instinct work . \
- ... \
- Checking Vitals \
- ... \
- Adjusting Fluid Intake \
- ... \
- Allocating 37% Cogito \
- ... \
- The work is complete, you report the good result to the work log."
- observation_fail_message = "Surely such a cute thing must be friendly, right? \
- It seems you have not learned your lesson \
- The split fox senses your intent. \
- It opens up, revealing a core connected to several sharp cutting tools \
- You are too close to get away."
+ observation_choices = list(
+ "Inject Cogito" = list(TRUE, "You prepare to start instinct work . \
+ ... \
+ Checking Vitals \
+ ... \
+ Adjusting Fluid Intake \
+ ... \
+ Allocating 37% Cogito \
+ ... \
+ The work is complete, you report the good result to the work log."),
+ "Try to make friends with it" = list(FALSE, "Surely such a cute thing must be friendly, right? \
+ It seems you have not learned your lesson \
+ The split fox senses your intent. \
+ It opens up, revealing a core connected to several sharp cutting tools \
+ You are too close to get away."),
+ )
//breach related
var/can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/pinocchio.dm b/code/modules/mob/living/simple_animal/abnormality/he/pinocchio.dm
index 092ff9c9dcf4..7aa6b4458bb8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/pinocchio.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/pinocchio.dm
@@ -34,10 +34,10 @@
observation_prompt = "I've been watching people for as long as I've known them, it's not hard to imitate others. \
Can I be a human if I mimic humans?"
- observation_choices = list("You're human", "You will never be a human")
- correct_choices = list("You will never be a human")
- observation_success_message = "Can I... not become a human..? You could've let me fool you, you're too cruel."
- observation_fail_message = "Did I look just like a human? I hope I fooled you, it's other people's fault for falling for my lies."
+ observation_choices = list(
+ "You will never be a human" = list(TRUE, "Can I... not become a human..? You could've let me fool you, you're too cruel."),
+ "You're human" = list(FALSE, "Did I look just like a human? I hope I fooled you, it's other people's fault for falling for my lies."),
+ )
var/lying = FALSE
var/caught_lie = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/pisc_mermaid.dm b/code/modules/mob/living/simple_animal/abnormality/he/pisc_mermaid.dm
index 8a3b6fd41b37..e29abca9607e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/pisc_mermaid.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/pisc_mermaid.dm
@@ -51,14 +51,14 @@
if you said I did not need to see then I'd scoop out my eyes as well.\" She splashes her aquamarine tail, foam, water and something else was flicked towards you. \
\"I made you a gift, just wear it and say that you love me too.\" \
The water carries the comb to your feet, you pick it up as she watches you expectantly."
- observation_choices = list("Accept the comb", "Cast it into the sea")
- correct_choices = list("Cast it into the sea")
- observation_success_message = "\"I don't understand, don't you love me? Can't you hear, see or understand my love? \
- If I give you my eyes, my ears and my brain, could you percieve and learn to love me too? Just please trade me your heart to fill this void in my chest...\" \
- You left the mermaid to her babble, love could never be something so transactional."
- observation_fail_message = "You place the comb in your hair and the mermaid smiles, her pupils like tiny hearts, and you find yourself walking into the depths as she embraces you. \
- \"I'm so happy you gave me your heart...\" She whispers as she draws you into a kiss, pulling you further and further into the waves, the water passing your chest and then your head but still she wouldn't release her embrace. \
- Salt water fills your lungs as you lose consciousness."
+ observation_choices = list(
+ "Cast it into the sea" = list(TRUE, "\"I don't understand, don't you love me? Can't you hear, see or understand my love? \
+ If I give you my eyes, my ears and my brain, could you percieve and learn to love me too? Just please trade me your heart to fill this void in my chest...\" \
+ You left the mermaid to her babble, love could never be something so transactional."),
+ "Accept the comb" = list(FALSE, "You place the comb in your hair and the mermaid smiles, her pupils like tiny hearts, and you find yourself walking into the depths as she embraces you. \
+ \"I'm so happy you gave me your heart...\" She whispers as she draws you into a kiss, pulling you further and further into the waves, the water passing your chest and then your head but still she wouldn't release her embrace. \
+ Salt water fills your lungs as you lose consciousness."),
+ )
response_help_continuous = "pets" //You sick fuck
response_help_simple = "pet"
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm b/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm
index cff432a39da1..57400d22e5f3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm
@@ -46,22 +46,39 @@
observation_prompt = "The red flower waits expectantly for you as you enter the containment unit, \
studying your movements it leans down towards you and bares its thorns to you."
- observation_choices = list("Touch the thorns", "Just observe")
- correct_choices = list("Just observe")
- observation_success_message = "The flower pulls back when it realises you make no effort to try and touch it. \
- You study it and it studies you back, it only ever wanted to make people happy the only way it knew how. \
- You turn to leave, resolving to chase after happiness with your own power."
- observation_fail_message = "The thorns prick your hands and you feel an indescribable rush of pleasure. \
- Poppy flowers like this one have ruined many lives and now it's ruined yours, but for now - you're happy."
+ observation_choices = list(
+ "Just observe" = list(TRUE, "The flower pulls back when it realises you make no effort to try and touch it. \
+ You study it and it studies you back, it only ever wanted to make people happy the only way it knew how. \
+ You turn to leave, resolving to chase after happiness with your own power."),
+ "Touch the thorns" = list(FALSE, "The thorns prick your hands and you feel an indescribable rush of pleasure. \
+ Poppy flowers like this one have ruined many lives and now it's ruined yours, but for now - you're happy."),
+ )
//the agent that started work on porccubus
var/agent_ckey
var/teleport_cooldown_time = 5 MINUTES
var/teleport_cooldown
var/damage_taken = FALSE
+ var/leap_recharge_time = 2 SECONDS
+ var/leap_charges = 3
+ var/max_leap_charges = 3
+ var/timer_added = FALSE
+ var/in_charging = FALSE
+ var/noteleport = FALSE
+ attack_action_types = list(/datum/action/innate/abnormality_attack/toggle/porccubus_dash_toggle)
+
+/mob/living/simple_animal/hostile/abnormality/porccubus/Login()
+ . = ..()
+ if(!. || !client)
+ return FALSE
+ to_chat(src, "
You are Porccubus, A Tank Role Abnormality.
\
+ |Fluttering|: You are immune to all projectiles. However you are unable to move. \
+ However, If you click on a tile that is at least 3 tiles away from you. You will spend a leap charge to dash to that tile. \
+ You regain a leap charge every 3 seconds, and you can hold a max of 3 at a time. \
+ \
+ |Happiness|: Your melee attack has a range of 2 tiles.")
//PLAYABLE ATTACKS
- attack_action_types = list(/datum/action/innate/abnormality_attack/toggle/porccubus_dash_toggle)
/datum/action/innate/abnormality_attack/toggle/porccubus_dash_toggle
name = "Toggle Dash"
@@ -132,11 +149,13 @@
//it does have a dash that makes it able to jump around, but it can't properly "roam" per say.
/mob/living/simple_animal/hostile/abnormality/porccubus/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
+ if(breach_type == BREACH_MINING)
+ noteleport = TRUE
playsound(src, 'sound/abnormalities/porccubus/head_explode_laugh.ogg', 50, FALSE, 4)
icon_living = "porrcubus"
icon_state = icon_living
ranged_cooldown = world.time + ranged_cooldown_time
- if(!IsCombatMap())
+ if(!IsCombatMap() && (breach_type != BREACH_MINING))
var/turf/T = pick(GLOB.xeno_spawn)
forceMove(T)
teleport_cooldown = world.time + teleport_cooldown_time
@@ -148,7 +167,7 @@
. = ..()
if(status_flags & GODMODE)
return
- if(IsCombatMap())
+ if(IsCombatMap() || noteleport)
return
if(teleport_cooldown < world.time) //if porccubus hasn't taken damage for 5 minutes we make him move so he doesn't stay stuck in whatever cell he got thrown in.
teleport_cooldown = world.time + teleport_cooldown_time
@@ -171,31 +190,52 @@
//Breach Code Attacks
/mob/living/simple_animal/hostile/abnormality/porccubus/OpenFire(atom/A)
if(client)
- if(ranged_cooldown > world.time || chosen_attack != 1)
- RangedAttack(A)
+ if(!IsCombatMap())
+ if(ranged_cooldown > world.time || chosen_attack != 1)
+ RangedAttack(A)
switch(chosen_attack)
if(1)
- PorcDash(target)
+ DashChecker(target)
return
if(!target)
return
if(!isliving(target))
return
- PorcDash(A)
+ DashChecker(A)
-/mob/living/simple_animal/hostile/abnormality/porccubus/proc/PorcDash(atom/target)//additionally, it can dash to its target every 15 seconds if it's out of range
+/mob/living/simple_animal/hostile/abnormality/porccubus/proc/DashChecker(atom/target)
var/dist = get_dist(target, src)
- if(dist > 2 && ranged_cooldown < world.time)
- ranged_cooldown = world.time + ranged_cooldown_time
- var/list/dash_line = getline(src, target)
- for(var/turf/line_turf in dash_line) //checks if there's a valid path between the turf and the friend
- if(line_turf.is_blocked_turf(exclude_mobs = TRUE))
- break
- forceMove(line_turf)
- SLEEP_CHECK_DEATH(0.8)
- playsound(src, 'sound/abnormalities/porccubus/porccu_giggle.ogg', 10, FALSE, 4) // This thing is absurdly loud
- ranged_cooldown = world.time + ranged_cooldown_time
+ if(IsCombatMap())
+ if(dist > 2 && leap_charges > 0 && !in_charging)
+ PorcDash(target)
+ else
+ if(dist > 2 && ranged_cooldown < world.time)
+ ranged_cooldown = world.time + ranged_cooldown_time
+ PorcDash(target)
+
+/mob/living/simple_animal/hostile/abnormality/porccubus/proc/PorcDash(atom/target)//additionally, it can dash to its target every 15 seconds if it's out of range
+ // var/dist = get_dist(target, src)
+ // if(IsCombatMap())
+ // if(dist > 2 && charges > 0)
+ // else
+ // if(dist > 2 && ranged_cooldown < world.time)
+ // ranged_cooldown = world.time + ranged_cooldown_time
+ in_charging = TRUE
+ var/list/dash_line = getline(src, target)
+ for(var/turf/line_turf in dash_line) //checks if there's a valid path between the turf and the friend
+ if(line_turf.is_blocked_turf(exclude_mobs = TRUE))
+ break
+ forceMove(line_turf)
+ SLEEP_CHECK_DEATH(1)
+ playsound(src, 'sound/abnormalities/porccubus/porccu_giggle.ogg', 10, FALSE, 4) // This thing is absurdly loud
+ ranged_cooldown = world.time + ranged_cooldown_time
+ if(IsCombatMap())
+ leap_charges -= 1
+ if(!timer_added)
+ addtimer(CALLBACK(src, PROC_REF(AddCharge)), leap_recharge_time)
+ timer_added = TRUE
+ in_charging = FALSE
/mob/living/simple_animal/hostile/abnormality/porccubus/AttackingTarget(atom/attacked_target)
var/mob/living/carbon/human/H
@@ -214,6 +254,15 @@
LoseTarget()
H.faction += "porccubus" //that guy's already fucked, even if they can kill porccubus safely now, porccubus has done its job of being a cunt
+/mob/living/simple_animal/hostile/abnormality/porccubus/proc/AddCharge()
+ if(leap_charges < max_leap_charges)
+ leap_charges++
+ to_chat(src, " You now have [leap_charges]/[max_leap_charges] leap charges.")
+ timer_added = FALSE
+ if(leap_charges < max_leap_charges)
+ addtimer(CALLBACK(src, PROC_REF(AddCharge)), leap_recharge_time)
+ timer_added = TRUE
+
//Drug Item
//this is only obtainable if someone else dies from the addiction, but it's the only way to get drugged without working on porccubus
/obj/item/porccubus_drug
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm b/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm
index 9d08c797ec9b..c2d8a079f79c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm
@@ -43,10 +43,10 @@
observation_prompt = "The miller, my old master, when he passed he left his mill, his donkey and myself to his three sons. \
I was left to the youngest and the elders denied him any right to the mill. I felt for the poor lad and so, I turned the young master into a Prince, \
and one day a King. I can do the same for you - Are you ready to claim your inheritance?"
- observation_choices = list("Yes", "No")
- correct_choices = list("Yes")
- observation_success_message = "Excellent, by my paw you shall make a fine master, envy of all your peers!"
- observation_fail_message = "Bah! When will someone worthy arrive?"
+ observation_choices = list(
+ "Yes" = list(TRUE, "Excellent, by my paw you shall make a fine master, envy of all your peers!"),
+ "No" = list(FALSE, "Bah! When will someone worthy arrive?"),
+ )
//Work/misc Vars
var/list/stats = list(
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm b/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm
index bdf534a73aa2..da9b74176a80 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm
@@ -51,14 +51,14 @@
observation_prompt = "You enter the containment unit and see a cartoonish-looking dog collapsed in the centre, shivering from pain and inflicted with terribly deep, red wounds. \
\"My master wants a wolf...\" It says breathlessly. \"I'm waiting for my master, waiting, waiting... I'm waiting for them...\""
- observation_choices = list("Hug and console it", "Beat it within an inch of it's life")
- correct_choices = list("Hug and console it")
- observation_success_message = "You hold the wounded animal in your arms as it continues to shake. \
- \"I shook my split tail hard until flesh fell off it, I lied flat on the floor and begged... My heart for my Master...\" \
- Finally it stops shivering and wounds stopped appearing on its body. \"Left only red scars...\""
- observation_fail_message = "You pull out your baton and hit the animal over and over again, kicking, spitting and cursing at it but it never reacts to any of your abuse beyond hastening its transformation. \
- The skinless dog now stands above you, neither wolf nor dog. \"You can't stop a wolf with a touch gentler than my master's. I'm a wolf, vile and vicious, belonging to my master.\" \
- The faux-wolf eats you in one bite."
+ observation_choices = list(
+ "Hug and console it" = list(TRUE, "You hold the wounded animal in your arms as it continues to shake. \
+ \"I shook my split tail hard until flesh fell off it, I lied flat on the floor and begged... My heart for my Master...\" \
+ Finally it stops shivering and wounds stopped appearing on its body. \"Left only red scars...\""),
+ "Beat it within an inch of it's life" = list(FALSE, "You pull out your baton and hit the animal over and over again, kicking, spitting and cursing at it but it never reacts to any of your abuse beyond hastening its transformation. \
+ The skinless dog now stands above you, neither wolf nor dog. \"You can't stop a wolf with a touch gentler than my master's. I'm a wolf, vile and vicious, belonging to my master.\" \
+ The faux-wolf eats you in one bite."),
+ )
///The blue smocked shepherd linked to red buddy
var/datum/abnormality/master
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm b/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm
index 3f1108e854fa..00a1a90fe099 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm
@@ -27,10 +27,12 @@
observation_prompt = "This abnormality has a notorious reputation for being particularly dry to work with. It's hard to tell what it's thinking or what work it prefers. \
What type of work will you attempt?"
- observation_choices = list(ABNORMALITY_WORK_INSTINCT, ABNORMALITY_WORK_INSIGHT, ABNORMALITY_WORK_ATTACHMENT, ABNORMALITY_WORK_REPRESSION)
- correct_choices = list(ABNORMALITY_WORK_INSTINCT) // Matches Red Queen's real preferred work. This default is set to stop warnings
- observation_success_message = "You are granted an audience with the red queen. Today, you were able to to satisfy her unpredictable whims"
- observation_fail_message = "You narrowly dodge the card-guillotine coming for your neck, that was close, let's try something else."
+ observation_choices = list( // Matches Red Queen's real preferred work.
+ ABNORMALITY_WORK_INSTINCT = list(FALSE, "You narrowly dodge the card-guillotine coming for your neck, that was close, let's try something else."),
+ ABNORMALITY_WORK_INSIGHT = list(FALSE, "You narrowly dodge the card-guillotine coming for your neck, that was close, let's try something else."),
+ ABNORMALITY_WORK_ATTACHMENT = list(FALSE, "You narrowly dodge the card-guillotine coming for your neck, that was close, let's try something else."),
+ ABNORMALITY_WORK_REPRESSION = list(FALSE, "You narrowly dodge the card-guillotine coming for your neck, that was close, let's try something else."),
+ )
var/liked
/mob/living/simple_animal/hostile/abnormality/red_queen/Initialize(mapload)
@@ -41,8 +43,7 @@
/mob/living/simple_animal/hostile/abnormality/red_queen/PostSpawn()
. = ..()
- correct_choices = list()
- correct_choices += liked
+ observation_choices[liked] = list(TRUE, "You are granted an audience with the red queen. Today, you were able to to satisfy her unpredictable whims")
/mob/living/simple_animal/hostile/abnormality/red_queen/PostWorkEffect(mob/living/carbon/human/user, work_type, pe)
if(work_type != liked)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm b/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm
index 75cb8f4e67e1..d90f2a1d685a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm
@@ -39,14 +39,14 @@
observation_prompt = "There is a pair of red shoes. \
It could be sitting in front of me, or in my feet. I am......"
- observation_choices = list("Wearing them.", "Not wearing them.")
- correct_choices = list("Wearing them.") //TODO: Second line of dialogue, must be coded
- observation_success_message = "I am wearing the shoes. \
- They are perfect fit, it feels good. I have a weird feeling as if I am in another world. \
- There is a sharp axe in front of me. Maybe it was there all along, or maybe I just haven't realized it until now. \
- A weapon will change a lot of things."
- observation_fail_message = "I was not wearing the shoes. \
- The shoes' crimson color is getting deeper."
+ observation_choices = list( //TODO: Second line of dialogue, must be coded
+ "Wearing them." = list(TRUE, "I am wearing the shoes. \
+ They are perfect fit, it feels good. I have a weird feeling as if I am in another world. \
+ There is a sharp axe in front of me. Maybe it was there all along, or maybe I just haven't realized it until now. \
+ A weapon will change a lot of things."),
+ "Not wearing them." = list(FALSE, "I was not wearing the shoes. \
+ The shoes' crimson color is getting deeper."),
+ )
var/mutable_appearance/breach_icon
var/mob/living/possessee
@@ -201,8 +201,6 @@
//BreachEffect and combat
/mob/living/simple_animal/hostile/abnormality/red_shoes/BreachEffect(mob/living/carbon/human/user, breach_type)
- if(!(status_flags & GODMODE))
- return
soundloop.stop()
for(var/mob/living/carbon/human/H in GLOB.mob_living_list)//stops possessing people, prevents runtimes. Panicked players are ghosted so use mob_living_list
UnPossess(H)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm b/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm
index 2558c1664fa4..bb265a41fb8f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm
@@ -44,10 +44,10 @@
)
observation_prompt = "Last of all, road that is lost. I will send you home. The wizard grants you..."
- observation_choices = list("The home cannot be reached", "The road home")
- correct_choices = list("The home cannot be reached")
- observation_success_message = "What are you fighting for so fiercely when you have nowhere to go back to?"
- observation_fail_message = "Wear this pair of shoes and be on your way. To the hometown you miss so much."
+ observation_choices = list(
+ "The home cannot be reached" = list(TRUE, "What are you fighting for so fiercely when you have nowhere to go back to?"),
+ "The road home" = list(FALSE, "Wear this pair of shoes and be on your way. To the hometown you miss so much."),
+ )
///Stuff related to the house and its path
var/obj/road_house/house
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm b/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm
index e8499bdda61c..773508bbe338 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm
@@ -44,12 +44,12 @@
That night, when everyone was sleeping. I waited for the man, sitting next to sleeping Alex. \
Sometimes, for someone, an absurd fairy tale is a silver lining of hope. When I met Santa, I imagined dismembering him. ... \
In front of me is Santa. My ideal. People don't call it Santa. Something is twitching inside of that sack. I......"
- observation_choices = list("Opened the sack.", "Did not open the sack.")
- correct_choices = list("Did not open the sack.")
- observation_success_message = "Inside of the sack is a desire. \
- A hope that I've been waiting for since when I was very young. I never opened the sack. Did you wish come true?"
- observation_fail_message = "There was something that I have been longing for my entire life. \
- Like Pandora's Box, it will never go back into the sack."
+ observation_choices = list(
+ "Did not open the sack" = list(TRUE, "Inside of the sack is a desire. \
+ A hope that I've been waiting for since when I was very young. I never opened the sack. Did your wish come true?"),
+ "Opened the sack" = list(FALSE, "There was something that I have been longing for my entire life. \
+ Like Pandora's Box, it will never go back into the sack."),
+ )
var/pulse_cooldown
var/pulse_cooldown_time = 1.8 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm b/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm
index 7f54df0e2df4..a9ca21951d85 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm
@@ -49,15 +49,103 @@
)
observation_prompt = "Poor stuffing of straw. I'll give you the wisdom to ponder over anything. The wizard grants you..."
- observation_choices = list("A silk sack of sawdust", "Wisdom")
- correct_choices = list("A silk sack of sawdust")
- observation_success_message = "Do you think jabbering away with your oh-so smart mouth is all that matters?"
- observation_fail_message = "Come closer. I’ll help you forget all of your woes and worries."
+ observation_choices = list(
+ "A silk sack of sawdust" = list(TRUE, "Do you think jabbering away with your oh-so smart mouth is all that matters?"),
+ "Wisdom" = list(FALSE, "Come closer. I’ll help you forget all of your woes and worries."),
+ )
/// Can't move/attack when it's TRUE
var/finishing = FALSE
var/braineating = TRUE
var/healthmodifier = 0.05 // Can restore 30% of HP
+ var/attack_healthmodifier = 0.05
+ var/target_hit = FALSE
+ var/hunger = FALSE
+
+ attack_action_types = list(/datum/action/cooldown/hungering)
+
+/mob/living/simple_animal/hostile/abnormality/scarecrow/Login()
+ . = ..()
+ if(!. || !client)
+ return FALSE
+ to_chat(src, "
You are Scarecrow Searching for Wisdom, A Tank Role Abnormality.
\
+ |Seeking Wisdom|: When you attack corpses, You heal. \
+ Unlike other abnormalities which use corpses, you are able to reuse the corpses you drain as many times as you would like. \
+ |Hungering for Wisdom|: You have an ability which causes you to enter a 'Hungering' State. \
+ While you are in the 'Hungering' State, You have increased movement speed and melee damage. As well, Your melee attack heal 5% of your max HP on hit. \
+ You will need to hit at least on human every 6 seconds in order to keep this state active. \
+ However, If you don't hit any humans you will lose 5% of your max HP, become slowed down for 3.5 seconds and lose your 'Hungering' state.")
+
+/datum/action/cooldown/hungering
+ name = "Hungering for Wisdom"
+ icon_icon = 'icons/mob/actions/actions_rcorp.dmi'
+ button_icon_state = "hungering"
+ desc = "Gain a short speed/damage boost to rush at your foes!"
+ cooldown_time = 300
+ var/speeded_up = 1.5
+ var/punishment_speed = 6
+ var/speed_duration = 60
+ var/weaken_duration = 30
+ var/min_dam_buff = 35
+ var/max_dam_buff = 40
+ var/min_dam_old
+ var/max_dam_old
+ var/old_speed
+
+/datum/action/cooldown/hungering/Trigger()
+ if(!..())
+ return FALSE
+ if (istype(owner, /mob/living/simple_animal/hostile/abnormality/scarecrow))
+ var/sound/heartbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE)
+ var/mob/living/simple_animal/hostile/abnormality/scarecrow/H = owner
+ if(H.hunger == TRUE)
+ to_chat(H, span_nicegreen("YOU ARE RUSHING RIGHT NOW!"))
+ return FALSE
+ else
+ old_speed = H.move_to_delay
+ H.move_to_delay = speeded_up
+ H.playsound_local(get_turf(H),heartbeat,40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
+ H.UpdateSpeed()
+ H.target_hit = FALSE
+ H.color = "#ff5770"
+ H.manual_emote("starts twitching...")
+ H.hunger = TRUE
+ min_dam_old = H.melee_damage_lower
+ max_dam_old = H.melee_damage_upper
+ H.melee_damage_lower = min_dam_buff
+ H.melee_damage_upper = max_dam_buff
+ to_chat(H, span_nicegreen("THEIR WISDOM, SHALL BE YOURS!"))
+ addtimer(CALLBACK(src, PROC_REF(Hunger)), speed_duration)
+ StartCooldown()
+
+/datum/action/cooldown/hungering/proc/Hunger()
+ if (istype(owner, /mob/living/simple_animal/hostile/abnormality/scarecrow))
+ var/mob/living/simple_animal/hostile/abnormality/scarecrow/H = owner
+ if (H.target_hit)
+ addtimer(CALLBACK(src, PROC_REF(Hunger)), speed_duration)
+ H.target_hit = FALSE
+ to_chat(H, span_nicegreen("YOUR FEAST CONTINUES!"))
+ else
+ H.stop_sound_channel(CHANNEL_HEARTBEAT)
+ H.melee_damage_lower = min_dam_old
+ H.melee_damage_upper = max_dam_old
+ H.move_to_delay = punishment_speed
+ H.deal_damage(100, WHITE_DAMAGE)
+ H.color = null
+ H.manual_emote("starts slowing down...")
+ to_chat(H, span_userdanger("No... I need that wisdom..."))
+ H.target_hit = TRUE
+ addtimer(CALLBACK(src, PROC_REF(RushEnd)), weaken_duration)
+ H.UpdateSpeed()
+
+/datum/action/cooldown/hungering/proc/RushEnd()
+ if (istype(owner, /mob/living/simple_animal/hostile/abnormality/scarecrow))
+ var/mob/living/simple_animal/hostile/abnormality/scarecrow/H = owner
+ H.move_to_delay = old_speed
+ to_chat(H, span_nicegreen("You calm down from your feast..."))
+ H.hunger = FALSE
+ H.UpdateSpeed()
+
/mob/living/simple_animal/hostile/abnormality/scarecrow/CanAttack(atom/the_target)
if(finishing)
@@ -80,7 +168,11 @@
if(.)
if(!istype(attacked_target, /mob/living/carbon/human))
return
- var/mob/living/carbon/human/H = attacked_target
+ target_hit = TRUE
+ if (hunger == TRUE)
+ adjustBruteLoss(-(maxHealth*attack_healthmodifier))
+ playsound(get_turf(src), 'sound/abnormalities/scarecrow/start_drink.ogg', 50, 1)
+ var/mob/living/carbon/human/H = target
if(H.health < 0 && stat != DEAD && !finishing && H.getorgan(/obj/item/organ/brain))
finishing = TRUE
H.Stun(10 SECONDS)
@@ -91,10 +183,11 @@
finishing = FALSE
return
playsound(get_turf(src), 'sound/abnormalities/scarecrow/drink.ogg', 50, 1)
- if(H.health < -120) //prevents infinite healing, corpse is too mangled
- break
+ if (!IsCombatMap())
+ if(H.health < -120) //prevents infinite healing, corpse is too mangled
+ break
+ H.adjustBruteLoss(20)
adjustBruteLoss(-(maxHealth*healthmodifier))
- H.adjustBruteLoss(20)
SLEEP_CHECK_DEATH(4)
if(!targets_from.Adjacent(H) || QDELETED(H))
finishing = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/scaredy_cat.dm b/code/modules/mob/living/simple_animal/abnormality/he/scaredy_cat.dm
index 09f75f99b91e..a7e288ed99e1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/scaredy_cat.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/scaredy_cat.dm
@@ -51,10 +51,10 @@
)
observation_prompt = "Cowardly kitten. I’ll give you the courage to stand up to anything and everything. The wizard grants you..."
- observation_choices = list("A vial of \"liquid courage\"", "Courage")
- correct_choices = list("A vial of \"liquid courage\"")
- observation_success_message = "What are you even going to do when you lack the bravery to face anything head-on?"
- observation_fail_message = "Drink this potion, it’ll give you courage. You’ll be braver than anyone."
+ observation_choices = list(
+ "A vial of \"liquid courage\"" = list(TRUE, "What are you even going to do when you lack the bravery to face anything head-on?"),
+ "Courage" = list(FALSE, "Drink this potion, it’ll give you courage. You’ll be braver than anyone."),
+ )
/// The list of abnormality scaredy cat will automatically join when they breach, add any "Oz" abno to this list if possible
var/list/prefered_abno_list = list(
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm b/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm
index 2c5847d4bdae..a2e3a9fce76a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm
@@ -39,14 +39,14 @@
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
observation_prompt = "You put on the blindfold and entered the containment unit. You can feel the metal box's gaze through the thick fabric."
- observation_choices = list("Take off the blindfold", "Feel for the wall")
- correct_choices = list("Feel for the wall")
- observation_success_message = "You turn to the wall and feel for it until you find your way back to the door. \
- The box can't ever be more than a box, it can only exist as something real in the gaze of others. Perhaps you're more alike than you think."
- observation_fail_message = "You remove the blindfold and wait a moment for your eyes to adjust to the light, your gaze meets the eye in the keyhole's. \
- The box comes to life with saws and blades, but all it is for - is to catch your attention."
+ observation_choices = list(
+ "Feel for the wall" = list(TRUE, "You turn to the wall and feel for it until you find your way back to the door. \
+ The box can't ever be more than a box, it can only exist as something real in the gaze of others. Perhaps you're more alike than you think."),
+ "Take off the blindfold" = list(FALSE, "You remove the blindfold and wait a moment for your eyes to adjust to the light, your gaze meets the eye in the keyhole's. \
+ The box comes to life with saws and blades, but all it is for - is to catch your attention."),
+ )
- var/seen //Are you being looked at right now?
+ var/seen //Are you being looked at right now?
var/solo_punish //Is an agent alone on the Z level, but not overall?
var/total_players
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm b/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm
index 8e3afad62958..c3db5dbef6bb 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm
@@ -47,22 +47,22 @@
The segments of the creature spark each time they move, suggesting faulty connections. \
There are two buttons at the tank. \
One is shaped like a thunderbolt, while the other looks like a waterdrop."
- observation_choices = list("Thunderbolt", "Water drop")
- correct_choices = list("Thunderbolt")
- observation_success_message = "You press the lightning-shaped button. \
- \"Apply stimulation and pain to the centipede to increase the discharge intensity.\" \
- So writes a message above the buttons. \
- That seems to be what this one does. \
- When you pressed it, a mechanical sound played for a short while. \
- The centipede has stopped moving."
- observation_fail_message = "You press the water drop-shaped button. \
- \"Apply stimulation and pain to the centipede to increase the discharge intensity.\" \
- So writes a message above the buttons. \
- When you pressed the drop-shaped button, the tank was filled with water. \
- The centipede twists its body as if in some sort of dance. \
- You watched the centipede’s tail scratch the tank’s surface. \
- The glass cracked and fell apart immediately afterward. \
- The electrified water fell right on your head."
+ observation_choices = list(
+ "Thunderbolt" = list(TRUE, "You press the lightning-shaped button. \
+ \"Apply stimulation and pain to the centipede to increase the discharge intensity.\" \
+ So writes a message above the buttons. \
+ That seems to be what this one does. \
+ When you pressed it, a mechanical sound played for a short while. \
+ The centipede has stopped moving."),
+ "Water drop" = list(FALSE, "You press the water drop-shaped button. \
+ \"Apply stimulation and pain to the centipede to increase the discharge intensity.\" \
+ So writes a message above the buttons. \
+ When you pressed the drop-shaped button, the tank was filled with water. \
+ The centipede twists its body as if in some sort of dance. \
+ You watched the centipede’s tail scratch the tank’s surface. \
+ The glass cracked and fell apart immediately afterward. \
+ The electrified water fell right on your head."),
+ )
// Work vars
var/bonus_pe = 6
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/silent_girl.dm b/code/modules/mob/living/simple_animal/abnormality/he/silent_girl.dm
index e83d37312eb8..0bc6489b0ca7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/silent_girl.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/silent_girl.dm
@@ -35,11 +35,11 @@
abnormality_origin = ABNORMALITY_ORIGIN_ARTBOOK
observation_prompt = "..."
- observation_choices = list("Accept your guilt", "Plead your ignorance")
- correct_choices = list("Accept your guilt")
- observation_success_message = "The nails pierce your heart as the girl in the white dress hammers them home. \
- She opens hers eyes and you meet her gaze. You're forgiven."
- observation_fail_message = "The nails pierce your heart as the girl in the white dress hammers them home."
+ observation_choices = list(
+ "Accept your guilt" = list(TRUE, "The nails pierce your heart as the girl in the white dress hammers them home. \
+ She opens hers eyes and you meet her gaze. You're forgiven."),
+ "Plead your ignorance" = list(FALSE, "The nails pierce your heart as the girl in the white dress hammers them home."),
+ )
/mob/living/simple_animal/hostile/abnormality/silent_girl/proc/GuiltEffect(mob/living/carbon/human/user, enable_qliphoth = TRUE, stack_count = 1)
if (user.stat == DEAD)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm b/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm
index 613a8844b531..df352dc5d657 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm
@@ -10,8 +10,9 @@ Finally, an abnormality that DOESN'T have to do any fancy movement shit. It's a
icon_state = "singingmachine_closed_clean"
icon_living = "singingmachine_closed_clean"
portrait = "singing_machine"
- maxHealth = 200
- health = 200
+ maxHealth = 3000
+ health = 3000
+ damage_coeff = list(RED_DAMAGE = 0.7, WHITE_DAMAGE = 0.7, BLACK_DAMAGE = 1.5, PALE_DAMAGE = 1)
threat_level = HE_LEVEL
start_qliphoth = 2
work_chances = list(
@@ -39,10 +40,10 @@ Finally, an abnormality that DOESN'T have to do any fancy movement shit. It's a
observation_prompt = "You know that people die every time this machine sings. \
Or perhaps this machine sings when people die. Though it has spilled blood of countless people, the song put you in a rapturous mood."
- observation_choices = list("Listen to the music", "Turn off the machine")
- correct_choices = list("Turn off the machine")
- observation_success_message = "You turned the machine off. Silence fills the air."
- observation_fail_message = "Aah. The music gives you sense of warm coziness and relaxation."
+ observation_choices = list(
+ "Turn off the machine" = list(TRUE, "You turned the machine off. Silence fills the air."),
+ "Listen to the music" = list(FALSE, "Aah. The music gives you sense of warm coziness and relaxation."),
+ )
var/cleanliness = "clean"
var/statChecked = 0
@@ -71,6 +72,12 @@ Finally, an abnormality that DOESN'T have to do any fancy movement shit. It's a
to_chat(H, span_warning("That terrible grinding noise..."))
return ..()
+/mob/living/simple_animal/hostile/abnormality/singing_machine/Move()
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/singing_machine/CanAttack(atom/the_target)
+ return FALSE
+
/mob/living/simple_animal/hostile/abnormality/singing_machine/AttemptWork(mob/living/carbon/human/user, work_type)
if(work_type == ABNORMALITY_WORK_INSTINCT)
if(datum_reference.qliphoth_meter > 0) // Sets bonus damage on instinct work.
@@ -148,6 +155,10 @@ Finally, an abnormality that DOESN'T have to do any fancy movement shit. It's a
playStatus = 1
return
+/mob/living/simple_animal/hostile/abnormality/singing_machine/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ ZeroQliphoth()
+
/mob/living/simple_animal/hostile/abnormality/singing_machine/proc/removeAddict(mob/living/carbon/human/addict)
if(addict)
musicalAddicts -= addict // Your five minutes are over, you're free.
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/siren.dm b/code/modules/mob/living/simple_animal/abnormality/he/siren.dm
index ed2aa27f8072..1837f70eb60d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/siren.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/siren.dm
@@ -32,14 +32,13 @@
When she passed he would play this song all the time until the vinyl began to warp. One day, I visited him after a long time and the song wasn't playing. \
\"It's not the same song,\" he'd whisper chin resting over his clenched hands, gripped together until they were as white as his knuckles. \
\"Why isn't the same song?\""
- observation_choices = list("Put the song on again", "Throw it away")
- correct_choices = list("Put the song on again")
- observation_success_message = "The record began to play, the slow warped song filled the air. \
- \"It's just not the same without her here...\""
- observation_fail_message = "You throw the old record into the trash, the well-used viny shattering. \
- \"NO! HOW CAN I REMEMBER HER NOW?\" Your grandfather wails, coming at you with fury in his eyes before stopping. \
- \"...Who were you again?\""
-
+ observation_choices = list(
+ "Put the song on again" = list(TRUE, "The record began to play, the slow warped song filled the air. \
+ \"It's just not the same without her here...\""),
+ "Throw it away" = list(FALSE, "You throw the old record into the trash, the well-used viny shattering. \
+ \"NO! HOW CAN I REMEMBER HER NOW?\" Your grandfather wails, coming at you with fury in his eyes before stopping. \
+ \"...Who were you again?\""),
+ )
//meltdown effects
var/meltdown_cooldown_time = 144 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm b/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm
index 8e369030d8a1..19367c702801 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm
@@ -20,6 +20,7 @@
mob_biotypes = MOB_MINERAL
maxHealth = 1500
health = 1500
+ blood_volume = 0
move_to_delay = 5
damage_coeff = list(BRUTE = 1, RED_DAMAGE = 1.1, WHITE_DAMAGE = 0.8, BLACK_DAMAGE = 0.8, PALE_DAMAGE = 0.8) //ASK SOMEONE GOOD AT BALANCING ABOUT THIS -IP
base_pixel_x = -16
@@ -50,10 +51,10 @@
Freezing and cold. \
You thought about it often, seeing she who couldn't see her dreams come true, trapped inside ice. \
The brave agent headed to the Snow Palace and..."
- observation_choices = list("Saved Kai", "Met the Snow Queen")
- correct_choices = list("Met the Snow Queen")
- observation_success_message = "The Snow Queen was cold and beautiful. You heard ice melting."
- observation_fail_message = "Gerda saved Kai and returned home. They lived happily ever after."
+ observation_choices = list(
+ "Met the Snow Queen" = list(TRUE, "The Snow Queen was cold and beautiful. You heard ice melting."),
+ "Saved Kai" = list(FALSE, "Gerda saved Kai and returned home. They lived happily ever after."),
+ )
ego_list = list(
/datum/ego_datum/weapon/frostsplinter,
@@ -163,7 +164,7 @@
faction += "pink_midnight"
//Call root code but with normal breach
. = ..(null, BREACH_NORMAL)
- if(!IsCombatMap())
+ if(!IsCombatMap() && breach_type != BREACH_MINING)
var/turf/T = pick(GLOB.department_centers)
forceMove(T)
update_icon()
@@ -240,6 +241,12 @@
QDEL_IN(src, 10 SECONDS)
return ..()
+//Prevents gibbing during the duel.
+/mob/living/simple_animal/hostile/abnormality/snow_queen/gib()
+ if(arena_attacks)
+ return FALSE
+ return ..()
+
//This is here so that people can see the death animation before snow queen is defeated.
/mob/living/simple_animal/hostile/abnormality/snow_queen/Destroy()
if(!storybook_hero && snow_prison)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm b/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm
index d5754d50495c..70c41ce22b8b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm
@@ -10,6 +10,7 @@
del_on_death = FALSE
maxHealth = 1600
health = 1600
+ blood_volume = 0
ranged = TRUE
attack_sound = 'sound/abnormalities/steam/attack.ogg'
friendly_verb_continuous = "bonks"
@@ -55,16 +56,16 @@
As it does its work, the number on the electronic display seems to update. \
Machines exist for a purpose. \
You feel like you should give it an order."
- observation_choices = list("Order it to carry luggage", "Order it to do nothing")
- correct_choices = list("Order it to carry luggage")
- observation_success_message = "It lifts a nearby object to carry it from left to right. \
- The count on its body went up by 1. \
- Just as you started to wonder if that was it, the machine replaced one of its vacuum tubes with a new one. \
- It presented the old one to you, and naturally, you accepted."
- observation_fail_message = "A purposeless machine is bound to lose the meaning of its existence, even if it is functional. \
- A machine whose purpose is to do nothing will do whatever it takes to achieve its directive. \
- With a loud boiling noise, the machine’s body begins to heat, expelling hot steam. \
- Seeing it glow a dangerous-looking hue, you quickly escaped the room."
+ observation_choices = list(
+ "Order it to carry luggage" = list(TRUE, "It lifts a nearby object to carry it from left to right. \
+ The count on its body went up by 1. \
+ Just as you started to wonder if that was it, the machine replaced one of its vacuum tubes with a new one. \
+ It presented the old one to you, and naturally, you accepted."),
+ "Order it to do nothing" = list(FALSE, "A purposeless machine is bound to lose the meaning of its existence, even if it is functional. \
+ A machine whose purpose is to do nothing will do whatever it takes to achieve its directive. \
+ With a loud boiling noise, the machine’s body begins to heat, expelling hot steam. \
+ Seeing it glow a dangerous-looking hue, you quickly escaped the room."),
+ )
var/gear = 0
var/steam_damage = 5
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/watchman.dm b/code/modules/mob/living/simple_animal/abnormality/he/watchman.dm
index 3c5dd95d31a2..480e506e3a9f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/watchman.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/watchman.dm
@@ -42,12 +42,12 @@
observation_prompt = "\"Natureless creatures roam the night, you should find shelter.\" \
The watchman beckons you over. You..."
- observation_choices = list("Approach", "Run away")
- correct_choices = list("Approach")
- observation_success_message = "Good. It's not safe to roam the woods at night. \
- Come now, I will guide you home."
- observation_fail_message = "You don't get far before you start hearing howling and shrieking. \
- Numerous talons, claws, and fangs bite into you all at once. Now you will know why you fear the night."
+ observation_choices = list(
+ "Approach" = list(TRUE, "Good. It's not safe to roam the woods at night. \
+ Come now, I will guide you home."),
+ "Run away" = list(FALSE, "You don't get far before you start hearing howling and shrieking. \
+ Numerous talons, claws, and fangs bite into you all at once. Now you will know why you fear the night."),
+ )
// Speech Lines
speak_chance = 4
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
index d2391773b1cb..cc91e106e49a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
@@ -59,20 +59,20 @@
but they’ll simply pretend that the passenger never existed. \
Lost and abandoned, tossed out like trash, \
having no place left in the City."
- observation_choices = list("Sit still", "Guide them out")
- correct_choices = list("Guide them out")
- observation_success_message = "You take a few steps, and the passenger follows. \
- As you draw closer to what appears to be an exit, the passenger bows down as though to show you gratitude. \
- You heard something fall; it left behind a gift. \
- Looks like it wasn't lost after all. It may have been an employee that happened to be patrolling the area. \
- Maybe you didn't guide it—maybe it was merely following you to make sure that you found the right exit."
- observation_fail_message = "It idly stared in your direction. \
- Then, it began shambling for you, realizing something. \
- As it drew closer, you were able to identify \
- that the being was an employee of a certain transport company, not a passenger. \
- The ID card on its chest gave it away. \
- This stranded employee was approaching you, \
- preparing to go through the motions."
+ observation_choices = list(
+ "Guide them out" = list(TRUE, "You take a few steps, and the passenger follows. \
+ As you draw closer to what appears to be an exit, the passenger bows down as though to show you gratitude. \
+ You heard something fall; it left behind a gift. \
+ Looks like it wasn't lost after all. It may have been an employee that happened to be patrolling the area. \
+ Maybe you didn't guide it—maybe it was merely following you to make sure that you found the right exit."),
+ "Sit still" = list(FALSE, "It idly stared in your direction. \
+ Then, it began shambling for you, realizing something. \
+ As it drew closer, you were able to identify \
+ that the being was an employee of a certain transport company, not a passenger. \
+ The ID card on its chest gave it away. \
+ This stranded employee was approaching you, \
+ preparing to go through the motions."),
+ )
//teleport vars
var/teleport_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm b/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm
index 8479aec3bff8..4adb15c013b1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm
@@ -34,13 +34,13 @@
observation_prompt = "The feathered lady dances in the centre of the containment unit to a tempo that exists only in her world, it's elegant and precise. \
\"This domain, my lunar palace, it's mine birdcage gilded with fine gold. Whatever I wish, it is brought for me and all that is expected of me is to dance. \
Even if I possessed the fortitude to bend these bars and free myself, I would not - what good comes from change? Fortitude won't avail anyone, wouldn't you agree?\""
- observation_choices = list("Agree", "Disagree")
- correct_choices = list("Agree")
- observation_success_message = "\"Hmm, you'll make for a cute decoration in mine sanctum, bear my circlet and come to your Princess' aid, won't you? \
- Protect her from witches seeking to bully this poor Lake.\" \
- She dances towards you, placing the circlet upon your head. \"Sully your hands so mine stay clean and beautiful.\" She turns away, returning to her dance."
- observation_fail_message = "\"I don't find heroes cute at all. Leave me to my dancing butcher, before you tarnish my pure-white feathers with your blood-soaked hands.\" \
- The ballerina turns away from you and continues her dance, ignoring you."
+ observation_choices = list(
+ "Agree" = list(TRUE, "\"Hmm, you'll make for a cute decoration in mine sanctum, bear my circlet and come to your Princess' aid, won't you? \
+ Protect her from witches seeking to bully this poor Lake.\" \
+ She dances towards you, placing the circlet upon your head. \"Sully your hands so mine stay clean and beautiful.\" She turns away, returning to her dance."),
+ "Disagree" = list(FALSE, "\"I don't find heroes cute at all. Leave me to my dancing butcher, before you tarnish my pure-white feathers with your blood-soaked hands.\" \
+ The ballerina turns away from you and continues her dance, ignoring you."),
+ )
/mob/living/simple_animal/hostile/abnormality/whitelake/WorkChance(mob/living/carbon/human/user, chance)
if(get_attribute_level(user, FORTITUDE_ATTRIBUTE) >= 60)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm b/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm
index f00412b1c2f8..e7c9d6cde1e0 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm
@@ -50,10 +50,10 @@
)
observation_prompt = "Tin-cold woodsman. I’ll give you the heart to forgive and love anyone. The wizard grants you..."
- observation_choices = list("A heart of lead", "A warm heart")
- correct_choices = list("A heart of lead")
- observation_success_message = "Who do you possibly expect to understand with that ice-cold heart of yours?"
- observation_fail_message = "You’re a machine, aren’t you? A heart is unnecessary for a machine."
+ observation_choices = list(
+ "A heart of lead" = list(TRUE, "Who do you possibly expect to understand with that ice-cold heart of yours?"),
+ "A warm heart" = list(FALSE, "You’re a machine, aren’t you? A heart is unnecessary for a machine."),
+ )
// Flurry Vars
var/flurry_cooldown = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm b/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm
index fc03e9af235c..c10f80f4fbf5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm
@@ -5,8 +5,9 @@
icon_state = "you_strong_pause"
icon_living = "you_strong_pause"
portrait = "grown_strong"
- maxHealth = 200
- health = 200
+ maxHealth = 2000
+ health = 2000
+ damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 1.5, BLACK_DAMAGE = 1.5, PALE_DAMAGE = 0)
threat_level = HE_LEVEL
start_qliphoth = 3
work_chances = list(
@@ -37,9 +38,9 @@
'I would never amount to anything in life or in death', I thought until one day I recieved a curious offer, a pamphlet in my mail. \
\"Have you become strong? Strong for your City? Become Strong! Strong for your City!\" The suspicious pamphlet had an address and I followed it, \
I detested my weakness and I cared not if I lived or died, I'd take any chance to not be weak. At the address was a most curious machine and an instruction to enter."
- observation_choices = list("Enter the machine")
- correct_choices = list("Enter the machine")
- observation_success_message = "I did as instructed and entered; now I have become strong, strong for my City. I love the City I live in."
+ observation_choices = list(
+ "Enter the machine" = list(TRUE, "I did as instructed and entered; now I have become strong, strong for my City. I love the City I live in."),
+ )
var/penalize = FALSE
var/work_count = 0
@@ -61,6 +62,10 @@
var/datum/looping_sound/server/soundloop
var/operating = FALSE
+ var/breaching = FALSE
+ var/summon_cooldown
+ var/summon_cooldown_time = 120 SECONDS
+ var/summon_count = 0
/mob/living/simple_animal/hostile/abnormality/you_strong/Initialize(mapload)
. = ..()
@@ -68,6 +73,19 @@
soundloop.volume = 75
soundloop.extra_range = 0
+/mob/living/simple_animal/hostile/abnormality/you_strong/Move()
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/you_strong/CanAttack(atom/the_target)
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/you_strong/Life()
+ . = ..()
+ if(!breaching)
+ return
+ if((summon_cooldown < world.time) && !(status_flags & GODMODE))
+ SummonAdds()
+
/mob/living/simple_animal/hostile/abnormality/you_strong/WorkComplete(mob/living/carbon/human/user, work_type, pe, work_time, canceled)
. = ..()
if(work_type == ABNORMALITY_WORK_REPRESSION)
@@ -123,14 +141,28 @@
icon_state = "you_strong_work"
SLEEP_CHECK_DEATH(30 SECONDS)
soundloop.stop()
- src.datum_reference.qliphoth_change(3)
+ if(datum_reference)
+ src.datum_reference.qliphoth_change(3)
icon_state = "you_strong_make"
SLEEP_CHECK_DEATH(6)
for(var/i = 1 to 3)
new /mob/living/simple_animal/hostile/grown_strong(get_step(src, EAST))
+ if(breaching)
+ summon_count += 1
SLEEP_CHECK_DEATH(6)
icon_state = "you_strong_pause"
+/mob/living/simple_animal/hostile/abnormality/you_strong/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ breaching = TRUE
+ return ..()
+
+/mob/living/simple_animal/hostile/abnormality/you_strong/proc/SummonAdds()
+ summon_cooldown = world.time + summon_cooldown_time
+ if(summon_count > 9)//this list is not subtracted when minions are killed. Limited to 10 per breach
+ return
+ ZeroQliphoth()
+
/mob/living/simple_animal/hostile/abnormality/you_strong/attacked_by(obj/item/I, mob/living/user)
if(!(I.type in taken_parts))
return ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm b/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm
index 7f219f853876..9a3577c029e9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm
@@ -11,6 +11,7 @@
base_pixel_y = -32
maxHealth = 400
health = 400
+ blood_volume = 0
start_qliphoth = 4
threat_level = TETH_LEVEL
work_chances = list(
@@ -40,11 +41,11 @@
As you wait, your radio hisses with static and ghostly voices, buried in electromagnetic snow. \
\"h...e...l...p\" \
A ghost from the past calls out, the voice is familiar but you can't place who it belongs to."
- observation_choices = list("Tune your radio to 1.76 MHz", "Forget")
- correct_choices = list("Tune your radio to 1.76 MHz")
- observation_success_message = "You tune your radio and hear her plea plain as day, her voice is like sunshine. \
- Unbridled anger and sorrow at the unfairness of it all fills you as you leave the cell."
- observation_fail_message = "But you can't forget. Not until you've atoned."
+ observation_choices = list(
+ "Tune your radio to 1.76 MHz" = list(TRUE, "You tune your radio and hear her plea plain as day, her voice is like sunshine. \
+ Unbridled anger and sorrow at the unfairness of it all fills you as you leave the cell."),
+ "Forget" = list(FALSE, "But you can't forget. Not until you've atoned."),
+ )
var/reset_time = 4 MINUTES //Qliphoth resets after this time. To prevent bugs
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/beanstalk.dm b/code/modules/mob/living/simple_animal/abnormality/teth/beanstalk.dm
index 314cb432ed0d..04f6e35dad8c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/beanstalk.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/beanstalk.dm
@@ -30,10 +30,10 @@
observation_prompt = "You remember an employee was obsessed with this abnormality. \"\
If you reach the top, you'll find what you've been looking for!\", He'd tell every employee. \
One day he did climb the beanstalk, and never came back down. Perhaps he's doing okay up there."
- observation_choices = list("Climb the beanstalk", "Chop it down")
- correct_choices = list("Chop it down") //TODO: Make this event a bit special
- observation_success_message = "If something's too big to understand, it's too big to be allowed to exist. The axe bites into the stem..."
- observation_fail_message = "You begin to climb the beanstalk, but no matter how much you climb there's always more stalk. You peer at the clouds, squinting your eyes, but still can't see anyone..."
+ observation_choices = list( //TODO: Make this event a bit special
+ "Chop it down" = list(TRUE, "If something's too big to understand, it's too big to be allowed to exist. The axe bites into the stem..."),
+ "Climb the beanstalk" = list(FALSE, "You begin to climb the beanstalk, but no matter how much you climb there's always more stalk. You peer at the clouds, squinting your eyes, but still can't see anyone..."),
+ )
var/climbing = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/beauty_beast.dm b/code/modules/mob/living/simple_animal/abnormality/teth/beauty_beast.dm
index 38b325116ed8..f2fa64186a2b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/beauty_beast.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/beauty_beast.dm
@@ -36,12 +36,12 @@
These puddles are evidence of monster's futile struggle to end its life. \
\"Kill me. Stab me with that knife you have.\" The monster cannot talk. However, the soul trapped in it can talk and I can hear it. \
\"Why are you not helping me when you can hear me?\" The monster asks reproachfully."
- observation_choices = list("Because I don't have a knife.", "Because this problem can't be solved with death.")
- correct_choices = list("Because this problem can't be solved with death.")
- observation_success_message = "'That's not important. Every single second is an agony for me. \
- Death is a prize compared to this endless pain.' \"But you are right. It is your job to solve it. Not mine.\" \
- \"Child, would you make a promise? Would you free me from this cycle when you are ready?\""
- observation_fail_message = "You are lying. You know you can pull out that knife out from your pocket whenever you want."
+ observation_choices = list(
+ "Because this problem can't be solved with death" = list(TRUE, "'That's not important. Every single second is an agony for me. \
+ Death is a prize compared to this endless pain.' \"But you are right. It is your job to solve it. Not mine.\" \
+ \"Child, would you make a promise? Would you free me from this cycle when you are ready?\""),
+ "Because I don't have a knife" = list(FALSE, "You are lying. You know you can pull out that knife out from your pocket whenever you want."),
+ )
var/injured = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm b/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm
index eb0badeb1c16..444089e1e7d7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm
@@ -4,8 +4,17 @@
icon = 'ModularTegustation/Teguicons/48x64.dmi'
icon_state = "bloodbath"
portrait = "blood_bath"
- maxHealth = 400
- health = 400
+ maxHealth = 1000
+ health = 1000
+ move_to_delay = 3
+ attack_sound = 'sound/abnormalities/ichthys/slap.ogg'
+ attack_verb_continuous = "mauls"
+ attack_verb_simple = "maul"
+ melee_damage_lower = 6
+ melee_damage_upper = 12
+ melee_damage_type = WHITE_DAMAGE
+ damage_coeff = list(RED_DAMAGE = 1.6, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1.4, PALE_DAMAGE = 1.5)
+ ranged = TRUE
threat_level = TETH_LEVEL
work_chances = list(
ABNORMALITY_WORK_INSTINCT = list(55, 55, 50, 50, 50),
@@ -32,12 +41,14 @@
One of problems, one of them was numbing. People believed they could live happy life. \
People believed they could buy sadness and sell happiness with money. When the first suicide happened, we should have known that these beliefs had been shattered. \
Many hands float in the bath. Hands that wanted to grab something but could not. You......"
- observation_choices = list("Grabbed a hand", "Did not grab a hand")
- correct_choices = list("Grabbed a hand")
- observation_success_message = "I feel coldness and stiffness. I know these hands. These are the hands of people I once loved."
- observation_fail_message = "You looked away. This is not the first time you ignore them. It will be the same afterwards."
+ observation_choices = list(
+ "Grabbed a hand" = list(TRUE, "I feel coldness and stiffness. I know these hands. These are the hands of people I once loved."),
+ "Did not grab a hand" = list(FALSE, "You looked away. This is not the first time you ignore them. It will be the same afterwards."),
+ )
var/hands = 0
+ var/can_act = TRUE
+ var/special_attack_cooldown
/mob/living/simple_animal/hostile/abnormality/bloodbath/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time)
// any work performed with level 1 Fort and Temperance makes you panic and die
@@ -67,3 +78,50 @@
datum_reference.max_boxes = max_boxes
icon_state = "bloodbath"
return
+
+/mob/living/simple_animal/hostile/abnormality/bloodbath/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type != BREACH_MINING && breach_type != BREACH_PINK)
+ return
+ if(breach_type == BREACH_PINK)
+ maxHealth = 4000
+ melee_damage_lower = 20
+ melee_damage_upper = 40
+ ..()
+ icon_state = "bloodbath_DF"
+ pixel_x = -8
+ base_pixel_x = -8
+ update_icon()
+
+/mob/living/simple_animal/hostile/abnormality/bloodbath/OpenFire()
+ if(!can_act)
+ return
+ if(special_attack_cooldown > world.time)
+ return
+ BloodBathSlam()
+
+/mob/living/simple_animal/hostile/abnormality/bloodbath/proc/BloodBathSlam()//weaker version of the DF form
+ if(!can_act)
+ return
+ special_attack_cooldown = world.time + 5 SECONDS
+ can_act = FALSE
+ for(var/turf/L in view(3, src))
+ new /obj/effect/temp_visual/cult/sparks(L)
+ playsound(get_turf(src), 'sound/abnormalities/ichthys/jump.ogg', 100, FALSE, 6)
+ icon_state = "bloodbath_slamprepare"
+ SLEEP_CHECK_DEATH(12)
+ for(var/turf/T in view(3, src))
+ var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(T)
+ FX.color = "#b52e19"
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ if(H.sanity_lost)
+ H.gib()
+ playsound(get_turf(src), 'sound/abnormalities/bloodbath/Bloodbath_EyeOn.ogg', 125, FALSE, 6)
+ icon_state = "bloodbath_slam"
+ SLEEP_CHECK_DEATH(3)
+ icon_state = "bloodbath_DF"
+ can_act = TRUE
+
+/mob/living/simple_animal/hostile/abnormality/bloodbath/Move()
+ if(!can_act)
+ return FALSE
+ ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/book.dm b/code/modules/mob/living/simple_animal/abnormality/teth/book.dm
index 580e9768ee69..47c473aa6274 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/book.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/book.dm
@@ -6,6 +6,7 @@
portrait = "book"
maxHealth = 600
health = 600
+ blood_volume = 0
start_qliphoth = 2
threat_level = TETH_LEVEL
work_chances = list(
@@ -27,10 +28,10 @@
observation_prompt = "It's just a stupid rumour. \"If you fill it in whatever way, then the book will grant one wish!\" \
All the newbies crow, waiting for their chance to fill the pages with their wishes. \
You open the book and read through every wish, splotched with ink and tears, every employee had, living and dead, wrote..."
- observation_choices = list("Tear out the wishes", "Write your own wish")
- correct_choices = list("Write your own wish")
- observation_success_message = "You take out the pen from your pocket and write down your wish. It'll never come true but that's why it will always remain a wish."
- observation_fail_message = "You tear out their wishes one by one. The book's page count remains the same. Did your wish come true?"
+ observation_choices = list(
+ "Write your own wish" = list(TRUE, "You take out the pen from your pocket and write down your wish. It'll never come true but that's why it will always remain a wish."),
+ "Tear out the wishes" = list(FALSE, "You tear out their wishes one by one. The book's page count remains the same. Did your wish come true?"),
+ )
var/wordcount = 0
var/list/oddities = list() //List gets populated with friendly animals
@@ -41,6 +42,9 @@
)
var/meltdown_cooldown //no spamming the meltdown effect
var/meltdown_cooldown_time = 30 SECONDS
+ var/breaching = FALSE
+ var/summon_count = 0
+
/mob/living/simple_animal/hostile/abnormality/book/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time)
if(work_type == ABNORMALITY_WORK_REPRESSION)
@@ -103,6 +107,23 @@
if((initial(abno.threat_level)) <= TETH_LEVEL)
nasties += abno
+/mob/living/simple_animal/hostile/abnormality/book/Life()
+ . = ..()
+ if(!breaching)
+ return
+ if(summon_count > 15)
+ qdel(src)
+ return
+ if((meltdown_cooldown < world.time) && !(status_flags & GODMODE))
+ MeltdownEffect()
+ meltdown_cooldown = world.time + meltdown_cooldown_time
+
+/mob/living/simple_animal/hostile/abnormality/book/Move()
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/book/CanAttack(atom/the_target)
+ return FALSE
+
/mob/living/simple_animal/hostile/abnormality/book/proc/RipPages()
var/mob/living/simple_animal/newspawn
if(wordcount >= 3)
@@ -133,12 +154,13 @@
spawnedmob.health = spawnedmob.maxHealth
spawnedmob.death_message = "collapses into a bunch of writing material."
spawnedmob.filters += filter(type="drop_shadow", x=0, y=0, size=1, offset=0, color=rgb(0, 0, 0))
+ spawnedmob.blood_volume = 0
src.visible_message(span_warning("Pages of [src] fold into [spawnedmob]!"))
playsound(get_turf(src), 'sound/items/handling/paper_pickup.ogg', 90, 1, FALSE)
/mob/living/simple_animal/hostile/abnormality/book/ZeroQliphoth(mob/living/carbon/human/user)
datum_reference.qliphoth_change(start_qliphoth) //no need for qliphoth to be stuck at 0
- if(meltdown_cooldown > world.time)
+ if(meltdown_cooldown < world.time)
return
meltdown_cooldown = world.time + meltdown_cooldown_time
MeltdownEffect()
@@ -151,3 +173,9 @@
sleep(0.5 SECONDS)
newspawn = pick(nasties)
SpawnMob(newspawn)
+ if(breaching)
+ summon_count += 1
+
+/mob/living/simple_animal/hostile/abnormality/book/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ breaching = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/cherry_blossoms.dm b/code/modules/mob/living/simple_animal/abnormality/teth/cherry_blossoms.dm
index 163b6159af74..106f715a0a38 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/cherry_blossoms.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/cherry_blossoms.dm
@@ -33,12 +33,12 @@
observation_prompt = "The tree is adorned with beautiful leaves growing here and there. \
The kind of sight you could never even hope to see in this dark and dreary place. \
You can take a moment to take in the beauty before you begin to work."
- observation_choices = list("Take in the beauty")
- correct_choices = list("Take in the beauty")
- observation_success_message = "You feel refreshed after just taking a moment to watch such a beautiful thing. \
- This doesn't mean that you don't know that this is a dangerous abnormality. \
- There is beauty even in great and terrible things. \
- Even the bodies underneath this tree would agree with you."
+ observation_choices = list(
+ "Take in the beauty" = list(TRUE, "You feel refreshed after just taking a moment to watch such a beautiful thing. \
+ This doesn't mean that you don't know that this is a dangerous abnormality. \
+ There is beauty even in great and terrible things. \
+ Even the bodies underneath this tree would agree with you."),
+ )
var/number_of_marks = 5
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm b/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm
index 751804e318af..9b1f3614964d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm
@@ -38,14 +38,13 @@
(You sit and wait.) \
Do you not need me anymore? Did I not take you to the happiest night of your life? \
(You sit and...)"
- observation_choices = list("Remember that night", "Wait")
- correct_choices = list("Remember that night")
- observation_success_message = "Yes, it was the happiest night of both our lives... \
- (The colour returns to your flesh and your wheels begin to mend.) \
- Let's go back to that wonderous, magical night..."
- observation_fail_message = "She still may have need of me, I'll wait until I'm called. \
- (Your flesh turns grey, no one will need such a horrid looking carriage.)"
-
+ observation_choices = list(
+ "Remember that night" = list(TRUE, "Yes, it was the happiest night of both our lives... \
+ (The colour returns to your flesh and your wheels begin to mend.) \
+ Let's go back to that wonderous, magical night..."),
+ "Wait" = list(FALSE, "She still may have need of me, I'll wait until I'm called. \
+ (Your flesh turns grey, no one will need such a horrid looking carriage.)"),
+ )
var/freshness = 0
//Breach stuff
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm b/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm
index 9f7d4dfae5d3..5235bf64a41b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm
@@ -54,16 +54,16 @@
The model next to mine boasted that it has multiple parts that others don't. \
Is that what makes one special? \
Am I special the way I am?"
- observation_choices = list("You are special", "You are not special")
- correct_choices = list("You are not special")
- observation_success_message = "\"Am I not special, not special, not special?\" \
- After giving a lagged reply, it suddenly began tearing off all the cleaning gadgets from its body and crashing into walls. \
- It rubbed its body on other objects while sparks flew off as if it was trying to attach things to it. \
- It only stopped after a while. \
- \"Maybe I wanted to be special.\""
- observation_fail_message = "\"No. I am not special.\" \
- Disregarding the answer, it gives a stern reply. \
- \"I will keep living an ordinary life, the same as now, just as assigned to me.\""
+ observation_choices = list(
+ "You are not special" = list(TRUE, "\"Am I not special, not special, not special?\" \
+ After giving a lagged reply, it suddenly began tearing off all the cleaning gadgets from its body and crashing into walls. \
+ It rubbed its body on other objects while sparks flew off as if it was trying to attach things to it. \
+ It only stopped after a while. \
+ \"Maybe I wanted to be special.\""),
+ "You are special" = list(FALSE, "\"No. I am not special.\" \
+ Disregarding the answer, it gives a stern reply. \
+ \"I will keep living an ordinary life, the same as now, just as assigned to me.\""),
+ )
var/bumpdamage = 10
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm b/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm
index d6ebb1ab472e..8c6bd5b4fa33 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm
@@ -31,10 +31,10 @@
secret_icon_state = "megalovania"
observation_prompt = "The armor that took away many people's lives is sitting in front of you. You can put it on, if you wish."
- observation_choices = list("Put it on", "Dont't put it on")
- correct_choices = list("Put it on")
- observation_success_message = "It seems like you were not pacifist. You feel the armor's warm welcome."
- observation_fail_message = "The armor waits for another reckless one."
+ observation_choices = list(
+ "Put it on" = list(TRUE, "It seems like you were not pacifist. You feel the armor's warm welcome."),
+ "Dont't put it on" = list(FALSE, "The armor waits for another reckless one."),
+ )
var/buff_icon = 'ModularTegustation/Teguicons/tegu_effects.dmi'
var/user_armored
@@ -49,15 +49,14 @@
..()
gift_type = null
-/mob/living/simple_animal/hostile/abnormality/crumbling_armor/ObservationResult(mob/living/carbon/human/user, condition)
+/mob/living/simple_animal/hostile/abnormality/crumbling_armor/ObservationResult(mob/living/carbon/human/user, success, reply)
. = ..()
- if(condition)
+ if(success)
var/datum/ego_gifts/recklessCourage/R = new
user.Apply_Gift(R)
if(!armor_dispensed) // You only get one of these. Ever.
new /obj/item/clothing/suit/armor/ego_gear/he/crumbling_armor(get_turf(user))
armor_dispensed = TRUE
- datum_reference.observation_ready = FALSE
/mob/living/simple_animal/hostile/abnormality/crumbling_armor/SuccessEffect(mob/living/carbon/human/user, work_type, pe)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm b/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm
index 1853b9590e85..46b4915a51bf 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm
@@ -32,10 +32,10 @@
observation_prompt = "You awaken to a building flooded with stimulation; guests mingle and drink as slot machines whirr and blare their tunes, drowning out the mourning of those who have lost it all. \
Amidst all this, you find yourself sat in front of a poker table, already in the middle of a game. The Dealer turns to you, eagerly awaiting your next move."
- observation_choices = list("Call", "Fold")
- correct_choices = list("Call")
- observation_success_message = "You call, confident your hand is enough to win. However, you lose, beat by none other than a Royal Flush. Despite this loss, you continue to play, confident your luck will eventually turn around..."
- observation_fail_message = "You fold, wishing to cling to what little remains of your wealth. Despite lacking any facial features, you can feel the Dealer's disappointment..."
+ observation_choices = list(
+ "Call" = list(TRUE, "You call, confident your hand is enough to win. However, you lose, beat by none other than a Royal Flush. Despite this loss, you continue to play, confident your luck will eventually turn around..."),
+ "Fold" = list(FALSE, "You fold, wishing to cling to what little remains of your wealth. Despite lacking any facial features, you can feel the Dealer's disappointment..."),
+ )
//Coinflip V1; Expect Jank
/mob/living/simple_animal/hostile/abnormality/dealerdamned/funpet(mob/petter)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/dingle_dangle.dm b/code/modules/mob/living/simple_animal/abnormality/teth/dingle_dangle.dm
index c9e959226555..35656f5928bd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/dingle_dangle.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/dingle_dangle.dm
@@ -29,11 +29,14 @@
abnormality_origin = ABNORMALITY_ORIGIN_WONDERLAB
observation_prompt = "You pass by the containment cell and, in the corner of your eye, spy your comrades dangling from ribbons, furiously scratching at their necks in choked agony."
- observation_choices = list("Save them", "Do not save them")
- correct_choices = list("Save them", "Do not save them")
- observation_success_message = "Regardless of your resolution, you find yourself before the tree anyway as one of its ribbons wrap around your neck. \
- \"Let's dangle together, let your sorrows, your pain dangle, let's all dangle down...\" It whispers into your mind. \
- Your comrades were never here, the life passes from your body painlessly. None of this is real."
+ observation_choices = list(
+ "Save them" = list(TRUE, "Regardless of your resolution, you find yourself before the tree anyway as one of its ribbons wrap around your neck. \
+ \"Let's dangle together, let your sorrows, your pain dangle, let's all dangle down...\" It whispers into your mind. \
+ Your comrades were never here, the life passes from your body painlessly. None of this is real."),
+ "Do not save them" = list(TRUE, "Regardless of your resolution, you find yourself before the tree anyway as one of its ribbons wrap around your neck. \
+ \"Let's dangle together, let your sorrows, your pain dangle, let's all dangle down...\" It whispers into your mind. \
+ Your comrades were never here, the life passes from your body painlessly. None of this is real."),
+ )
//Introduction to our hallucinations. This is a global hallucination, but it's all it really does.
/mob/living/simple_animal/hostile/abnormality/dingledangle/ZeroQliphoth(mob/living/carbon/human/user)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm b/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm
index ff6d8c9c05c2..03dbd1608667 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm
@@ -30,10 +30,12 @@
observation_prompt = "You sit cross-legged before the pair, flowers conceal their faces and expression. \
\"Ahh, woe is us. We have become sinners. Please hear us, hear of our sins that we do not know we've committed, and absolve us of our grief...\""
- observation_choices = list("Listen to their story", "Don't listen")
- correct_choices = list("Listen to their story", "Don't listen")
- observation_success_message = "You exit the cell, their story leaving your mind and voices on the wind but their sorrow remains. \
- You'll be back again and still won't understand their grief."
+ observation_choices = list(
+ "Listen to their story" = list(TRUE, "You exit the cell, their story leaving your mind and voices on the wind but their sorrow remains. \
+ You'll be back again and still won't understand their grief."),
+ "Don't listen" = list(TRUE, "You exit the cell, their story leaving your mind and voices on the wind but their sorrow remains. \
+ You'll be back again and still won't understand their grief."),
+ )
var/breaching = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm b/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm
index 71d826514fe1..cb67dc588028 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm
@@ -10,6 +10,7 @@
portrait = "faelantern"
maxHealth = 1200
health = 1200
+ blood_volume = 0
base_pixel_x = -16
pixel_x = -16
threat_level = TETH_LEVEL
@@ -45,16 +46,15 @@
A small fairy with a green glow sits atop it. \
Saying no words, the fairy waves at you, inviting you to come over and take a break. \
It looked like it was smiling, and it might have been dancing."
- observation_choices = list("Take a momentary break", "Move on without resting", "Take a break where you're standing")
- correct_choices = list("Move on without resting")
- observation_success_message = "This is no time to be careless and stop here. \
- Tree branches came at you to halt you from leaving, but you narrowly dodged them. \
- You knew the real meaning of the fairy's gesture: \
- \"There's no such thing as a free gift\"."
- observation_fail_message = "The fairy's smile stretches into an eerie grin. You shouldn't have trusted its appearance and now you'll have to pay the price."
- //Extra wrong answer
- var/observation_fail_message_2 = "You ignore the beckoning fairy and take a short break where you stand. \
- As you gather yourself to continue on the journey, you realize that several branches had grown in the premises, trapping you in."
+ observation_choices = list(
+ "Move on without resting" = list(TRUE, "This is no time to be careless and stop here. \
+ Tree branches came at you to halt you from leaving, but you narrowly dodged them. \
+ You knew the real meaning of the fairy's gesture: \
+ \"There's no such thing as a free gift\"."),
+ "Take a momentary break" = list(FALSE, "The fairy's smile stretches into an eerie grin. You shouldn't have trusted its appearance and now you'll have to pay the price."),
+ "Take a break where you're standing" = list(FALSE, "You ignore the beckoning fairy and take a short break where you stand. \
+ As you gather yourself to continue on the journey, you realize that several branches had grown in the premises, trapping you in."),
+ )
var/can_act = FALSE
var/break_threshold = 450
@@ -68,13 +68,6 @@
var/stab_cooldown_time = 30
var/lured_list = list()
-/mob/living/simple_animal/hostile/abnormality/faelantern/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answer
- if(answer == "Take a break where you're standing")
- observation_fail_message = observation_fail_message_2
- else
- observation_fail_message = initial(observation_fail_message)
- return ..()
-
/mob/living/simple_animal/hostile/abnormality/faelantern/AttackingTarget(atom/attacked_target)
return OpenFire()
@@ -108,6 +101,12 @@
/mob/living/simple_animal/hostile/abnormality/faelantern/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
+ if(breach_type == BREACH_MINING)
+ fairy_enabled = TRUE
+ fairy_health = health
+ can_act = TRUE
+ icon_state = icon_living
+ return
INVOKE_ASYNC(src, PROC_REF(BreachDig))
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm
index 85b7c69b5b43..92ec524b8b6b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm
@@ -48,11 +48,11 @@
)
observation_prompt = "\"Care for a drink?\""
- observation_choices = list("Yes", "No")
- correct_choices = list("Yes")
- observation_success_message = "\"Yer a good drinkin buddy as any!\""
- observation_fail_message = "\"Pssh! you're no fun!\" \
- The fairy walks away, stumbling along the way."
+ observation_choices = list(
+ "Yes" = list(TRUE, "\"Yer a good drinkin buddy as any!\""),
+ "No" = list(FALSE, "\"Pssh! you're no fun!\" \
+ The fairy walks away, stumbling along the way."),
+ )
var/can_act = TRUE
var/jump_cooldown = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm
index e8ec2b2f7284..d42c858169a0 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm
@@ -52,16 +52,16 @@
observation_prompt = "Come on, why don'cha stay under the umbrella with me? \
Just for old times sake?"
- observation_choices = list("Yes", "No")
- correct_choices = list("No")
- observation_success_message = "You'd think that you'd have learned your lesson by now. \
- You leave the cell, having narrowly dodged the imminent attack. \
- This guy will always be a crook."
- observation_fail_message = "Ouch! \
- The moment you get in striking range of fairy long legs, you are attacked. \
- \"Heh. You really think you could be one of us, pal?\" \
- \"You aint part of the family, chump.\" \
- You walk away, and bandage the bleeding wound."
+ observation_choices = list(
+ "No" = list(TRUE, "You'd think that you'd have learned your lesson by now. \
+ You leave the cell, having narrowly dodged the imminent attack. \
+ This guy will always be a crook."),
+ "Yes" = list(FALSE, "Ouch! \
+ The moment you get in striking range of fairy long legs, you are attacked. \
+ \"Heh. You really think you could be one of us, pal?\" \
+ \"You aint part of the family, chump.\" \
+ You walk away, and bandage the bleeding wound."),
+ )
var/finishing = FALSE //cant move/attack when it's TRUE
var/work_count = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/falada.dm b/code/modules/mob/living/simple_animal/abnormality/teth/falada.dm
index 90c185e75414..451259091c4e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/falada.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/falada.dm
@@ -33,13 +33,13 @@
observation_prompt = "A severed horse-like creature's head hangs high on the wall, sobbing. \
You can't help but feel some pity for the thing."
- observation_choices = list("Why the long face?", "What happened to you?")
- correct_choices = list("What happened to you?")
- observation_success_message = "The horse head begins speaking. \
- \"Oh, woe is me. If only it could be - the powers that be, would see fit to have me die in her stead.\" \
- It speaks in rhymes, but it clearly lost someone important to it. \
- Even if there is nothing you can do, at least you are there to listen."
- observation_fail_message = "The horse head continues sobbing, despite your cheesy joke. Maybe that wasn't the best approach."
+ observation_choices = list(
+ "What happened to you?" = list(TRUE, "The horse head begins speaking. \
+ \"Oh, woe is me. If only it could be - the powers that be, would see fit to have me die in her stead.\" \
+ It speaks in rhymes, but it clearly lost someone important to it. \
+ Even if there is nothing you can do, at least you are there to listen."),
+ "Why the long face?" = list(FALSE, "The horse head continues sobbing, despite your cheesy joke. Maybe that wasn't the best approach."),
+ )
var/liked
var/happy = TRUE
@@ -69,6 +69,11 @@
datum_reference.qliphoth_change(1)
return
+/mob/living/simple_animal/hostile/abnormality/falada/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ pissed()
+ qdel(src)
+
/mob/living/simple_animal/hostile/abnormality/falada/WorkChance(mob/living/carbon/human/user, chance)
if(happy)
chance+=30
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm b/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm
index 1d9a304e2bac..d3badcc9f1c1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm
@@ -32,14 +32,14 @@
The card is almost too battered and contaminated to recognize. \
Wearing a box filled with Enkephalin on their head, the employee rams it into what looks like the door to a containment unit. \
A rubber O-ring is worn around their neck. Could it be there to prevent Enkephalin from spilling?"
- observation_choices = list("Cut the ring.", "Don't cut the ring.")
- correct_choices = list("Cut the ring.")
- observation_success_message = " The blade kept bouncing off the slippery O-ring... \
- \"Brgrrgh...\ \
- And the submerged thing pushed you away and ran off. Did it prefer to stay like that? \
- All it left was a small employee card."
- observation_fail_message = "Tang- Tang- Tang- The ramming at the door and the sloshing continue. \
- I keep watching and listening. A more attentive hearing reveals that the sounds have a rhythm. Perhaps there is delight to be found in it."
+ observation_choices = list(
+ "Cut the ring" = list(TRUE, "The blade kept bouncing off the slippery O-ring... \
+ \"Brgrrgh...\ \
+ And the submerged thing pushed you away and ran off. Did it prefer to stay like that? \
+ All it left was a small employee card."),
+ "Don't cut the ring" = list(FALSE, "Tang- Tang- Tang- The ramming at the door and the sloshing continue. \
+ I keep watching and listening. A more attentive hearing reveals that the sounds have a rhythm. Perhaps there is delight to be found in it."),
+ )
/mob/living/simple_animal/hostile/abnormality/forsaken_employee/FailureEffect(mob/living/carbon/human/user, work_type, pe, work_time, canceled)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_murderer.dm b/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_murderer.dm
index 5fb7606dbbbe..f5b66f540746 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_murderer.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_murderer.dm
@@ -97,13 +97,16 @@
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
/**
- * Final observation code. These variables should be self-explanatory.
- */
+ * Final observation code.
+ * observation_prompt controls the text that the user sees when they start the observation
+ * observation_choices is made in the format of:
+ * "Choice" = list(TRUE or FALSE [depending on if the answer is correct], "Response"),
+ */
observation_prompt = "Around his neck is a rope. It is up to you to cut his rope."
- observation_choices = list("Cut the rope.", "Don't cut the rope.")
- correct_choices = list("Don't cut the rope.")
- observation_success_message = "His neck snaps, granting him silence and eternal rest."
- observation_fail_message = "\"You think I'm pathetic, huh? But is you people who are really pathetic. Because you get killed. By people like me.\""
+ observation_choices = list(
+ "Don't cut the rope" = list(TRUE, "His neck snaps, granting him silence and eternal rest."),
+ "Cut the rope" = list(FALSE, "\"You think I'm pathetic, huh? But is you people who are really pathetic. Because you get killed. By people like me.\""),
+ )
//Unique variable im defining for this abnormality. This is the timer for their during work emotes.
var/work_emote_cooldown = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm
index ffc944680954..a94a67ccbff8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm
@@ -39,11 +39,11 @@
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
observation_prompt = "It started singing. You..."
- observation_choices = list("Listen to it", "Plug your ears")
- correct_choices = list("Listen to it")
- observation_success_message = "You silently listen to it. \
- The universe lingers in your ears. You see the song. Glamorously, it approaches you."
- observation_fail_message = "You are not prepared yet. The song stopped when you plugged the ears."
+ observation_choices = list(
+ "Listen to it" = list(TRUE, "You silently listen to it. \
+ The universe lingers in your ears. You see the song. Glamorously, it approaches you."),
+ "Plug your ears" = list(FALSE, "You are not prepared yet. The song stopped when you plugged the ears."),
+ )
var/song_cooldown
var/song_cooldown_time = 10 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm b/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm
index 4adcdc3379d4..aec6beec7c07 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm
@@ -34,11 +34,10 @@
Her muttering is unintelligible, and it gives you goosebumps. You don't like being in the same space with her. \
You want to get out. The woman seems to be sobbing. You feel as though her crying is insisting you to turn towards her. \
And you also feel, that you should not."
- observation_choices = list("Do not turn back.", "Turn back.")
- correct_choices = list("Turn back.")
- observation_success_message = "You face the fear, and turn to face the woman."
- observation_fail_message = "Something terrible could happen if you turn back. You exit the room, without looking back."
-
+ observation_choices = list(
+ "Turn back" = list(TRUE, "You face the fear, and turn to face the woman."),
+ "Do not turn back" = list(FALSE, "Something terrible could happen if you turn back. You exit the room, without looking back."),
+ )
/mob/living/simple_animal/hostile/abnormality/wall_gazer/NeutralEffect(mob/living/carbon/human/user, work_type, pe)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm b/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm
index 1b5dbb190dc8..e1552988ee59 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm
@@ -39,10 +39,10 @@
observation_prompt = "It's always the same, dull colours in the facility. Grey walls, grey floors, grey ceilings, even the people were grey. \
Every day was grey until, one day, you saw the a small, beautifully green flower growing and glowing from the ground."
- observation_choices = list("Approach the flower", "Call for security")
- correct_choices = list("Approach the flower")
- observation_success_message = "It's the most beautiful thing you've ever seen, you brush your hand against it and the petals tickle your hand. You feel a tremor beneath and..."
- observation_fail_message = "Something so beautiful had no right to exist in the City. You called for security and left in a hurry back to your grey workplace."
+ observation_choices = list(
+ "Approach the flower" = list(TRUE, "It's the most beautiful thing you've ever seen, you brush your hand against it and the petals tickle your hand. You feel a tremor beneath and..."),
+ "Call for security" = list(FALSE, "Something so beautiful had no right to exist in the City. You called for security and left in a hurry back to your grey workplace."),
+ )
var/can_act = TRUE
var/detect_range = 1
@@ -146,6 +146,9 @@
return
/mob/living/simple_animal/hostile/abnormality/meat_lantern/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)//as funny as it sounds, this abnormality would be unreachable
+ qdel(src)
+ return
. = ..()
update_icon()
density = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm b/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm
index b53ba5801184..9fad97edcc9d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm
@@ -49,13 +49,13 @@
A perfect, safe place away from this scary room. \
Everything for you. \
Won't you come inside?"
- observation_choices = list("Go inside", "Don't go inside")
- correct_choices = list("Don't go inside")
- observation_success_message = "Some things are too good to be true. \
- You take the key from under the doormat, and leave."
- observation_fail_message = "A key appears in your hand. \
- You move to open the door. \
- But at the last minute, you are pulled away by another agent to safety."
+ observation_choices = list(
+ "Don't go inside" = list(TRUE, "Some things are too good to be true. \
+ You take the key from under the doormat, and leave."),
+ "Go inside" = list(FALSE, "A key appears in your hand. \
+ You move to open the door. \
+ But at the last minute, you are pulled away by another agent to safety."),
+ )
var/ranged_damage = 15
var/damage_dealt = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/old_lady.dm b/code/modules/mob/living/simple_animal/abnormality/teth/old_lady.dm
index e379c825ce46..d4121d654d65 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/old_lady.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/old_lady.dm
@@ -30,12 +30,12 @@
Because I don't like to listen to stories. Bugs were buzzing around here and there. \
Something slimy popped as I set my foot on it. I found her. Every hole on her face was swarming bugs. \
I don't want to stay here. I want to get out. It's damp, nasty, and awful. I can't stand it anymore."
- observation_choices = list("Get out", "Stay")
- correct_choices = list("Stay")
- observation_success_message = "I stayed, bearing the unpleasantness. \
- She was so talkative before. In the end, loneliness was the only listener. \
- She called me, with her finger. I am now ready to listen to her story."
- observation_fail_message = "I turned around to get out of this place. Once again, I bit lips in self-hatred while escaping."
+ observation_choices = list(
+ "Stay" = list(TRUE, "I stayed, bearing the unpleasantness. \
+ She was so talkative before. In the end, loneliness was the only listener. \
+ She called me, with her finger. I am now ready to listen to her story."),
+ "Get out" = list(FALSE, "I turned around to get out of this place. Once again, I bit lips in self-hatred while escaping."),
+ )
var/meltdown_cooldown_time = 120 SECONDS
var/meltdown_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm b/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm
index b3ace720687e..494912cc95ad 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm
@@ -41,12 +41,12 @@
observation_prompt = "Joseph came to you once, his face flush with excitement after the horse wept before him. He's \"Nothing There\"'s shell now. \
Did the horse merely prognosticate his death or did it doom him? You're outside the containment unit now and your legs tremble, you've been ordered to work it today. \
You..."
- observation_choices = list("Enter the containment unit", "Pretend you didn't get the order")
- correct_choices = list("Enter the containment unit")
- observation_success_message = "You enter the containment unit and kneel before the horse. \
- It kneels next to you and a single tear drips from its eye onto your shoulder. You hold onto its head as you both weep. \
- Death is terrifying but at least you know something weeps for you."
- observation_fail_message = "You pretend you didn't get the order and make to leave, your PDA flashes again, you've been assigned to \"Nothing There\" and this time, you're being escorted."
+ observation_choices = list(
+ "Enter the containment unit" = list(TRUE, "You enter the containment unit and kneel before the horse. \
+ It kneels next to you and a single tear drips from its eye onto your shoulder. You hold onto its head as you both weep. \
+ Death is terrifying but at least you know something weeps for you."),
+ "Pretend you didn't get the order" = list(FALSE, "You pretend you didn't get the order and make to leave, your PDA flashes again, you've been assigned to \"Nothing There\" and this time, you're being escorted."),
+ )
//teleport
var/can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm b/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm
index 0f98c6e212f8..c190d7b3c524 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm
@@ -31,13 +31,13 @@
observation_prompt = "A girl in front of you dances, stumbling to and fro. \
Her feet are chopped off at the ankles, and yet they still move. \
You..."
- observation_choices = list("Put on the shoes.", "Don't put on the shoes.")
- correct_choices = list("Put on the shoes.")
- observation_success_message = "You remove the severed feet, and put on the shoes. \
- It feels good. You want to dance. Please, chop off my feet."
- observation_fail_message = "How could you do something so gross? \
- You leave the shoes where they are. \
- The girl continues shifting about without a care in the world."
+ observation_choices = list(
+ "Put on the shoes" = list(TRUE, "You remove the severed feet, and put on the shoes. \
+ It feels good. You want to dance. Please, chop off my feet."),
+ "Don't put on the shoes" = list(FALSE, "How could you do something so gross? \
+ You leave the shoes where they are. \
+ The girl continues shifting about without a care in the world."),
+ )
//Work Mechanics
/mob/living/simple_animal/hostile/abnormality/penitentgirl/AttemptWork(mob/living/carbon/human/user, work_type)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm b/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm
index 9aacdb8453c4..214808cebe5a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm
@@ -35,18 +35,93 @@
)
gift_type = /datum/ego_gifts/cute
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
+ attack_action_types = list(/datum/action/cooldown/ppodae_transform)
observation_prompt = "Before me stands a creature, eagerly awaiting its next meal. The creature is..."
- observation_choices = list("A puppy", "A monster")
- correct_choices = list("A monster")
- observation_success_message = "I don't know how I didn't see it before, I rushed out to warn the others. I was fired the next day."
- observation_fail_message = "It's the cutest puppy I've ever seen."
+ observation_choices = list(
+ "A monster" = list(TRUE, "I don't know how I didn't see it before, I rushed out to warn the others. I was fired the next day."),
+ "A puppy" = list(FALSE, "It's the cutest puppy I've ever seen."),
+ )
var/smash_damage_low = 16
var/smash_damage_high = 28
var/smash_length = 2
var/smash_width = 1
var/can_act = TRUE
+ var/buff_form = TRUE
+ //Buff Form stuff
+ var/buff_resist_red = 0.5
+ var/buff_resist_white = 0.5
+ var/buff_resist_black = 0.5
+ var/buff_resist_pale = 0.5
+ var/buff_speed = 2
+ var/can_slam = TRUE
+ //Cute Form stuff
+ var/cute_resist_red = 1.5
+ var/cute_resist_white = 0.8
+ var/cute_resist_black = 1
+ var/cute_resist_pale = 2
+ var/cute_speed = 1
+ //Other Stuff
+ var/limb_heal = 0.1
+
+
+/mob/living/simple_animal/hostile/abnormality/ppodae/Login()
+ . = ..()
+ if(!. || !client)
+ return FALSE
+ to_chat(src, "
You are Ppodae, A Support/Combat Role Abnormality.
\
+ |How adorable!|: You are able to switch between a 'Cute' and 'Buff' form. \
+ Switching between forms has a 5 second cooldown and each time you switch forms you create smoke which lasts for 9 seconds. \
+ \
+ |Cute!|: While you are in your 'Cute' form, you have a MASSIVE speed boost and if you try to melee attack mechs or living mobs, you will crawl under them. \
+ \
+ |Strong!|: While you are in your 'Buff' form, you take 50% less damage from all attacks and you prefrom a 3x3 AoE attack when you try to melee attack, (Really good at breaking down Structures) \
+ \
+ |He's just Playing|: When you melee attack a unconscious or dead human body, you are able to tear off a limb, which heals you 10% of your max HP. (You can do this 4 time per body)")
+
+/datum/action/cooldown/ppodae_transform
+ name = "Transform!"
+ icon_icon = 'icons/mob/actions/actions_abnormality.dmi'
+ button_icon_state = "ppodae_transform"
+ check_flags = AB_CHECK_CONSCIOUS
+ transparent_when_unavailable = TRUE
+ cooldown_time = 5 SECONDS
+
+/datum/action/cooldown/ppodae_transform/Trigger()
+ if(!..())
+ return FALSE
+ if(!istype(owner, /mob/living/simple_animal/hostile/abnormality/ppodae))
+ return FALSE
+ var/mob/living/simple_animal/hostile/abnormality/ppodae/ppodae = owner
+ if(ppodae.IsContained()) // No more using cooldowns while contained
+ return FALSE
+ StartCooldown()
+ if(ppodae.buff_form)
+ ppodae.buff_form = FALSE
+ ppodae.UpdateForm()
+ else
+ ppodae.buff_form = TRUE
+ ppodae.UpdateForm()
+ return TRUE
+
+/mob/living/simple_animal/hostile/abnormality/ppodae/proc/UpdateForm()
+ if(buff_form)
+ ChangeResistances(list(RED_DAMAGE = buff_resist_red, WHITE_DAMAGE = buff_resist_white, BLACK_DAMAGE = buff_resist_black, PALE_DAMAGE = buff_resist_pale))
+ move_to_delay = buff_speed
+ icon_state = "ppodae_active"
+ can_slam = TRUE
+ else
+ ChangeResistances(list(RED_DAMAGE = cute_resist_red, WHITE_DAMAGE = cute_resist_white, BLACK_DAMAGE = cute_resist_black, PALE_DAMAGE = cute_resist_pale))
+ move_to_delay = cute_speed
+ icon_state = "ppodae"
+ can_slam = FALSE
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(1, src)
+ smoke.start()
+ qdel(smoke)
+ UpdateSpeed()
+ playsound(get_turf(src), 'sound/abnormalities/scaredycat/cateleport.ogg', 50, 0, 5)
/mob/living/simple_animal/hostile/abnormality/ppodae/Move()
if(!can_act)
@@ -56,23 +131,49 @@
/mob/living/simple_animal/hostile/abnormality/ppodae/AttackingTarget(atom/attacked_target)
if(!can_act)
return FALSE
- var/mob/living/carbon/L = attacked_target
- if(iscarbon(attacked_target) && (L.health < 0 || L.stat == DEAD))
- if(HAS_TRAIT(L, TRAIT_NODISMEMBER))
+ var/mob/living/carbon/L = target
+ if(IsCombatMap())
+ if(iscarbon(target) && (L.stat == DEAD))
+ LimbSteal(L)
+ return
+ else
+ if(iscarbon(target) && (L.health < 0 || L.stat == DEAD))
+ LimbSteal(L)
return
- var/list/parts = list()
- for(var/X in L.bodyparts)
- var/obj/item/bodypart/bp = X
- if(bp.body_part != HEAD && bp.body_part != CHEST)
- if(bp.dismemberable)
- parts += bp
- if(length(parts))
- var/obj/item/bodypart/bp = pick(parts)
- bp.dismember()
- bp.forceMove(get_turf(datum_reference.landmark)) // Teleports limb to containment
- QDEL_NULL(src)
+
// Taken from eldritch_demons.dm
- return Smash(attacked_target)
+ if(IsCombatMap())
+ if(can_slam)
+ return Smash(target)
+ else if(isvehicle(target))
+ var/obj/vehicle/V = target
+ var/turf/target_turf = get_turf(V)
+ forceMove(target_turf)
+ manual_emote("crawls under [V]!")
+ else if (istype(target, /mob/living))
+ if (target != src)
+ var/turf/target_turf = get_turf(target)
+ forceMove(target_turf)
+ manual_emote("crawls under [target]!")
+ else
+ return Smash(target)
+
+/mob/living/simple_animal/hostile/abnormality/ppodae/proc/LimbSteal(mob/living/carbon/L)
+ if(HAS_TRAIT(L, TRAIT_NODISMEMBER))
+ return
+ var/list/parts = list()
+ for(var/X in L.bodyparts)
+ var/obj/item/bodypart/bp = X
+ if(bp.body_part != HEAD && bp.body_part != CHEST)
+ if(bp.dismemberable)
+ parts += bp
+ if(length(parts))
+ var/obj/item/bodypart/bp = pick(parts)
+ bp.dismember()
+ if(IsCombatMap())
+ adjustHealth(-(maxHealth * limb_heal))
+ bp.forceMove(get_turf(datum_reference.landmark)) // Teleports limb to containment
+ QDEL_NULL(src)
//AoE attack taken from woodsman
/mob/living/simple_animal/hostile/abnormality/ppodae/proc/Smash(target)
@@ -165,7 +266,7 @@
var/smash_damage = rand(smash_damage_low, smash_damage_high)
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/smash_effect(T)
- HurtInTurf(T, list(), smash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), smash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE)
playsound(get_turf(src), 'sound/abnormalities/ppodae/bark.wav', 100, 0, 5)
playsound(get_turf(src), 'sound/abnormalities/ppodae/attack.wav', 50, 0, 5)
SLEEP_CHECK_DEATH(0.5 SECONDS)
@@ -185,3 +286,5 @@
. = ..()
icon_state = "ppodae_active"
GiveTarget(user)
+ if(IsCombatMap())
+ UpdateForm()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm b/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm
index 07af10bc6f7d..6c2fa3bc93ef 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm
@@ -60,9 +60,10 @@
)
observation_prompt = "A bird stares at you. What is the name of this bird?"
- observation_choices = list("Little bird", "Punishing bird")
- correct_choices = list("Little bird", "Punishing bird")
- observation_success_message = "The small bird accepts whatever name you decide to give it. Its nature can never change now."
+ observation_choices = list(
+ "Little bird" = list(TRUE, "The small bird accepts whatever name you decide to give it. Its nature can never change now."),
+ "Punishing bird" = list(TRUE, "The small bird accepts whatever name you decide to give it. Its nature can never change now."),
+ )
do_not_possess = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm b/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm
index f1d80feee7c4..4e9e4ee84a38 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm
@@ -52,15 +52,19 @@
\"Blowing freakshits away with my shotgun. Talking with my brothers in arms.\" \
\"That's all I ever needed. All I ever wanted. Even now, I fight for the glory of my country.\" \
\"Do you have anything, anyone, to serve and protect?\""
- observation_choices = list("I don't.", "I do.")
- correct_choices = list("I do.")
- observation_success_message = "\"Heh.\" \
- \"We might not be on the same side but I can respect that.\" \
- \"Go on then, freak. Show me that you can protect what matters to you.\""
- observation_fail_message = "\"Feh. Then what's the point of living, huh?\" \
- \"Without a flag to protect, without a goal to achieve...\" \
- \"Are you any better than an animal? Get out of my sight.\""
+ observation_choices = list(
+ "I do" = list(TRUE, "\"Heh.\" \
+ \"We might not be on the same side but I can respect that.\" \
+ \"Go on then, freak. Show me that you can protect what matters to you.\""),
+ "I don't" = list(FALSE, "\"Feh. Then what's the point of living, huh?\" \
+ \"Without a flag to protect, without a goal to achieve...\" \
+ \"Are you any better than an animal? Get out of my sight.\""),
+ )
+ var/ammo = 6
+ var/max_ammo = 6
+ var/reload_time = 2 SECONDS
+ var/last_reload_time = 0
var/bloodlust = 0 //more you do repression, more damage it deals. decreases on other works.
var/list/fighting_quotes = list(
"Go ahead, freakshit! Do your best!",
@@ -86,6 +90,14 @@
"This is going to be fun!",
)
+/mob/living/simple_animal/hostile/abnormality/redblooded/Login()
+ . = ..()
+ if(!. || !client)
+ return FALSE
+ to_chat(src, "
You are Red Blooded American, A Support Role Abnormality.
\
+ |The American Way|: When you pick on a tile at least 2 sqrs away, You will consume 1 ammo to fire 6 pellets which deal 18 damage each. \
+ You passively reload 1 ammo every 2 seconds, but you can also reload 1 ammo by hitting humans or mechs.")
+
/mob/living/simple_animal/hostile/abnormality/redblooded/AttemptWork(mob/living/carbon/human/user, work_type)
work_damage_amount = 6 + bloodlust
if(work_type == ABNORMALITY_WORK_REPRESSION)
@@ -123,6 +135,27 @@
BreachEffect()
return
+//Breach
+/mob/living/simple_animal/hostile/abnormality/redblooded/proc/Reload()
+ playsound(src, 'sound/weapons/gun/general/bolt_rack.ogg', 25, TRUE)
+ to_chat(src, span_nicegreen("You reload your shotgun..."))
+ ammo += 1
+
+/mob/living/simple_animal/hostile/abnormality/redblooded/Life()
+ . = ..()
+ if (last_reload_time < world.time - reload_time)
+ last_reload_time = world.time
+ if (ammo < max_ammo)
+ Reload()
+
+/mob/living/simple_animal/hostile/abnormality/redblooded/AttackingTarget()
+ if(ammo < max_ammo)
+ if(isliving(target))
+ Reload()
+ if(ismecha(target))
+ Reload()
+ return ..()
+
/mob/living/simple_animal/hostile/abnormality/redblooded/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
icon_state = "american_aggro"
@@ -134,9 +167,15 @@
return ..()
/mob/living/simple_animal/hostile/abnormality/redblooded/OpenFire(atom/A)
- if(get_dist(src, A) <= 2)
+ if(get_dist(src, A) >= 2)
+ if(ammo <= 0)
+ to_chat(src, span_warning("Out of ammo!"))
+ return FALSE
+ else
+ ammo -= 1
+ return ..()
+ else
return FALSE
- return ..()
//Projectiles
/obj/item/ammo_casing/caseless/true_patriot
@@ -152,3 +191,17 @@
damage_type = RED_DAMAGE
damage = 8
+
+/obj/item/ammo_casing/caseless/rcorp_true_patriot
+ name = "true patriot casing"
+ desc = "a true patriot casing"
+ projectile_type = /obj/projectile/rcorp_true_patriot
+ pellets = 6
+ variance = 25
+
+/obj/projectile/rcorp_true_patriot
+ name = "american pellet"
+ desc = "100% real, surplus military ammo."
+ damage_type = RED_DAMAGE
+
+ damage = 18
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm b/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm
index c484b373ea5d..2ff651dd3346 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm
@@ -40,13 +40,13 @@
The match that never caught a fire before now burns to ash. Maybe is a price for taking my body, to burn so bright and fiery. \
Let's run when I can burn. I have been suffering and will suffer. But why you are still happy? \
I know the menace I have become. If nothing will change, I at least want to see you suffering."
- observation_choices = list("Go to her", "Do not go to her")
- correct_choices = list("Do not go to her")
- observation_success_message = "I stopped. I can see her in the distance. \
- \"Maybe you are thinking I am some kind of lighthouse.\" \
- \"At least, I hope you realize my ash is all that remains after this flame consumes the all of me.\""
- observation_fail_message = "Come to me. \
- You who will soon become ashes just like me."
+ observation_choices = list(
+ "Do not go to her" = list(TRUE, "I stopped. I can see her in the distance. \
+ \"Maybe you are thinking I am some kind of lighthouse.\" \
+ \"At least, I hope you realize my ash is all that remains after this flame consumes the all of me.\""),
+ "Go to her" = list(FALSE, "Come to me. \
+ You who will soon become ashes just like me."),
+ )
/// Restrict movement when this is set to TRUE
var/exploding = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/shy_look.dm b/code/modules/mob/living/simple_animal/abnormality/teth/shy_look.dm
index 0183a0c4ae90..54bbb65be449 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/shy_look.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/shy_look.dm
@@ -30,10 +30,10 @@
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
observation_prompt = "It's a good day! Are you still shy today?"
- observation_choices = list("Yes", "No")
- correct_choices = list("Yes")
- observation_success_message = "\"That's no good, it's very important to have a smile on one's face! We need to be happy for our City!\""
- observation_fail_message = "\"That's great to hear! Let's see the biggest smile you can put on to make those in the Outskirts jealous!\""
+ observation_choices = list(
+ "Yes" = list(TRUE, "\"That's no good, it's very important to have a smile on one's face! We need to be happy for our City!\""),
+ "No" = list(FALSE, "\"That's great to hear! Let's see the biggest smile you can put on to make those in the Outskirts jealous!\""),
+ )
var/chance_modifier = 1
var/previous_mood
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/simple_smile.dm b/code/modules/mob/living/simple_animal/abnormality/teth/simple_smile.dm
index c609aabad6ee..c2f288f7a2a5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/simple_smile.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/simple_smile.dm
@@ -44,14 +44,14 @@
abnormality_origin = ABNORMALITY_ORIGIN_WONDERLAB
observation_prompt = "The abnormality appears to you from out of thin air, and swipes away your weapon."
- observation_choices = list("Chase after it")
- correct_choices = list("Chase after it")
- observation_success_message = "You chase gone with a simple smile across the facility \
- You trip and scrape your leg on the facility's floor. \
- \"Well that wasn't very nice! You should apologize for so rudely disarming me, and having me run around like that!\" \
- The words come out of your mouth before you even realize what is happening. \
- And as if to answer, Gone with a Simple Smile hands your weapon back. \
- Then, it disappears with a smile."
+ observation_choices = list(
+ "Chase after it" = list(TRUE, "You chase gone with a simple smile across the facility \
+ You trip and scrape your leg on the facility's floor. \
+ \"Well that wasn't very nice! You should apologize for so rudely disarming me, and having me run around like that!\" \
+ The words come out of your mouth before you even realize what is happening. \
+ And as if to answer, Gone with a Simple Smile hands your weapon back. \
+ Then, it disappears with a smile."),
+ )
var/list/stats = list(
FORTITUDE_ATTRIBUTE,
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/skin_prophet.dm b/code/modules/mob/living/simple_animal/abnormality/teth/skin_prophet.dm
index ff7b0cbeaca6..41050acbe1f6 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/skin_prophet.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/skin_prophet.dm
@@ -32,16 +32,16 @@
hands are busy nonetheless. \
Yearning for destruction and doom, it writes and writes and writes. \
You feel the passages it’s writing may be prophecies for someplace and sometime."
- observation_choices = list("Snuff out the candles", "Peek at the book")
- correct_choices = list("Snuff out the candles")
- observation_success_message = "You hushed the candles, one by one. \
- The space grew darker, but its hands won’t stop. \
- The only light left was on the quill it held. \
- Even that was snuffed by our breaths. \
- Then, the whole place went dark. \
- All that’s left is the pen in its hand."
- observation_fail_message = "!@)(!@&)&*%(%@!@#*(#)*(%&!@#$ \
- @$*@)$ ? @#$!!@#* ! @*()!%&$(^!!!!@&(@)"
+ observation_choices = list(
+ "Snuff out the candles" = list(TRUE, "You hushed the candles, one by one. \
+ The space grew darker, but its hands won’t stop. \
+ The only light left was on the quill it held. \
+ Even that was snuffed by our breaths. \
+ Then, the whole place went dark. \
+ All that’s left is the pen in its hand."),
+ "Peek at the book" = list(FALSE, "!@)(!@&)&*%(%@!@#*(#)*(%&!@#$ \
+ @$*@)$ ? @#$!!@#* ! @*()!%&$(^!!!!@&(@)"),
+ )
var/list/speak_list = list(
"!@)(!@&)&*%(%@!@#*(#)*(%&!@#$",
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm b/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm
index 0eb585b6018c..1345db7664cf 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm
@@ -44,15 +44,15 @@
In this cramped cell, the wooden doll stands. \
Are the talismans here to fulfill a wish? \
Does this wooden doll wish for anything?"
- observation_choices = list("Remove the doll's talismans", "Do nothing")
- correct_choices = list("Remove the doll's talismans")
- observation_success_message = "After you removed them, the doll knelt. \
- Is it begging you not to take it, \
- or is it a gesture of gratitude? \
- You won’t know for now."
- observation_fail_message = "Nothing happened. \
- The doll would simply stand there, producing small noises. \
- It now ignores you, as if disappointed."
+ observation_choices = list(
+ "Remove the doll's talismans" = list(TRUE, "After you removed them, the doll knelt. \
+ Is it begging you not to take it, \
+ or is it a gesture of gratitude? \
+ You won’t know for now."),
+ "Do nothing" = list(FALSE, "Nothing happened. \
+ The doll would simply stand there, producing small noises. \
+ It now ignores you, as if disappointed."),
+ )
var/can_act = TRUE
/// When this reaches 400 - begins reflecting damage
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/someonesportrait.dm b/code/modules/mob/living/simple_animal/abnormality/teth/someonesportrait.dm
index 7dd806c49ac4..847d2781e6dd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/someonesportrait.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/someonesportrait.dm
@@ -29,11 +29,11 @@
//TODO: Resprite + redo of this
observation_prompt = "The portrait has been in our family's possession for a long time. \
They say it was of a very important relative of ours, but we do not recognize anyone present. I've always hated the picture, why couldn't anyone else see it was just biding its time, waiting to strike?"
- observation_choices = list("Destroy the picture")
- correct_choices = list("Destroy the picture")
- observation_success_message = "One night, when everyone else was asleep, I snuck out of my room and found myself before that horrible thing. \
- Retrieving a lighter from my pocket I flicked it on and held it to the painting... \
- It turned out I was right, it was waiting to attack and I got into its striking range when no one else was around..."
+ observation_choices = list(
+ "Destroy the picture" = list(TRUE, "One night, when everyone else was asleep, I snuck out of my room and found myself before that horrible thing. \
+ Retrieving a lighter from my pocket I flicked it on and held it to the painting... \
+ It turned out I was right, it was waiting to attack and I got into its striking range when no one else was around..."),
+ )
//Initialize
/mob/living/simple_animal/hostile/abnormality/someones_portrait/PostSpawn()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm b/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm
index 7bb700d05279..21012c411d33 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm
@@ -30,13 +30,13 @@
observation_prompt = "I am a spider. I eat anything my web catches. I am starving. \
I haven't eaten anything for days. There is a big prey hanging on my web. \
My starvation could kill me if I don't eat something."
- observation_choices = list("Eat the prey.", "Do not eat the prey.")
- correct_choices = list("Do not eat the prey.")
- observation_success_message = "I could not eat the prey in front of me. \
- This starvation is slowly tiring me. The prey struggles to get out, to survive. \
- The struggle did nothing but shaking my web a little bit. And I watch the prey."
- observation_fail_message = "I devoured the prey. \
- My body reacted faster than my thoughts. ... I am a spider. I eat anything my web catches."
+ observation_choices = list(
+ "Do not eat the prey" = list(TRUE, "I could not eat the prey in front of me. \
+ This starvation is slowly tiring me. The prey struggles to get out, to survive. \
+ The struggle did nothing but shaking my web a little bit. And I watch the prey."),
+ "Eat the prey" = list(FALSE, "I devoured the prey. \
+ My body reacted faster than my thoughts. ... I am a spider. I eat anything my web catches."),
+ )
/// Filled with ckeys of people who broke our cocoons, they need to pay if they dare mess with us
var/list/metagame_list = list()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/training_rabbit.dm b/code/modules/mob/living/simple_animal/abnormality/teth/training_rabbit.dm
index cf9ed70d7468..1937f3a91e42 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/training_rabbit.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/training_rabbit.dm
@@ -37,14 +37,14 @@
observation_prompt = "This is the training dummy that Lobotomy Corporation uses for training new agents. \
But is that really all there is to it? \
Looking closely, you find..."
- observation_choices = list("A dead body?", "Nothing")
- correct_choices = list("A dead body?")
- observation_success_message = "The facial structure, the torso, arms and legs, not to mention the stench... \
- There's no doubt that this is just a dead body in a body bag, flipped upside-down. \
- In spite of all this, it provides a gift to you. It continues moving around as if it were alive. \
- So this is what they call an abnormality. \
- Are all abnormalities at Lobotomy Corporation this strange?"
- observation_fail_message = "Your imagination must be going haywire due to the stress. There's no way such an out-of-place thing could be there!"
+ observation_choices = list(
+ "A dead body?" = list(TRUE, "The facial structure, the torso, arms and legs, not to mention the stench... \
+ There's no doubt that this is just a dead body in a body bag, flipped upside-down. \
+ In spite of all this, it provides a gift to you. It continues moving around as if it were alive. \
+ So this is what they call an abnormality. \
+ Are all abnormalities at Lobotomy Corporation this strange?"),
+ "Nothing" = list(FALSE, "Your imagination must be going haywire due to the stress. There's no way such an out-of-place thing could be there!"),
+ )
/mob/living/simple_animal/hostile/abnormality/training_rabbit/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm b/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm
index 0b28cd1ba22c..984a073ab150 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm
@@ -40,10 +40,10 @@
I go out and bring such sweet dreams to those who've only learned to stop dreaming, \
I'm not to blame if their dreams are so entrancing they become hollow people in their waking lives, am I not? \
Don't you want such sweet dreams too?\""
- observation_choices = list("You're a demon", "Please, eat my dreams")
- correct_choices = list("You're a demon")
- observation_success_message = "\"Don't say such scary, complicated things. I just gave them the enrapturing dreams they wanted. They're destined to come back to me.\""
- observation_fail_message = "It's alright, dreams are harmless but unnecessary things. So, just close your eyes and show me your most delectable dream..."
+ observation_choices = list(
+ "You're a demon" = list(TRUE, "\"Don't say such scary, complicated things. I just gave them the enrapturing dreams they wanted. They're destined to come back to me.\""),
+ "Please, eat my dreams" = list(FALSE, "It's alright, dreams are harmless but unnecessary things. So, just close your eyes and show me your most delectable dream..."),
+ )
var/punched = FALSE
var/pulse_damage = 50
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm b/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm
index 96ccecb95f18..5cf708ad48a6 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm
@@ -35,12 +35,11 @@
observation_prompt = "You told me, shedding petals instead of tears. \
\"We were all nothing but soil once, so do not speak of an end here.\" \
You told me, blossoming flowers from body as if they are your last words. \"Soon...\""
- observation_choices = list("Spring will come.", "Winter will come.")
- correct_choices = list("Spring will come.", "Winter will come.")
- observation_success_message = "Spring is coming. Slowly, rapturously, my end began."
- //Special answer for choice 2
- var/observation_success_message_2 = "Winter is coming. \
- Gradually, my exipation was drawing to an end hectically."
+ observation_choices = list(
+ "Spring will come" = list(TRUE, "Spring is coming. Slowly, rapturously, my end began."),
+ "Winter will come" = list(TRUE, "Winter is coming. \
+ Gradually, my exipation was drawing to an end hectically."),
+ )
/// Currently displayed petals. When value is at 3 - reset to 0 and perform attack
var/petals_current = 0
@@ -58,13 +57,6 @@
gift_type = /datum/ego_gifts/aroma
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
-/mob/living/simple_animal/hostile/abnormality/alriune/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answer for winter
- if(answer == "Winter will come.")
- observation_success_message = observation_success_message_2
- else
- observation_success_message = initial(observation_success_message)
- return ..()
-
/* Combat */
/mob/living/simple_animal/hostile/abnormality/alriune/Move()
@@ -160,7 +152,8 @@
/mob/living/simple_animal/hostile/abnormality/alriune/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
petals_next = world.time + petals_next_time + 30
- TeleportAway()
+ if(breach_type != BREACH_MINING)//in ER you get a few seconds to smack it down
+ TeleportAway()
icon_state = "alriune_active"
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm b/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm
index f49b510ba790..8e75e6dcba6f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm
@@ -50,14 +50,14 @@
You're not sure if it's even able to understand you. Despite being shaped like a human, there's no face to relate to. No eyes to look at. \
Just the rough outline of a human. \
Is there even anything you can say to it?"
- observation_choices = list("Beat it up.", "Why?")
- correct_choices = list("Why?")
- observation_success_message = "The abnormality suddenly stops moving. It doesn't quite know how to respond either. \
- It stares down at the floor as if to contemplate the question. \
- All it can offer is a shrug. Perhaps there isn't an answer."
- observation_fail_message = "There's nothing to say. A crash test dummy's only purpose is to enable violence. \
- Violence for the sake of violence. \
- You smile as you pull out your baton."
+ observation_choices = list(
+ "Why?" = list(TRUE, "The abnormality suddenly stops moving. It doesn't quite know how to respond either. \
+ It stares down at the floor as if to contemplate the question. \
+ All it can offer is a shrug. Perhaps there isn't an answer."),
+ "Beat it up" = list(FALSE, "There's nothing to say. A crash test dummy's only purpose is to enable violence. \
+ Violence for the sake of violence. \
+ You smile as you pull out your baton."),
+ )
var/revealed = TRUE
var/can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm b/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm
index 4593c2ee1f94..91efb80b28ad 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm
@@ -40,11 +40,11 @@
Seeing little recourse, you follow them to a palace made of ice, surrounded by a fence made out of various bones. \
The palace stands on the precipice of life and death. You know this palace and who it belongs to. \
A terrifying witch lives here."
- observation_choices = list("Knock on the door", "Keep wandering the blizzard")
- correct_choices = list("Knock on the door")
- observation_success_message = "You can't keep shivering in the cold forever. You knock on the door..."
- observation_fail_message = "You keep wandering the blizzard, the cold continuing to sap your strength. \
- Eventually you collapse in the snow, your whole body frozen. Ahh... There's no more pain..."
+ observation_choices = list(
+ "Knock on the door" = list(TRUE, "You can't keep shivering in the cold forever. You knock on the door..."),
+ "Keep wandering the blizzard" = list(FALSE, "You keep wandering the blizzard, the cold continuing to sap your strength. \
+ Eventually you collapse in the snow, your whole body frozen. Ahh... There's no more pain..."),
+ )
var/jump_cooldown = 0
var/jump_cooldown_time = 35 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/big_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/big_bird.dm
index 194fa292f1d7..e3daa7ab1947 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/big_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/big_bird.dm
@@ -63,11 +63,11 @@
For monsters could come, hurting creatures at any time. By the time eyes covered the whole body of the big bird, no one was around for it to protect. \
To shine the light in this dark forest, the big bird burned every single feather it had to make an everlasting lamp. \
The big bird now could hardly be called a bird now, it has no feathers at all."
- observation_choices = list("Don't pet it", "Pet it")
- correct_choices = list("Pet it")
- observation_success_message = "It was not soft actually, it gave you chills. You felt eyes looking at you with curiosity. \
- Eyes started closing as you pet the bird. The big bird, for the first time in a very long time, peacefully fell asleep."
- observation_fail_message = "The bird could get angry and bite you. You ran out of the room in fear."
+ observation_choices = list(
+ "Pet it" = list(TRUE, "It was not soft actually, it gave you chills. You felt eyes looking at you with curiosity. \
+ Eyes started closing as you pet the bird. The big bird, for the first time in a very long time, peacefully fell asleep."),
+ "Don't pet it" = list(FALSE, "The bird could get angry and bite you. You ran out of the room in fear."),
+ )
var/bite_cooldown
var/bite_cooldown_time = 8 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm b/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm
index f678dbc1adb1..35956de77d70 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm
@@ -60,12 +60,12 @@
observation_prompt = "(You see a wolf with patchy fur) \
I like it here. At least it's better than where I used to live. There are no pigs or chickens, but I don't have to be Big Bad Wolf, at least. \
You didn't immediately kick me out, so I will tell you my name. My name is..."
- observation_choices = list("Forget the name", "Remember the name")
- correct_choices = list("Remember the name")
- observation_success_message = "It's no use to remember it. Nobody cares about my name. \
- (Even though the wolf said such a thing, it seems happy.)"
- observation_fail_message = "You better watch out. I can eat you with one bite if I want to. \
- (The wolf seems unhappy)"
+ observation_choices = list(
+ "Remember the name" = list(TRUE, "It's no use to remember it. Nobody cares about my name. \
+ (Even though the wolf said such a thing, it seems happy.)"),
+ "Forget the name" = list(FALSE, "You better watch out. I can eat you with one bite if I want to. \
+ (The wolf seems unhappy)"),
+ )
var/can_act = TRUE
//For when the wolf becomes incorporal and flees.
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm b/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm
index aeb3656a878c..64d19f254283 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm
@@ -60,12 +60,12 @@
One day, her skin covered in blisters and her mouth oozing with spittle and pus, she passed by a lake, seemingly untouched by the pollution of the City. \
Though her eyesight was almost ruined by fog and affliction, she could see it clearly. \
Upon that lake were six white swans and a singular black swan. Elijah..."
- observation_choices = list("Observed the white swans", "Observed the black swan")
- correct_choices = list("Observed the black swan")
- observation_success_message = "The black swan watches forlornly as her family takes flight, she's willing to give up everything for her family. \
- Elijah embraces the near-finished nettle clothing wholeheartedly, soon..."
- observation_fail_message = "The white swans were Elijah's favourite. \
- They spread their wings and took flight to the sky, high above the fog, leaving the black swan behind. Elijah clutched her brooch tighter, she only had to work a little harder..."
+ observation_choices = list(
+ "Observed the black swan" = list(TRUE, "The black swan watches forlornly as her family takes flight, she's willing to give up everything for her family. \
+ Elijah embraces the near-finished nettle clothing wholeheartedly, soon..."),
+ "Observed the white swans" = list(FALSE, "The white swans were Elijah's favourite. \
+ They spread their wings and took flight to the sky, high above the fog, leaving the black swan behind. Elijah clutched her brooch tighter, she only had to work a little harder..."),
+ )
//family breach conditions
var/insane_humans = 0
@@ -157,7 +157,8 @@
if(!LAZYLEN(teleport_potential))
return FALSE
var/turf/teleport_target = pick(teleport_potential)
- forceMove(teleport_target)
+ if(breach_type != BREACH_MINING)
+ forceMove(teleport_target)
playsound(get_turf(src), 'sound/abnormalities/blackswan/sis_transformation.ogg', 30, 0, 4)
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm
index 878d3cf3dd27..cf055b52ddf1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm
@@ -44,9 +44,9 @@
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
observation_prompt = "Are you a monk?"
- observation_choices = list("I am no longer a monk")
- correct_choices = list("I am no longer a monk")
- observation_success_message = "A demon shall never reach Heaven."
+ observation_choices = list(
+ "I am no longer a monk" = list(TRUE, "A demon shall never reach Heaven."),
+ )
var/datum/looping_sound/cloudedmonk_ambience/soundloop
var/charging = FALSE
@@ -59,6 +59,7 @@
var/charge_damage = 350
var/eaten = FALSE
var/damage_taken
+ var/slam_damage = 100
attack_action_types = list(
/datum/action/innate/abnormality_attack/toggle/monk_charge,
@@ -159,6 +160,7 @@
damage_taken += .
if(damage_taken >= 200 && !charge_ready)
charge_ready = TRUE
+ to_chat(src, span_userdanger("YOU ARE READY TO CHARGE!"))
/mob/living/simple_animal/hostile/abnormality/clouded_monk/Goto(target, delay, minimum_distance)
if(revving_charge || charging)
@@ -239,7 +241,7 @@
SLEEP_CHECK_DEATH(get_dist(src, T) * movespeed)
EndCharge()
-/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/EndCharge()
+/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/EndCharge(bump = FALSE)
if(!charging)
return
charging = FALSE
@@ -247,6 +249,22 @@
walk(src, 0) // cancel the movement
icon_state = icon_aggro
+ if (!bump && SSmaptype.maptype == "rcorp")
+ var/turf/T = get_turf(src)
+ for(var/turf/TF in range(2, T))//Smash AOE visual
+ new /obj/effect/temp_visual/smash_effect(TF)
+ for(var/mob/living/L in range(2, T))//damage applied to targets in range
+ if(faction_check_mob(L))
+ continue
+ if(L.z != z)
+ continue
+ visible_message(span_boldwarning("[src] slams [L]!"))
+ to_chat(L, span_userdanger("[src] slams you!"))
+ var/turf/LT = get_turf(L)
+ new /obj/effect/temp_visual/kinetic_blast(LT)
+ L.apply_damage(slam_damage,RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ playsound(L, 'sound/creatures/lc13/lovetown/slam.ogg', 75, 1)
+
/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/ResetCharge()
monk_charge_cooldown = world.time + monk_charge_cooldown_time
charge_ready = FALSE //redundancy is good
@@ -276,11 +294,12 @@
playsound(src, 'sound/abnormalities/clouded_monk/eat_groggy.ogg', 75, 1)
else
L.adjustRedLoss(charge_damage/10)
- EndCharge()
+ EndCharge(TRUE)
ResetCharge()
else if(isvehicle(A))
var/obj/vehicle/V = A
- V.take_damage(charge_damage/10, RED_DAMAGE)
+ V.take_damage(charge_damage*1.5, RED_DAMAGE)
for(var/mob/living/occupant in V.occupants)
to_chat(occupant, span_userdanger("Your [V.name] is bit by [src]!"))
+ EndCharge(FALSE)
return ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm b/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm
index 9eb894acb704..83e4933ad0a4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm
@@ -66,11 +66,11 @@
When I first met this thing, I started to understand how those people feel. \
Right now, during my attachment work, it started its usual clown performance. \
Things are looking good so far. Out of its pocket, the clown pulls out..."
- observation_choices = list("It's just a tool" ,"Run")
- correct_choices = list("Run")
- observation_success_message = "I bolted out of containment unit as fast as I could. \
- I could hear giggling as I left. But that was more than just a cruel prank."
- observation_fail_message = "I thought it was a tool. Just for that moment."
+ observation_choices = list(
+ "Run" = list(TRUE, "I bolted out of containment unit as fast as I could. \
+ I could hear giggling as I left. But that was more than just a cruel prank."),
+ "It's just a tool" = list(FALSE, "I thought it was a tool. Just for that moment."),
+ )
del_on_death = FALSE //for explosions
var/finishing = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/contract.dm b/code/modules/mob/living/simple_animal/abnormality/waw/contract.dm
index 37200420daf4..48d36318a091 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/contract.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/contract.dm
@@ -33,17 +33,17 @@
The paper is a jumbled mess of words, you can't make out anything on it. \
A pen appears in your hand. \
The seems to be running out of patience. Will you sign?"
- observation_choices = list("Sign the contract", "Do not sign")
- correct_choices = list("Do not sign")
- observation_success_message = "You take a closer look at the contract \
- There is a tiny clause in fine print \
- \"Your soul becomes the property of a contract signed.\" \
- At your refusal, the man sighs and hands you a new contract. \
- This contract seems legitimate, so you sign."
- observation_fail_message = "You sign the contract in haste. \
- In a few moments, you feel as if a piece of you is missing. \
- You walk out in a daze, unable to remember what the contract was about. \
- Perhaps you should have read the fine print."
+ observation_choices = list(
+ "Do not sign" = list(TRUE, "You take a closer look at the contract \
+ There is a tiny clause in fine print \
+ \"Your soul becomes the property of a contract signed.\" \
+ At your refusal, the man sighs and hands you a new contract. \
+ This contract seems legitimate, so you sign."),
+ "Sign the contract" = list(FALSE, "You sign the contract in haste. \
+ In a few moments, you feel as if a piece of you is missing. \
+ You walk out in a daze, unable to remember what the contract was about. \
+ Perhaps you should have read the fine print."),
+ )
var/list/total_havers = list()
var/list/fort_havers = list()
@@ -52,6 +52,10 @@
var/list/just_havers = list()
var/list/spawnables = list()
var/total_per_contract = 4
+ var/breaching
+ var/summon_count = 0
+ var/summon_cooldown
+ var/summon_cooldown_time = 60 SECONDS
/mob/living/simple_animal/hostile/abnormality/contract/Initialize()
. = ..()
@@ -65,6 +69,16 @@
if((initial(abno.threat_level)) <= WAW_LEVEL)
spawnables += abno
+/mob/living/simple_animal/hostile/abnormality/contract/Life()
+ . = ..()
+ if(!breaching)
+ return
+ if(summon_count > 4)
+ return
+ if((summon_cooldown < world.time) && !(status_flags & GODMODE))
+ Summon()
+ summon_cooldown = world.time + summon_cooldown_time
+
/mob/living/simple_animal/hostile/abnormality/contract/WorkChance(mob/living/carbon/human/user, chance, work_type)
. = chance
if(!(user in total_havers))
@@ -147,8 +161,17 @@
//Meltdown
/mob/living/simple_animal/hostile/abnormality/contract/ZeroQliphoth(mob/living/carbon/human/user)
+ Summon()
+ datum_reference.qliphoth_change(2)
+
+/mob/living/simple_animal/hostile/abnormality/contract/BreachEffect(mob/living/carbon/human/user, breach_type)//causes a runtime
+ if(breach_type == BREACH_MINING)
+ breaching = TRUE
+ ..()
+
+/mob/living/simple_animal/hostile/abnormality/contract/proc/Summon(mob/living/carbon/human/user)
// Don't need to lazylen this. If this is empty there is a SERIOUS PROBLEM.
- var/mob/living/simple_animal/hostile/abnormality/spawning = pick(spawnables)
+ var/mob/living/simple_animal/hostile/abnormality/spawning = pick(spawnables)
var/mob/living/simple_animal/hostile/abnormality/spawned = new spawning(get_turf(src))
spawned.BreachEffect()
spawned.color = "#000000" //Make it black to look cool
@@ -156,7 +179,7 @@
spawned.desc = "What is that thing?"
spawned.faction = list("hostile")
spawned.core_enabled = FALSE
- datum_reference.qliphoth_change(2)
+ summon_count += 1
/* Work effects */
/mob/living/simple_animal/hostile/abnormality/contract/SuccessEffect(mob/living/carbon/human/user, work_type, pe)
@@ -167,7 +190,6 @@
work_damage_amount = initial(work_damage_amount)
return
-
/mob/living/simple_animal/hostile/abnormality/contract/NeutralEffect(mob/living/carbon/human/user, work_type, pe)
. = ..()
NewContract(user, work_type)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/despair_knight.dm b/code/modules/mob/living/simple_animal/abnormality/waw/despair_knight.dm
index 76fd03984a9f..94dc1c2701c4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/despair_knight.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/despair_knight.dm
@@ -50,11 +50,11 @@
observation_prompt = "I once dedicated myself to the justice of this world, to protect my king, the kingdom and the weak. \
However in the end nothing was truly upheld on my watch. Even so... I still want to protect someone, anyone..."
- observation_choices = list("Accept her blessing", "Refuse it")
- correct_choices = list("Refuse it")
- observation_success_message = "Am I not needed anymore? \
- No... You're saying I should move on. I don't know how, or if I can, but, perhaps things could turn out for the better. We need only try."
- observation_fail_message = "Thank you, though I am but a pitiful knight, I still yearn to protect, if I can't protect others, I may as well disappear..."
+ observation_choices = list(
+ "Refuse it" = list(TRUE, "Am I not needed anymore? \
+ No... You're saying I should move on. I don't know how, or if I can, but, perhaps things could turn out for the better. We need only try."),
+ "Accept her blessing" = list(FALSE, "Thank you, though I am but a pitiful knight, I still yearn to protect, if I can't protect others, I may as well disappear..."),
+ )
var/mob/living/carbon/human/blessed_human = null
var/teleport_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm b/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm
index 848b8206e938..6d50202a8714 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm
@@ -13,6 +13,7 @@
maxHealth = 1200
health = 1200
+ blood_volume = 0
density = FALSE
damage_coeff = list(RED_DAMAGE = 0, WHITE_DAMAGE = 1.5, BLACK_DAMAGE = 0.8, PALE_DAMAGE = 1)
stat_attack = HARD_CRIT
@@ -40,12 +41,12 @@
observation_prompt = "It's invisible to almost all means of measurement, the only way I know it's there is due to the effect it has on the cup of water before me. \
I calmly observe the chamber's surroundings and make adjustments when I notice the surface of the cup's liquid begin to bubble."
- observation_choices = list("Stay and observe", "Exit the containment unit")
- correct_choices = list("Stay and observe")
- observation_success_message = "I continue to record my observations as the water rises up into the air, followed by the cup. \
- The water folds into a sphere around the cup in a most immaculate manner before being violently dispersed, the cup shattering into infinitesmal fragments. \
- I leave the chamber, satisfied with my observations."
- observation_fail_message = "The manual says to leave the chamber immediately if the cup's condition becomes violent. As I leave, the water falls still."
+ observation_choices = list(
+ "Stay and observe" = list(TRUE, "I continue to record my observations as the water rises up into the air, followed by the cup. \
+ The water folds into a sphere around the cup in a most immaculate manner before being violently dispersed, the cup shattering into infinitesmal fragments. \
+ I leave the chamber, satisfied with my observations."),
+ "Exit the containment unit" = list(FALSE, "The manual says to leave the chamber immediately if the cup's condition becomes violent. As I leave, the water falls still."),
+ )
var/cooldown_time = 3
var/aoe_damage = 12
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm b/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm
index 361a59cedc8d..ad59de2feaa6 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm
@@ -45,11 +45,11 @@
observation_prompt = "My mom and dad took me to this place when I was very small, it smells strange and the people in it only wear white. \
Mom says she and dad will come back for me very soon. \
Today one of the men in the white clothing offers me the purple candy, it's grape-flavoured he says. Grape is my favourite."
- observation_choices = list("Eat the candy", "Don't eat the candy")
- correct_choices = list("Eat the candy")
- observation_success_message = "It's grape flavour, the grape is my favourite. \
- When I eat the grape candy I imagine myself swimming in an ocean of colour. Today, I think I'm going to go to the Sea..."
- observation_fail_message = "I don't eat the candy given to me. When will mom and dad come? Why aren't they here? It doesn't stop hurting, I'm scared..."
+ observation_choices = list(
+ "Eat the candy" = list(TRUE, "It's grape flavour, the grape is my favourite. \
+ When I eat the grape candy I imagine myself swimming in an ocean of colour. Today, I think I'm going to go to the Sea..."),
+ "Don't eat the candy" = list(FALSE, "I don't eat the candy given to me. When will mom and dad come? Why aren't they here? It doesn't stop hurting, I'm scared..."),
+ )
var/list/movement_path = list()
var/list/been_hit = list()
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm b/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm
index e79af2a806aa..d55d34a00ac7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm
@@ -12,6 +12,7 @@
health = 2000
pixel_x = -16
base_pixel_x = -16
+ blood_volume = 0
melee_damage_type = BLACK_DAMAGE
melee_damage_lower = 35
melee_damage_upper = 45
@@ -53,12 +54,12 @@
Her plan was a success - her behated Snow White has fallen into a death-like state. \
Is that all I was for? To bring pain to others whilst never experiencing it myself? \
I'm beginning to rot and feel pests and other lowly creatures make a meal out of me..."
- observation_choices = list("Rot into nothing", "Don't accept the end")
- correct_choices = list("Don't accept the end")
- observation_success_message = "The impression of poison brings pause to the pests and even they no longer wish to remain with me. \
- Petrified roots grow from within me and I gain some sense of being ambulatory. I know now how long I had laid but I refuse to remain still. \
- I shall find vengeance. Bring me snow white..."
- observation_fail_message = "An apple culminates when it shrivels up and attracts lesser creatures. I'm just an apple, I can't change a thing."
+ observation_choices = list(
+ "Don't accept the end" = list(TRUE, "The impression of poison brings pause to the pests and even they no longer wish to remain with me. \
+ Petrified roots grow from within me and I gain some sense of being ambulatory. I know now how long I had laid but I refuse to remain still. \
+ I shall find vengeance. Bring me snow white..."),
+ "Rot into nothing" = list(FALSE, "An apple culminates when it shrivels up and attracts lesser creatures. I'm just an apple, I can't change a thing."),
+ )
var/barrier_cooldown
var/barrier_cooldown_time = 4 SECONDS
@@ -141,7 +142,8 @@
/mob/living/simple_animal/hostile/abnormality/ebony_queen/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
- addtimer(CALLBACK(src, PROC_REF(TryTeleport)), 5)
+ if(breach_type != BREACH_MINING)
+ addtimer(CALLBACK(src, PROC_REF(TryTeleport)), 5)
/mob/living/simple_animal/hostile/abnormality/ebony_queen/Move()
if(!can_act)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm b/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm
index a53015794a56..07f3c55663ee 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm
@@ -33,10 +33,10 @@
observation_prompt = "The booking clerk who remains dauntingly quiet sells tickets for a train with no final destination. \
There are no clocks to alert the arrival times, instead, there are some blinking lights. \
\"Sir! Your ticket?\" The clerk behind the counter smothered in shadow, save for two pinpricks of amber light for eyes, holds out an unmarked ticket with its gangly appendage."
- observation_choices = list("Take the ticket")
- correct_choices = list("Take the ticket")
- observation_success_message = "I took the ticket from his hand, it felt like a lead weight, and asked him when the train would arrive. \
- \"Sooner than you'd like, later than you prepare for. It comes for everyone Sir.\" I hear the sound of a distant horn."
+ observation_choices = list(
+ "Take the ticket" = list(TRUE, "I took the ticket from his hand, it felt like a lead weight, and asked him when the train would arrive. \
+ \"Sooner than you'd like, later than you prepare for. It comes for everyone Sir.\" I hear the sound of a distant horn."),
+ )
var/meltdown_tick = 60 SECONDS
var/meltdown_timer
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm
index 08f611ee68c8..eab18f94e30b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm
@@ -42,18 +42,17 @@
observation_prompt = "You can only hunt it wearing a thick blindfold, but even through the fabric you can track it by the light that manages to seep through and by the heat it radiates. \
In your hands you carry a bow nocked with an arrow, it's your last one. \
You've been pursuing your prey for days, you..."
- observation_choices = list("Fire an arrow", "Take off your blindfold", "Do nothing")
- correct_choices = list("Do nothing", "Take off your blindfold")
- observation_success_message = "You watch and wait as the light and heat pass until only cold and darkness reign in the forest. \
- Feeling safe, you remove your blindfold and find on the ground one of its radiant feathers. \
- Bravo brave hunter, have you found what you were seeking?"
- observation_fail_message = "You fire an arrow at what you percieve to be the source of the light and miss entirely. You return empty-handed like so many hunters before you."
- //Special answer for choice 2
- var/observation_success_message_2 = "Your curiosity gets the better of you. \
- The sight of a mythological bird that no one has seen before is a prize no hunter has claimed. \
- Steeling yourself, you remove the blindfold and immediately your vision is seared by the intensity of the light but you will yourself through the pain to catch a glimpse of what has long evaded every hunter's sight. \
- The bird offers a tear for your efforts. \
- Though your eyes may never recover, you have done what no hunter has dared to accomplish - captured it in your sight."
+ observation_choices = list(
+ "Do nothing" = list(TRUE, "You watch and wait as the light and heat pass until only cold and darkness reign in the forest. \
+ Feeling safe, you remove your blindfold and find on the ground one of its radiant feathers. \
+ Bravo brave hunter, have you found what you were seeking?"),
+ "Take off your blindfold" = list(TRUE, "Your curiosity gets the better of you. \
+ The sight of a mythological bird that no one has seen before is a prize no hunter has claimed. \
+ Steeling yourself, you remove the blindfold and immediately your vision is seared by the intensity of the light but you will yourself through the pain to catch a glimpse of what has long evaded every hunter's sight. \
+ The bird offers a tear for your efforts. \
+ Though your eyes may never recover, you have done what no hunter has dared to accomplish - captured it in your sight."),
+ "Fire an arrow" = list(FALSE, "You fire an arrow at what you percieve to be the source of the light and miss entirely. You return empty-handed like so many hunters before you."),
+ )
var/pulse_cooldown
var/pulse_cooldown_time = 1 SECONDS
@@ -65,13 +64,6 @@
var/dash_damage = 220
var/list/been_hit = list()
-/mob/living/simple_animal/hostile/abnormality/fire_bird/ObservationResult(mob/living/carbon/human/user, condition, answer) //borrowed from Bottle of Tears
- if(answer == "Take off your blindfold")
- observation_success_message = observation_success_message_2
- else
- observation_success_message = initial(observation_success_message)
- return ..()
-
//Initialize
/mob/living/simple_animal/hostile/abnormality/fire_bird/HandleStructures()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm b/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm
index 7741f69fbc6f..3131e5f96cd7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm
@@ -30,10 +30,10 @@
observation_prompt = "I've been praying for 7 days and 7 nights, my skin is taut from malnutrition, my eyes bloodshot from lack of sleep and my clothes soiled with my own filth. \
Though my throat is so dry I cannot even maintain the chants I move my lips anyway. \
Is anyone even listening? Does my prayer reach Him? All I ask for is a sign."
- observation_choices = list("Stop praying", "Keep praying")
- correct_choices = list("Stop praying")
- observation_success_message = "No one is there, God does not reside here."
- observation_fail_message = "If God truly loves us, he'll show us a sign."
+ observation_choices = list(
+ "Stop praying" = list(TRUE, "No one is there, God does not reside here."),
+ "Keep praying" = list(FALSE, "If God truly loves us, he'll show us a sign."),
+ )
var/work_count = 0
var/breach_count = 4 //when do you breach?
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm b/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm
index c5dc7452cd8c..645ccee2eb0e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm
@@ -45,13 +45,18 @@
Unquestioningly loyal, I follow my orders to the letter. \
I even feel excited whenever I get a new order. \
Why am I doing this all again?"
- observation_choices = list("I fight to survive", "I fight out of loyalty")
- correct_choices = list("I fight to survive","I fight out of loyalty")
- observation_success_message = "Bees have a natural instinct to fight for their queen. \
- It is not something as complicated as human emotion. \
- Rather, it is a hormone produced by the queen. \
- I will die the moment I leave the queendom. \
- There is no other option but to remain unquestionably loyal."
+ observation_choices = list(
+ "I fight to survive" = list(TRUE, "Bees have a natural instinct to fight for their queen. \
+ It is not something as complicated as human emotion. \
+ Rather, it is a hormone produced by the queen. \
+ I will die the moment I leave the queendom. \
+ There is no other option but to remain unquestionably loyal."),
+ "I fight out of loyalty" = list(TRUE, "Bees have a natural instinct to fight for their queen. \
+ It is not something as complicated as human emotion. \
+ Rather, it is a hormone produced by the queen. \
+ I will die the moment I leave the queendom. \
+ There is no other option but to remain unquestionably loyal."),
+ )
var/fire_cooldown_time = 3 SECONDS //She has 4 cannons, fires 4 times faster than the artillery bees
var/fire_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm b/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm
index f6e25e918c58..7de78f1cf8ad 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm
@@ -38,15 +38,15 @@
Happiness of the world means happiness for me. I'm trying to stay happy. \
I don't care even if it got me to the point where I look like this. Have you met my sisters? We were always one. \
We fought together, and shared a common goal. By the way, are you happy now?"
- observation_choices = list("Yes, I'm happy", "No, I'm not happy")
- correct_choices = list("Yes, I'm happy")
- observation_success_message = "(The egg shook violently) \
- Don't lie. Why have we been ruined like this if that's true? \
- And why have you ended up like that? My greed will not be sated with such flimsy conviction. \
- But if your answer is a resolve for the future, and not just a statement of fact... Things might change, slowly."
- observation_fail_message = "I knew you were not happy. \
- You are like me. You trapped yourself inside of an egg, just like me. \
- The amber-colored sky is beautiful. Oh, I'm getting hungry again."
+ observation_choices = list(
+ "Yes, I'm happy" = list(TRUE, "(The egg shook violently) \
+ Don't lie. Why have we been ruined like this if that's true? \
+ And why have you ended up like that? My greed will not be sated with such flimsy conviction. \
+ But if your answer is a resolve for the future, and not just a statement of fact... Things might change, slowly."),
+ "No, I'm not happy" = list(FALSE, "I knew you were not happy. \
+ You are like me. You trapped yourself inside of an egg, just like me. \
+ The amber-colored sky is beautiful. Oh, I'm getting hungry again."),
+ )
//Some Variables cannibalized from helper
var/charge_check_time = 1 SECONDS
@@ -54,6 +54,8 @@
var/dash_num = 50 //Mostly a safeguard
var/list/been_hit = list()
var/can_act = TRUE
+ var/initial_charge_damage = 800
+ var/growing_charge_damage = 0
var/nihil_present = FALSE
@@ -83,8 +85,8 @@
|Gilded Cage|: Your size is 3 by 3 tiles wide, however you can still fit in 1 by 1 areas. \
\
|Endless Hunger|: When you click on a tile outside your melee range, you will start charging into the direction you clicked. \
- There is a 1.5 second delay before you start charging, once you start charging into a direction you will constantly move in one direction. \
- If human gets within your melee range while charging, you will instantly gib them. If a abnormality appears in your path, you will deal damage to them. \
+ Once you start charging into a direction you will constantly move in one direction. \
+ Initialy, your charge deal 200 RED damage, but for every tile you move you deal an extra 40 RED damage. \
Your charge ends after you move into a wall, or any dense object. (RHINOS/OTHER ABNORMALITIES WILL STOP YOUR CHARGE)")
/datum/action/innate/abnormality_attack/kog_dash
@@ -133,6 +135,7 @@
offsets_pixel_y = list("south" = -8, "north" = -8, "west" = -8, "east" = -8)
transform = matrix(1.5, MATRIX_SCALE)
SetOccupiedTiles(1, 1, 1, 1)
+ damage_effect_scale = 1.2
startTeleport() //Let's Spaghettioodle out of here
/mob/living/simple_animal/hostile/abnormality/greed_king/proc/startTeleport()
@@ -170,7 +173,7 @@
var/dir_to_target = get_cardinal_dir(get_turf(src), get_turf(target))
if(dir_to_target)
can_act = FALSE
- addtimer(CALLBACK(src, PROC_REF(charge), dir_to_target, 0, target), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(charge), dir_to_target, 0, initial_charge_damage), 2 SECONDS)
return
return
@@ -183,35 +186,10 @@
var/dir_to_target = get_cardinal_dir(get_turf(src), get_turf(target))
can_act = FALSE
// do particle effect
- if (IsCombatMap())
- manual_emote("starts shaking...")
- SLEEP_CHECK_DEATH(15)
- addtimer(CALLBACK(src, PROC_REF(warning_effect), get_turf(src), dir_to_target, 0, target), 0 SECONDS)
- charge(dir_to_target, 0, target)
+ charge(dir_to_target, 0, initial_charge_damage)
return
-/obj/effect/temp_visual/cult/sparks/greed
- duration = 4
-
-/mob/living/simple_animal/hostile/abnormality/greed_king/proc/warning_effect(turf, move_dir, times_ran, target)
- var/stop_warning = FALSE
- if(times_ran >= dash_num)
- stop_warning = TRUE
- var/turf/T = get_step(turf, move_dir)
- if(!T)
- stop_warning = TRUE
- return
- if(T.density)
- stop_warning = TRUE
- for(var/obj/machinery/door/D in T.contents)
- if(D.density)
- stop_warning = TRUE
- for(var/turf/open/R in range(1, T))
- new /obj/effect/temp_visual/cult/sparks/greed(R)
- if (!stop_warning)
- addtimer(CALLBACK(src, PROC_REF(warning_effect), T, move_dir, (times_ran + 1)), 1)
-
-/mob/living/simple_animal/hostile/abnormality/greed_king/proc/charge(move_dir, times_ran, target)
+/mob/living/simple_animal/hostile/abnormality/greed_king/proc/charge(move_dir, times_ran, charge_damage)
setDir(move_dir)
var/stop_charge = FALSE
if(times_ran >= dash_num)
@@ -251,7 +229,7 @@
playsound(L, attack_sound, 75, 1)
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
if(ishuman(L))
- L.deal_damage(800, RED_DAMAGE)
+ L.deal_damage(charge_damage, RED_DAMAGE)
else
L.adjustRedLoss(80)
if(L.stat >= HARD_CRIT)
@@ -278,7 +256,9 @@
playsound(src,'sound/effects/bamf.ogg', 70, TRUE, 20)
for(var/turf/open/R in range(1, src))
new /obj/effect/temp_visual/small_smoke/halfsecond(R)
- addtimer(CALLBACK(src, PROC_REF(charge), move_dir, (times_ran + 1)), 2)
+ if (IsCombatMap())
+ charge_damage = charge_damage + growing_charge_damage
+ addtimer(CALLBACK(src, PROC_REF(charge), move_dir, (times_ran + 1), charge_damage), 2)
/mob/living/simple_animal/hostile/abnormality/greed_king/proc/endCharge()
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm b/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm
index 26589e5d4daa..c1531ae5c317 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm
@@ -62,13 +62,13 @@
observation_prompt = "Everyone likes me, every day someone new visits me and asks about my stories, the villains I've fought, the friends I've made, the adventures I've had. \
They never grow tired of my stories but, hey is it always peaceful around here? The world still needs me, doesn't it?"
- observation_choices = list("The world still needs you", "The world doesn't need you")
- correct_choices = list("The world doesn't need you")
- observation_success_message = "... Somehow I think I already knew that. \
- I don't know if I can accept a world that doesn't love me as I love it. Can I keep on loving the world, even if I'm no longer a real Magical Girl..?"
- observation_fail_message = "I knew it! Whilst I'm here, no villains will go unpunished! Just call on me anytime!.. \
- ... \
- Why is still so peaceful..?"
+ observation_choices = list(
+ "The world doesn't need you" = list(TRUE, "... Somehow I think I already knew that. \
+ I don't know if I can accept a world that doesn't love me as I love it. Can I keep on loving the world, even if I'm no longer a real Magical Girl..?"),
+ "The world still needs you" = list(FALSE, "I knew it! Whilst I'm here, no villains will go unpunished! Just call on me anytime!.. \
+ ... \
+ Why is still so peaceful..?"),
+ )
var/obj/effect/qoh_wand/wand
var/chance_modifier = 1
@@ -693,6 +693,8 @@
return ..()
/mob/living/simple_animal/hostile/abnormality/hatred_queen/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ friendly = FALSE
death_counter = 0
if(friendly)
friendly = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm
index fed0cf1298f6..81031d835019 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm
@@ -52,11 +52,11 @@
observation_prompt = "\"Long Bird\" who lived in the forest didn't want to let creatures to be eaten by monsters. \
His initial goal was pure, at least. The forest began to be saturated by darkness. His long vigil is saturated with memories and regrets."
- observation_choices = list("Leave him be", "Console the bird")
- correct_choices = list("Console the bird")
- observation_success_message = "Long Bird put down his scales, that had been with him for a long time. \
- The long-lasting judgement finally ends. Long Bird slowly realizes the secrets behind the monster, and he waits. For the forest that he will never take back."
- observation_fail_message = "Long Bird sees through you, even though he is blind. He is weighing your sins."
+ observation_choices = list(
+ "Console the bird" = list(TRUE, "Long Bird put down his scales, that had been with him for a long time. \
+ The long-lasting judgement finally ends. Long Bird slowly realizes the secrets behind the monster, and he waits. For the forest that he will never take back."),
+ "Leave him be" = list(FALSE, "Long Bird sees through you, even though he is blind. He is weighing your sins."),
+ )
var/judgement_cooldown = 10 SECONDS
var/judgement_cooldown_base = 10 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm b/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm
index ef4b636338f0..15b3a426a9a1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm
@@ -28,12 +28,12 @@
I have come across 15 billion light years to meet you. \
However, a butterfly can only fly as high in the sky as the sun warms. \
It does not know that it will crumble before it can reach the stars. It fell from the sky and crushed into the ground."
- observation_choices = list("Do nothing", "Become its friend")
- correct_choices = list("Become its friend")
- observation_success_message = "My voice can reach you unlike others. \
- Come to me, step by step. You will reach the stars if those steps continue."
- observation_fail_message = "Many who tried to reach me got lost. \
- Perhaps, we are standing on parallel lines. Perhaps, we were looking at something that can never be reached."
+ observation_choices = list(
+ "Become its friend" = list(TRUE, "My voice can reach you unlike others. \
+ Come to me, step by step. You will reach the stars if those steps continue."),
+ "Do nothing" = list(FALSE, "Many who tried to reach me got lost. \
+ Perhaps, we are standing on parallel lines. Perhaps, we were looking at something that can never be reached."),
+ )
var/insight_count = 0
var/non_insight_count = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm b/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm
index 69e549cfa40f..2a254b60a65f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm
@@ -6,8 +6,8 @@
icon = 'ModularTegustation/Teguicons/96x48.dmi'
icon_state = "dellaluna"
portrait = "luna"
- maxHealth = 400
- health = 400
+ maxHealth = 4000
+ health = 4000
damage_coeff = list(RED_DAMAGE = 1.2, WHITE_DAMAGE = 0, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
start_qliphoth = 3
threat_level = WAW_LEVEL
@@ -33,15 +33,15 @@
observation_prompt = "You enter the containment unit as respectfully as you can, the woman by the piano does not acknowledge your presence, merely clutching her cane tighter. \
\"Begin.\" She commands, her lips a tight thin line. It's the first time she's ever spoken. \
The piano waits for you expectantly."
- observation_choices = list("Begin a performance", "Refuse")
- correct_choices = list("Begin a performance")
- observation_success_message = "You begin to play, there is no sheet music to guide you, you play the performance that you were always meant to play. \
- It's haunting and beautiful, terrifying yet entrancing. \
- With every key press, your body feels heavier and heavier and with every step upon the shrunken heads for pedals, your mind grows slower and more sluggish. \
- By the end of the performance, you're slumped over the keyboard with hardly the strength or wherewithal to move. \
- Above the piano, through your fading vision, you can swear you see the moon. \
- And you despair."
- observation_fail_message = "She gives no indication of being disappointed. Perhaps if you played, you might understand the truth behind yourself as she did."
+ observation_choices = list(
+ "Begin a performance" = list(TRUE, "You begin to play, there is no sheet music to guide you, you play the performance that you were always meant to play. \
+ It's haunting and beautiful, terrifying yet entrancing. \
+ With every key press, your body feels heavier and heavier and with every step upon the shrunken heads for pedals, your mind grows slower and more sluggish. \
+ By the end of the performance, you're slumped over the keyboard with hardly the strength or wherewithal to move. \
+ Above the piano, through your fading vision, you can swear you see the moon. \
+ And you despair."),
+ "Refuse" = list(FALSE, "She gives no indication of being disappointed. Perhaps if you played, you might understand the truth behind yourself as she did."),
+ )
var/performance = FALSE
var/performance_length = 60 SECONDS
@@ -50,6 +50,17 @@
var/breached_monster
var/killspawn
+/mob/living/simple_animal/hostile/abnormality/luna/Move()
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/luna/CanAttack(atom/the_target)
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/luna/death(gibbed)
+ if(breached_monster)
+ qdel(breached_monster)
+ ..()
+
/mob/living/simple_animal/hostile/abnormality/luna/NeutralEffect(mob/living/carbon/human/user, work_type, pe)
. = ..()
if(prob(50))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm b/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm
index 7e7cd7e3da92..873d5a4ff701 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm
@@ -41,15 +41,15 @@
abnormality_origin = ABNORMALITY_ORIGIN_LIMBUS
observation_prompt = "A bell occasionally tolls in the room. \
-It's a heavy, subduing sound. You're unable to recognize its words. \
-But, you feel that whatever it is, is not a joyous thing."
- observation_choices = list("Listen closer.", "Repeat the mantras.")
- correct_choices = list("Listen closer.")
- observation_success_message = "You close your eyes and focus on the sound. What is is saying? \
- This thing is uttering thoughts. Empty oneself by verbalizing one's thoughts. \
- Expel everything within so that nothing remains."
- observation_fail_message = "The statue won't move, no matter what happens around it. \
- Though the tone of its mantra remains consistent, you knew its chants are imbued with a curse."
+ It's a heavy, subduing sound. You're unable to recognize its words. \
+ But, you feel that whatever it is, is not a joyous thing."
+ observation_choices = list(
+ "Listen closer" = list(TRUE, "You close your eyes and focus on the sound. What is is saying? \
+ This thing is uttering thoughts. Empty oneself by verbalizing one's thoughts. \
+ Expel everything within so that nothing remains."),
+ "Repeat the mantras" = list(FALSE, "The statue won't move, no matter what happens around it. \
+ Though the tone of its mantra remains consistent, you knew its chants are imbued with a curse.")
+ )
var/anatman_state = FALSE
var/praying = FALSE
@@ -178,7 +178,8 @@ But, you feel that whatever it is, is not a joyous thing."
var/turf/T = pick(GLOB.department_centers)
icon_state = icon_living
soundloop.start()
- forceMove(T)
+ if(breach_type != BREACH_MINING)
+ forceMove(T)
for(var/i = 1, i <= minion_amount ,i++)
var/karma_vis = new /obj/effect/karma_halo
var/picked = pick(pick(possible_minion_list))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm b/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm
index 95019daad398..eac69e295017 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm
@@ -46,12 +46,12 @@
observation_prompt = "In the beginning, a serpent tempted Eve with a bite of the forbidden fruit an act which cast Man out of the Garden of Eden. \
Now all that remains of that fruit is a rotten, decayed mass squirming with more evil serpents."
- observation_choices = list("Cover your mouth", "Take a bite")
- correct_choices = list("Take a bite")
- observation_success_message = "Mankind's sin began long ago but it was never the serpent that was evil, it only followed its nature as did Man. \
- The serpents within the fruit paused and entered into your mouth with the bite, and evil took root - \
- it's hard to blame them for mistaking you for being the same as the fruit that has long been their home."
- observation_fail_message = "They could infect you at any time through any orifice, you best leave in a hurry."
+ observation_choices = list(
+ "Take a bite" = list(TRUE, "Mankind's sin began long ago but it was never the serpent that was evil, it only followed its nature as did Man. \
+ The serpents within the fruit paused and entered into your mouth with the bite, and evil took root - \
+ it's hard to blame them for mistaking you for being the same as the fruit that has long been their home."),
+ "Cover your mouth" = list(FALSE, "They could infect you at any time through any orifice, you best leave in a hurry."),
+ )
var/serpentsnested = 4
var/origin_cooldown = 0
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm b/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm
index f2acb88c7b3a..2ff2c0014b4e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm
@@ -48,11 +48,11 @@
He seemed lost, wandering the backstreets in such finery made him a tempting target, I never realised it was everyone else who was in danger. \
He wears the mask of humanity well, but a single drop of blood is all it took for him to reveal his ferocity. \
\"It's too early for a nap... Won't you join me and share the pleasure?\" He asks, his lips still red with my blood."
- observation_choices = list("Join the Danse Macabre")
- correct_choices = list("Join the Danse Macabre")
- observation_success_message = "Refusing wasn't an option and he smiles, raising his glass. \
- \"A toast then! To a night when one is allowed to pursue all kinds of desire, a never-ending blood-red night!\" \
- Blood.... The blood brings me eternal happiness, forfeiting false hope, let's forget all pretenses of humanity..."
+ observation_choices = list(
+ "Join the Danse Macabre" = list(TRUE, "Refusing wasn't an option and he smiles, raising his glass. \
+ \"A toast then! To a night when one is allowed to pursue all kinds of desire, a never-ending blood-red night!\" \
+ Blood.... The blood brings me eternal happiness, forfeiting false hope, let's forget all pretenses of humanity..."),
+ )
//work stuff
var/feeding
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/orange_tree.dm b/code/modules/mob/living/simple_animal/abnormality/waw/orange_tree.dm
index 7cacecfa10bb..d1e6cd0043af 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/orange_tree.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/orange_tree.dm
@@ -38,10 +38,10 @@
observation_prompt = "Whenever I enter this containment cell, I find myself whisked away to Never Never Land by Peter Pan to join his merry band of Lost Boys. \
I had forgotten all about him when I grew up, I want to stay longer..."
- observation_choices = list("Stay", "Leave")
- correct_choices = list("Leave")
- observation_success_message = "Second to the right, and straight on till morning, I found my way back to where I'm supposed to - there's still work to be done."
- observation_fail_message = "If no one comes to get me, I'll remain here - never noticing the passing of time..."
+ observation_choices = list(
+ "Leave" = list(TRUE, "Second to the right, and straight on till morning, I found my way back to where I'm supposed to - there's still work to be done."),
+ "Stay" = list(FALSE, "If no one comes to get me, I'll remain here - never noticing the passing of time..."),
+ )
var/datum/looping_sound/orangetree_ambience/soundloop
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm b/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm
index 35d297bd9dbc..c273d98aa6e8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm
@@ -41,32 +41,24 @@
At the heart of the minituare forest you see a lush green tree with heavy, ripened fruit and a peaceful-looking face upon its trunk. \
\"Hello, have you come here to recieve my blessing, too?\" \
The voice on the wind (there is no wind) spoke, carrying a sweet, flowery scent asked. \"I just want to help you all, could you bring your friends to me as well?\" "
- observation_choices = list("Accept the blessing and do as it asks", "Accept the blessing and refuse", "Refuse the blessing")
- correct_choices = list("Accept the blessing and refuse")
- observation_success_message = "\"You're a bad child, I don't need someone like you.\" \
- Blessings should be given earnestly, not treated as an obligation. You leave the chamber, pleased with yourself."
- observation_fail_message = "\"If you say you've never had need of anyone's blessing, then that's a lie.\" The tree said, frowning deeply. \
- \"... if you don't need my blessing then you're a bad person. \
- There's nothing for you here, leave.\" \
- You leave the verdant containment unit behind, the tree waits for someone else to fall into its snare."
- //Extra wrong answers
- var/observation_fail_message_2 = "You venture out and find some of your most trusting colleagues. \
- \"Come with me, I have something wonderous to show you all\", you tell them as you bring them to stand before the tree, that same calm visage etched into its trunk. \
- \"You're a good child, aren't you? Thank you for bringing these children to me.\" \
- It says as you all stare rapturously at the bulbs about to flower. \"Let me gift you with something...\" \
- I feel something sprout from my body..."
+ observation_choices = list(
+ "Accept the blessing and refuse" = list(TRUE, "\"You're a bad child, I don't need someone like you.\" \
+ Blessings should be given earnestly, not treated as an obligation. You leave the chamber, pleased with yourself."),
+ "Refuse the blessing" = list(FALSE, "\"If you say you've never had need of anyone's blessing, then that's a lie.\" The tree said, frowning deeply. \
+ \"... if you don't need my blessing then you're a bad person. \
+ There's nothing for you here, leave.\" \
+ You leave the verdant containment unit behind, the tree waits for someone else to fall into its snare."),
+ "Accept the blessing and do as it asks" = list(FALSE, "You venture out and find some of your most trusting colleagues. \
+ \"Come with me, I have something wonderous to show you all\", you tell them as you bring them to stand before the tree, that same calm visage etched into its trunk. \
+ \"You're a good child, aren't you? Thank you for bringing these children to me.\" \
+ It says as you all stare rapturously at the bulbs about to flower. \"Let me gift you with something...\" \
+ I feel something sprout from my body..."),
+ )
var/origin_cooldown = 0 //null when compared to numbers is a eldritch concept so world.time cannot be more or less.
var/static/list/blessed = list() //keeps track of status effected individuals
var/static/list/minions = list() //keeps track of minions if suppressed forcefully
-/mob/living/simple_animal/hostile/abnormality/parasite_tree/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answer
- if(answer == "Accept the blessing and do as it asks")
- observation_fail_message = observation_fail_message_2
- else
- observation_fail_message = initial(observation_fail_message)
- return ..()
-
/mob/living/simple_animal/hostile/abnormality/parasite_tree/Initialize()
. = ..()
RegisterSignal(SSdcs, COMSIG_GLOB_ABNORMALITY_BREACH, PROC_REF(dropLeaf))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm b/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm
index b09f01c02142..63506a311ff1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm
@@ -46,9 +46,10 @@
observation_prompt = "The King Pygmalion prayed earnestly to the Goddess Aphrodite, wishing for the marble statue he had made and fallen in love to come to life. \
She answered his prayer, bringing Galatea to life and united them in matrinomy. \
What is the real name of the abnormality before you?"
- observation_choices = list("Galatea", "Pygmalion")
- correct_choices = list("Galatea", "Pygmalion")
- observation_success_message = "Perhaps they sculpted each other."
+ observation_choices = list(
+ "Galatea" = list(TRUE, "Perhaps they sculpted each other."),
+ "Pygmalion" = list(TRUE, "Perhaps they sculpted each other."),
+ )
var/missing_prudence = 0
var/mob/living/carbon/human/sculptor = null
@@ -165,7 +166,7 @@
if(client)
to_chat(src, span_userdanger("The sculptor is in danger. It is now your duty to protect them!"))
- threat_level = TETH_LEVEL
+ fear_level = TETH_LEVEL
var/datum/attribute/user_attribute = sculptor.attributes[PRUDENCE_ATTRIBUTE]
var/user_attribute_level = max(1, user_attribute.level)
if (user_attribute_level > PRUDENCE_CAP)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/queen_bee.dm b/code/modules/mob/living/simple_animal/abnormality/waw/queen_bee.dm
index 3b8db2c436bd..fb114b3aa202 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/queen_bee.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/queen_bee.dm
@@ -35,30 +35,22 @@
)
observation_prompt = "There was one summer so hot and unpleasant. Bees were busily flying around the beehive. \
- They live for the only one queen. \'Are they happy? Living only to work\' I asked myself. Then someone answered."
- observation_choices = list("They work to survive", "They work out of loyalty")
- correct_choices = list("They work to survive", "They work out of loyalty")
- observation_success_message = "They have no other option but to obey. \
- For they know that the moment they leave the queendom, only death awaits them. \
- It is years later that I found out that their unshakable loyalty is because of special pheromone which only queen can produce. \
- Everything started when I began to study that pheromone."
- //Special answer for choice 2. Yes, the same text is used multiple times intentionally. This is from legacy LC.
- var/observation_success_message_2 = "Loyalty that bees possess is a natural instinct. \
- If we find a way to control that instinct, \
- Things will change. \
- It is years later that I found out that their unshakable loyalty is because of special pheromone which only queen can produce. \
- Everything started when I began to study that pheromone."
+ They live for the only one queen. 'Are they happy? Living only to work' I asked myself. Then someone answered."
+ observation_choices = list(
+ "They work to survive" = list(TRUE, "They have no other option but to obey. \
+ For they know that the moment they leave the queendom, only death awaits them. \
+ It is years later that I found out that their unshakable loyalty is because of special pheromone which only queen can produce. \
+ Everything started when I began to study that pheromone."),
+ "They work out of loyalty" = list(TRUE, "Loyalty that bees possess is a natural instinct. \
+ If we find a way to control that instinct, \
+ Things will change. \
+ It is years later that I found out that their unshakable loyalty is because of special pheromone which only queen can produce. \
+ Everything started when I began to study that pheromone."),
+ )
var/datum/looping_sound/queenbee/soundloop
var/breached_others = FALSE
-/mob/living/simple_animal/hostile/abnormality/queen_bee/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answer
- if(answer == "They work out of loyalty")
- observation_success_message = observation_success_message_2
- else
- observation_success_message = initial(observation_success_message)
- return ..()
-
/mob/living/simple_animal/hostile/abnormality/queen_bee/Initialize()
. = ..()
soundloop = new(list(src), TRUE)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm b/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm
index bc4923fdefa0..02d1c4727e40 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm
@@ -56,12 +56,12 @@ It has now been over four months. Now we get her for real. -Coxswain
observation_prompt = "(The chamber is empty, except the Little Red Riding Hooded Mercenary, and her axe and gun. She seems exhausted) \
Am I really alive? What if I'm a ghost that doesn't even know it's dead? \
The only thing I love in my life is the death of the wolf."
- observation_choices = list("Exit the room", "Mourn for her memories")
- correct_choices = list("Mourn for her memories")
- observation_success_message = "I will swing my axe again tomorrow, still driven by hatred like I have been forever. \
- But tonight, I think I can sleep peacefully."
- observation_fail_message = "Knock on my door whenever you need my service. \
- This is my struggle."
+ observation_choices = list(
+ "Mourn for her memories" = list(TRUE, "I will swing my axe again tomorrow, still driven by hatred like I have been forever. \
+ But tonight, I think I can sleep peacefully."),
+ "Exit the room" = list(FALSE, "Knock on my door whenever you need my service. \
+ This is my struggle."),
+ )
/*
Red's targeting logic
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm b/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm
index c0ec8662ac94..f8a19ef2ff6e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm
@@ -39,22 +39,23 @@
observation_prompt = "What does this signboard say? \
It hangs itself on a tree, trying to make its content known. \
Its desperation is almost pitiable."
- observation_choices = list("Pick a rose", "Unravel the brambles")
- correct_choices = list("Pick a rose")
- observation_success_message = "You pick a rose out of it. \
- With closer examination, you notice \
- that it has an intestinal texture. \
- What is a flower-shaped organ for?"
- observation_fail_message = "As you try to untangle the vines, \
- sallow bits of flesh fall off. \
- The thorny brambles you thought were a source of constricting pain \
- ironically had been keeping the body together. \
- The body writhes as its flesh falls apart. \
- Blossoms of flowers sprawled on the ground substitute its screams."
+ observation_choices = list(
+ "Pick a rose" = list(TRUE, "You pick a rose out of it. \
+ With closer examination, you notice \
+ that it has an intestinal texture. \
+ What is a flower-shaped organ for?"),
+ "Unravel the brambles" = list(FALSE, "As you try to untangle the vines, \
+ sallow bits of flesh fall off. \
+ The thorny brambles you thought were a source of constricting pain \
+ ironically had been keeping the body together. \
+ The body writhes as its flesh falls apart. \
+ Blossoms of flowers sprawled on the ground substitute its screams."),
+ )
var/list/work_roses = list()
var/list/work_damages = list()
var/list/summoned_roses = list()
+ var/rose_type = /mob/living/simple_animal/hostile/rose_summoned
var/rose_max = 4
var/rose_cooldown
var/rose_cooldown_time = 160 SECONDS
@@ -204,7 +205,10 @@
work_roses -= R
qdel(R)
var/turf/T = pick(GLOB.department_centers)
- forceMove(T)
+ if(breach_type != BREACH_MINING)//TODO: create attacking roses for this breach type
+ forceMove(T)
+ else
+ rose_type = /mob/living/simple_animal/hostile/rose_summoned/combat
/mob/living/simple_animal/hostile/abnormality/rose_sign/proc/PickTargets()//this is called by life()
rose_cooldown = world.time + rose_cooldown_time
@@ -227,11 +231,14 @@
sound_to_playing_players_on_level("sound/abnormalities/rosesign/rose_summon.ogg", 100, zlevel = z)
/mob/living/simple_animal/hostile/abnormality/rose_sign/proc/SpawnBreachRose(mob/living/carbon/human/target, turf/T)
+ if(rose_type == /mob/living/simple_animal/hostile/rose_summoned/combat)//during a mining breach, these are spawned around players
+ T = get_ranged_target_turf(get_turf(target), pick(GLOB.alldirs), 1)
if(locate(/mob/living/simple_animal/hostile/rose_summoned) in get_turf(T))//Needs to be tested in a multiplayer environment
T = get_ranged_target_turf(T, pick(GLOB.alldirs), 1)//This will move the target's turf to an adjacent one, preventing stacking and visual clutter to some degree.
var/list/flower_damtype = list()
var/damtype
- var/mob/living/simple_animal/hostile/rose_summoned/R = new(T)//Spawns the rose
+ var/mob/living/simple_animal/hostile/rose_summoned/R
+ R = new rose_type(T)//Spawns the rose
summoned_roses += R
for(var/obj/item/W in target.held_items + target.get_equipped_items())//Searches the human for any E.G.O and adds them to a list.
if(is_ego_melee_weapon(W)) //FIXME!!!! The above line doesn't actually check suit storage slots, could be more efficient too
@@ -338,6 +345,7 @@
pull_force = INFINITY
generic_canpass = FALSE
movement_type = PHASING | FLYING
+ damtype = BLACK_DAMAGE
var/root_damage = 30 //Black Damage
layer = POINT_LAYER//should always be visible.
@@ -351,7 +359,7 @@
for(var/turf/T in view(0, target_turf))
new /obj/effect/temp_visual/thornspike(T)
for(var/mob/living/L in T)
- L.deal_damage(root_damage, BLACK_DAMAGE)
+ L.deal_damage(root_damage, damtype)
if(L.stat == DEAD)
if(L.has_status_effect(/datum/status_effect/stacking/crownthorns))//Stops a second crucifix from appearing
L.remove_status_effect(STATUS_EFFECT_THORNS)
@@ -362,6 +370,15 @@
N.buckle_mob(L)
qdel(src)
+/obj/effect/roseRoot/red
+ damtype = RED_DAMAGE
+
+/obj/effect/roseRoot/white
+ damtype = WHITE_DAMAGE
+
+/obj/effect/roseRoot/pale
+ damtype = PALE_DAMAGE
+
//***Breach Roses***//
/mob/living/simple_animal/hostile/rose_summoned
@@ -374,7 +391,7 @@
maxHealth = 500
health = 500
damage_coeff = list(RED_DAMAGE = 0.5, WHITE_DAMAGE = 0.5, BLACK_DAMAGE = 0.5, PALE_DAMAGE = 0.5)
- del_on_death = FALSE
+ del_on_death = TRUE
var/flower_damage_type
var/mob/living/simple_animal/hostile/abnormality/rose_sign/master
var/mob/living/status_target
@@ -401,7 +418,7 @@
/mob/living/simple_animal/hostile/rose_summoned/CanAttack(atom/the_target)
return FALSE
-/mob/living/simple_animal/hostile/rose_summoned/death()
+/mob/living/simple_animal/hostile/rose_summoned/Destroy()
if(!killed || !status_target)
return ..()
if(flower_damage_type && master)
@@ -409,10 +426,43 @@
master.ChangeResistance(flower_damage_type, (master.damage_coeff.getCoeff(flower_damage_type) + 0.3), update = TRUE)
if(status_target.has_status_effect(/datum/status_effect/stacking/crownthorns))
status_target.remove_status_effect(STATUS_EFFECT_THORNS)
- density = FALSE
- animate(src, alpha = 0, time = 10 SECONDS)
- QDEL_IN(src, 10 SECONDS)
+ return ..()
+
+/mob/living/simple_animal/hostile/rose_summoned/combat//mining breach variant
+ maxHealth = 1000
+ health = 1000
+ ranged = TRUE
+ var/root_type = /obj/effect/roseRoot
+ var/can_act = TRUE
+
+/mob/living/simple_animal/hostile/rose_summoned/combat/CanAttack(atom/the_target)
+ if(prob(30))
+ return OpenFire()
+
+/mob/living/simple_animal/hostile/rose_summoned/combat/OpenFire()
+ if(!can_act)
+ return
+ rootBarrage(target)//Ebony queen-style basic attack
+
+/mob/living/simple_animal/hostile/rose_summoned/combat/PickColor(picked_color)
..()
+ switch(picked_color)
+ if(RED_DAMAGE)
+ root_type = /obj/effect/roseRoot/red
+ if(WHITE_DAMAGE)
+ root_type = /obj/effect/roseRoot/white
+ if(PALE_DAMAGE)
+ root_type = /obj/effect/roseRoot/pale
+
+/mob/living/simple_animal/hostile/rose_summoned/combat/proc/rootBarrage(target, picked_color)//Ebony queen's basic attack, fired at a low rate.
+ can_act = FALSE
+ playsound(get_turf(target), 'sound/creatures/venus_trap_hurt.ogg', 75, 0, 5)
+ SLEEP_CHECK_DEATH(3)
+ var/turf/target_turf = get_turf(target)
+ for(var/turf/T in view(0, target_turf))
+ new root_type(T)
+ SLEEP_CHECK_DEATH(3)
+ can_act = TRUE
//***Work-Based Roses***//
/obj/structure/rose_work
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm b/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm
index a69ac701449a..e87e1bbc8690 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm
@@ -11,9 +11,13 @@ Defeating the murderer also surpresses the abnormality.
icon = 'ModularTegustation/Teguicons/32x32.dmi'
icon_state = "screenwriter"
portrait = "screenwriter"
+ maxHealth = 4000
+ health = 4000
+ damage_coeff = list(RED_DAMAGE = 1.3, WHITE_DAMAGE = 0.5, BLACK_DAMAGE = 1.3, PALE_DAMAGE = 1.5)
faction = list("hostile")
threat_level = WAW_LEVEL
start_qliphoth = 2
+ blood_volume = 0
work_chances = list(
"Nutrition" = 35,
"Cleanliness" = 35,
@@ -40,9 +44,11 @@ Defeating the murderer also surpresses the abnormality.
abnormality_origin = ABNORMALITY_ORIGIN_ARTBOOK //Technically it was in the beta but I dont want it showing it up in LC-only modes
observation_prompt = "The play started long ago. Here is the man who killed many. And you are holding a gun."
- observation_choices = list("Shoot the man", "Wait and see", "Shoot someone else")
- correct_choices = list("Shoot the man", "Wait and see", "Shoot someone else")
- observation_success_message = "Whether you shoot or not, the play ends with tragedy." //TODO: multiple texts
+ observation_choices = list( //TODO: multiple texts
+ "Shoot the man" = list(TRUE, "Whether you shoot or not, the play ends with tragedy."),
+ "Wait and see" = list(TRUE, "Whether you shoot or not, the play ends with tragedy."),
+ "Shoot someone else" = list(TRUE, "Whether you shoot or not, the play ends with tragedy."),
+ )
pet_bonus = "shuffles" //saves a few lines of code by allowing funpet() to be called by attack_hand()
var/mob/living/simple_animal/hostile/actor/A
@@ -56,6 +62,18 @@ Defeating the murderer also surpresses the abnormality.
preferred_work_type = pick(work_chances)
SpawnIcon()
+/mob/living/simple_animal/hostile/abnormality/screenwriter/Move()
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/screenwriter/CanAttack(atom/the_target)
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/screenwriter/Destroy()
+ if(A)
+ A.death()
+ EndScenario()
+ return ..()
+
//Work stuff
/mob/living/simple_animal/hostile/abnormality/screenwriter/AttemptWork(mob/living/carbon/human/user, work_type)
if(A)
@@ -110,6 +128,10 @@ Defeating the murderer also surpresses the abnormality.
MeltdownEffect()
return
+/mob/living/simple_animal/hostile/abnormality/screenwriter/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ MeltdownEffect()
+
/mob/living/simple_animal/hostile/abnormality/screenwriter/proc/MeltdownEffect()
var/turf/actor_location = pick(GLOB.department_centers) //Spawn the murderer
A = new (actor_location)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/shrimp.dm b/code/modules/mob/living/simple_animal/abnormality/waw/shrimp.dm
index 48b06b5b3e7a..e2535eceb423 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/shrimp.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/shrimp.dm
@@ -38,10 +38,12 @@
The shrimp offers you a champagne glass full of... Something. \
It looks and smells like wellcheers grape soda. It's soda. \
You can even see the can's label torn off and stuck on the side. Will you drink it?"
- observation_choices = list("Drink the soda","Refuse")
- correct_choices = list("Drink the soda","Refuse")
- observation_success_message = "Before you can make a choice, two gigantic and heavily armed shrimp guards bust in through the door. \
- They hold you down and force you to drink the soda, and you fall asleep... ... Somewhere in the distance, you hear seagulls."
+ observation_choices = list(
+ "Drink the soda" = list(TRUE, "Before you can make a choice, two gigantic and heavily armed shrimp guards bust in through the door. \
+ They hold you down and force you to drink the soda, and you fall asleep... ... Somewhere in the distance, you hear seagulls."),
+ "Refuse" = list(TRUE, "Before you can make a choice, two gigantic and heavily armed shrimp guards bust in through the door. \
+ They hold you down and force you to drink the soda, and you fall asleep... ... Somewhere in the distance, you hear seagulls."),
+ )
var/liked
var/happy = TRUE
@@ -118,6 +120,11 @@
datum_reference.qliphoth_change(1)
return
+/mob/living/simple_animal/hostile/abnormality/shrimp_exec/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ pissed()
+ addtimer(CALLBACK(src, PROC_REF(pissed)), 20 SECONDS)
+
/mob/living/simple_animal/hostile/abnormality/shrimp_exec/AttemptWork(mob/living/carbon/human/user, work_type)
if(work_type == liked || !liked)
happy = TRUE
@@ -193,7 +200,7 @@
/mob/living/simple_animal/hostile/shrimp/Initialize()
. = ..()
- if(SSmaptype.maptype == "fixers" || SSmaptype.maptype == "city")
+ if(SSmaptype.maptype in SSmaptype.citymaps)
del_on_death = FALSE
//You can put these guys about to guard an area.
@@ -229,7 +236,7 @@
/mob/living/simple_animal/hostile/shrimp_soldier/Initialize()
. = ..()
- if(SSmaptype.maptype == "fixers" || SSmaptype.maptype == "city")
+ if(SSmaptype.maptype in SSmaptype.citymaps)
del_on_death = FALSE
/mob/living/simple_animal/hostile/shrimp_soldier/friendly
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm b/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm
index 9eea368f9e1c..ab4dfb18236b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm
@@ -25,11 +25,11 @@
observation_prompt = "Time's wasting. Time's running out... They are nothing but meaningless tantrums. \
The watch will not only take your lost time back, but also give you even more time."
- observation_choices = list("Do not use the watch", "Use the watch")
- correct_choices = list("Use the watch")
- observation_success_message = "The price will follow to your decision. It is designed this way."
- observation_fail_message = "Actually, you have no right to refuse this gift. \
- Whether you want it or not, we all know that you have to take it."
+ observation_choices = list(
+ "Use the watch" = list(TRUE, "The price will follow to your decision. It is designed this way."),
+ "Do not use the watch" = list(FALSE, "Actually, you have no right to refuse this gift. \
+ Whether you want it or not, we all know that you have to take it."),
+ )
var/meltdown_cooldown_time = 13 MINUTES
var/meltdown_cooldown
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm b/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm
index 75dce523d231..e423b90b03ea 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm
@@ -67,16 +67,16 @@
We were all abandoned, yes. But we all had dreams, too. Remember? \
Well, let's make our dreams come true. Let's sink together into the depths.\" \
The dim fluorescent lights impaling the entity's back flicker."
- observation_choices = list("Say that you will sink together", "Fix the entity's flickering fluorescent lights")
- correct_choices = list("Fix the entity's flickering fluorescent lights")
- observation_success_message = "\"I remember. I've always wanted to run across a rolling field of grass under the warm sun. \
- To swim across the vast ocean that I've seen only through pictures. \
- That was my dream. \
- My only dream. \
- Now, if you ever recall a dream in which you wished to twinkle, even as a faint flicker...\""
- observation_fail_message = "You still fear the dark, don't you? \
- I know that you will miss the surface, forever out of your reach once this fluorescent lamp dies. \
- So do return once you're ready.\""
+ observation_choices = list(
+ "Fix the entity's flickering fluorescent lights" = list(TRUE, "\"I remember. I've always wanted to run across a rolling field of grass under the warm sun. \
+ To swim across the vast ocean that I've seen only through pictures. \
+ That was my dream. \
+ My only dream. \
+ Now, if you ever recall a dream in which you wished to twinkle, even as a faint flicker...\""),
+ "Say that you will sink together" = list(FALSE, "You still fear the dark, don't you? \
+ I know that you will miss the surface, forever out of your reach once this fluorescent lamp dies. \
+ So do return once you're ready.\""),
+ )
var/stunned = FALSE
//Stuff relating to the dive attack
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm b/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm
index a059d5072b52..b9aac2bf27ad 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm
@@ -10,6 +10,7 @@
portrait = "snow_whites_apple"
maxHealth = 1600
health = 1600
+ blood_volume = 0
obj_damage = 0
damage_coeff = list(RED_DAMAGE = 0.5, WHITE_DAMAGE = 1.0, BLACK_DAMAGE = 0, PALE_DAMAGE = 1.5)
ranged = TRUE
@@ -59,24 +60,25 @@
Why does no one visit me? Why does no one share my pain? \
Why does no one like me? I hope I had legs, no, it doesn't have to be legs. \
All I want is to be able to move. Oh, redemption......"
- observation_choices = list("I shall go find it.", "It does not exist.")
- correct_choices = list("It does not exist.")
- observation_success_message = "This is unfair. I want to be happy. It's too painful to wait. \
- It is my bane that no one is around me. I want this misery to crush me to nonexistence. \
- Some kind of legs sprouted out of me but I have no place to go. However, I do not rot. I cannot stop existing. \
- I have to go, although I have no place to go. I have to go. I go."
-
- observation_fail_message = "From some moment, I realized I can walk. \
- I see light. I hear people. I will be free from this torment. For I will meet my redemption"
+ observation_choices = list(
+ "It does not exist" = list(TRUE, "This is unfair. I want to be happy. It's too painful to wait. \
+ It is my bane that no one is around me. I want this misery to crush me to nonexistence. \
+ Some kind of legs sprouted out of me but I have no place to go. However, I do not rot. I cannot stop existing. \
+ I have to go, although I have no place to go. I have to go. I go."),
+ "I shall go find it" = list(FALSE, "From some moment, I realized I can walk. \
+ I see light. I hear people. I will be free from this torment. For I will meet my redemption"),
+ )
initial_language_holder = /datum/language_holder/plant //essentially flavor
var/togglemovement = FALSE
var/toggleplants = TRUE
+ var/nightmare_mode = FALSE
var/plant_cooldown = 30
var/hedge_cooldown = 0
var/hedge_cooldown_delay = FLORAL_BARRIER_COOLDOWN
var/teleport_cooldown = 0
var/teleport_cooldown_delay = 60 SECONDS
+ var/can_teleport = TRUE
//Spell automatically given to the abnormality.
var/obj/effect/proc_holder/spell/pointed/apple_barrier/barrier_spell
//All iterations share this list between eachother.
@@ -96,6 +98,8 @@
/mob/living/simple_animal/hostile/abnormality/snow_whites_apple/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
update_icon()
+ if(breach_type == BREACH_MINING)//TODO: create attacking roses for this breach type
+ can_teleport = FALSE
/mob/living/simple_animal/hostile/abnormality/snow_whites_apple/Initialize()
. = ..()
@@ -152,9 +156,18 @@
if(toggleplants)
SpreadPlants()
oldGrowth()
- for(var/obj/structure/spreading/apple_vine/W in urange(15, get_turf(src)))
+ var/list/area_of_influence
+ if(nightmare_mode)
+ area_of_influence = vine_list
+ else
+ area_of_influence = urange(15, get_turf(src))
+ for(var/obj/structure/spreading/apple_vine/W in area_of_influence)
if(W.last_expand <= world.time)
W.expand()
+ else if(nightmare_mode && ranged_cooldown <= world.time)
+ var/list/did_we_hit = HurtInTurf(get_turf(W), list(), 30, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ if(did_we_hit.len)
+ W.VineAttack(pick(did_we_hit))
if(teleport_cooldown <= world.time && !togglemovement && !client && !IsCombatMap())
TryTeleport()
@@ -198,6 +211,8 @@
dir = 2
if(teleport_cooldown > world.time)
return FALSE
+ if(!can_teleport)
+ return FALSE
teleport_cooldown = world.time + teleport_cooldown_delay
var/list/teleport_potential = TeleportList()
if(!LAZYLEN(teleport_potential))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm b/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm
index 2c8d0e9f6148..6d5307692613 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm
@@ -1,6 +1,4 @@
//Coded by Coxswain
-#define SPHINX_GAZE_COOLDOWN (12 SECONDS)
-
/mob/living/simple_animal/hostile/abnormality/sphinx
name = "Sphinx"
desc = "A gigantic stone feline."
@@ -21,18 +19,16 @@
melee_damage_lower = 70
melee_damage_upper = 100
attack_sound = 'sound/abnormalities/sphinx/attack.ogg'
- attack_action_types = list(/datum/action/cooldown/sphinx_gaze)
+ attack_action_types = list(/datum/action/cooldown/sphinx_gaze, /datum/action/cooldown/sphinx_quake)
can_breach = TRUE
threat_level = WAW_LEVEL
melee_damage_type = WHITE_DAMAGE
start_qliphoth = 3
work_chances = list(
- ABNORMALITY_WORK_INSTINCT = list(0, 0, 35, 35, 40),
- ABNORMALITY_WORK_INSIGHT = list(20, 30, 45, 50, 50),
- ABNORMALITY_WORK_ATTACHMENT = 0,
- ABNORMALITY_WORK_REPRESSION = list(0, 0, 25, 30, 30),
- "Riddle" = 0, //These should never be used, but they're here for clarity.
- "Make Offering" = 0,
+ ABNORMALITY_WORK_INSTINCT = list(5, 10, 25, 25, 30),
+ ABNORMALITY_WORK_INSIGHT = -25,
+ ABNORMALITY_WORK_ATTACHMENT = 15,
+ ABNORMALITY_WORK_REPRESSION = list(5, 10, 25, 25, 30),
)
work_damage_amount = 12
work_damage_type = WHITE_DAMAGE
@@ -53,185 +49,131 @@
Beside me, the great sphinx lies. It beckons me to answer the plaque. \
Written in characters I have never seen before, well are the sculptor's passions read. \
\"What goes on four feet in the morning, two feet in midday, and three feet in the evening?\""
- observation_choices = list("Man", "Monster")
- correct_choices = list("Man")
- observation_success_message = "The sphinx says something. It seems happy, or proud. \
- Then, it turns to stone, and sinks into the sand. \
- Nothing beside remains. Round the decay \
- Of that colossal Wreck, boundless and bare \
- The lone and level sands stretch far away."
- observation_fail_message = "The sphinx seems displeased. \
- It says some incomprehensible but hurtful words to me. \
- Then, it turns to stone. I try and look away, but I find that I cannot move either. \
- My skin cracks like stone, my breathing stops. I fall into an abyss. \
- ... \
- I am entombed in stone, with no end in sight. \
- I cannot scream, for I have no tongue to scream with. \
- I cannot see, for I have no eyes to see with. \
- I cannot hear anything, for I have no ears to hear with. \
- Soon after, my heart is taken away too. And then there is nothing left."
+ observation_choices = list(
+ "Man" = list(TRUE, "The sphinx says something. It seems happy, or proud. \
+ Then, it turns to stone, and sinks into the sand. \
+ Nothing beside remains. Round the decay \
+ Of that colossal Wreck, boundless and bare \
+ The lone and level sands stretch far away."),
+ "Monster" = list(FALSE, "The sphinx seems displeased. \
+ It says some incomprehensible but hurtful words to me. \
+ Then, it turns to stone. I try and look away, but I find that I cannot move either. \
+ My skin cracks like stone, my breathing stops. I fall into an abyss. \
+ ... \
+ I am entombed in stone, with no end in sight. \
+ I cannot scream, for I have no tongue to scream with. \
+ I cannot see, for I have no eyes to see with. \
+ I cannot hear anything, for I have no ears to hear with. \
+ Soon after, my heart is taken away too. And then there is nothing left."),
+ )
//work-related
- var/happy = FALSE
- var/demand
- var/work_cooldown
- var/work_cooldown_time = 3 SECONDS
- var/list/worked = list()
- var/list/satisfied = list(
- "Ipi etog sind lemanto.", //You mind big human
- "Lemantinco kom geng kaskihir etog!", //(Human-honor) show has (not-lazy) mind
- )
- var/list/angry = list(
- "Mi cadu cef ipi por sagmo!", //I king threat you beggar begone
- "Mi thran lemantolly quistramos!", //I angry stupid man (body-coin)
- )
- var/list/translate = list(
- "Ipi etog geng quir.", //You mind paper translate
- "Ipi inspuz geng quir.", //You quest paper translate
- )
- var/list/riddleloot = list(
+ var/loot_progress = 0
+ var/prudence_work_chance = 0
+ var/list/workloot = list(
/obj/item/golden_needle,
/obj/item/canopic_jar,
)
- var/list/demandlist = list(
- /obj/item/clothing/suit/armor/ego_gear,
- /obj/item/ego_weapon,
- /obj/item/reagent_containers/food/drinks,
- /obj/item/food,
- )
-
//breach
var/can_act = TRUE
var/curse_cooldown
var/curse_cooldown_time = 12 SECONDS
+ var/quake_cooldown
+ var/quake_cooldown_time = 6 SECONDS
+ var/quake_damage = 20
//Playables buttons
+ attack_action_types = list(
+ /datum/action/cooldown/sphinx_gaze,
+ /datum/action/cooldown/sphinx_quake,
+ )
+
/datum/action/cooldown/sphinx_gaze
name = "Sphinx's Gaze"
icon_icon = 'icons/mob/actions/actions_abnormality.dmi'
button_icon_state = "sphinx"
check_flags = AB_CHECK_CONSCIOUS
transparent_when_unavailable = TRUE
- cooldown_time = SPHINX_GAZE_COOLDOWN //12 seconds
-
-/mob/living/simple_animal/hostile/abnormality/sphinx/InitializeSecretIcon()
- . = ..()
- icon_aggro = "sphonx_eye"
+ cooldown_time = 12 SECONDS
/datum/action/cooldown/sphinx_gaze/Trigger()
- if(!..())
- return FALSE
- if(!istype(owner, /mob/living/simple_animal/hostile/abnormality/sphinx))
+ . = ..()
+ if(!.)
return FALSE
var/mob/living/simple_animal/hostile/abnormality/sphinx/sphinx = owner
+ if(!istype(sphinx))
+ return FALSE
if(sphinx.IsContained()) // No more using cooldowns while contained
return FALSE
+ if(sphinx.curse_cooldown_time > world.time || !sphinx.can_act)
+ return FALSE
StartCooldown()
sphinx.StoneVision(FALSE)
return TRUE
-/mob/living/simple_animal/hostile/abnormality/sphinx/PostSpawn()
- ..()
- if((locate(/obj/structure/sacrifice_table) in range(1, src)))
- return
- new /obj/structure/sacrifice_table(get_step(src, SOUTH))
+/datum/action/cooldown/sphinx_quake
+ name = "Sphinx's Earthquake"
+ icon_icon = 'icons/mob/actions/actions_abnormality.dmi'
+ button_icon_state = "ebony_barrier"
+ check_flags = AB_CHECK_CONSCIOUS
+ transparent_when_unavailable = TRUE
+ cooldown_time = 6 SECONDS
-// Work
-/mob/living/simple_animal/hostile/abnormality/sphinx/AttemptWork(mob/living/carbon/human/user, work_type)
- if((work_type != "Riddle") && work_type != "Make Offering")
- return ..()
- else if(work_cooldown > world.time)
+/datum/action/cooldown/sphinx_quake/Trigger()
+ . = ..()
+ if(!.)
return FALSE
-
- work_cooldown = world.time + work_cooldown_time
- if(work_type == "Riddle")
- if(!(user in worked))
- worked += user
- new /obj/item/paper/fluff/translation_notes(get_turf(user))
- say(pick(translate))
- sleep(10)
- NewQuest() //repeat quest lines or offer new quest
+ var/mob/living/simple_animal/hostile/abnormality/sphinx/sphinx = owner
+ if(!istype(sphinx))
return FALSE
- else
- var/I = null
- for(var/obj/structure/sacrifice_table/S in range(1, src))
- if(S.showpiece)
- I = S.showpiece
- S.dump()
- if(I)
- to_chat(user, span_warning("[src] seems to be looking at the [I]!"))
- else if(user.get_active_held_item())
- I = user.get_active_held_item()
- else if(user.get_inactive_held_item())
- I = user.get_inactive_held_item()
- if(!I) //both hands are empty and there is no table
- to_chat(user, span_warning("You have nothing to offer to [src]!"))
- return FALSE
- QuestHandler(I,user) //quest item must be either the active hand, or the other hand if active is empty. No guessing.
- return FALSE
-
-/mob/living/simple_animal/hostile/abnormality/sphinx/WorkChance(mob/living/carbon/human/user, chance)
- if(happy)
- chance+=30
- return chance
+ if(sphinx.IsContained()) // No more using cooldowns while contained
+ return FALSE
+ if(sphinx.quake_cooldown > world.time || !sphinx.can_act)
+ return FALSE
+ StartCooldown()
+ sphinx.Quake()
+ return TRUE
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/InitializeSecretIcon()
+ . = ..()
+ icon_aggro = "sphonx_eye"
+
+// Abnormality Work Stuff
+/mob/living/simple_animal/hostile/abnormality/sphinx/AttemptWork(mob/living/carbon/human/user, work_type)
+ prudence_work_chance = clamp(get_modified_attribute_level(user, PRUDENCE_ATTRIBUTE) * 0.45, 0, 60) // Additional roll on a every work tick based on prudence
+ var/player_temperance = get_modified_attribute_level(user, TEMPERANCE_ATTRIBUTE)
+ var/work_chance_bonus = 20 *((0.07*player_temperance-1.4)/(0.07*player_temperance+4)) // 20 is half of the usual temperance_mod of 40
+ work_chance_bonus += datum_reference.understanding * 0.5 // Should be roughly half of the usual effects from temperance overall
+ prudence_work_chance = clamp(prudence_work_chance + work_chance_bonus, 0, 95)
+ if(datum_reference.overload_chance[user.ckey]) // Work penalty from overload applies here too. Probably.
+ prudence_work_chance += datum_reference.overload_chance[user.ckey]
+ return ..()
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/ChanceWorktickOverride(mob/living/carbon/human/user, work_chance, init_work_chance, work_type)
+ if(!prob(init_work_chance))
+ if(!prob(prudence_work_chance))
+ return 0 // You failed both work checks, sorry bozo
+ loot_progress += 1
+ return 100
/mob/living/simple_animal/hostile/abnormality/sphinx/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time)
+ if(loot_progress >= 16)
+ var/turf/dispense_turf = get_step(src, EAST)
+ var/reward = pick(workloot)
+ new reward(dispense_turf)
+ loot_progress = 0
if(user.sanity_lost)
QDEL_NULL(user.ai_controller)
user.ai_controller = /datum/ai_controller/insane/wander/sphinx
user.InitializeAIController()
- if(happy)
- happy = FALSE
- else
- say(pick(angry))
- datum_reference.qliphoth_change(-1)
-
-// Riddle/Quest code
-/mob/living/simple_animal/hostile/abnormality/sphinx/proc/NewQuest()
- if(!demand)
- demand = pick(demandlist)
- switch(demand)
- if(/obj/item/clothing/suit/armor/ego_gear)
- say("Atan eblak esm quistra utast.")//Bring me an armor EGO
- if(/obj/item/ego_weapon)
- say("Atan eblak esm sommel utast.")//Bring me an weapon EGO
- if(/obj/item/reagent_containers)
- say("Kom eblak mina brit hethre.")//Find me a water with vessel
- if(/obj/item/food)
- say("Atan eblak gorno tai por prin enum gorno.")//Bring me what the beggar consumes and needs (Its food)
-
-/mob/living/simple_animal/hostile/abnormality/sphinx/proc/QuestHandler(obj/item/I, mob/living/carbon/human/user)
- if (!istype(I, demand))
- if(demand)
- QuestPenalty(user)
- else
- to_chat(user, span_warning("[src] is not waiting for an offering at the moment."))
- return
-
- if(demand == /obj/item/reagent_containers)
- if(I.reagents.has_reagent(/datum/reagent/water))
- qdel(I)
- else
- QuestPenalty(user)
- return
-
- if(demand == /obj/item/food)
- qdel(I)
-
- QuestReward()
-/mob/living/simple_animal/hostile/abnormality/sphinx/proc/QuestReward()
- say(pick(satisfied))
- happy = TRUE
- demand = null
- datum_reference.qliphoth_change(3)
- var/turf/dispense_turf = get_step(src, pick(GLOB.alldirs))
- var/reward = pick(riddleloot)
- new reward(dispense_turf)
-
-/mob/living/simple_animal/hostile/abnormality/sphinx/proc/QuestPenalty(mob/living/carbon/human/user)
- say(pick(angry))
+/mob/living/simple_animal/hostile/abnormality/sphinx/FailureEffect(mob/living/carbon/human/user, work_type, pe)
+ . = ..()
datum_reference.qliphoth_change(-1)
+ if(!user)
+ return
+ if(get_attribute_level(user, PRUDENCE_ATTRIBUTE) >= 100)
+ return
var/mob/living/carbon/human/H = user
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/ears/ears = H.getorganslot(ORGAN_SLOT_EARS)
@@ -280,13 +222,12 @@
return pick(priority)
/mob/living/simple_animal/hostile/abnormality/sphinx/AttackingTarget(atom/attacked_target)
- ..()
if(!ishuman(attacked_target))
- return
+ return OpenFire(attacked_target)
var/mob/living/carbon/human/H = attacked_target
if(!H.sanity_lost)
- return
+ return OpenFire(attacked_target)
QDEL_NULL(H.ai_controller)
H.ai_controller = /datum/ai_controller/insane/wander/sphinx
@@ -294,12 +235,58 @@
LoseTarget(H)
/mob/living/simple_animal/hostile/abnormality/sphinx/OpenFire()
- if(!can_act || client)
+ if(!can_act)
return
- if((curse_cooldown <= world.time))
+ if((curse_cooldown <= world.time) && !client)
StoneVision(FALSE)
- return
+ return
+ StoneThrow(target)
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/attackby(obj/item/I, mob/living/user, params)
+ ..()
+ if(!client)
+ TryQuake()
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/attack_animal(mob/living/simple_animal/M)
+ ..()
+ if(!client)
+ TryQuake()
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/proc/StoneThrow()
+ if(!can_act)
+ return
+ can_act = FALSE
+ SLEEP_CHECK_DEATH(3)
+ playsound(get_turf(target), 'sound/magic/arbiter/repulse.ogg', 20, 0, 5)
+ new /obj/effect/temp_visual/rockwarning(get_turf(target), src)
+ SLEEP_CHECK_DEATH(10)
+ can_act = TRUE
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/proc/TryQuake()
+ if((quake_cooldown <= world.time) && !client)
+ Quake()
+
+/mob/living/simple_animal/hostile/abnormality/sphinx/proc/Quake()
+ if(quake_cooldown > world.time || !can_act)
+ return
+ quake_cooldown = world.time + quake_cooldown_time
+ can_act = FALSE
+ var/turf/origin = get_turf(src)
+ playsound(origin, 'sound/magic/arbiter/knock.ogg', 25, 0, 5)
+ SLEEP_CHECK_DEATH(9)
+ playsound(get_turf(src), 'sound/effects/ordeals/brown/rock_attack.ogg', 50, 0, 8)
+ for(var/turf/T in view(2, src))
+ new /obj/effect/temp_visual/smash_effect(T)
+ for(var/mob/living/victim in HurtInTurf(T, list(), quake_damage, WHITE_DAMAGE, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ var/throw_target = get_edge_target_turf(victim, get_dir(victim, get_step_away(victim, src)))
+ if(!victim.anchored)
+ var/throw_velocity = (prob(60) ? 1 : 4)
+ victim.throw_at(throw_target, rand(1, 2), throw_velocity, src)
+ SLEEP_CHECK_DEATH(8)
+ icon_state = icon_living
+ SLEEP_CHECK_DEATH(3)
+ can_act = TRUE
/mob/living/simple_animal/hostile/abnormality/sphinx/proc/StoneVision(attack_chain)
if((curse_cooldown > world.time) && !attack_chain)
@@ -345,11 +332,11 @@
/datum/ai_behavior/say_line/insanity_sphinx
lines = list(
- "Utast tom tai beos... Utast tom esm cadu!",
- "TAI ARKUR AGAL TOM LUVRI!!!",
- "Mi tai hur... Mi tai hur... Mi tai hur... Mi tai hur...",
- "Mies geng thran utast lemantomos!",
- "Ipi manba geng mosleti atan brit utast!",
+ "Our old masters are waiting for us.",
+ "Listen to the stars.",
+ "The age of mankind is over...",
+ "AHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA!!",
+ "I can't... It's too much!",
)
// Objects - Items
@@ -401,71 +388,6 @@
qdel(src)
return
-/obj/item/paper/fluff/translation_notes //most of these are just fluff
- name = "Translation Notes"
- info = {"
You may find this helpful when interpreting the sphinx's demands.
- -A-
- agal: gate
- arkur: city
- atan: bring
- -B-
- beos: law
- brit: with
- -C-
- cadu: king
- ceffe: threat
- cihir: lazy
- -E-
- eblak: me
- enum: and
- esm: a
- etog: will/mind
- -T-
- tai: the
- thran: angry
- tolly: stupid
- tom: to
- -U-
- ucaf: lands
- utast: abnormality/shell"}
-
// Chems
/datum/reagent/medicine/ichor //from jar
name = "Ichor"
@@ -529,59 +451,41 @@
variable = TRUE
multiplicative_slowdown = 2
-// Objects - Structures
-/obj/structure/sacrifice_table
- name = "sacrificial altar"
- desc = "It looks impossibly ancient."
- icon = 'ModularTegustation/Teguicons/32x32.dmi'
- icon_state = "altar"
- anchored = TRUE
- density = TRUE
- layer = TURF_LAYER
- plane = FLOOR_PLANE
- resistance_flags = INDESTRUCTIBLE
- var/obj/item/showpiece = null
-
-/obj/structure/sacrifice_table/examine(mob/user)
+ //Effects
+/obj/effect/temp_visual/rockattack
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "rockattack"
+ duration = 6
+ randomdir = TRUE // random spike appearance
+ layer = ABOVE_MOB_LAYER
+
+/obj/effect/temp_visual/rockwarning
+ name = "moving rocks"
+ desc = "A target warning you of incoming pain"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "rockwarning"
+ duration = 10
+ layer = RIPPLE_LAYER // We want this HIGH. SUPER HIGH. We want it so that you can absolutely, guaranteed, see exactly what is about to hit you.
+ var/damage = 40 //Red Damage
+ var/mob/living/caster // who made this, anyway
+
+/obj/effect/temp_visual/rockwarning/Initialize(mapload, new_caster)
. = ..()
- if(showpiece)
- . += span_notice("There's \a [showpiece] inside.")
+ if(new_caster)
+ caster = new_caster
+ addtimer(CALLBACK(src, PROC_REF(explode)), 0.9 SECONDS)
-/obj/structure/sacrifice_table/update_overlays()
- . = ..()
- if(showpiece)
- var/mutable_appearance/showpiece_overlay = mutable_appearance(showpiece.icon, showpiece.icon_state)
- showpiece_overlay.copy_overlays(showpiece)
- showpiece_overlay.transform *= 0.7
- . += showpiece_overlay
-
-/obj/structure/sacrifice_table/proc/insert_showpiece(obj/item/wack, mob/user)
- if(user.transferItemToLoc(wack, src))
- showpiece = wack
- to_chat(user, span_notice("You put [wack] on display."))
- update_icon()
-
-/obj/structure/sacrifice_table/proc/dump()
- if(!QDELETED(showpiece))
- showpiece.forceMove(drop_location())
- showpiece = null
- update_icon()
-
-/obj/structure/sacrifice_table/attack_hand(mob/user)
- . = ..()
- if(.)
+/obj/effect/temp_visual/rockwarning/proc/explode()
+ var/turf/target_turf = get_turf(src)
+ if(!target_turf)
return
- user.changeNext_move(CLICK_CD_MELEE)
- if (showpiece)
- to_chat(user, span_notice("You remove [showpiece]."))
- dump()
- add_fingerprint(user)
+ if(QDELETED(caster) || caster?.stat == DEAD || !caster)
return
-
-/obj/structure/sacrifice_table/attackby(obj/item/W, mob/user, params)
- if(!showpiece)
- insert_showpiece(W, user)
- else
- return ..()
-
-#undef SPHINX_GAZE_COOLDOWN
+ playsound(target_turf, 'sound/effects/ordeals/brown/rock_attack.ogg', 50, 0, 8)
+ new /obj/effect/temp_visual/rockattack(target_turf)
+ for(var/turf/T in view(1, src))
+ new /obj/effect/temp_visual/smash_effect(T)
+ for(var/mob/living/L in caster.HurtInTurf(T, list(), damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = TRUE))
+ if(L.health < 0)
+ L.gib()
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
index 2420c2d63c8b..71c00fb7345e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
@@ -56,12 +56,12 @@
observation_prompt = "The totem sits atop a pile of gore and viscera. \
Human scalps dangle motionlessly, strung to its wings. \
Though the totem lies still, you feel compelled to answer it."
- observation_choices = list("Speak", "Remain silent")
- correct_choices = list("Remain silent")
- observation_success_message = "The disgusting totem answered with silence. \
- The Thunderbird had been defeated long ago, its existence being its only privilege."
- observation_fail_message = "Before you can utter a word, thunder booms within the cell. \
- The Thunderbird can be spoken to, but never reasoned with."
+ observation_choices = list(
+ "Remain silent" = list(TRUE, "The disgusting totem answered with silence. \
+ The Thunderbird had been defeated long ago, its existence being its only privilege."),
+ "Speak" = list(FALSE, "Before you can utter a word, thunder booms within the cell. \
+ The Thunderbird can be spoken to, but never reasoned with."),
+ )
/*---Combat---*/
//Melee stats
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm b/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm
index a38b22cdd280..25335541529a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm
@@ -44,19 +44,19 @@
As far as I know it's just me left. \
The site burial went off and escape is impossible, yet, the other abnormalities remain in their cells - if they leave she forces them back inside. \
Maybe if I enter one of the unused cells, she might leave me alone?"
- observation_choices = list("Enter a cell", "Surrender to her")
- correct_choices = list("Enter a cell")
- observation_success_message = "I step inside and lock the door behind me, I'm stuck inside. \
- She passes by the containment unit and peers through the glass and seems satisfied."
- observation_fail_message = "Steeling myself, I confront her during one of her rounds. I tell her I'm tired and just want it to end. \
- She gets closer and lifts her skirt(?) and I'm thrust underneath, my colleagues are here- they're alive and well! \
- But, they seem despondent. One looks at me says simply; \"In here, you're with us. Forever.\""
+ observation_choices = list(
+ "Enter a cell" = list(TRUE, "I step inside and lock the door behind me, I'm stuck inside. \
+ She passes by the containment unit and peers through the glass and seems satisfied."),
+ "Surrender to her" = list(FALSE, "Steeling myself, I confront her during one of her rounds. I tell her I'm tired and just want it to end. \
+ She gets closer and lifts her skirt(?) and I'm thrust underneath, my colleagues are here- they're alive and well! \
+ But, they seem despondent. One looks at me says simply; \"In here, you're with us. Forever.\""),
+ )
var/finishing = FALSE
var/captured_souls = 0
- var/resistance_decrease = 0.5
+ var/resistance_decrease = 0.2
var/base_red_resistance = 0.7
var/base_white_resistance = 1.2
@@ -152,4 +152,5 @@
/mob/living/simple_animal/hostile/abnormality/warden/bullet_act(obj/projectile/P)
visible_message(span_userdanger("[src] is unfazed by \the [P]!"))
+ new /obj/effect/temp_visual/healing/no_dam(get_turf(src))
P.Destroy()
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm b/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm
index 84e0673761d5..ea4a455055e3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm
@@ -60,13 +60,13 @@
observation_prompt = "I made a mistake, I put my trust in someone I shouldn't have and my world paid the price for my indiscretion. \
Was I wrong to call them friend? Were they really my friend, all along?"
- observation_choices = list("You were wrong", "It wasn't wrong")
- correct_choices = list("It wasn't wrong")
- observation_success_message = "If that's the case, then why did balance, why did justice, fail me? \
- Why did my world burn if I truly did not make a mistake? It still hurts, but, if you're right then maybe I can put my trust in you..."
- observation_fail_message = "It was the most precious relationship to me... \
- That's why I lost; I fell to my beloved companion... \
- I should have killed them when I had the chance! Sinners!! Embodiments of evil..!"
+ observation_choices = list(
+ "It wasn't wrong" = list(TRUE, "If that's the case, then why did balance, why did justice, fail me? \
+ Why did my world burn if I truly did not make a mistake? It still hurts, but, if you're right then maybe I can put my trust in you..."),
+ "You were wrong" = list(FALSE, "It was the most precious relationship to me... \
+ That's why I lost; I fell to my beloved companion... \
+ I should have killed them when I had the chance! Sinners!! Embodiments of evil..!"),
+ )
var/friendly = TRUE
var/list/friend_ship = list()
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm b/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm
index 481368534514..c144ba7ea043 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm
@@ -61,14 +61,14 @@
observation_prompt = "The Angel's Pendant was one half of a greater whole, but now they've been cleaved in half, forever wanting to reunite. \
The pendant laid upon the podium before you, even being in the same room as it seemed to fortify your body and soul."
- observation_choices = list("Put it on", "Don't put it on")
- correct_choices = list("Put it on")
- observation_success_message = "The moment you put it on, you feel a radiance emanate out and mend pain you didn't even know was there. \
- It doesn't intend to heal you, it's just the way it is. \
- If there is darkness and evil in this world, shouldn't there be light and good too? \
- The world is far more than darkness and cold."
- observation_fail_message = "It is all that is bright given form, made to gather all the positivity in the world. \
- If you can't accept the goodness in yourself, you're not ready to accept the goodness of the world."
+ observation_choices = list(
+ "Put it on" = list(TRUE, "The moment you put it on, you feel a radiance emanate out and mend pain you didn't even know was there. \
+ It doesn't intend to heal you, it's just the way it is. \
+ If there is darkness and evil in this world, shouldn't there be light and good too? \
+ The world is far more than darkness and cold."),
+ "Don't put it on" = list(FALSE, "It is all that is bright given form, made to gather all the positivity in the world. \
+ If you can't accept the goodness in yourself, you're not ready to accept the goodness of the world."),
+ )
var/explosion_damage = 150
var/explosion_timer = 7 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm b/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm
index 5f2cb5ed4057..5a470a022723 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm
@@ -46,14 +46,14 @@
observation_prompt = "The Devil's Pendant was one half of a greater whole, but now they've been cleaved in half, forever wanting to reunite. \
The pendant laid upon the podium before you, even being in the same room as it seemed to suck the life out of you and erodes your very essence."
- observation_choices = list("Put it on", "Don't put it on")
- correct_choices = list("Put it on")
- observation_success_message = "The moment you put it on, your body is stricken with deepest agony, feeling like thorns racing through your body, puncturing flesh and mind alike but you endure. \
- It didn't mean to harm you, it's just the way it is. \
- If there is light and goodness in this world, shouldn't there be darkness and evil too? \
- The world is far more than brightness and warmth."
- observation_fail_message = "It is darkness made manifest, made to encapsulate all the negativity in the world. \
- If you can't accept the darkness of the world, you're not ready to accept the darkness in you."
+ observation_choices = list(
+ "Put it on" = list(TRUE, "The moment you put it on, your body is stricken with deepest agony, feeling like thorns racing through your body, puncturing flesh and mind alike but you endure. \
+ It didn't mean to harm you, it's just the way it is. \
+ If there is light and goodness in this world, shouldn't there be darkness and evil too? \
+ The world is far more than brightness and warmth."),
+ "Don't put it on" = list(FALSE, "It is darkness made manifest, made to encapsulate all the negativity in the world. \
+ If you can't accept the darkness of the world, you're not ready to accept the darkness in you."),
+ )
faction = list("neutral", "hostile") // Not fought by anything, typically. But...
var/faction_override = list("hostile") // The effects hit non-hostiles.
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/bald.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/bald.dm
index efe01e9addb5..6f4ed278a234 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/bald.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/bald.dm
@@ -42,10 +42,10 @@
harvest_phrase_third = "%PERSON squeezes %ABNO. Some juice drips into %VESSEL."
observation_prompt = "This abnormality is filled with dreams of bald people. Are you balding, or already bald?"
- observation_choices = list("Yes", "No")
- correct_choices = list("Yes")
- observation_success_message = "Lobotomy Corporation welcomes you."
- observation_fail_message = "Come back after watching the fast and the furious 7 five more times."
+ observation_choices = list(
+ "Yes" = list(TRUE, "Lobotomy Corporation welcomes you."),
+ "No" = list(FALSE, "Come back after watching the fast and the furious 7 five more times."),
+ )
var/bald_users = list()
chem_type = /datum/reagent/abnormality/bald
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm
index 4d09f09118e2..18153dadaf20 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm
@@ -58,20 +58,20 @@
This resin is like gloom. \
A sap of gloom, not quite like tears or sadness. \
The toad holds this resin."
- observation_choices = list("Mimic the cry", "Sit and wait")
- correct_choices = list("Sit and wait")
- observation_success_message = "An indeterminate amount of time passes. \
- As you waited for the toad to finish its cries, \
- it gazed into you, closing and opening its eyelids slowly. \
- With a quick, slick sound,a long blue tongue popped out towards you. \
- An eyeball belonging to the toad was on its tongue. \
- When you picked it up, it blinked its other eye at us before going on its way. \
- Was that its thanks for lending an ear?"
- observation_fail_message = "\"Croohic, croohoo.\" \
- The toad’s cry is dull and heavy. \
- It doesn’t seem to have understood what it heard. \
- After crying like that a few more times, it hopped away from its spot. \
- All that’s left is the sticky blue resin."
+ observation_choices = list(
+ "Sit and wait" = list(TRUE, "An indeterminate amount of time passes. \
+ As you waited for the toad to finish its cries, \
+ it gazed into you, closing and opening its eyelids slowly. \
+ With a quick, slick sound, a long blue tongue popped out towards you. \
+ An eyeball belonging to the toad was on its tongue. \
+ When you picked it up, it blinked its other eye at us before going on its way. \
+ Was that its thanks for lending an ear?"),
+ "Mimic the cry" = list(FALSE, "\"Croohic, croohoo.\" \
+ The toad’s cry is dull and heavy. \
+ It doesn’t seem to have understood what it heard. \
+ After crying like that a few more times, it hopped away from its spot. \
+ All that’s left is the sticky blue resin."),
+ )
//work
var/pulse_healing = 15
@@ -116,8 +116,15 @@
//Attack or approach it directly and it attacks you!
/mob/living/simple_animal/hostile/abnormality/blubbering_toad/BreachEffect(mob/living/user, breach_type = BREACH_NORMAL)
- if(breach_type == BREACH_PINK)
+ if(breach_type == BREACH_PINK || breach_type == BREACH_MINING)
persistant = TRUE
+ if(breach_type == BREACH_MINING)//nerfed to a ZAYIN statline since this is something you'll typically fight roundstart
+ name = "Weakened [name]"
+ maxHealth = 400
+ melee_damage_lower = 9
+ melee_damage_upper = 15
+ tongue_damage = 10
+ broken = TRUE
SetIdiot(user)
return ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm
index c8b1e2e26dc9..69dd327b203b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm
@@ -55,26 +55,17 @@
observation_prompt = "It was all very well to say \"Drink me\" but wisdom told you not to do that in a hurry. \
The bottle had no markings to denote whether it was poisonous but you could not be sure, it was almost certain to disagree with you, sooner or later..."
- observation_choices = list("Drink the bottle", "Eat the cake", "Leave")
- correct_choices = list("Leave", "Eat the cake")
- observation_success_message = "Suspicious things are suspicious, common sense hasn't failed you yet."
- observation_fail_message = "However this bottle was not marked as poisonous and you ventured a taste, \
- and found it horrid, the brine clung to your tongue. Who'd mark such a horrible thing for drinking?"
- //Special answer for choice 2
- var/observation_success_message_2 = "Abandon reason, that's how you survive in Wonderland. \
- You devour the cake by the handful, frosting and crumbs smear your hands, your face and the floor. \
- It's sweet and tart, with only the slightest hint of salt. \
- As you breach the final layer of cake, the top of the bottle cracks and a deluge of brine spills forth, filling the room faster than you could draw a breath. \
- In spite of that, you're at peace and smiling. \
- Through your fading eyesight, you spy yourself through the other side of the containment door's window - frowning."
-
-// Final Observation
-/mob/living/simple_animal/hostile/abnormality/bottle/ObservationResult(mob/living/carbon/human/user, condition, answer) //special answer for cake result
- if(answer == "Eat the cake")
- observation_success_message = observation_success_message_2
- else
- observation_success_message = initial(observation_success_message)
- return ..()
+ observation_choices = list(
+ "Leave" = list(TRUE, "Suspicious things are suspicious, common sense hasn't failed you yet."),
+ "Eat the cake" = list(TRUE, "Abandon reason, that's how you survive in Wonderland. \
+ You devour the cake by the handful, frosting and crumbs smear your hands, your face and the floor. \
+ It's sweet and tart, with only the slightest hint of salt. \
+ As you breach the final layer of cake, the top of the bottle cracks and a deluge of brine spills forth, filling the room faster than you could draw a breath. \
+ In spite of that, you're at peace and smiling. \
+ Through your fading eyesight, you spy yourself through the other side of the containment door's window - frowning."),
+ "Drink the bottle" = list(FALSE, "However this bottle was not marked as poisonous and you ventured a taste, \
+ and found it horrid, the brine clung to your tongue. Who'd mark such a horrible thing for drinking?"),
+ )
// Work Mechanics
/mob/living/simple_animal/hostile/abnormality/bottle/AttemptWork(mob/living/carbon/human/user, work_type)
@@ -189,12 +180,15 @@
// Pink Midnight Breach
/mob/living/simple_animal/hostile/abnormality/bottle/BreachEffect(mob/living/carbon/human/user, breach_type)
- if(breach_type == BREACH_PINK)
+ if(breach_type == BREACH_PINK || breach_type == BREACH_MINING)
ADD_TRAIT(src, TRAIT_MOVE_FLYING, INNATE_TRAIT)
COOLDOWN_START(src, speak_damage_aura, speak_cooldown_time)
icon_state = "bottle_breach"
desc = "A floating bottle, leaking tears.\nYou can use an empty hand to drink from it."
can_breach = TRUE
+ if(breach_type == BREACH_MINING)
+ speak_damage = 0
+ speak_cooldown_time = 15 SECONDS
return ..()
/mob/living/simple_animal/hostile/abnormality/bottle/attack_hand(mob/living/carbon/human/M)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/fairy_festival.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/fairy_festival.dm
index 8562c85400ce..6a63135f5002 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/fairy_festival.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/fairy_festival.dm
@@ -5,8 +5,14 @@
icon_state = "fairy"
icon_living = "fairy"
portrait = "fairy_festival"
- maxHealth = 83
- health = 83
+ maxHealth = 800
+ health = 800
+ move_to_delay = 5
+ damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 1.2, BLACK_DAMAGE = 1.3, PALE_DAMAGE = 2)
+ melee_damage_lower = 8
+ melee_damage_upper = 15
+ stat_attack = DEAD
+ attack_sound = 'sound/abnormalities/fairyfestival/fairyqueen_hit.ogg'
is_flying_animal = TRUE
threat_level = ZAYIN_LEVEL
work_chances = list(
@@ -31,6 +37,15 @@
var/heal_cooldown = 2 SECONDS
var/heal_cooldown_base = 2 SECONDS
var/list/mob/living/carbon/human/protected_people = list()
+ var/summon_count = 0
+ var/summon_type = /mob/living/simple_animal/hostile/mini_fairy
+ var/summon_cooldown
+ var/summon_cooldown_time = 30 SECONDS
+ var/seek_cooldown
+ var/seek_cooldown_time = 10 SECONDS
+ var/summon_group_size = 6
+ var/summon_maximum = 14
+ var/eat_threshold = 0.8
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
grouped_abnos = list(
@@ -46,10 +61,10 @@
observation_prompt = "A gaggle of fairies flitter to and fro about the containment cell, they giggle as you approach. \
\"You're a peaceful child, aren't you? You're lucky to accept our care.\" \
They say in a sing-song all around you. \"Only good people ever speak to us, you're a good person too, right?\""
- observation_choices = list("Accept their care")
- correct_choices = list("Accept their care")
- observation_success_message = "The fairies sprinkle their powder around you and it collects upon your hands. You feel special. \
- You retreat from the cell and the fairies' hungry gazes. You've always known the true meaning of The Fairies' Care."
+ observation_choices = list(
+ "Accept their care" = list(TRUE, "The fairies sprinkle their powder around you and it collects upon your hands. You feel special. \
+ You retreat from the cell and the fairies' hungry gazes. You've always known the true meaning of The Fairies' Care."),
+ )
/mob/living/simple_animal/hostile/abnormality/fairy_festival/proc/FairyHeal()
for(var/mob/living/carbon/human/P in protected_people)
@@ -82,6 +97,10 @@
. = ..()
if(protected_people.len)
FairyHeal()
+ if(summon_count > summon_maximum)
+ return
+ if((summon_cooldown < world.time) && !(status_flags & GODMODE))
+ SummonGuys(summon_type)
/mob/living/simple_animal/hostile/abnormality/fairy_festival/proc/FairyEnd(mob/living/carbon/human/user)
protected_people.Remove(user)
@@ -116,18 +135,82 @@
/mob/living/simple_animal/hostile/abnormality/fairy_festival/BreachEffect(mob/living/carbon/human/user, breach_type)
if(breach_type == BREACH_PINK)
- SummonGuys()
- addtimer(CALLBACK(src, PROC_REF(SummonGuys)), 20 SECONDS)
+ summon_cooldown_time = 20 SECONDS
+ SummonGuys(summon_type)
+ if(breach_type == BREACH_MINING)
+ can_breach = TRUE
+ summon_type = /mob/living/simple_animal/hostile/fairy_mass
+ summon_group_size = 1
+ summon_maximum = 3
+ SummonGuys(summon_type)
+ icon = 'ModularTegustation/Teguicons/96x48.dmi'
+ icon_state = "fairy_queen"
+ pixel_x = -16
+ maxHealth = 500
+ playsound(get_turf(src), "sound/abnormalities/seasons/fall_change.ogg", 100, FALSE)
+ playsound(get_turf(src), "sound/abnormalities/fairyfestival/fairyqueen_growl.ogg", 100, FALSE)
return ..()
-/mob/living/simple_animal/hostile/abnormality/fairy_festival/proc/SummonGuys()
+/mob/living/simple_animal/hostile/abnormality/fairy_festival/AttackingTarget()
+ . = ..()
+ if(summon_type != /mob/living/simple_animal/hostile/fairy_mass)//does she have fairy masses?
+ return
+ if(istype(target, /mob/living/simple_animal/hostile/fairy_mass))
+ var/mob/living/L = target
+ if(L.health > 0)//fairies have to be alive; scarred meat isn't tasty
+ L.gib()
+ ProcessKill()
+ playsound(get_turf(src), "sound/abnormalities/fairyfestival/fairyqueen_growl.ogg", 100, FALSE)
+ return
+ eat_threshold -= 0.2
+ if(. && isliving(target))
+ var/mob/living/L = target
+ if(isliving(target) && (L.health < 0 || L.stat == DEAD))
+ L.gib()
+ playsound(get_turf(src), "sound/abnormalities/fairyfestival/fairyqueen_growl.ogg", 100, FALSE)
+ if(ishuman(L))
+ ProcessKill()
+
+//Cannibalism
+/mob/living/simple_animal/hostile/abnormality/fairy_festival/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ ..()
+ if(summon_type != /mob/living/simple_animal/hostile/fairy_mass)//does she have fairy masses?
+ return
+ if(health < (maxHealth * eat_threshold)) //80% health or lower, 20% less for each eat.
+ var/fairy_hp = 300
+ var/mob/living/mytarget
+ if(seek_cooldown < world.time)//this check can only be done once every ten seconds, for performance
+ for(var/mob/living/simple_animal/hostile/fairy_mass/M in range(12, src))//finds the fairy with the lowest HP in the vicinity
+ if(M.health <= 0)
+ mytarget = M
+ break
+ if(M.health <= fairy_hp)
+ fairy_hp = M.health
+ mytarget = M
+ if(mytarget)
+ mytarget.faction = list("neutral")
+ LoseTarget()
+ GiveTarget(mytarget)
+ seek_cooldown = world.time + seek_cooldown_time
+
+/mob/living/simple_animal/hostile/abnormality/fairy_festival/proc/SummonGuys(summon_type)
+ summon_cooldown = world.time + summon_cooldown_time
var/mob/living/simple_animal/hostile/ordeal/pink_midnight/pink = locate() in GLOB.mob_living_list
- for(var/i = 1 to 6)
+ for(var/i = 1 to summon_group_size)
var/turf/target_turf = get_turf(pink ? pink : src)
- var/mob/living/simple_animal/hostile/mini_fairy/new_fairy = new(target_turf)
+ var/mob/living/simple_animal/hostile/mini_fairy/new_fairy
+ new_fairy = new summon_type(target_turf)
+ summon_count += 1
if(pink)
new_fairy.faction += "pink_midnight"
+/mob/living/simple_animal/hostile/abnormality/fairy_festival/proc/ProcessKill()
+ eat_threshold -= 0.2
+ adjustBruteLoss(-maxHealth)//FRESH MEAT!
+ playsound(get_turf(src), "sound/abnormalities/fairyfestival/fairyqueen_growl.ogg", 100, FALSE)
+ if(move_to_delay>1)
+ ChangeMoveToDelayBy(-1)
+
/datum/reagent/abnormality/fairy_festival
name = "Nectar of an Unknown Flower"
description = "The fairies got this for you..."
@@ -187,3 +270,36 @@
continue
else
M.Goto(src,M.move_to_delay,M.minimum_distance)
+
+/mob/living/simple_animal/hostile/fairy_mass
+ name = "\improper Fairy Mass"
+ desc = "They wander in search of food."
+ icon = 'ModularTegustation/Teguicons/tegumobs.dmi'
+ icon_state = "fairy_mass"
+ icon_living = "fairy_mass"
+ icon_dead = "fairy_mass_dead"
+ maxHealth = 300
+ health = 300
+ attack_verb_continuous = "bites"
+ attack_verb_simple = "bite"
+ is_flying_animal = TRUE
+ damage_coeff = list(BRUTE = 1, RED_DAMAGE = 1.2, WHITE_DAMAGE = 1.2, BLACK_DAMAGE = 1.2, PALE_DAMAGE = 1.2)
+ faction = list("hostile", "fairy")
+ melee_damage_lower = 1
+ melee_damage_upper = 5
+ melee_damage_type = RED_DAMAGE
+ obj_damage = 3
+ rapid_melee = 3
+ attack_sound = 'sound/abnormalities/fairyfestival/fairy_festival_bite.ogg'
+ density = FALSE
+ move_to_delay = 2
+ stat_attack = DEAD
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab = 1)
+
+/mob/living/simple_animal/hostile/fairy_mass/AttackingTarget()
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/L = target
+ if(L.health < 0 || L.stat == DEAD)
+ playsound(get_turf(src), 'sound/magic/demon_consume.ogg', 75, 0)
+ L.gib()
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm
index fa6ba5c393fe..8b7dc83b5324 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm
@@ -27,10 +27,10 @@
observation_prompt = "The sweet stench of rot and decay hit you before you noticed the source was the bleeding person covered in plants. \
His lips gape open and close like a fish's and what little strength he has in his limbs, he uses to beckons you closer..."
- observation_choices = list("Get closer and listen", "Leave")
- correct_choices = list("Get closer and listen")
- observation_success_message = "You bend down and lend your ear to his mouth... You hear the words you've been waiting your whole life to hear."
- observation_fail_message = "The man clearly needs help, you rush to find a medic."
+ observation_choices = list(
+ "Get closer and listen" = list(TRUE, "You bend down and lend your ear to his mouth... You hear the words you've been waiting your whole life to hear."),
+ "Leave" = list(FALSE, "The man clearly needs help, you rush to find a medic."),
+ )
var/seed_list = list(
/obj/item/seeds/grass/fairy,
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/hammer_light.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/hammer_light.dm
index 590fc73aedb1..c832ee68a798 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/hammer_light.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/hammer_light.dm
@@ -30,14 +30,13 @@
gift_type = /datum/ego_gifts/evening
abnormality_origin = ABNORMALITY_ORIGIN_ARTBOOK // Technically it was in the beta but I dont want it showing it up in LC-only modes
- observation_prompt = "I was the unluckiest man in the world. \
- Everything around me did nothing but ruining my life.But I had no power to change this fate. \
- Someday, someone made an offer to me.\"If you accept it, your whole world will change.\" \
+ observation_prompt = "I was the unluckiest man in the world. \
+ Everything around me did nothing but ruining my life. But I had no power to change this fate. \
+ Someday, someone made an offer to me. \"If you accept it, your whole world will change.\" \
Such a tempting offer. I would become something that I could only hope to be."
- observation_choices = list("Accept the offer")
- correct_choices = list("Accept the offer")
- observation_success_message = "I accepted the offer and paid the price. \
- The $0 Hammer of Light shined."
+ observation_choices = list(
+ "Accept the offer" = list(TRUE, "I accepted the offer and paid the price. The $0 Hammer of Light shined.")
+ )
pet_bonus = "hums" // saves a few lines of code by allowing funpet() to be called by attack_hand()
var/sealed = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/oceanwaves.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/oceanwaves.dm
index 3fd1d945f66b..e0b2169bfe95 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/oceanwaves.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/oceanwaves.dm
@@ -43,11 +43,11 @@
Where does it get its power…? Besides that, what’s with this sound of crashing waves? \
Regardless, this vacant lot looks to be a good place to take a break. \
Standing in front of the vending machine, you see rows of buttons."
- observation_choices = list("Press one")
- correct_choices = list("Press one")
- observation_success_message = "With just a single press, the machine ejected one can after another. \
- All the cans are purple. You can’t fathom the meaning of the ships and grapes doodled on them, but they somehow feel familiar, and well… cheery. \
- They should be okay to drink."
+ observation_choices = list(
+ "Press one" = list(TRUE, "With just a single press, the machine ejected one can after another. \
+ All the cans are purple. You can’t fathom the meaning of the ships and grapes doodled on them, but they somehow feel familiar, and well… cheery. \
+ They should be okay to drink."),
+ )
var/list/goodsoders = list(
/obj/item/reagent_containers/food/drinks/soda_cans/oceanwave/unlabeled,
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm
index 74c4c9182002..283671b9129c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm
@@ -7,6 +7,13 @@
portrait = "one_sin"
maxHealth = 777
health = 777
+ damage_coeff = list(RED_DAMAGE = 1.5, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
+ melee_damage_lower = 8
+ melee_damage_upper = 15
+ melee_damage_type = WHITE_DAMAGE
+ attack_sound = 'sound/abnormalities/onesin/onesin_attack.ogg'
+ attack_verb_continuous = "smites"
+ attack_verb_simple = "smite"
is_flying_animal = TRUE
threat_level = ZAYIN_LEVEL
work_chances = list(
@@ -24,7 +31,7 @@
/datum/ego_datum/armor/penitence
)
max_boxes = 10
- gift_type = /datum/ego_gifts/penitence
+ gift_type = /datum/ego_gifts/penitence
gift_message = "From this day forth, you shall never forget his words."
abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY
@@ -38,12 +45,12 @@
observation_prompt = "It has great power. It is savior that will judge you, and executioner that will put you in your demise. \
In its eyes, you find... (Technically, it has no eyes, so in its pitch-black holes you find...)"
- observation_choices = list("You find yourself.", "Nothing.")
- correct_choices = list("Nothing.")
- observation_success_message = "Darkness. \
- Nothing is there. Have you found the answers you were looking for?"
- observation_fail_message = "You are found. \
- You have great power. You willingly lift the axe for the greater good."
+ observation_choices = list(
+ "Nothing" = list(TRUE, "Darkness. \
+ Nothing is there. Have you found the answers you were looking for?"),
+ "You find yourself" = list(FALSE, "You are found. \
+ You have great power. You willingly lift the axe for the greater good."),
+ )
var/halo_status = "onesin_halo_normal" //used for changing the halo overlays
@@ -57,7 +64,7 @@
. += "onesin" //by the nine this is too cursed
/mob/living/simple_animal/hostile/abnormality/onesin/WorkChance(mob/living/carbon/human/user, chance)
- if(istype(user.ego_gift_list[HAT], /datum/ego_gifts/penitence))
+ if(istype(user.ego_gift_list[HAT], gift_type))
return chance + 10
return chance
@@ -131,8 +138,15 @@
H.adjustSanityLoss(-H.maxSanity * heal_factor)
/mob/living/simple_animal/hostile/abnormality/onesin/BreachEffect(mob/living/carbon/human/user, breach_type)
+ if(breach_type == BREACH_MINING)
+ update_icon()
+ return ..()
return FALSE // If someone wants him to breach for SOME REASON in the future, then exclude breach_type == BREACH_PINK
+/mob/living/simple_animal/hostile/abnormality/onesin/AttackingTarget()
+ ..()
+ new /obj/effect/temp_visual/onesin_punishment(get_turf(target))
+
/datum/reagent/abnormality/onesin
name = "Holy Light"
description = "It's calming, even if you can't quite look at it straight."
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm
index e39ad98d3a79..27f6735eba46 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm
@@ -7,8 +7,8 @@
icon_state = "oracle"
icon_living = "oracle"
portrait = "oracle"
- maxHealth = 50
- health = 50
+ maxHealth = 1500
+ health = 1500
damage_coeff = list(RED_DAMAGE = 2, WHITE_DAMAGE = 0, BLACK_DAMAGE = 2, PALE_DAMAGE = 2)
threat_level = ZAYIN_LEVEL
work_chances = list(
@@ -22,7 +22,7 @@
work_damage_type = WHITE_DAMAGE
ego_list = list(
- /datum/ego_datum/weapon/dead_dream,
+ /datum/ego_datum/weapon/dead_dream,
/datum/ego_datum/armor/dead_dream
)
// gift_type = /datum/ego_gifts/oracle
@@ -32,15 +32,15 @@
She was told that it would feel like no time at all. \
Silently sleeping she dreams of the future, a future she was promised. \
Before your eyes untold time passes until one day."
- observation_choices = list("She woke up.", "The pod broke.")
- correct_choices = list("The pod broke.")
- observation_success_message = "You look into the window as you see her stir in her slumber before falling still. \
- Holding your breath in silence, \
- You remember Maria, \
- Forever dreaming of a future she will never see."
- observation_fail_message = "The pod opens with a hiss as you watch her step out. \
- The joy on her face is immesurable, for she left behind so much to be here. \
- Then she melts away, for this was your dream."
+ observation_choices = list(
+ "The pod broke" = list(TRUE, "You look into the window as you see her stir in her slumber before falling still. \
+ Holding your breath in silence, \
+ You remember Maria, \
+ Forever dreaming of a future she will never see."),
+ "She woke up" = list(FALSE, "The pod opens with a hiss as you watch her step out. \
+ The joy on her face is immesurable, for she left behind so much to be here. \
+ Then she melts away, for this was your dream."),
+ )
var/list/sleeplines = list(
"Hello...",
@@ -77,6 +77,11 @@
"A person in a blue coat... they fold into a book...",
)
+/mob/living/simple_animal/hostile/abnormality/oracle/Move()
+ return FALSE
+
+/mob/living/simple_animal/hostile/abnormality/oracle/CanAttack(atom/the_target)
+ return FALSE
/mob/living/simple_animal/hostile/abnormality/oracle/PostWorkEffect(mob/living/carbon/human/user, work_type, pe)
if(work_type == ABNORMALITY_WORK_INSIGHT)
@@ -97,7 +102,6 @@
to_chat(user, span_notice("[SSlobotomy_corp.next_ordeal.name]"))
..()
-
/mob/living/simple_animal/hostile/abnormality/oracle/Initialize(mob/living/carbon/human/user)
. = ..()
RegisterSignal(SSdcs, COMSIG_GLOB_ABNORMALITY_BREACH, PROC_REF(OnAbnoBreach))
@@ -127,3 +131,29 @@
if(H.IsSleeping())
continue //You need to be sleeping to get notified
to_chat(H, "Oh.... [abno]... It has breached containment...")
+
+//ER stuff
+/mob/living/simple_animal/hostile/abnormality/oracle/BreachEffect(mob/living/carbon/human/user, breach_type)//finish this shit
+ if(breach_type == BREACH_MINING)
+ var/chosenfake = pick(fakeordeals)
+ for(var/mob/living/L in livinginrange(48, src))
+ if(L.z != z)
+ continue
+ if(faction_check_mob(L))
+ continue
+ to_chat(L, span_userdanger("[chosenfake]"))
+ addtimer(CALLBACK(src, PROC_REF(NukeAttack)), 30 SECONDS)
+ return ..()
+
+/mob/living/simple_animal/hostile/abnormality/oracle/proc/NukeAttack()
+ if(stat == DEAD)
+ return
+ playsound(src, 'sound/magic/wandodeath.ogg', 100, FALSE, 40, falloff_distance = 10)
+ for(var/mob/living/L in livinginrange(48, src))
+ if(L.z != z)
+ continue
+ if(faction_check_mob(L))
+ continue
+ to_chat(L, span_userdanger("Visions of a horrible future flash before your eyes!"))
+ L.deal_damage((150 - get_dist(src, L)), WHITE_DAMAGE)
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm
index 00ab394bedde..d5eeb20a159c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm
@@ -32,12 +32,12 @@
observation_prompt = "Letters addressed to various addresses and recipients litter the containment cell. \
Occasionally, some of the letters flutter in the air, as if a breeze has come through the cell. \
A new batch of letters comes flooding out of the mailbox, one lands right in front of you, with your name on it."
- observation_choices = list("Open the letter", "Ignore it")
- correct_choices = list("Open the letter")
- observation_success_message = "You open the letter, but the inside is blank. \
- Looking at the envelope, you notice that it is labelled \"RETURN TO SENDER\" \
- You put the envelope back in the mailbox, and find a gift inside."
- observation_fail_message = "You know better than to fall for the tricks of an abnormality. You walk out of the cell, never knowing what was in that letter."
+ observation_choices = list(
+ "Open the letter" = list(TRUE, "You open the letter, but the inside is blank. \
+ Looking at the envelope, you notice that it is labelled \"RETURN TO SENDER\" \
+ You put the envelope back in the mailbox, and find a gift inside."),
+ "Ignore it" = list(FALSE, "You know better than to fall for the tricks of an abnormality. You walk out of the cell, never knowing what was in that letter."),
+ )
var/cooldown
var/cooldown_time = 10 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/quiet_day.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/quiet_day.dm
index 0549c06acd1e..35a9df15cfe7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/quiet_day.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/quiet_day.dm
@@ -11,6 +11,7 @@
core_icon = "quiet_day"
maxHealth = 451
health = 451
+ blood_volume = 0
threat_level = ZAYIN_LEVEL
faction = list("hostile", "neutral")
//Bad for stat gain, but the damage is negligable and there's a nice bonus at the end
@@ -40,19 +41,19 @@
harvest_phrase_third = "%ABNO glances at %PERSON. Suddenly, %VESSEL seems to be more full."
observation_prompt = "The shadow of an old man seems to be contemplating about something. \
- \"Don\'t you ever wish you could go back to those better times? To be able to enjoy life to the fullest? \
+ \"Don't you ever wish you could go back to those better times? To be able to enjoy life to the fullest? \
To relive the best moments of your life again? \
To remember her face? To remember that young man's name? \
- Perhaps it's foolish of me to ask for this. I want to hear your opinion, young\'in. \
+ Perhaps it's foolish of me to ask for this. I want to hear your opinion, young'in. \
Would it be worth chasing after those old, familiar memories?\""
- observation_choices = list("It's not wrong.", "Perhaps it's better to move on.")
- correct_choices = list("Perhaps it's better to move on.")
- observation_success_message = "\"I suppose you're right after all.\" \
- \"If I can't even remember their names and faces, what worth even are those memories?\" \
- \"Go on. Leave before you forget too.\""
- observation_fail_message = "\"Indeed. There's no harm, right?\" \
- \"...Yet why can't I remember her face?\" \
- As you're about to leave, you hear the old man croak out something. \"Who are you again?\""
+ observation_choices = list(
+ "Perhaps it's better to move on." = list(TRUE, "\"I suppose you're right after all.\" \
+ \"If I can't even remember their names and faces, what worth even are those memories?\" \
+ \"Go on. Leave before you forget too.\""),
+ "It's not wrong." = list(FALSE, "\"Indeed. There's no harm, right?\" \
+ \"...Yet why can't I remember her face?\" \
+ As you're about to leave, you hear the old man croak out something. \"Who are you again?\""),
+ )
var/performed_work
var/datum/looping_sound/quietday_ambience/soundloop
@@ -228,7 +229,7 @@
return FALSE
/mob/living/simple_animal/hostile/abnormality/quiet_day/BreachEffect(mob/living/carbon/human/user, breach_type)
- if(breach_type == BREACH_PINK)
+ if(breach_type == BREACH_PINK || breach_type == BREACH_MINING)
AbnoRadio()
Ramble()
can_breach = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/sleeping_beauty.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/sleeping_beauty.dm
index e4ae27ea2019..7e33eb19cfc5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/sleeping_beauty.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/sleeping_beauty.dm
@@ -39,11 +39,10 @@
harvest_phrase_third = "%PERSON jostles %ABNO, then captures the resulting clouds with %VESSEL."
observation_prompt = "The couch looks inviting, softer and plusher than anything you've ever known. You've been working for so long, it couldn't hurt to take a break?"
- observation_choices = list("Lie down", "Get back to work")
- correct_choices = list("Get back to work")
- observation_success_message = "You shake your head. You'll have time to rest when you're dead."
- observation_fail_message = "You lay your head down into your soft and comfy pillow. You can always try again tomorrow."
-
+ observation_choices = list(
+ "Get back to work" = list(TRUE, "You shake your head. You'll have time to rest when you're dead."),
+ "Lie down" = list(FALSE, "You lay your head down into your soft and comfy pillow. You can always try again tomorrow."),
+ )
var/grab_cooldown
var/grab_cooldown_time = 20 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/sunset_traveller.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/sunset_traveller.dm
index 672a3e6531e2..b62429f661e0 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/sunset_traveller.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/sunset_traveller.dm
@@ -37,16 +37,16 @@
observation_prompt = "\"Look at those butterflies! Aren’t they just beautiful? And gander at that sunset, too! Really makes you want to go for a stroll.\" \
\"Why don’t you stop for a moment and take a breather here?\" \
Something yellow gestures warmly at you."
- observation_choices = list("Take a break", "Ignore it and leave")
- correct_choices = list("Take a break")
- observation_success_message = "\"Wasn’t it tiring coming all the way here? Really, check out those butterflies. \
- Just watching them will warm your heart.\" \
- You looked at the butterflies as the voice suggested. They indeed fill the heart with a certain warmth. \
- \"Looks like some of them want to tag along!\" \
- A kaleidoscope of butterflies started following you, even after you left that scenic spot."
- observation_fail_message = "\"You must be very busy then!\" It made the same gesture as when it first greeted you. \
- Perhaps it was waving goodbye all along. \
- \"Another time, I suppose!\""
+ observation_choices = list(
+ "Take a break" = list(TRUE, "\"Wasn’t it tiring coming all the way here? Really, check out those butterflies. \
+ Just watching them will warm your heart.\" \
+ You looked at the butterflies as the voice suggested. They indeed fill the heart with a certain warmth. \
+ \"Looks like some of them want to tag along!\" \
+ A kaleidoscope of butterflies started following you, even after you left that scenic spot."),
+ "Ignore it and leave" = list(FALSE, "\"You must be very busy then!\" It made the same gesture as when it first greeted you. \
+ Perhaps it was waving goodbye all along. \
+ \"Another time, I suppose!\""),
+ )
light_color = COLOR_ORANGE
light_range = 5
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm
index f277b68aa709..be8a7c4be4bc 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm
@@ -49,10 +49,10 @@
Is your house suffering from an outage because you don’t have the money to pay for the power bill? \
We can change that! \
It’s quite simple. Just open up the machine, step inside, and press the button to make it shut."
- observation_choices = list("Enter the machine")
- correct_choices = list("Enter the machine")
- observation_success_message = "You step inside the machine, it's just as comfortable as advertised. \
- Now everything will be just fine."
+ observation_choices = list(
+ "Enter the machine" = list(TRUE, "You step inside the machine, it's just as comfortable as advertised. \
+ Now everything will be just fine."),
+ )
var/grinding = FALSE
var/grind_duration = 5 SECONDS
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm
index c47e39ca4bd4..a83628fe5892 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm
@@ -58,11 +58,12 @@
observation_prompt = "A vending machine stands before you. \
Two delicious looking shrimp are standing at both sides of the machine. Will you buy soda?"
- observation_choices = list("Yes", "No")
- correct_choices = list("Yes", "No")
- observation_success_message = "Before you can make a choice, one of the shrimp buys you soda. \
- You drink the soda, and fall asleep... ... Somewhere in the distance, you hear seagulls."
-
+ observation_choices = list(
+ "Yes" = list(TRUE, "Before you can make a choice, one of the shrimp buys you soda. \
+ You drink the soda, and fall asleep... ... Somewhere in the distance, you hear seagulls."),
+ "No" = list(TRUE, "Before you can make a choice, one of the shrimp buys you soda. \
+ You drink the soda, and fall asleep... ... Somewhere in the distance, you hear seagulls.")
+ )
/mob/living/simple_animal/hostile/abnormality/wellcheers/HandleStructures()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index e5b0ff5f0541..59b35d8eed8e 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -141,6 +141,7 @@
if(temp_damage >= 0 && temp_damage <= force_threshold)
visible_message(span_warning("[src] looks unharmed!"))
+ DamageEffect(0, damagetype)
return FALSE
if(actuallydamage)
diff --git a/code/modules/mob/living/simple_animal/distortion/monolith.dm b/code/modules/mob/living/simple_animal/distortion/monolith.dm
index f746472ce6f3..59b2422631d1 100644
--- a/code/modules/mob/living/simple_animal/distortion/monolith.dm
+++ b/code/modules/mob/living/simple_animal/distortion/monolith.dm
@@ -133,7 +133,7 @@
var/mob/living/simple_animal/hostile/distortion/D = target
if(D.monolith_abnormality)
var/mob/living/simple_animal/hostile/abnormality/myAbno = new D.monolith_abnormality(get_turf(target))
- myAbno.BreachEffect()
+ myAbno.BreachEffect(null, BREACH_MINING)
qdel(target)
return TRUE
return FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 01da7bfb9c10..41db68af73dd 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -83,6 +83,11 @@
/// How willing a mob is to switch targets. More resistance means more aggro is required
var/target_switch_resistance
+ var/damage_effect_scale = 1
+
+ // Return to spawn point if target lost
+ var/return_to_origin = FALSE
+
/mob/living/simple_animal/hostile/Initialize()
/*Update Speed overrides set speed and sets it
to the equivilent of move_to_delay. Basically
@@ -101,6 +106,9 @@
wanted_objects = typecacheof(wanted_objects)
+ if (return_to_origin)
+ AddComponent(/datum/component/return_to_origin)
+
/mob/living/simple_animal/hostile/Destroy()
targets_from = null
return ..()
@@ -201,7 +209,6 @@
//register the attacker in our memory.
if(P.firer)
RegisterAggroValue(P.firer, P.damage, P.damage_type)
- DamageEffect(P.damage, P.damage_type)
return ..()
/mob/living/simple_animal/hostile/attack_animal(mob/living/simple_animal/M, damage)
@@ -280,42 +287,93 @@
/*-------------------\
|Damage Visual Effect|
\-------------------*/
-
-/mob/living/simple_animal/hostile/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE, actuallydamage = TRUE)
- //This used to also check actually damage but turns out melee weapons in item_attack.dm dont call actually damage.
- if(stat != DEAD && (damagetype in list(RED_DAMAGE, WHITE_DAMAGE, BLACK_DAMAGE, PALE_DAMAGE)))
- //To simplify things, if you bash a abnormality with a wrench it wont show any effect. --uhh it will though
- DamageEffect(damagetype)
- return ..()
-
-/mob/living/simple_animal/hostile/proc/DamageEffect(damtype)
- //Code stolen from attack_threshold_check() in animal_defense.dm
- var/damage_modifier
- if(islist(damage_coeff))
- damage_modifier = damage_coeff[damtype]
- else
- damage_modifier = damage_coeff.getCoeff(damtype)
-
- if(damage_modifier == 0)
- //Visual Effect for immunity.
- return new /obj/effect/temp_visual/healing/no_dam(get_turf(src))
- if(damage_modifier < 0)
- //Visual Effect for healing.
- return new /obj/effect/temp_visual/healing(get_turf(src))
-
+/mob/living/proc/DamageEffect(damage, damtype)
+ if(damage > 0)
+ switch(damtype)
+ if(RED_DAMAGE)
+ return new /obj/effect/temp_visual/damage_effect/red(get_turf(src))
+ if(WHITE_DAMAGE)
+ return new /obj/effect/temp_visual/damage_effect/white(get_turf(src))
+ if(BLACK_DAMAGE)
+ return new /obj/effect/temp_visual/damage_effect/black(get_turf(src))
+ if(PALE_DAMAGE)
+ return new /obj/effect/temp_visual/damage_effect/pale(get_turf(src))
+ if(BURN)
+ return new /obj/effect/temp_visual/damage_effect/burn(get_turf(src))
+ if(TOX)
+ return new /obj/effect/temp_visual/damage_effect/tox(get_turf(src))
+ else
+ return null
+
+/mob/living/simple_animal/hostile/DamageEffect(damage, damtype)
+ var/obj/effect/dam_effect = null
+ if(!damage)
+ dam_effect = new /obj/effect/temp_visual/healing/no_dam(get_turf(src))
+ if(damage_effect_scale != 1)
+ dam_effect.transform *= damage_effect_scale
+ return dam_effect
+ if(damage < 0)
+ dam_effect = new /obj/effect/temp_visual/healing(get_turf(src))
+ if(damage_effect_scale != 1)
+ dam_effect.transform *= damage_effect_scale
+ return dam_effect
switch(damtype)
if(RED_DAMAGE)
- return new /obj/effect/temp_visual/damage_effect/red(get_turf(src))
+ dam_effect = new /obj/effect/temp_visual/damage_effect/red(get_turf(src))
if(WHITE_DAMAGE)
- return new /obj/effect/temp_visual/damage_effect/white(get_turf(src))
+ dam_effect = new /obj/effect/temp_visual/damage_effect/white(get_turf(src))
if(BLACK_DAMAGE)
- return new /obj/effect/temp_visual/damage_effect/black(get_turf(src))
+ dam_effect = new /obj/effect/temp_visual/damage_effect/black(get_turf(src))
if(PALE_DAMAGE)
- return new /obj/effect/temp_visual/damage_effect/pale(get_turf(src))
+ dam_effect = new /obj/effect/temp_visual/damage_effect/pale(get_turf(src))
if(BURN)
- return new /obj/effect/temp_visual/damage_effect/burn(get_turf(src))
+ dam_effect = new /obj/effect/temp_visual/damage_effect/burn(get_turf(src))
if(TOX)
- return new /obj/effect/temp_visual/damage_effect/tox(get_turf(src))
+ dam_effect = new /obj/effect/temp_visual/damage_effect/tox(get_turf(src))
+ else
+ return null
+ if(damage_effect_scale != 1)
+ dam_effect.transform *= damage_effect_scale
+ if(length(projectile_blockers) > 0)
+ dam_effect.pixel_x += rand(-occupied_tiles_left_current * 32, occupied_tiles_right_current * 32)
+ dam_effect.pixel_y += rand(-occupied_tiles_down_current * 32, occupied_tiles_up_current * 32)
+ return dam_effect
+
+/mob/living/simple_animal/hostile/adjustRedLoss(amount, updating_health, forced)
+ var/was_alive = stat != DEAD
+ . = ..()
+ if(was_alive)
+ DamageEffect(., RED_DAMAGE)
+
+/mob/living/simple_animal/hostile/adjustWhiteLoss(amount, updating_health, forced, white_healable)
+ var/was_alive = stat != DEAD
+ . = ..()
+ if(was_alive)
+ DamageEffect(., WHITE_DAMAGE)
+
+/mob/living/simple_animal/hostile/adjustBlackLoss(amount, updating_health, forced, white_healable)
+ var/was_alive = stat != DEAD
+ . = ..()
+ if(was_alive)
+ DamageEffect(., BLACK_DAMAGE)
+
+/mob/living/simple_animal/hostile/adjustPaleLoss(amount, updating_health, forced)
+ var/was_alive = stat != DEAD
+ . = ..()
+ if(was_alive)
+ DamageEffect(., PALE_DAMAGE)
+
+/mob/living/simple_animal/hostile/adjustFireLoss(amount, updating_health, forced)
+ var/was_alive = stat != DEAD
+ . = ..()
+ if(was_alive)
+ DamageEffect(., BURN)
+
+/mob/living/simple_animal/hostile/adjustToxLoss(amount, updating_health, forced)
+ var/was_alive = stat != DEAD
+ . = ..()
+ if(was_alive)
+ DamageEffect(., TOX)
/*Used in LC13 abnormality calculations.
Moved here so we can use it for all hostiles.
@@ -591,6 +649,7 @@
approaching_target = FALSE
in_melee = FALSE
walk(src, 0)
+ SEND_SIGNAL(src, COMSIG_HOSTILE_LOSTTARGET)
LoseAggro()
/mob/living/simple_animal/hostile/proc/Aggro()
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/amber.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/amber.dm
index 1a2a3de686b4..302132d92216 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/amber.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/amber.dm
@@ -183,6 +183,7 @@
base_pixel_x = -16
butcher_results = list(/obj/item/food/meat/slab/worm = 3)
guaranteed_butcher_results = list(/obj/item/food/meat/slab/worm = 2)
+ silk_results = list(/obj/item/stack/sheet/silk/amber_simple = 2, /obj/item/stack/sheet/silk/amber_advanced = 1)
attack_verb_continuous = "eviscerates"
attack_verb_simple = "eviscerate"
attack_sound = 'sound/effects/ordeals/amber/dusk_attack.ogg'
@@ -192,6 +193,7 @@
should_projectile_blockers_change_orientation = TRUE
occupied_tiles_up = 1
offsets_pixel_x = list("south" = -16, "north" = -16, "west" = 0, "east" = -32)
+ offsets_pixel_y = list("south" = 9, "north" = -20, "west" = 0, "east" = 0)
/// This cooldown responds for both the burrowing and spawning in the dawns
var/burrow_cooldown
@@ -201,6 +203,8 @@
var/burrowing = FALSE
/// List of currently spawned dawns, so we don't create too many
var/list/spawned_mobs = list()
+ //If they can burrow or not.
+ var/can_burrow = TRUE
var/datum/looping_sound/amberdusk/soundloop
@@ -226,10 +230,25 @@
/mob/living/simple_animal/hostile/ordeal/amber_dusk/Initialize()
. = ..()
+ setDir(WEST)
soundloop = new(list(src), TRUE)
if(LAZYLEN(butcher_results))
addtimer(CALLBACK(src, PROC_REF(BurrowOut), get_turf(src)))
+/mob/living/simple_animal/hostile/ordeal/amber_dusk/OnDirChange(atom/thing, dir, newdir)
+ . = ..()
+ if(stat == DEAD)
+ return
+ var/static/matrix/add_vertical_transform = matrix(0.8, 1.4, MATRIX_SCALE)
+ var/static/south_north = SOUTH | NORTH
+ var/static/east_west = EAST | WEST
+ var/combined = dir | newdir
+ if((combined & south_north) && (combined & east_west))
+ if(newdir & south_north)
+ transform = add_vertical_transform
+ else
+ transform = matrix()
+
/mob/living/simple_animal/hostile/ordeal/amber_dusk/Destroy()
QDEL_NULL(soundloop)
for(var/mob/living/simple_animal/hostile/ordeal/amber_bug/spawned/bug as anything in spawned_mobs)
@@ -241,14 +260,17 @@
. = ..()
if(!.) // Dead
return FALSE
- if(!burrowing && world.time > burrow_cooldown)
- AttemptBirth()
- BurrowIn()
+ if(can_burrow)
+ if(!burrowing && world.time > burrow_cooldown)
+ AttemptBirth()
+ BurrowIn()
/mob/living/simple_animal/hostile/ordeal/amber_dusk/death(gibbed)
if(LAZYLEN(butcher_results))
alpha = 255
offsets_pixel_x = list("south" = -16, "north" = -16, "west" = -16, "east" = -16)
+ offsets_pixel_y = list("south" = 0, "north" = 0, "west" = 0, "east" = 0)
+ transform = matrix()
soundloop.stop()
for(var/mob/living/simple_animal/hostile/ordeal/amber_bug/bug in spawned_mobs)
bug.can_burrow_solo = TRUE
@@ -257,6 +279,8 @@
/mob/living/simple_animal/hostile/ordeal/amber_dusk/revive(full_heal, admin_revive)
. = ..()
offsets_pixel_x = list("south" = -16, "north" = -16, "west" = 0, "east" = -32)
+ offsets_pixel_y = list("south" = 9, "north" = -20, "west" = 0, "east" = 0)
+ density = TRUE
/mob/living/simple_animal/hostile/ordeal/amber_dusk/proc/AttemptBirth()
var/max_spawn = clamp(length(GLOB.clients) * 2, 4, 8)
@@ -368,6 +392,7 @@
occupied_tiles_up = 2
offsets_pixel_x = list("south" = -96, "north" = -96, "west" = -96, "east" = -96)
offsets_pixel_y = list("south" = -16, "north" = -16, "west" = -16, "east" = -16)
+ damage_effect_scale = 1.25
blood_volume = BLOOD_VOLUME_NORMAL
death_sound = 'sound/effects/ordeals/amber/midnight_dead.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm
index cc4bd0f98d4e..b607ebfef186 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm
@@ -7,159 +7,80 @@
icon_living = "sinrock"
icon_dead = "sin_dead"
faction = list("brown_ordeal")
- maxHealth = 200
- health = 200
+ maxHealth = 80
+ health = 80
melee_damage_type = BLACK_DAMAGE
- melee_damage_lower = 14
- melee_damage_upper = 24
+ melee_damage_lower = 9
+ melee_damage_upper = 15
attack_verb_continuous = "bashes"
attack_verb_simple = "bashes"
attack_sound = 'sound/effects/ordeals/brown/rock_attack.ogg'
death_sound = 'sound/effects/ordeals/brown/rock_dead.ogg'
damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 2, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/slab/human/mutant/golem = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human/mutant/golem = 1)
+ butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
ranged = TRUE
- var/list/movement_path = list()
- var/list/been_hit = list()
- var/charging = FALSE
- var/charging_cooldown
- var/charging_cooldown_time = 8 SECONDS //apparantly charge is already used in /hostile.dm
- var/charge_damage = 20
- /// Delay between each subsequent move when charging
- var/charge_speed = 1
- /// How many paths do we create between several landmarks?
- var/charge_nodes = 3
- /// Maximum AStar pathfinding distances from one point to another
- var/charge_max_distance = 40
+ move_to_delay = 8
var/dash_cooldown_time = 15 SECONDS //will dash at people if they get out of range but not too often
var/dash_cooldown
+ var/can_act = TRUE
+ var/jump_range = 7
+ var/jump_aoe = 1
+ var/jump_damage = 20
-/mob/living/simple_animal/hostile/ordeal/sin_sloth/Life()
+/mob/living/simple_animal/hostile/ordeal/sin_sloth/AttackingTarget(atom/attacked_target)
+ if(!can_act)
+ return
. = ..()
- if(.)
- if((charging_cooldown <= world.time) && prob(15))
- ChargeStart()
/mob/living/simple_animal/hostile/ordeal/sin_sloth/OpenFire()
- if(!target || charging)
+ if(!target)
return
Dash(target)
/mob/living/simple_animal/hostile/ordeal/sin_sloth/Move()
- return FALSE
+ if(!can_act)
+ return FALSE
+ . = ..()
+ if(.)
+ var/para = TRUE
+ if(dir in list(WEST, NORTHWEST, SOUTHWEST))
+ para = FALSE
+ SpinAnimation(6, 1, para)
/mob/living/simple_animal/hostile/ordeal/sin_sloth/proc/Dash(mob/living/target)
if(!istype(target))
return
var/dist = get_dist(target, src)
- if(dist > 2 && dash_cooldown < world.time)
+ if(dist > 2 && dash_cooldown < world.time && dist < jump_range)
+ can_act = FALSE
var/list/dash_line = getline(src, target)
+ animate(src, pixel_y = (base_pixel_y + 30), time = 2)
+ playsound(src, 'sound/effects/ordeals/brown/rock_kill.ogg', 50, FALSE, 4)
for(var/turf/line_turf in dash_line) //checks if there's a valid path between the turf and the target
if(line_turf.is_blocked_turf(exclude_mobs = TRUE))
break
forceMove(line_turf)
- SLEEP_CHECK_DEATH(0.8)
- playsound(src, 'sound/effects/ordeals/brown/rock_runover.ogg', 50, FALSE, 4)
- dash_cooldown = world.time + dash_cooldown_time
-
-/mob/living/simple_animal/hostile/ordeal/sin_sloth/proc/ChargeStart(target)
- if(charging || charging_cooldown > world.time)
- return
- charging = TRUE
- movement_path = list()
- var/list/initial_turfs = GLOB.xeno_spawn.Copy() + GLOB.department_centers.Copy()
- var/list/potential_turfs = list()
- for(var/turf/open/T in initial_turfs)
- if(get_dist(src, T) > 3)
- potential_turfs += T
- for(var/mob/living/L in livinginrange(32, src))
- if(prob(50))
- continue
- if((L.status_flags & GODMODE) || faction_check_mob(L))
- continue
- if(L.stat == DEAD)
- continue
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if(H.is_working)
- continue
- potential_turfs += get_turf(L)
- var/turf/picking_from = get_turf(src)
- var/turf/path_start = get_turf(src)
- if(target)
- var/turf/open/target_turf = get_turf(target)
- if(istype(target_turf))
- picking_from = target_turf
- potential_turfs |= target_turf
- face_atom(target)
- for(var/i = 1 to charge_nodes)
- if(!LAZYLEN(potential_turfs))
- break
- var/turf/T = get_closest_atom(/turf/open, potential_turfs, picking_from)
- if(!T)
- break
- var/list/our_path = list()
- for(var/o = 1 to 3) // Grand total of 3 retries
- our_path = get_path_to(path_start, T, TYPE_PROC_REF(/turf, Distance_cardinal), charge_max_distance)
- if(islist(our_path) && LAZYLEN(our_path))
- break
- potential_turfs -= T // Couldn't find path to it, don't try again
- if(!LAZYLEN(potential_turfs))
- break
- T = get_closest_atom(/turf/open, potential_turfs, picking_from)
- if(!islist(our_path) || !LAZYLEN(our_path))
- continue
- movement_path += our_path
- picking_from = T
- path_start = T
- potential_turfs -= T
- if(!LAZYLEN(movement_path))
- return FALSE
- playsound(src, 'sound/effects/ordeals/brown/rock_runover.ogg', 50, TRUE, 7)
- for(var/turf/T in movement_path) // Warning before charging
- new /obj/effect/temp_visual/mustardgas(T)
- SLEEP_CHECK_DEATH(18)
- been_hit = list()
- SpinAnimation(3, 10)
- for(var/turf/T in movement_path)
- if(QDELETED(T))
- break
- if(!Adjacent(T))
- break
- ChargeAt(T)
- SLEEP_CHECK_DEATH(charge_speed)
- charging = FALSE
- icon_state = icon_living
- charging_cooldown = world.time + charging_cooldown_time
-
-/mob/living/simple_animal/hostile/ordeal/sin_sloth/proc/ChargeAt(turf/T)
- face_atom(T)
- for(var/obj/structure/window/W in T.contents)
- W.obj_destruction("teeth")
- for(var/obj/machinery/door/D in T.contents)
- if(D.density)
- addtimer(CALLBACK (D, TYPE_PROC_REF(/obj/machinery/door, open)))
- forceMove(T)
- if(prob(33))
- playsound(T, 'sound/effects/ordeals/brown/rock_attack.ogg', 10, TRUE, 3)
- for(var/turf/TF in view(1, T))
- new /obj/effect/temp_visual/mustardgas(TF)
- for(var/mob/living/L in TF)
- if(!faction_check_mob(L))
- if(L in been_hit)
+ SLEEP_CHECK_DEATH(0.4)
+ addtimer(CALLBACK(src, PROC_REF(AnimateBack)), 8)
+ SLEEP_CHECK_DEATH(10)
+ for(var/turf/T in view(1, src))
+ new /obj/effect/temp_visual/mustardgas(T)
+ for(var/mob/living/L in T)
+ if(faction_check_mob(L))
continue
- L.visible_message(span_warning("[src] rams [L]!"), span_boldwarning("[src] rams into you!"))
- L.apply_damage(charge_damage, BLACK_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
- new /obj/effect/temp_visual/cleave(get_turf(L))
- playsound(L, 'sound/effects/ordeals/brown/rock_kill.ogg', 50, TRUE)
+ L.deal_damage(jump_damage, BLACK_DAMAGE)
if(L.health < 0)
L.gib()
- if(!QDELETED(L))
- been_hit += L
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- H.Knockdown(4)
+ for(var/obj/vehicle/sealed/mecha/V in T)
+ V.take_damage(jump_damage, BLACK_DAMAGE)
+ can_act = TRUE
+ dash_cooldown = world.time + dash_cooldown_time
+
+
+/mob/living/simple_animal/hostile/ordeal/sin_sloth/proc/AnimateBack()
+ animate(src, pixel_y = base_pixel_y, time = 2)
+ return TRUE
/mob/living/simple_animal/hostile/ordeal/sin_gluttony
name = "Peccatulum Gulae"
@@ -169,8 +90,8 @@
icon_living = "sinflower"
icon_dead = "sin_dead"
faction = list("brown_ordeal")
- maxHealth = 150
- health = 150
+ maxHealth = 80
+ health = 80
melee_damage_type = RED_DAMAGE
rapid_melee = 3
melee_damage_lower = 4
@@ -180,8 +101,8 @@
attack_sound = 'sound/effects/ordeals/brown/flower_attack.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 2, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/slab/human/mutant/plant = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human/mutant/plant = 1)
+ butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
stat_attack = DEAD
/mob/living/simple_animal/hostile/ordeal/sin_gluttony/AttackingTarget(atom/attacked_target)
@@ -226,42 +147,67 @@
icon_living = "sinflea"
icon_dead = "flea_dead"
faction = list("brown_ordeal")
- maxHealth = 200
- health = 200
+ maxHealth = 80
+ health = 80
melee_damage_type = WHITE_DAMAGE
- rapid_melee = 2
- melee_damage_lower = 14
- melee_damage_upper = 14
+ melee_damage_lower = 35
+ melee_damage_upper = 45
attack_verb_continuous = "bashes"
attack_verb_simple = "bashes"
attack_sound = 'sound/effects/ordeals/brown/flea_attack.ogg'
death_sound = 'sound/effects/ordeals/brown/flea_dead.ogg'
damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 1, BLACK_DAMAGE = 2, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/slab/human/mutant/slime = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human/mutant/slime = 1)
+ butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
is_flying_animal = TRUE
ranged = TRUE
+ ranged_cooldown_time = 5 SECONDS // Fires a laser dealing 10 white damage
minimum_distance = 2 // Don't move all the way to melee
projectiletype = /obj/projectile/beam/water_jet
projectilesound = 'sound/effects/ordeals/brown/flea_attack.ogg'
+ var/can_act = TRUE
-/mob/living/simple_animal/hostile/ordeal/sin_gloom/MeleeAction()
- if(health <= maxHealth*0.5 && stat != DEAD)
- walk_to(src, 0)
- animate(src, transform = matrix()*1.8, time = 15)
- addtimer(CALLBACK(src, PROC_REF(DeathExplosion)), 15)
- ..()
+/mob/living/simple_animal/hostile/ordeal/sin_gloom/Move()
+ if(!can_act)
+ return FALSE
+ return ..()
-/mob/living/simple_animal/hostile/ordeal/sin_gloom/proc/DeathExplosion()
- if(QDELETED(src))
- return
+/mob/living/simple_animal/hostile/ordeal/sin_gloom/OpenFire()
+ if(!can_act)
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/ordeal/sin_gloom/AttackingTarget(atom/attacked_target)
+ if(!can_act)
+ return FALSE
+ . = AreaAttack()
+
+/mob/living/simple_animal/hostile/ordeal/sin_gloom/proc/AreaAttack()
+ set waitfor = FALSE
+ changeNext_move(SSnpcpool.wait / rapid_melee) //Prevents attack spam
+ animate(src, transform = matrix()*1.4, time = 16)
+ addtimer(CALLBACK(src, PROC_REF(AnimateBack)), 16)
+ can_act = FALSE
+ SLEEP_CHECK_DEATH(16)
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(src), src)
+ animate(D, alpha = 0, transform = matrix()*1.6, time = 5)
visible_message(span_danger("[src] suddenly explodes!"))
- playsound(loc, 'sound/effects/ordeals/brown/tentacle_explode.ogg', 60, TRUE)
- new /obj/effect/temp_visual/explosion(get_turf(src))
- for(var/mob/living/L in viewers(2, src))
- L.apply_damage(40, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ playsound(loc, 'sound/abnormalities/ichthys/hardslap.ogg', 60, TRUE)
+ var/damage_dealt = rand(melee_damage_lower, melee_damage_upper)
+ for(var/turf/T in view(2, src))
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/L in T)
+ if(faction_check_mob(L))
+ continue
+ L.deal_damage(damage_dealt, melee_damage_type)
+ for(var/obj/vehicle/sealed/mecha/V in T)
+ V.take_damage(damage_dealt, melee_damage_type)
+ SLEEP_CHECK_DEATH(8)
+ can_act = TRUE
+
+/mob/living/simple_animal/hostile/ordeal/sin_gloom/proc/AnimateBack()
animate(src, transform = matrix(), time = 0)
- death()
+ return TRUE
/mob/living/simple_animal/hostile/ordeal/sin_pride
name = "Peccatulum Superbiae"
@@ -273,8 +219,8 @@
icon_living = "sinwheel"
icon_dead = "sin_dead"
faction = list("brown_ordeal")
- maxHealth = 100
- health = 100
+ maxHealth = 80
+ health = 80
melee_damage_type = RED_DAMAGE
rapid_melee = 2
melee_damage_lower = 7
@@ -284,8 +230,8 @@
attack_sound = 'sound/weapons/ego/sword1.ogg'
death_sound = 'sound/effects/ordeals/brown/dead_generic.ogg'
damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 2, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/rawcrab = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/rawcrab = 1)
+ butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
ranged = TRUE
var/charging = FALSE
var/dash_num = 25
@@ -387,7 +333,7 @@
/mob/living/simple_animal/hostile/ordeal/sin_lust //Tank that is resistant to bullets
name = "Peccatulum Luxuriae"
- desc = "It looks like a creature made of lumps of flesh. It looks eagar to devour human flesh."
+ desc = "A creature made of lumps of flesh. It looks eagar to devour human flesh."
icon = 'ModularTegustation/Teguicons/64x32.dmi'
icon_state = "sincromer"
icon_living = "sincromer"
@@ -407,8 +353,8 @@
attack_sound = 'sound/effects/ordeals/brown/cromer_slam.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 2, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/slab/human/mutant/lizard = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human/mutant/lizard = 1)
+ butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
/mob/living/simple_animal/hostile/ordeal/sin_lust/Initialize()
. = ..()
@@ -439,8 +385,8 @@
pixel_x = -8
base_pixel_x = -8
faction = list("brown_ordeal")
- maxHealth = 150
- health = 150
+ maxHealth = 80
+ health = 80
melee_damage_type = RED_DAMAGE
rapid_melee = 2
melee_damage_lower = 2
@@ -450,8 +396,8 @@
attack_sound = 'sound/effects/ordeals/brown/tentacle_attack.ogg'
death_sound = 'sound/effects/ordeals/brown/dead_generic.ogg'
damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 2, BLACK_DAMAGE = 1, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/carpmeat/icantbeliveitsnotcarp = 1)
- guaranteed_butcher_results = list(/obj/item/food/carpmeat/icantbeliveitsnotcarp = 1) //should make its own kind of meat when I get around to it
+ butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/sinnew = 1)
/mob/living/simple_animal/hostile/ordeal/sin_wrath/AttackingTarget(atom/attacked_target)
. = ..()
@@ -482,7 +428,7 @@
/atom/movable/screen/alert/status_effect/fuming
name = "Fuming Wrath"
- desc = "You feel so angry that your head might explode! You take additional BURN damage whenever you are hurt, which is reduced by WHITE armor."
+ desc = "You feel so angry that your head might explode! You take additional BURN damage whenever you are hurt, which is reduced by RED armor."
icon = 'ModularTegustation/Teguicons/status_sprites.dmi'
icon_state = "sin_wrath"
@@ -510,6 +456,6 @@
if(damagetype == BURN)
return
var/damage_amt = ((damage/100) * (stacks * 10)) //10-200% of damage taken is dealt as additional burn
- H.apply_damage(damage_amt, BURN, blocked = H.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE) //Damage reduced by white armor
+ H.apply_damage(damage_amt, BURN, blocked = H.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) //Damage reduced by red armor
#undef STATUS_EFFECT_FUMING
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dawn.dm
index 5a229732f9c1..c0b1e7f70caa 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dawn.dm
@@ -1,7 +1,7 @@
// Gold Dawn - Commander that heals its minions
/mob/living/simple_animal/hostile/ordeal/fallen_amurdad_corrosion
name = "Fallen Nepenthes"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "A level 1 agent of Lobotomy Corporation that has somehow been corrupted by an abnormality."
icon = 'ModularTegustation/Teguicons/48x48.dmi'
icon_state = "amurdad_corrosion"
icon_living = "amurdad_corrosion"
@@ -19,8 +19,7 @@
attack_sound = 'sound/abnormalities/ebonyqueen/attack.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 1, BLACK_DAMAGE = 0.8, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/slab/human/mutant/plant = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human/mutant/plant = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 1)
speed = 1 //slow as balls
move_to_delay = 20
ranged = TRUE
@@ -38,7 +37,7 @@
/mob/living/simple_animal/hostile/ordeal/beanstalk_corrosion
name = "Beanstalk Searching for Jack"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "A Lobotomy Corporation clerk that has been corrupted by an abnormality."
icon = 'ModularTegustation/Teguicons/32x48.dmi'
icon_state = "beanstalk"
icon_living = "beanstalk"
@@ -55,5 +54,4 @@
attack_verb_continuous = "stabs"
attack_verb_simple = "stab"
damage_coeff = list(RED_DAMAGE = 0.9, WHITE_DAMAGE = 1.2, BLACK_DAMAGE = 0.7, PALE_DAMAGE = 2)
- butcher_results = list(/obj/item/food/meat/slab/human/mutant/plant = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human/mutant/plant = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm
index 7f4147e430d6..62e1081e88fa 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm
@@ -1,7 +1,7 @@
// Gold Dusk - Commander that buffs its minion's attacks and wandering white damage
/mob/living/simple_animal/hostile/ordeal/centipede_corrosion
name = "High-Voltage Centipede"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "An agent of the information team, corrupted by an abnormality. But how?"
icon = 'ModularTegustation/Teguicons/64x48.dmi'
pixel_x = -16
base_pixel_x = -16
@@ -19,8 +19,7 @@
attack_sound = 'sound/abnormalities/thunderbird/tbird_peck.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 0.8, WHITE_DAMAGE = 1, BLACK_DAMAGE = 0.5, PALE_DAMAGE = 0.7)
- butcher_results = list(/obj/item/food/meat/slab/robot = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 2)
move_to_delay = 3
var/pulse_cooldown
var/pulse_cooldown_time = 4 SECONDS
@@ -148,7 +147,7 @@
/mob/living/simple_animal/hostile/ordeal/thunderbird_corrosion
name = "Thunder Warrior"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "An agent of the disciplinary team, corrupted by an abnormality. But how?"
icon = 'ModularTegustation/Teguicons/32x48.dmi'
icon_state = "thunder_warrior"
icon_living = "thunder_warrior"
@@ -164,8 +163,7 @@
attack_sound = 'sound/abnormalities/thunderbird/tbird_zombieattack.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 0.8, WHITE_DAMAGE = 0.5, BLACK_DAMAGE = 1, PALE_DAMAGE = 0.7)
- butcher_results = list(/obj/item/food/meat/slab/chicken = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 2)
move_to_delay = 3
ranged = TRUE
projectiletype = /obj/projectile/thunder_tomahawk
@@ -228,7 +226,7 @@
/mob/living/simple_animal/hostile/ordeal/KHz_corrosion
name = "680 Ham Actor"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "An agent of the control team, corrupted by an abnormality. But how?"
icon = 'ModularTegustation/Teguicons/32x32.dmi'
icon_state = "680_ham_actor"
icon_living = "680_ham_actor"
@@ -244,8 +242,7 @@
attack_sound = 'sound/abnormalities/thunderbird/tbird_peck.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 0.8, WHITE_DAMAGE = 0.5, BLACK_DAMAGE = 1, PALE_DAMAGE = 1)
- butcher_results = list(/obj/item/food/meat/slab/robot = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 2)
move_to_delay = 4
speak = list("Kilo India Lima Lima", "Delta India Echo", "Golf Echo Tango Oscar Uniform Tango", "Oscar Mike", "Charlie Mike")
speak_emote = list("emits", "groans")
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm
index 622cb4b541fd..b24292212483 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm
@@ -11,8 +11,8 @@
health = 4000
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 0.2, WHITE_DAMAGE = 0.2, BLACK_DAMAGE = 0.2, PALE_DAMAGE = 0.2)
- butcher_results = list(/obj/item/food/meat/slab/chicken = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/chicken = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 1)
+ guaranteed_butcher_results = list(/obj/item/food/meat/slab/corroded = 1)
/// Range of the damage
var/symphony_range = 20
/// Amount of white damage every tick
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm
index 85099a61d838..0d3d86ea34d5 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm
@@ -1,7 +1,7 @@
// Gold Noon - Boss with minions
/mob/living/simple_animal/hostile/ordeal/white_lake_corrosion
name = "Lady of the Lake"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "An agent captain of the central command team, corrupted by an abnormality. But how?"
icon = 'ModularTegustation/Teguicons/32x64.dmi'
icon_state = "lake_corrosion"
icon_living = "lake_corrosion"
@@ -18,8 +18,7 @@
attack_sound = 'sound/weapons/fixer/generic/blade3.ogg'
death_sound = 'sound/effects/limbus_death.ogg'
damage_coeff = list(RED_DAMAGE = 0.8, WHITE_DAMAGE = 0.5, BLACK_DAMAGE = 1.5, PALE_DAMAGE = 1)
- butcher_results = list(/obj/item/food/meat/slab/chicken = 1, /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/chicken = 1)
+ butcher_results = list(/obj/item/food/meat/slab/corroded = 3)
speed = 3
move_to_delay = 3
@@ -249,7 +248,7 @@
/mob/living/simple_animal/hostile/ordeal/silentgirl_corrosion
name = "Silent Handmaiden"
- desc = "Improper use of E.G.O. can have serious consequences."
+ desc = "A level 2 agent of Lobotomy Corporation that has somehow been corrupted by an abnormality."
icon = 'ModularTegustation/Teguicons/32x32.dmi'
icon_state = "silent_girl_corrosion"
icon_living = "silent_girl_corrosion"
@@ -265,8 +264,7 @@
attack_verb_continuous = "stabs"
attack_verb_simple = "stab"
damage_coeff = list(RED_DAMAGE = 1, WHITE_DAMAGE = 0.6, BLACK_DAMAGE = 1.5, PALE_DAMAGE = 2)
- butcher_results = list( /obj/item/food/meat/slab/human = 1)
- guaranteed_butcher_results = list(/obj/item/food/meat/slab/human = 1)
+ butcher_results = list( /obj/item/food/meat/slab/corroded = 1)
var/vengeful = FALSE
var/current_target = null
var/finishing = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm
index 902563287382..07756fd8c981 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm
@@ -39,6 +39,7 @@
/// Can't move/attack when it's TRUE
var/reloading = FALSE
var/firing_time = 0
+ var/firing_cooldown = 1.2
/// When at 12 - it will start "reloading"
var/fire_count = 0
@@ -75,7 +76,7 @@
/mob/living/simple_animal/hostile/ordeal/green_bot_big/AttackingTarget(atom/attacked_target)
if(reloading)
return FALSE
- if(world.time < firing_time + 1.2 SECONDS)
+ if(world.time < firing_time + firing_cooldown SECONDS)
return FALSE
. = ..()
if(.)
@@ -275,6 +276,7 @@
guaranteed_butcher_results = list(/obj/item/food/meat/slab/robot = 16)
death_sound = 'sound/effects/ordeals/green/midnight_dead.ogg'
offsets_pixel_x = list("south" = -96, "north" = -96, "west" = -96, "east" = -96)
+ damage_effect_scale = 1.25
var/laser_cooldown
var/laser_cooldown_time = 20 SECONDS
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/shrimps.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/shrimps.dm
index a1ecc6df5839..3d5afe8e20a2 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/shrimps.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/shrimps.dm
@@ -29,9 +29,8 @@
/mob/living/simple_animal/hostile/shrimp_rifleman/Initialize()
. = ..()
- if(SSmaptype.maptype == "fixers" || SSmaptype.maptype == "city")
+ if(SSmaptype.maptype in SSmaptype.citymaps)
del_on_death = FALSE
-
//extra buff shrimp i guess
/mob/living/simple_animal/hostile/senior_shrimp
name = "wellcheers corp senior officer"
@@ -60,7 +59,7 @@
/mob/living/simple_animal/hostile/senior_shrimp/Initialize()
. = ..()
- if(SSmaptype.maptype == "fixers" || SSmaptype.maptype == "city")
+ if(SSmaptype.maptype in SSmaptype.citymaps)
del_on_death = FALSE
/mob/living/simple_animal/hostile/senior_shrimp/ComponentInitialize()
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/steel.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/steel.dm
index d09ec7bad2dd..ff422e64626f 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/steel.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/steel.dm
@@ -24,7 +24,7 @@
possible_a_intents = list(INTENT_HELP, INTENT_HARM)
//similar to a human
damage_coeff = list(RED_DAMAGE = 0.8, WHITE_DAMAGE = 1.2, BLACK_DAMAGE = 1, PALE_DAMAGE = 1)
- butcher_results = list(/obj/item/food/meat/slab/human = 2, /obj/item/food/meat/slab/human/mutant/moth = 1)
+ butcher_results = list(/obj/item/food/meat/slab/buggy = 2)
silk_results = list(/obj/item/stack/sheet/silk/steel_simple = 1)
/mob/living/simple_animal/hostile/ordeal/steel_dawn/Initialize()
@@ -66,7 +66,7 @@
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
death_sound = 'sound/voice/mook_death.ogg'
- butcher_results = list(/obj/item/food/meat/slab/human = 1, /obj/item/food/meat/slab/human/mutant/moth = 2)
+ butcher_results = list(/obj/item/food/meat/slab/buggy = 2)
silk_results = list(/obj/item/stack/sheet/silk/steel_simple = 2, /obj/item/stack/sheet/silk/steel_advanced = 1)
/mob/living/simple_animal/hostile/ordeal/steel_dawn/steel_noon/MeleeAction()
@@ -224,7 +224,7 @@
footstep_type = FOOTSTEP_MOB_SHOE
possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_HARM)
death_sound = 'sound/voice/hiss5.ogg'
- butcher_results = list(/obj/item/food/meat/slab/human = 2, /obj/item/food/meat/slab/human/mutant/moth = 1)
+ butcher_results = list(/obj/item/food/meat/slab/buggy = 3)
silk_results = list(/obj/item/stack/sheet/silk/steel_simple = 4, /obj/item/stack/sheet/silk/steel_advanced = 2, /obj/item/stack/sheet/silk/steel_elegant = 1)
//Last command issued
var/last_command = 0
diff --git a/code/modules/mob/living/simple_animal/projectile_blocker.dm b/code/modules/mob/living/simple_animal/projectile_blocker.dm
index 631618fb0232..7e9c7645270b 100644
--- a/code/modules/mob/living/simple_animal/projectile_blocker.dm
+++ b/code/modules/mob/living/simple_animal/projectile_blocker.dm
@@ -47,7 +47,7 @@
return TRUE
if(!isturf(parent.loc))
return TRUE
- if(parent.CanPassThroughBlocker(mover, target))
+ if(parent.CanPassThroughBlocker(mover, target, get_turf(src)))
return TRUE
return parent.CanPass(mover, target)
@@ -126,10 +126,12 @@
moveToNullspace()
///For letting some mobs walk through the blockers
-/mob/living/simple_animal/proc/CanPassThroughBlocker(atom/movable/mover, turf/target)
+/mob/living/simple_animal/proc/CanPassThroughBlocker(atom/movable/mover, turf/start, turf/destination)
return FALSE
-/mob/living/simple_animal/hostile/CanPassThroughBlocker(atom/movable/mover, turf/target)
+/mob/living/simple_animal/hostile/CanPassThroughBlocker(atom/movable/mover, turf/start, turf/destination)
if(isliving(mover) && faction_check_mob(mover))
return TRUE
+ if(isliving(mover) && get_dist_manhattan(get_turf(src), destination) > get_dist_manhattan(get_turf(src), start))
+ return TRUE
return FALSE
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 8bd19ccffec1..63adfc821ccb 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -191,6 +191,9 @@
var/list/offsets_pixel_y = list("south" = 0, "north" = 0, "west" = 0, "east" = 0)
var/should_projectile_blockers_change_orientation = FALSE
+ //If they should get they city faction in City gamemodes
+ var/city_faction = TRUE
+
/mob/living/simple_animal/Initialize()
. = ..()
GLOB.simple_animals[AIStatus] += src
@@ -237,7 +240,8 @@
AddSpell(bloodspell)
//LC13 Check. If it's the citymap, they all gain a faction
if(SSmaptype.maptype in SSmaptype.citymaps)
- faction += "city"
+ if(city_faction)
+ faction += "city"
if(occupied_tiles_down > 0 || occupied_tiles_up > 0 || occupied_tiles_left > 0 || occupied_tiles_right > 0)
occupied_tiles_left_current = occupied_tiles_left
occupied_tiles_right_current = occupied_tiles_right
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index e1b8dae8c977..4cc7a6e03ce5 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -139,3 +139,7 @@
/datum/movespeed_modifier/qliphothoverload
flags = IS_ACTUALLY_MULTIPLICATIVE
multiplicative_slowdown = 2
+
+/datum/movespeed_modifier/bloodhold
+ flags = IS_ACTUALLY_MULTIPLICATIVE
+ multiplicative_slowdown = 4
diff --git a/code/modules/ordeals/_ordeal.dm b/code/modules/ordeals/_ordeal.dm
index 5fe2df2088e0..ccece1bacf5c 100644
--- a/code/modules/ordeals/_ordeal.dm
+++ b/code/modules/ordeals/_ordeal.dm
@@ -39,7 +39,7 @@
/datum/ordeal/proc/Run()
start_time = ROUNDTIME
SSlobotomy_corp.current_ordeals += src
- priority_announce(announce_text, name, sound='sound/effects/meltdownAlert.ogg')
+ priority_announce(announce_text, name, sound='sound/vox_fem/..ogg') // We want this to be silent, so play a silent sound since null uses defaults
/// If dawn started - clear suppression options
if(level == 1 && !istype(SSlobotomy_corp.core_suppression))
SSlobotomy_corp.ResetPotentialSuppressions()
@@ -54,7 +54,7 @@
// Ends the event
/datum/ordeal/proc/End()
var/total_reward = max(SSlobotomy_corp.box_goal, 3000) * reward_percent
- priority_announce("The Ordeal has ended. Facility has been rewarded with [reward_percent*100]% PE.", name, sound=null)
+ priority_announce("The Ordeal has ended. Facility has been rewarded with [reward_percent*100]% PE.", name, sound='sound/vox_fem/..ogg')
SSlobotomy_corp.AdjustAvailableBoxes(total_reward)
SSlobotomy_corp.current_ordeals -= src
SSlobotomy_corp.ordeal_stats += 5
diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm
index f0dfaa133468..9efa54ee8f40 100644
--- a/code/modules/paperwork/paper_premade.dm
+++ b/code/modules/paperwork/paper_premade.dm
@@ -125,6 +125,24 @@
\
Good Luck... "
+/obj/item/paper/fluff/fixer_skills
+ name = "Fixer Skills Guide"
+ info = "
Well, This will be a short one, but it should be enough to teach new Fixers on how to learn new skills in this line of work.
\
+ \
+ In total, there are 4 levels of skills you can learn. And depending on your grade you will be able to learn some skills, or become unable to learn others. \
+ \
+ Grade 9 Fixers will be able to learn level 1 Skills, Which are your main abilities for surviving in the backstreets ranging from healing and movement. You are also able to learn 5 of them at this level. \
+ \
+ Grade 8 Fixers are also able to learn level 1 Skills, but they are only able to learn 3 level 1 Skills. However, if they already knew 5 level 1 skills they will keep those skills. \
+ \
+ Grade 7 and 6 Fixers will be able to learn level 2 Skills, Which are your main utility, making gathering and looting easier. At this point and all higher grades, you will also be unable to learn skills of a lower level. So be cautious of over leveling. \
+ \
+ Grade 5 Fixers will be able to learn level 3 Skill, Which are your passives, you are able too toggle them on and off to gain benefits and downsides while they are active. You are only able to learn one of this skill. \
+ \
+ Finaly, Grade 4 Fixers will be able to learn level 4 Skills, Which are your 'Ultimate' abilities. They hold powerful effects, but come at the cost off having very long cooldowns. You are only able to learn one of this skill. \
+ \
+ Written by the Hana Association"
+
/obj/item/paper/fluff/sop
name = "paper- 'Standard Operating Procedure'"
info = "Alert Levels: \nBlue- Emergency \n\t1. Caused by fire \n\t2. Caused by manual interaction \n\tAction: \n\t\tClose all fire doors. These can only be opened by resetting the alarm \nRed- Ejection/Self-Destruct \n\t1. Caused by module operating computer. \n\tAction: \n\t\tAfter the specified time the module will eject completely. \n \nEngine Maintenance Instructions: \n\tShut off ignition systems: \n\tActivate internal power \n\tActivate orbital balance matrix \n\tRemove volatile liquids from area \n\tWear a fire suit \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nToxin Laboratory Procedure: \n\tWear a gas mask regardless \n\tGet an oxygen tank. \n\tActivate internal atmosphere \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nDisaster Procedure: \n\tFire: \n\t\tActivate sector fire alarm. \n\t\tMove to a safe area. \n\t\tGet a fire suit \n\t\tAfter: \n\t\t\tAssess Damage \n\t\t\tRepair damages \n\t\t\tIf needed, Evacuate \n\tMeteor Shower: \n\t\tActivate fire alarm \n\t\tMove to the back of ship \n\t\tAfter \n\t\t\tRepair damage \n\t\t\tIf needed, Evacuate \n\tAccidental Reentry: \n\t\tActivate fire alarms in front of ship. \n\t\tMove volatile matter to a fire proof area! \n\t\tGet a fire suit. \n\t\tStay secure until an emergency ship arrives. \n \n\t\tIf ship does not arrive- \n\t\t\tEvacuate to a nearby safe area!"
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 42c3a6eb69c7..694fcbc4a488 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -43,6 +43,8 @@
var/color_mode = PHOTO_COLOR
/// Indicates whether the printer is currently busy copying or not.
var/busy = FALSE
+ /// Variable needed to determine the selected category of forms on Photocopier.js
+ var/category
/obj/machinery/photocopier/Initialize()
. = ..()
@@ -60,6 +62,18 @@
data["has_item"] = !copier_empty()
data["num_copies"] = num_copies
+ try
+ // var/list/blanks = json_decode(file2text("config/blanks.json")) LOBOTOMYCORPORATION EDIT OLD
+ var/list/blanks = (SSmaptype.maptype in SSmaptype.citymaps) ? json_decode(file2text("config/blanks_city.json")) : json_decode(file2text("config/blanks.json")) // LOBOTOMYCORPORATION EDIT NEW
+ if (blanks != null)
+ data["blanks"] = blanks
+ data["category"] = category
+ data["forms_exist"] = TRUE
+ else
+ data["forms_exist"] = FALSE
+ catch()
+ data["forms_exist"] = FALSE
+
if(photo_copy)
data["is_photo"] = TRUE
data["color_mode"] = color_mode
@@ -156,6 +170,27 @@
if("set_copies")
num_copies = clamp(text2num(params["num_copies"]), 1, MAX_COPIES_AT_ONCE)
return TRUE
+ // Changes the forms displayed on Photocopier.js when you switch categories
+ if("choose_category")
+ category = params["category"]
+ return TRUE
+ // Called when you press print blank
+ if("print_blank")
+ if(busy)
+ to_chat(usr, span_warning("[src] is currently busy copying something. Please wait until it is finished."))
+ return FALSE
+ if (toner_cartridge.charges - PAPER_TONER_USE < 0)
+ to_chat(usr, span_warning("There is not enough toner in [src] to print the form, please replace the cartridge."))
+ return FALSE
+ do_copy_loop(CALLBACK(src, PROC_REF(make_blank_print)), usr)
+ var/obj/item/paper/printblank = new /obj/item/paper (loc)
+ var/printname = params["name"]
+ var/list/printinfo
+ for(var/infoline as anything in params["info"])
+ printinfo += infoline
+ printblank.name = printname
+ printblank.info = printinfo
+ return printblank
/**
* Determines if the photocopier has enough toner to create `num_copies` amount of copies of the currently inserted item.
@@ -267,6 +302,12 @@
give_pixel_offset(copied_doc)
toner_cartridge.charges -= DOCUMENT_TONER_USE
+/**
+ * The procedure is called when printing a blank to write off toner consumption.
+ */
+/obj/machinery/photocopier/proc/make_blank_print()
+ toner_cartridge.charges -= PAPER_TONER_USE
+
/**
* Handles the copying of an ass photo.
*
diff --git a/code/modules/paperwork/records/info/waw.dm b/code/modules/paperwork/records/info/waw.dm
index 6505c4dd95ce..157fb14115e0 100644
--- a/code/modules/paperwork/records/info/waw.dm
+++ b/code/modules/paperwork/records/info/waw.dm
@@ -368,13 +368,10 @@
abno_type = /mob/living/simple_animal/hostile/abnormality/sphinx
abno_code = "T-03-33"
abno_info = list(
- "When the work was complete, the Qliphoth Counter lowered depending on the abnormality's mood. The abnormality's mood improved after an offering was successfully made.",
- "When an employee performed riddle work, the abnormality posed a question in a strange language. Agents are then provided with a cipher.",
- "When the employee performed offering work, an item placed on the nearby offering table was inspected by the abnormality. If the table was empty, the abnormality checked the employee's hands.",
- "When the abnormality was disappointed with an offering, the offender had one of their senses taken away.",
- "When the riddle was successfully solved with an offering, the Qliphoth counter raised to its maximum. In addition, the abnormality willingly parted with an anomalous object referred to henceforth as a gift.",
- "When agent bong bong used the canopic jar gift, she was cured of permanent blindness. Effects may differ but are usually beneficial.",
- "Agent Joshua, who was turned to stone by the abnormality was able to be saved using gift of golden needles.")
+ "Employees with a high Prudence Level had their work chance increased dramatically.",
+ "When the work result was Good, the abnormality provided a treasure with a low probability.",
+ "When the work result was Bad, the Qliphoth counter reduced. Additionally, employees with Prudence Level 4 or lower had one of their senses taken away.",
+ "Agent Joshua, who was turned to stone by the abnormality was able to be saved using the treasure of golden needles.")
//Clouded Monk
/obj/item/paper/fluff/info/waw/clouded_monk
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d8453dbb326b..cb9469f97c39 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -375,8 +375,10 @@
projectile_piercing = PASSMOB
/obj/projectile/beam/laser/iff/on_hit(atom/target, blocked = FALSE)
- if(ishuman(target))
- return
+ if(isliving(target))
+ var/mob/living/L = target
+ if("neutral" in L.faction)
+ return
nodamage = FALSE
. = ..()
qdel(src)
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
index ee55cf87adc9..b5af454b5ecb 100644
--- a/code/modules/projectiles/projectile/bullets/smg.dm
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -47,3 +47,6 @@
/obj/projectile/bullet/c9x19mm/greenbot
damage = 6
speed = 0.4
+
+/obj/projectile/bullet/c9x19mm/greenbot/city
+ damage = 1
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index d746671b11e3..f4c7be092c68 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -891,6 +891,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Barefoot"
glass_desc = "Barefoot and pregnant."
+/* LOBOTOMYCORPORATION REMOVAL
/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M)
if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes.
var/mob/living/carbon/human/H = M
@@ -898,6 +899,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
H.adjustBruteLoss(-3, 0)
. = 1
return ..() || .
+*/
/datum/reagent/consumable/ethanol/snowwhite
name = "Snow White"
@@ -1957,7 +1959,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
generate_data_info(data)
/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data)
- var/const/minimum_percent = 0.15
+ var/const/minimum_percent = 0.15
var/const/notable_percent = minimum_percent * 2
var/list/primary_tastes = list()
var/list/secondary_tastes = list()
diff --git a/config/blanks.json b/config/blanks.json
new file mode 100644
index 000000000000..24c2d0e8cc1d
--- /dev/null
+++ b/config/blanks.json
@@ -0,0 +1,817 @@
+[
+ {
+ "code": "NT-CMD-JA",
+ "category": "Command Department",
+ "name": "Job Application",
+ "info": [
+ "
Job Application
",
+ "",
+ "
Applicant's name (with signature):
",
+ "
[]
",
+ "
Desired position
",
+ "
[]
",
+ "",
+ "
By signing this document, you agree to Nanotrasen's policies on labor protection, occupational health and safety, compensation, and confidentiality.
",
+ "",
+ "
Condemnation Review
",
+ "
Name of the Head of Personal or deputy head (with signature):
",
+ "
[]
",
+ "
Head of Personal Decision:
",
+ "
[]
",
+ "
[]
",
+ "
Review Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "
Name of department head or deputy head (with signature):
",
+ "
[]
",
+ "
Department Head's Decision:
",
+ "
[]
",
+ "
[]
",
+ "
Review Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
Appointment decision
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and stamps of the heads or their deputies, this document has no corporate validity and cannot be considered evidence of the candidate's enrollment in the desired position.
Name of the Head of Personal or deputy head (with signature):
",
+ "
[]
",
+ "
Head of Personal Decision:
",
+ "
[]
",
+ "
[]
",
+ "
Decision Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
The decision of the head of staff or his deputy is sufficient grounds for dismissal. If only the head of personnel or his deputy makes the decision to dismiss, VOID values must be entered in the head of department fields.
",
+ "",
+ "
Name of department head or deputy head (with signature):
",
+ "
[]
",
+ "
Department Head's Decision:
",
+ "
[]
",
+ "
[]
",
+ "
Decision Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Name of the Head of Personal or deputy head (with signature):
",
+ "
[]
",
+ "
Head of Personal Decision:
",
+ "
[]
",
+ "
[]
",
+ "
Decision Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "
Name of department head or deputy head (with signature):
",
+ "
[]
",
+ "
Department Head's Decision:
",
+ "
[]
",
+ "
[]
",
+ "
Decision Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
By writing and signing this complaint, you consent to the processing of your personal data by Nanotrasen Corporation.
",
+ "",
+ "
Name of the person who received the complaint (with signature):
",
+ "
[]
",
+ "
Actions taken:
",
+ "
[]
",
+ "
[]
",
+ "
Date the complaint was reviewed:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
An order may be addressed not only to a specific person, but also to a group of people, as well as to a department. This should be indicated in the text of the order. The person responsible for the execution of the order must sign in the name of the person who received the order.
",
+ "",
+ "
Name of the executor (with signature):
",
+ "
[]
",
+ "
Other notes:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Responsibility for any damage to property or employees of Nanotrasen Corporation during the execution of dangerous work lies with the person requesting the permit and the person issuing the permit.
",
+ "",
+ "
The name of the permittee (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
The arrest form is legally and corporately valid if stamped and signed by the Head of Security or his/her deputy. Arrest forms should only be used during Green and BLUE threat code of the Nanotrasen facility. In the case of a higher threat code, Nanotrasen Corporation allows security personnel to make arrests with the verbal approval of the Head of Security.
",
+ "",
+ "
Name of the head of security or his deputy (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
The arrest form is legally and corporately valid if stamped and signed by the Head of Security or his/her deputy. Arrest forms should only be used during Green and BLUE threat code of the Nanotrasen facility. In the case of a higher threat code, Nanotrasen Corporation allows security personnel to make arrests with the verbal approval of the Head of Security.
",
+ "",
+ "
Name of the head of security or his deputy (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Nanotrasen Corporation recommends the use of interrogation recording tools.
",
+ "",
+ "
Name of the interrogator (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Name of the person who received the report (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Only the top management of the Nanotrasen facility, the Nanotrasen Central Command or the Nanotrasen Board of Directors can order an execution. Remember that execution is an exceptional punishment. By signing this order, you take full responsibility for any mistakes that may occur. This order must be stapled to form NT-MDC-DC after the execution of the punishment.
",
+ "",
+ "
The name of the orderer (with signature):
",
+ "
[]
",
+ "
Other notes:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
This permit authorizes the possession, custody, and use of the listed equipment by the person designated on the permit. The Designated Person must present this permit to any Security Officer on first request. The permit may be revoked and withdrawn at any time without cause. When filling out this form, the authorizer should fill in the blank fields with the VOID designation.
",
+ "",
+ "
The name of the permittee (with signature):
",
+ "
[]
",
+ "
Other notes:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Responsibility for any damage caused to the Nanotrasen during the execution of the described work lies with the person requesting the permit and the person giving the permit.
",
+ "",
+ "
The name of the permittee (with signature):
",
+ "
[]
",
+ "
Other notes:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
",
+ ""
+ ]
+ },
+ {
+ "code": "NT-ENG-PE",
+ "category": "Engineering Department",
+ "name": "Permit for the issuance of engineering equipment",
+ "info": [
+ "
Permit for the issuance of engineering equipment
",
+ "",
+ "
Name of the requesting equipment (with signature):
",
+ "
[]
",
+ "
Purpose of application of the equipment:
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
List of equipment:
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
Responsibility for improper receipt of equipment lies with the person who signed the permit for the issuance of equipment. The VOID value must be filled in when completing the equipment list.
",
+ "",
+ "
Name of issuing equipment (with signature):
",
+ "
[]
",
+ "
The decision to issue:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
Responsibility for any damage caused to the Nanotrasen object during the execution of the research described herein lies with the person requesting the permit and the person giving the permit.
",
+ "",
+ "
The name of the permittee (with signature):
",
+ "
[]
",
+ "
Other notes:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
",
+ ""
+ ]
+ },
+ {
+ "code": "NT-RSH-PE",
+ "category": "Research Department",
+ "name": "Permit for the issuance of research equipment",
+ "info": [
+ "
Permit for the issuance of research equipment
",
+ "",
+ "
Name of the requesting equipment (with signature):
",
+ "
[]
",
+ "
Purpose of application of the equipment:
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
List of equipment:
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
Responsibility for improper receipt of equipment lies with the person who signed the permit for the issuance of equipment. The VOID value must be filled in when completing the equipment list.
",
+ "",
+ "
Name of issuing equipment (with signature):
",
+ "
[]
",
+ "
The decision to issue:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
This document entitles you to receive, store and use the listed medications. Patients should follow their doctor's recommendations when using medications. When filling out this form, the doctor should indicate the VOID value in the blank fields to avoid tampering.
",
+ "",
+ "
The attending doctor (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
This is evidence that the designated person is permanently dead and cannot be resurrected. The person signing the certificate is responsible for the wrongful death.
",
+ "",
+ "
Coroner's Name (with signature):
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
The name of the person requesting the delivery (with signature):
",
+ "
[]
",
+ "
Purpose of delivery target:
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
List of deliveries:
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
The person who signed the permission to receive the package is responsible for the improper receipt of the package. The VOID value must be filled in when completing the equipment list.
",
+ "",
+ "
Name of the person who approved the delivery (with signature):
",
+ "
[]
",
+ "
The decision to issue:
",
+ "
[]
",
+ "
[]
",
+ "
Date:
",
+ "
[].[].[]
",
+ "
[]:[]
",
+ "
Place for a stamp
",
+ "",
+ "
This document is the property of Nanotrasen Corporation. Without the signatures and seals of the managers or their deputies, this document has no corporate force.
This payment document is the property of NanoTrasen. You must deliver this document to the head of the NanoTrasen facility staff within 24 hours of service for independent tax accounting.
This payment document is the property of NanoTrasen. You must deliver this document to the head of the NanoTrasen facility staff within 24 hours of service for independent tax accounting.
This is a Registration form for the creation of an office. Please fill in the following information properly. This form is meant for the Office Director.
",
+ "
Registrant Information
",
+ "
",
+ "
Name:[]
",
+ "
Age:[] Sex:[]
",
+ "
Has the registrant previously registered to another Office? (Y/N) []
",
+ "
",
+ "",
+ "
",
+ "
========
",
+ "
STAMP HERE
",
+ "
========
",
+ "
",
+ "",
+ "
Office Details
",
+ "
Office-Name: []
",
+ "
Office Type (ONLY CHECK 1)
",
+ "
",
+ "
[] Combat
",
+ "
[] Protection
",
+ "
[] Peacekeeping
",
+ "
[] Recon
",
+ "
[] Fishing
",
+ "
[] Workshop
",
+ "
[] Other*
",
+ "
",
+ "
*Other must be defined for capsule, if definition is not qualified for a specific capsule, your Hana Associate will choose one for you.
",
+ "
Starting-Number of Fixers: []
",
+ "
By signing this, you agree to the laws and stipulations that Hana can impose.
",
+ "
Signature:[]
",
+ "
Approved By: []
",
+ "",
+ "
Offices approved by the Hana-Association are liable to direct-orders/Emergency Summons in regards to Urban-Myths and above. Please keep in mind the Hana-Association retains the right to Remove your office from the list of Registered offices, if the Hana-Association has in any reason, or any case decided to do so. In which case, the Hana-Association retains the right to termination of this authorization
This is a Hana-Association official form stating that you are an official Fixer with no office or association affiliation.
",
+ "
As of, []Citizen[]has requested to form a fixer under the Hana Association. Within District[] of the City.
",
+ "
Fixer approval given by [], Official of the Hana-Association
",
+ "",
+ "
",
+ "
========
",
+ "
STAMP HERE
",
+ "
========
",
+ "
",
+ "",
+ "
Fixers approved by the Hana-Association are liable to direct-orders/Emergency Summons in regards to Urban-Myths and above. Please keep in mind the Hana-Association retains the right to Remove your status from the registry, if the Hana-Association has in any reason, or any case decided to do so. In which case, the Hana-Association retains the right to termination of this authorization