Skip to content
Open
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e7d4624
modkit sprites
keygenpie Jul 16, 2026
d5c7998
modularization
keygenpie Jul 16, 2026
dd11b59
blank modkit
keygenpie Jul 16, 2026
6f3dde7
Anomaly interaction code
keygenpie Jul 16, 2026
0f485c5
gravitic pulverizer modkit
keygenpie Jul 16, 2026
06f6b42
failsafe
keygenpie Jul 16, 2026
ee6971b
storm capacitor modkit
keygenpie Jul 16, 2026
a451978
gravitic mob check bugfix
keygenpie Jul 16, 2026
af25ea2
geist projector
keygenpie Jul 16, 2026
e7ad3cd
description clarity
keygenpie Jul 16, 2026
8bad0a6
cost unification
keygenpie Jul 16, 2026
a40be31
bluespace aberrator
keygenpie Jul 16, 2026
4297b8b
small description touchup
keygenpie Jul 16, 2026
a2f658b
vortex attractor
keygenpie Jul 16, 2026
4b4ab3f
flux charger
keygenpie Jul 16, 2026
b037737
stormcaller buff
keygenpie Jul 16, 2026
d1755a7
rift cleaver
keygenpie Jul 16, 2026
e7dd1f7
storm capacitor bugfix
keygenpie Jul 16, 2026
41a0a0e
rift cleaver is now safe
keygenpie Jul 16, 2026
6a67a17
genetic inducer
keygenpie Jul 16, 2026
4feed91
rift cleaver alteration
keygenpie Jul 16, 2026
4063dbf
researchable and lathable blank-kits
keygenpie Jul 16, 2026
5b1e53c
small balance alterations
keygenpie Jul 17, 2026
5e2be39
cut the rift cleaver
keygenpie Jul 17, 2026
2290ae0
poltergeist projector (geist projector update)
keygenpie Jul 17, 2026
ca68ba2
complete modularization
keygenpie Jul 19, 2026
7e815d2
tiny correction to readme file location
keygenpie Jul 19, 2026
0767330
maxed all kit types at 1 max
keygenpie Jul 19, 2026
fd36121
spacing
keygenpie Jul 20, 2026
551bc28
small notation adjustment
keygenpie Jul 20, 2026
199265d
QDELETED check removal
keygenpie Jul 20, 2026
0ffc3c5
removed mob checks from grav and vortex kits
keygenpie Jul 20, 2026
57d60ee
ok well obviously there should be turf/anchored checks
keygenpie Jul 20, 2026
3435008
cleaned up storm code a bit
keygenpie Jul 20, 2026
f48eff9
removed mob check from poltergeist
keygenpie Jul 20, 2026
399530b
changed check on bluespace aberrator
keygenpie Jul 20, 2026
9b6c330
more modifier scaling
keygenpie Jul 20, 2026
924abe4
storm capacitor changes
keygenpie Jul 21, 2026
0b10cfa
oops
keygenpie Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,6 @@
KA.trigger_guard = TRIGGER_GUARD_NORMAL
..()

Comment thread
keygenpie marked this conversation as resolved.

//Cosmetic

/obj/item/borg/upgrade/modkit/chassis_mod
Expand Down
3 changes: 3 additions & 0 deletions code/modules/research/techweb/nodes/mining_nodes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@
"borg_upgrade_rangemod",
"borg_upgrade_cooldownmod",
"borg_upgrade_hypermod",
//OCULIS EDIT ADDITION START - ANOMALY_KITS
"anomalymod",
//OCULIS EDIT ADDITION END
Comment thread
keygenpie marked this conversation as resolved.
Outdated
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS)
announce_channels = list(RADIO_CHANNEL_SUPPLY)
Expand Down
184 changes: 184 additions & 0 deletions modular_oculis/modules/anomalykits/code/anomalykits.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
//Blank PK modkit, able to be fit with an anomaly core
/obj/item/borg/upgrade/modkit/blank
name = "blank anomaly kit"
desc = "A specialized PK anomaly modkit. This one is currently empty, awaiting an anomaly core for completion."
cost = 10
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykitempty"

/obj/item/borg/upgrade/modkit/blank/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
var/static/list/anomaly_kit_types = list(
/obj/effect/anomaly/grav = /obj/item/borg/upgrade/modkit/cooldown/gravity,
/obj/effect/anomaly/weather = /obj/item/borg/upgrade/modkit/weather,
/obj/effect/anomaly/ectoplasm = /obj/item/borg/upgrade/modkit/ectoplasm,
/obj/effect/anomaly/bluespace = /obj/item/borg/upgrade/modkit/cooldown/bluespace,
/obj/effect/anomaly/bhole = /obj/item/borg/upgrade/modkit/vortex,
/obj/effect/anomaly/flux = /obj/item/borg/upgrade/modkit/flux,
/obj/effect/anomaly/bioscrambler = /obj/item/borg/upgrade/modkit/bioscrambler,
)

if(istype(tool, /obj/item/assembly/signaler/anomaly))
var/obj/item/assembly/signaler/anomaly/anomaly = tool
var/anomkit_path = is_path_in_list(anomaly.anomaly_type, anomaly_kit_types, TRUE)
if(!anomkit_path)
anomkit_path = /obj/item/borg/upgrade/modkit/cooldown/gravity //If an anomaly is inserted without a specifically coded modifier, give the gravity one so that the player isn't unrewarded
to_chat(user, span_notice("You insert [anomaly] into the modkit, and it gently hums to life."))
new anomkit_path(get_turf(src))
qdel(src)
qdel(anomaly)
return ITEM_INTERACT_SUCCESS

/datum/design/anomaly_mod
name = "Kinetic Accelerator Blank Anomaly Mod"
desc = "Ask Research to slot an anomaly core into this for a specialized proto-kinetic accelerator upgrade."
id = "anomalymod"
build_type = PROTOLATHE | AWAY_LATHE
materials = list(
/datum/material/iron =SHEET_MATERIAL_AMOUNT * 3,
/datum/material/glass =SHEET_MATERIAL_AMOUNT * 2,
/datum/material/silver =SHEET_MATERIAL_AMOUNT * 2,
/datum/material/gold =SHEET_MATERIAL_AMOUNT * 2,
/datum/material/uranium =SHEET_MATERIAL_AMOUNT,
/datum/material/diamond =SHEET_MATERIAL_AMOUNT,
)
build_path = /obj/item/borg/upgrade/modkit/blank
category = list(
RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_PKA_MODS
)
departmental_flags = DEPARTMENT_BITFLAG_CARGO

/obj/item/borg/upgrade/modkit/cooldown/gravity
name = "gravitic pulverizer"
desc = "A specialized PK anomaly modkit. This one vastly increases the weapon's damage at the cost of cooldown, as well as allowing it to knock targets back."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
modifier = -10
cost = 35
maximum_of_type = 1

/obj/item/borg/upgrade/modkit/cooldown/gravity/modify_projectile(obj/projectile/kinetic/K)
K.damage -= modifier * 5

/obj/item/borg/upgrade/modkit/cooldown/gravity/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/movable/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
var/relative_direction = get_cardinal_dir(src, target)
var/atom/throw_target = get_edge_target_turf(target, relative_direction)
. = ..()
if(!QDELETED(target) && istype(target, /mob))
var/whack_speed = (2)
target.throw_at(throw_target, 2, whack_speed, K, gentle = TRUE)

/obj/item/borg/upgrade/modkit/weather
name = "storm capacitor"
desc = "A specialized PK anomaly modkit. This one allows the weapon to call lightning from above, electrocuting targets."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
cost = 35
maximum_of_type = 1

/obj/item/borg/upgrade/modkit/weather/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
new /obj/effect/temp_visual/telegraphing/thunderbolt(target_turf)
addtimer(CALLBACK(src, PROC_REF(shock_turf), target_turf), 1 SECONDS)

/obj/item/borg/upgrade/modkit/weather/proc/shock_turf(turf/target)
playsound(target, 'sound/effects/magic/lightningbolt.ogg', 66, TRUE)
new /obj/effect/temp_visual/thunderbolt(target)
for(var/turf/open/adjacent_turf in oview(1, target))
new /obj/effect/temp_visual/electricity(adjacent_turf)

for(var/mob/living/hit_mob in target)
to_chat(hit_mob, span_userdanger("You've been struck by lightning!"))
hit_mob.electrocute_act(30, src, flags = SHOCK_TESLA|SHOCK_NOSTUN)
hit_mob.Knockdown(1 SECONDS, 5 SECONDS)

for(var/mob/living/nearby_target in oview(1, target))
to_chat(nearby_target, span_userdanger("You've been struck by an arc of lightning!"))
nearby_target.electrocute_act(10, src, flags = SHOCK_TESLA|SHOCK_NOSTUN)

for(var/obj/hit_thing in target)
hit_thing.take_damage(20, BURN, ENERGY, FALSE)

for(var/obj/nearby_thing in oview(1, target))
nearby_thing.take_damage(10, BURN, ENERGY, FALSE)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't we have tesla ball code that you can use for this? Also- Five for loops...?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This reuses the storm-staff code. I can take a look at the tesla ball code and try that.


/obj/item/borg/upgrade/modkit/ectoplasm
name = "poltergeist projector"
desc = "A specialized PK anomaly modkit. This one grants the weapon a chance to haunt nearby objects, throwing them at the target. Comes with a large range increase."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
cost = 35
modifier = 3
maximum_of_type = 1

/obj/item/borg/upgrade/modkit/ectoplasm/modify_projectile(obj/projectile/kinetic/K)
K.range += modifier

/obj/item/borg/upgrade/modkit/ectoplasm/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/movable/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
if(!QDELETED(target) && istype(target, /mob))
for(var/obj/item/throwable in view(modifier, target))
if(prob(30))
playsound(target_turf,'sound/effects/hallucinations/veryfar_noise.ogg', 50, TRUE)
var/relative_direction = get_cardinal_dir(throwable, target)
var/atom/throw_target = get_edge_target_turf(target, relative_direction)
var/whack_speed = (2)
throwable.throw_at(throw_target, modifier, whack_speed, K, gentle = TRUE)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please unindent this, also it'd be mildly funny to be able to send anything flying if you hit it, not just mobs, ala wizard's mjolnir hammer, maybe you can use code from that?


/obj/item/borg/upgrade/modkit/cooldown/bluespace
name = "bluespace aberrator"
desc = "A specialized PK anomaly modkit. This one allows the weapon to chaotically teleport targets, alongside increased cooling rates."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
cost = 35
modifier = 4

/obj/item/borg/upgrade/modkit/cooldown/bluespace/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/movable/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
if(!QDELETED(target) && istype(target, /mob))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also dont really see any reason for these !QDELETED(target) checks. Ofcourse its not gonna be deleted if this proc is called.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, new to BYOND code and saw a bunch of !QDELETED checks elsewhere, so I figured it must be necessary? I'll do some testing without it.

do_teleport(target, target_turf, 1, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)

/obj/item/borg/upgrade/modkit/vortex
name = "vortex attractor"
desc = "A specialized PK anomaly modkit. This one allows the weapon to pull enemies in, along with an increase to force output."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
modifier = 10
cost = 35
maximum_of_type = 1

/obj/item/borg/upgrade/modkit/vortex/modify_projectile(obj/projectile/kinetic/K)
K.damage += modifier

/obj/item/borg/upgrade/modkit/vortex/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/movable/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
var/relative_direction = get_cardinal_dir(target, src)
var/atom/throw_target = get_edge_target_turf(target, relative_direction)
. = ..()
if(!QDELETED(target) && istype(target, /mob))
var/whack_speed = (2)
target.throw_at(throw_target, 2, whack_speed, K, gentle = TRUE)
Comment on lines +147 to +151

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above


/obj/item/borg/upgrade/modkit/flux
name = "flux charger"
desc = "A specialized PK anomaly modkit. This one gives the weapon a slight damage and range increase at no modularity cost. Push the limit."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
modifier = 10
cost = 0
maximum_of_type = 1

/obj/item/borg/upgrade/modkit/flux/modify_projectile(obj/projectile/kinetic/K)
K.damage += modifier
K.range += 1

/obj/item/borg/upgrade/modkit/bioscrambler
name = "genetic inducer"
desc = "A specialized PK anomaly modkit. This one allows the weapon to genetically batter its opponent, giving it a chance to deal critical internal damage."
icon = 'modular_oculis/modules/anomalykits/icons/obj/anomalykits.dmi'
icon_state = "anomalykit"
modifier = 20
cost = 35
maximum_of_type = 1

/obj/item/borg/upgrade/modkit/bioscrambler/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/movable/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
if(!QDELETED(target) && istype(target, /mob) && prob(modifier))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and here

playsound(target, 'sound/items/weapons/zapbang.ogg', 100, TRUE)
if(target.uses_integrity)
target.take_damage(60, BRUTE, ENERGY, FALSE)
Binary file not shown.
45 changes: 45 additions & 0 deletions modular_oculis/modules/anomalykits/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<!-- This should be copy-pasted into the root of your module folder as readme.md -->

https://github.com/Monkestation/OculisStation/pull/367<!--PR Number-->

## \<PK Anomaly Modkits> <!--Title of your addition.-->

Module ID: ANOMALY_KITS

### Description:

Adds a blank anomaly modkit, which allows insertion of an anomaly core to create specialized PKA upgrades. It must be researched in the same technode as the other craftable PKA upgrades, fabricated, then fit with an anomaly core.

<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. -->

### TG Proc/File Changes:

- N/A
<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed.
E.g:
- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var`
-->

### Modular Overrides:

- N/A
<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file.
E.g:
- `modular_oculis/master_files/sound/my_cool_sound.ogg`
- `modular_oculis/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var`
-->

### Defines:

- N/A
<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. -->

### Included files that are not contained in this module:

- N/A
<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. -->

### Credits:

Keygenpie - Programmer
Xeonmations - Getting me to modularize the damn thing
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -10211,6 +10211,7 @@
#include "modular_oculis\modules\abel\code\id_cards.dm"
#include "modular_oculis\modules\abel\code\modsuit.dm"
#include "modular_oculis\modules\admin\code\view_variables.dm"
#include "modular_oculis\modules\anomalykits\code\anomalykits.dm"
#include "modular_oculis\modules\antimemetics\code\amnestics.dm"
#include "modular_oculis\modules\antimemetics\code\mnestics.dm"
#include "modular_oculis\modules\antimemetics\code\reality_anchor.dm"
Expand Down
Loading