diff --git a/code/__defines/admin_vr.dm b/code/__defines/admin_vr.dm
index 62c4add906..5cc4ac2299 100644
--- a/code/__defines/admin_vr.dm
+++ b/code/__defines/admin_vr.dm
@@ -1,5 +1,6 @@
#define SMITE_SHADEKIN_ATTACK "Shadekin (Attack)"
#define SMITE_SHADEKIN_NOMF "Shadekin (Devour)"
#define SMITE_REDSPACE_ABDUCT "Redspace Abduction"
+#define SMITE_AD_SPAM "Ad Spam"
#define SMITE_AUTOSAVE "10 Second Autosave"
#define SMITE_AUTOSAVE_WIDE "10 Second Autosave (AoE)"
diff --git a/code/_onclick/hud/popups_vr.dm b/code/_onclick/hud/popups_vr.dm
index 76e72224ef..20dc1963da 100644
--- a/code/_onclick/hud/popups_vr.dm
+++ b/code/_onclick/hud/popups_vr.dm
@@ -68,4 +68,4 @@
/obj/screen/popup/default/New()
..()
- icon_state = "popup[rand(1,4)]"
\ No newline at end of file
+ icon_state = "popup[rand(1,10)]"
\ No newline at end of file
diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm
index 051c0e9e98..a374f19d8d 100644
--- a/code/game/objects/items/devices/hacktool.dm
+++ b/code/game/objects/items/devices/hacktool.dm
@@ -1,25 +1,19 @@
/obj/item/device/multitool/hacktool
var/is_hacking = 0
var/max_known_targets
-<<<<<<< HEAD
-=======
var/hackspeed = 1
var/max_level = 4 //what's the max door security_level we can handle?
var/full_override = FALSE //can we override door bolts too? defaults to false for event/safety reasons
->>>>>>> c28095b90b... Merge pull request #14148 from KillianKirilenko/kk-hacktool
var/in_hack_mode = 0
var/list/known_targets
var/list/supported_types
var/datum/tgui_state/default/must_hack/hack_state
-<<<<<<< HEAD
-=======
/obj/item/device/multitool/hacktool/override
hackspeed = 0.75
max_level = 5
full_override = TRUE
->>>>>>> c28095b90b... Merge pull request #14148 from KillianKirilenko/kk-hacktool
/obj/item/device/multitool/hacktool/New()
..()
@@ -53,7 +47,23 @@
return 0
// Note, if you ever want to expand supported_types, you must manually add the custom state argument to their tgui_interact
- A.tgui_interact(user, custom_state = hack_state)
+ // DISABLED: too fancy, too high-effort // A.tgui_interact(user, custom_state = hack_state)
+ // Just brute-force it
+ if(istype(A, /obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/D = A
+ if(!D.arePowerSystemsOn())
+ to_chat(user, "No response from remote, check door power.")
+ else if(D.locked == TRUE && full_override == FALSE)
+ to_chat(user, "Unable to override door bolts!")
+ else if(D.locked == TRUE && full_override == TRUE && D.arePowerSystemsOn())
+ to_chat(user, "Door bolts overridden.")
+ D.unlock()
+ else if(D.density == TRUE && D.locked == FALSE)
+ to_chat(user, "Overriding access. Door opening.")
+ D.open()
+ else if(D.density == FALSE && D.locked == FALSE)
+ to_chat(user, "Overriding access. Door closing.")
+ D.close()
return 1
/obj/item/device/multitool/hacktool/proc/attempt_hack(var/mob/user, var/atom/target)
@@ -75,14 +85,9 @@
return 1
to_chat(user, "You begin hacking \the [D]...")
is_hacking = 1
-<<<<<<< HEAD
- // On average hackin takes ~30 seconds. Fairly small random span to avoid people simply aborting and trying again
- var/hack_result = do_after(user, (20 SECONDS + rand(0, 10 SECONDS) + rand(0, 10 SECONDS)))
-=======
// On average hackin takes ~15 seconds. Fairly small random span to avoid people simply aborting and trying again
// Reduced hack duration to compensate for the reduced functionality, multiplied by door sec level
var/hack_result = do_after(user, (((10 SECONDS + rand(0, 10 SECONDS) + rand(0, 10 SECONDS))*hackspeed)*D.security_level))
->>>>>>> c28095b90b... Merge pull request #14148 from KillianKirilenko/kk-hacktool
is_hacking = 0
if(hack_result && in_hack_mode)
diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm
index 1f6cf5d3a8..17cf91d176 100644
--- a/code/game/objects/items/trash_vr.dm
+++ b/code/game/objects/items/trash_vr.dm
@@ -59,4 +59,9 @@
/obj/item/trash/ratpackcheese
name = "\improper Prepackaged Meal Tray"
icon = 'icons/obj/trash_vr.dmi'
- icon_state = "altevian_pack_cheese-trash"
\ No newline at end of file
+ icon_state = "altevian_pack_cheese-trash"
+
+/obj/item/trash/ratpackturkey
+ name = "\improper Prepackaged Meal Tray"
+ icon = 'icons/obj/trash_vr.dmi'
+ icon_state = "altevian_pack_turkey-trash"
\ No newline at end of file
diff --git a/code/modules/admin/verbs/smite_vr.dm b/code/modules/admin/verbs/smite_vr.dm
index 5ac60fcfc1..f1a1a08deb 100644
--- a/code/modules/admin/verbs/smite_vr.dm
+++ b/code/modules/admin/verbs/smite_vr.dm
@@ -8,7 +8,7 @@
if(!istype(target))
return
- var/list/smite_types = list(SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE)
+ var/list/smite_types = list(SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_AD_SPAM,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE)
var/smite_choice = tgui_input_list(usr, "Select the type of SMITE for [target]","SMITE Type Choice", smite_types)
if(!smite_choice)
@@ -128,6 +128,10 @@
if(SMITE_AUTOSAVE_WIDE)
fake_autosave(target, src, TRUE)
+ if(SMITE_AD_SPAM)
+ if(target.client)
+ create_fake_ad_popup_multiple(/obj/screen/popup/default, 15)
+
else
return //Injection? Don't print any messages.
diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm
index d2d04029c3..45fb51eabc 100644
--- a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm
@@ -122,6 +122,21 @@
"red emblem" = /obj/item/clothing/accessory/altevian_badge/aquila/hydrogen)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(badges))
+/datum/gear/suit/altevian_officer_suit
+ description = "A comfortable official suit for altevian command officers."
+ display_name = "altevian officer's suit selection, site manager"
+ whitelisted = SPECIES_ALTEVIAN
+ allowed_roles = list("Site Manager")
+ sort_category = "Xenowear"
+
+/datum/gear/suit/altevian_officer_suit/New()
+ ..()
+ var/list/suits = list()
+ for(var/ratsuit in typesof(/obj/item/clothing/suit/captunic/capjacket/altevian_admiral))
+ var/obj/item/clothing/suit/captunic/capjacket/altevian_admiral/specific_ratsuit = ratsuit
+ suits[initial(specific_ratsuit.name)] = specific_ratsuit
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(suits))
+
// Taur stuff
/datum/gear/suit/taur/drake_cloak
display_name = "drake cloak (Drake-taur)"
diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm
index 304009c3f2..e737360234 100644
--- a/code/modules/client/verbs/character_directory.dm
+++ b/code/modules/client/verbs/character_directory.dm
@@ -68,7 +68,8 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
name = strangername
species = "[H.custom_species ? H.custom_species : H.species.name]"
ooc_notes = H.ooc_notes
- flavor_text = H.flavor_texts["general"]
+ if(LAZYLEN(H.flavor_texts))
+ flavor_text = H.flavor_texts["general"]
if(isAI(C.mob))
var/mob/living/silicon/ai/A = C.mob
diff --git a/code/modules/clothing/suits/miscellaneous_vr.dm b/code/modules/clothing/suits/miscellaneous_vr.dm
index 67c255b1ee..6c2afc11f4 100644
--- a/code/modules/clothing/suits/miscellaneous_vr.dm
+++ b/code/modules/clothing/suits/miscellaneous_vr.dm
@@ -146,4 +146,31 @@
name = "cyberpunk vest"
desc = "A high tech looking vest. It's made out of tough materials, and can protect fairly well against bullets. Wake the fuck up, Samurai."
- icon_state = "cyberpunk_recolor"
\ No newline at end of file
+ icon_state = "cyberpunk_recolor"
+ species_restricted = list(SPECIES_ALTEVIAN)
+
+// Altevian admiralty stuff
+/obj/item/clothing/suit/captunic/capjacket/altevian_admiral // Subtype of capjacket because A) it makes sense and B) conviniently matching stats
+ name = "altevian officer's suit"
+ desc = "Formal attire worn by officers and bridge crew from the Altevian Hegemony. The material is made of high quality silk and provides maximum comfort and breathing room for those that are working double shifts all the time."
+ icon_state = "altevian-admiral"
+
+/obj/item/clothing/suit/captunic/capjacket/altevian_admiral/gray
+ name = "gray altevian officer's suit"
+ icon_state = "altevian-admiral-gray"
+
+/obj/item/clothing/suit/captunic/capjacket/altevian_admiral/white
+ name = "white altevian officer's suit"
+ icon_state = "altevian-admiral-white"
+
+/obj/item/clothing/suit/captunic/capjacket/altevian_admiral/dark
+ name = "dark altevian officer's suit"
+ icon_state = "altevian-admiral-dark"
+
+/obj/item/clothing/suit/captunic/capjacket/altevian_admiral/olive
+ name = "olive altevian officer's suit"
+ icon_state = "altevian-admiral-olive"
+
+/obj/item/clothing/suit/captunic/capjacket/altevian_admiral/yellow
+ name = "yellow altevian officer's suit"
+ icon_state = "altevian-admiral-yellow"
\ No newline at end of file
diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm
index 9492802e86..85a475c03f 100644
--- a/code/modules/economy/vending_machines_vr.dm
+++ b/code/modules/economy/vending_machines_vr.dm
@@ -3556,11 +3556,13 @@
/obj/item/weapon/reagent_containers/food/snacks/ratliquid = 15,
/obj/item/weapon/reagent_containers/food/snacks/ratfruitcake = 15,
/obj/item/weapon/reagent_containers/food/snacks/ratpackburger = 8,
- /obj/item/weapon/reagent_containers/food/snacks/ratpackcheese = 8)
+ /obj/item/weapon/reagent_containers/food/snacks/ratpackcheese = 8,
+ /obj/item/weapon/reagent_containers/food/snacks/ratpackturkey = 2)
prices = list(/obj/item/weapon/reagent_containers/food/snacks/ratprotein = 8,
/obj/item/weapon/reagent_containers/food/snacks/ratveggies = 8,
/obj/item/weapon/reagent_containers/food/snacks/ratliquid = 8,
/obj/item/weapon/reagent_containers/food/snacks/ratfruitcake = 8,
/obj/item/weapon/reagent_containers/food/snacks/ratpackburger = 10,
- /obj/item/weapon/reagent_containers/food/snacks/ratpackcheese = 10)
+ /obj/item/weapon/reagent_containers/food/snacks/ratpackcheese = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/ratpackturkey = 200)
diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm
index b1e3e878c2..f5c276d887 100644
--- a/code/modules/food/food/snacks_vr.dm
+++ b/code/modules/food/food/snacks_vr.dm
@@ -861,3 +861,15 @@
trash = /obj/item/trash/ratpackcheese
nutriment_amt = 2
nutriment_desc = list("gourmand cheese" = 4)
+
+/obj/item/weapon/reagent_containers/food/snacks/ratpackturkey
+ name = "Compact Holiday Special Bird"
+ desc = "A great gift for holidays for assorted species. This contains a full freshly cooked turkey. Open and enjoy. Courtesy of altevian packaging"
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "altevian_pack_turkey"
+ package_open_state = "altevian_pack_turkey-open"
+ package_opening_state = "altevian_pack_turkey-opening"
+ package = TRUE
+ trash = /obj/item/trash/ratpackturkey
+ nutriment_amt = 18
+ nutriment_desc = list("high-quality poultry" = 4)
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index 3d2df063b5..f0ac7c002e 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -18,6 +18,8 @@
generate_loot()
+/* Vorestation edit - see abandonedcrates_vr.dm for virgo version. Keeping legacy proc in comments for reference.
+
/obj/structure/closet/crate/secure/loot/proc/generate_loot()
var/loot = rand(1, 100)
switch(loot)
@@ -143,6 +145,9 @@
if(100)
new/obj/item/device/personal_shield_generator/belt/mining/loaded(src)
+vorestation edit end */
+
+
/obj/structure/closet/crate/secure/loot/togglelock(mob/user as mob)
if(!locked)
return
diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm
index 66bde0b4ff..7e4b8e2437 100644
--- a/code/modules/mining/abandonedcrates_vr.dm
+++ b/code/modules/mining/abandonedcrates_vr.dm
@@ -1,2 +1,173 @@
/obj/structure/closet/crate/secure/loot
- tamper_proof = 2
\ No newline at end of file
+ tamper_proof = 2
+
+/obj/structure/closet/crate/secure/loot/proc/generate_loot()
+ var/lootvalue = 0
+ while(lootvalue <= 10) //if the initial generation gives you less than 10 points of stuff, add more stuff
+ //pick a thing to add to the crate - the format is "list(filepath, value) = weight,"
+ var/choice = list()
+ choice = pickweight(list(
+ list(pick(/obj/item/weapon/ore/diamond,
+ /obj/item/weapon/ore/osmium,
+ /obj/item/weapon/ore/hydrogen,
+ /obj/item/weapon/ore/verdantium,
+ /obj/item/weapon/ore/uranium), 1) = 10,
+ list(pick(subtypesof(/obj/item/weapon/coin)), 2) = 10,
+ list(/obj/item/weapon/spacecash/c500, 4) = 5,
+ list(/obj/item/weapon/spacecash/c200, 2) = 10,
+ list(/obj/item/weapon/spacecash/c100, 1) = 10,
+ list(/obj/item/weapon/spacecash/c50, 1) = 10,
+ list(/obj/item/weapon/spacecash/c20, 1) = 10,
+ list(pick(subtypesof(/obj/item/weapon/reagent_containers/food/drinks/bottle/) - /obj/item/weapon/reagent_containers/food/drinks/bottle/small), 1) = 5,
+ list(/obj/item/weapon/storage/backpack/dufflebag/cratebooze,5) = 5,
+ list(/obj/item/weapon/storage/backpack/dufflebag/cratedrills, 5) = 5,
+ list(/obj/item/weapon/reagent_containers/glass/beaker/bluespace, 3) = 5,
+ list(/obj/item/weapon/reagent_containers/glass/beaker/noreact, 3) = 5,
+ list(/obj/item/weapon/melee/baton, 5) = 4,
+ list(pick(subtypesof(/obj/item/weapon/storage/mre)), 2) = 3,
+ list(/obj/item/seeds/random, 2) = 3,
+ list(/obj/item/clothing/under/chameleon, 5) = 3,
+ list(/obj/item/weapon/melee/classic_baton, 6) = 3,
+ list(/obj/item/weapon/rig/industrial, 6) = 3,
+ list(/obj/item/device/multitool/hacktool, 5) = 3,
+ list(/obj/item/toy/katana, 1) = 2,
+ list(/obj/item/clothing/head/kitty, 1) = 2,
+ list(pick(subtypesof(/obj/item/weapon/soap)), 1) = 2,
+ list(/obj/item/clothing/under/shorts/red, 1) = 2,
+ list(/obj/item/clothing/under/shorts/blue, 1) = 2,
+ list(/obj/item/clothing/accessory/tie/horrible, 1) = 2,
+ list(pick(subtypesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts/subspace), 2) = 3,
+ list(/obj/item/latexballon, 2) = 2,
+ list(/obj/item/toy/syndicateballoon, 3) = 2,
+ list(/obj/item/clothing/suit/ianshirt, 3) = 2,
+ list(/obj/item/clothing/head/bearpelt, 4) = 2,
+ list(/obj/item/weapon/archaeological_find, 3) = 2,
+ list(pick(subtypesof(/obj/item/toy/mecha)), 4) = 2,
+ list(pick(subtypesof(/obj/item/toy/figure)), 4) = 2,
+ list(pick(subtypesof(/obj/item/toy/plushie)), 4) = 2,
+ list(pick(subtypesof(/obj/item/weapon/storage/firstaid)), 4) = 2,
+ list(/obj/item/weapon/pickaxe/silver, 3) = 2,
+ list(/obj/item/weapon/pickaxe/drill, 3) = 2,
+ list(/obj/item/weapon/pickaxe/jackhammer, 4) = 2,
+ list(/obj/item/weapon/pickaxe/gold, 4) = 2,
+ list(/obj/item/weapon/pickaxe/diamond, 5) = 2,
+ list(/obj/item/weapon/pickaxe/diamonddrill, 6) = 2,
+ list(/obj/item/weapon/pickaxe/plasmacutter, 5) = 2,
+ list(/obj/item/device/soulstone, 5) = 2,
+ list(/obj/item/weapon/material/sword/katana, 5) = 2,
+ list(/obj/item/weapon/storage/belt/utility/chief/full, 8) = 2,
+ list(/obj/item/device/personal_shield_generator/belt/mining/loaded, 6) = 2,
+ list(pick(subtypesof(/obj/item/weapon/melee/energy/sword) - /obj/item/weapon/melee/energy/sword/charge), 6) = 2,
+ list(pick(/obj/item/weapon/dnainjector/xraymut, /obj/item/weapon/dnainjector/nobreath, /obj/item/weapon/dnainjector/insulation), 6) = 2,
+ list(/obj/item/weapon/gun/energy/netgun, 7) = 2,
+ list(pick(prob(300);/obj/item/weapon/gun/energy/mouseray,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/corgi,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/woof,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/cat,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/chicken,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/lizard,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/rabbit,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/fennec,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/monkey,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/wolpin,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/otie,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/direwolf,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/giantrat,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/redpanda,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/catslug,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/teppi,
+ prob(1);/obj/item/weapon/gun/energy/mouseray/metamorphosis,
+ prob(1);/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced/random
+ ), 8) = 2,
+ list(/obj/item/weapon/gun/energy/pummeler, 11) = 2,
+ list(pick(subtypesof(/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug)), 1) = 1,
+ list(/obj/item/xenos_claw, 1) = 1,
+ list(/obj/item/organ/internal/heart, 1) = 1,
+ list(/obj/item/weapon/vampiric, 2) = 1,
+ list(/obj/item/weed_extract, 2) = 1,
+ list(/obj/item/weapon/storage/backpack/luchador/loaded, 3) = 1,
+ list(/obj/item/weapon/storage/backpack/clown/loaded, 5) = 1,
+ list(/obj/item/weapon/storage/backpack/mime/loaded, 5) = 1,
+ list(pick(/obj/item/device/multitool/alien,
+ /obj/item/stack/cable_coil/alien,
+ /obj/item/weapon/tool/crowbar/alien,
+ /obj/item/weapon/tool/screwdriver/alien,
+ /obj/item/weapon/weldingtool/alien,
+ /obj/item/weapon/tool/wirecutters/alien,
+ /obj/item/weapon/tool/wrench/alien), 7) = 1,
+ list(pick(/obj/item/weapon/melee/energy/axe, /obj/item/weapon/melee/energy/spear), 11) = 1,
+ list(/obj/item/weapon/card/emag/used, 7) = 1,
+ list(pick(/obj/item/weapon/grenade/spawnergrenade/spesscarp, /obj/item/weapon/grenade/spawnergrenade/spider, /obj/item/weapon/grenade/explosive/frag), 7) = 1,
+ list(/obj/item/weapon/grenade/flashbang/clusterbang, 7) = 1,
+ list(/obj/item/weapon/card/emag, 11) = 1,
+ list(/obj/item/weapon/storage/backpack/sport/hyd/catchemall, 11) = 1
+ ))
+ var/path = choice[1]
+ var/value = choice[2]
+ contents += new path()
+ lootvalue += value
+
+//putting the multi-object loot items as their own things
+
+/obj/item/weapon/storage/backpack/dufflebag/cratebooze
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/rum,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
+ )
+
+/obj/item/weapon/storage/backpack/dufflebag/cratedrills
+ starts_with = list(
+ /obj/item/weapon/pickaxe/advdrill,
+ /obj/item/device/taperecorder,
+ /obj/item/clothing/suit/space,
+ /obj/item/clothing/head/helmet/space
+ )
+
+/obj/item/weapon/storage/backpack/clown/loaded
+ starts_with = list(
+ /obj/item/clothing/under/rank/clown,
+ /obj/item/clothing/shoes/clown_shoes,
+ /obj/item/device/pda/clown,
+ /obj/item/clothing/mask/gas/clown_hat,
+ /obj/item/weapon/bikehorn,
+ /obj/item/weapon/pen/crayon/rainbow,
+ /obj/item/weapon/reagent_containers/spray/waterflower
+ )
+
+/obj/item/weapon/storage/backpack/mime/loaded
+ starts_with = list(
+ /obj/item/clothing/under/mime,
+ /obj/item/clothing/shoes/black,
+ /obj/item/device/pda/mime,
+ /obj/item/clothing/gloves/white,
+ /obj/item/clothing/mask/gas/mime,
+ /obj/item/clothing/head/beret,
+ /obj/item/clothing/suit/suspenders,
+ /obj/item/weapon/pen/crayon/mime,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing
+ )
+
+/obj/item/weapon/storage/backpack/luchador/loaded
+ starts_with = list(
+ /obj/item/weapon/storage/belt/champion,
+ /obj/item/clothing/mask/luchador
+ )
+
+
+/obj/item/weapon/storage/backpack/sport/hyd/catchemall
+ name = "sports backpack"
+ desc = "A green sports backpack."
+ starts_with = list(
+ /obj/item/clothing/head/soft/red,
+ /obj/item/clothing/suit/varsity/blue,
+ /obj/item/clothing/under/pants/youngfolksjeans,
+ /obj/item/capture_crystal
+ )
+
+/obj/item/weapon/storage/backpack/sport/hyd/catchemall/Initialize() //gotta have your starter 'mon too (or an improved way to catch one)
+ ..()
+ var/path = pick(subtypesof(/obj/item/capture_crystal))
+ contents += new path()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index 7aa08accbb..e8c38208b2 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -59,6 +59,12 @@
var/obj/item/held = user.get_active_hand()
if(!istype(held) || is_robot_module(held))
stripping = TRUE
+ //CHOMPEdit Start - Let borg grippers put stuff on.
+ if(is_robot_module(held) && istype(held, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = held
+ if(istype(G.wrapped))
+ stripping = FALSE
+ //CHOMPEdit End
else
var/obj/item/weapon/holder/holder = held
if(istype(holder) && src == holder.held_mob)
@@ -67,7 +73,7 @@
var/obj/item/weapon/grab/grab = held
if(istype(grab) && grab.affecting == src)
stripping = TRUE
-
+
if(stripping)
if(!istype(target_slot)) // They aren't holding anything valid and there's nothing to remove, why are we even here?
return
@@ -75,11 +81,19 @@
to_chat(user, "You cannot remove \the [src]'s [target_slot.name].")
return
visible_message("\The [user] is trying to remove \the [src]'s [target_slot.name]!")
- else
+ else if(!istype(held, /obj/item/weapon/gripper)) //CHOMPEdit - Let borg grippers put stuff on.
if(slot_to_strip == slot_wear_mask && istype(held, /obj/item/weapon/grenade))
visible_message("\The [user] is trying to put \a [held] in \the [src]'s mouth!")
else
visible_message("\The [user] is trying to put \a [held] on \the [src]!")
+ //CHOMPEdit Start - Let borg grippers put stuff on.
+ else
+ var/obj/item/weapon/gripper/G = held
+ if(slot_to_strip == slot_wear_mask && istype(G.wrapped, /obj/item/weapon/grenade))
+ visible_message("\The [user] is trying to put \a [G.wrapped] in \the [src]'s mouth!")
+ else
+ visible_message("\The [user] is trying to put \a [G.wrapped] on \the [src]!")
+ //CHOMPEdit End
if(!do_after(user,HUMAN_STRIP_DELAY,src))
return
@@ -95,6 +109,14 @@
if(stripping)
add_attack_logs(user,src,"Removed equipment from slot [target_slot]")
unEquip(target_slot)
+ //CHOMPEdit Start - Let borg grippers put stuff on.
+ else if(is_robot_module(held) && istype(held, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = held
+ var/obj/item/wrapped = G.wrapped
+ if(istype(wrapped))
+ G.drop_item_nm()
+ equip_to_slot_if_possible(wrapped, text2num(slot_to_strip), 0, 1, 1)
+ //CHOMPEdit End
else if(user.unEquip(held))
equip_to_slot_if_possible(held, text2num(slot_to_strip), 0, 1, 1)
if(held.loc != src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index cc0d12c3f0..35474383a1 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -182,6 +182,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/tool/crowbar/cyborg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/device/gps/robot(src)
+ src.modules += new /obj/item/weapon/gripper/scene(src) //CHOMPEdit - Give all borgs a scene gripper
vr_new() // Vorestation Edit: For modules in robot_modules_vr.dm
/obj/item/weapon/robot_module/robot/standard
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
index 2706cfd3ec..0af7b1a8b9 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
@@ -221,7 +221,8 @@
"Otieborg" = "oties",
"Secborg model V-3" = "SecVale", //CHOMPEdit
"Cat" = "vixsec", //CHOMPEdit
- "Drake" = "drakesec"
+ "Drake" = "drakesec",
+ "Secborg model V-4" = "secraptor"//CHOMPEdit
)
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
@@ -307,7 +308,8 @@
"Borgi" = "borgi-medi",
"Mediborg model V-3" = "vale2", //CHOMPEdit
"Cat" = "vixmed", //CHOMPEdit
- "Drake" = "drakemed"
+ "Drake" = "drakemed",
+ "Mediborg model V-4" = "medraptor" //CHOMPEdit
)
/obj/item/weapon/robot_module/robot/medihound/New(var/mob/living/silicon/robot/R)
@@ -357,7 +359,7 @@
var/obj/item/device/dogborg/sleeper/B = new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them
B.water = water
src.modules += B
-
+
//CHOMPEdit Start - Give back the ATK/ABP since we don't have the surgeryhound
var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src)
var/obj/item/stack/medical/advanced/bruise_pack/P = new /obj/item/stack/medical/advanced/bruise_pack(src)
@@ -638,7 +640,8 @@
"SciHound" = "scihound",
"SciHoundDark" = "scihounddark",
"Cat" = "vixsci", //CHOMPEdit
- "Drake" = "drakesci"
+ "Drake" = "drakesci",
+ "Sciborg model V-4" = "sciraptor"//CHOMPEdit
)
channels = list("Science" = 1)
pto_type = PTO_SCIENCE
diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm
index 2d0f550c0e..dd0d900db4 100644
--- a/code/modules/mob/living/silicon/robot/robot_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_vr.dm
@@ -196,6 +196,8 @@
icon = 'modular_chomp/icons/mob/widerobot_ch.dmi'
else if(icontype == "Cat" || icontype == "Cat Mining" || icontype == "Cat Cargo") // CHOMPEdit
icon = 'modular_chomp/icons/mob/catborg/catborg.dmi'
+ else if(icontype == "Mediborg model V-4" || icontype == "Secborg model V-4"|| icontype == "Sciborg model V-4") //CHOMPEdit
+ icon = 'modular_chomp/icons/mob/raptorborg/raptor.dmi'
else
icon = wideborg_dept
return
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm
index 6dcc192684..b0db825340 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm
@@ -9,7 +9,7 @@
faction = "synthtide"
- ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/cyber_horror
maxHealth = 175
health = 175
@@ -45,6 +45,27 @@
emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.")
say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#")
say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS")
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror.ogg'
+
+/datum/ai_holder/simple_mob/melee/evasive/cyber_horror
+ threaten = TRUE
+ threaten_delay = 1 SECOND
+ threaten_timeout = 30 SECONDS
+
+/datum/ai_holder/simple_mob/melee/cyber_horror
+ threaten = TRUE
+ threaten_delay = 1 SECOND
+ threaten_timeout = 30 SECONDS
+
+/datum/ai_holder/simple_mob/melee/hit_and_run/cyber_horror
+ threaten = TRUE
+ threaten_delay = 1 SECOND
+ threaten_timeout = 30 SECONDS
+
+/datum/ai_holder/simple_mob/ranged/kiting/cyber_horror
+ threaten = TRUE
+ threaten_delay = 1 SECOND
+ threaten_timeout = 30 SECONDS
// Fragile but dangerous
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror
@@ -52,6 +73,7 @@
desc = "What was once a phoronoid, now a empty shell of malfunctioning nanites."
icon_state = "plasma_cyber_horror"
icon_dead = "plasma_cyber_horror_dead"
+ say_list_type = /datum/say_list/cyber_horror/plasma
armor = list(melee = 40, bullet = -10, laser = 40, bio = 100, rad = 100)
maxHealth = 75
@@ -67,6 +89,9 @@
var/poison_per_bite = 3
var/poison_type = "neurophage_nanites"
+/datum/say_list/cyber_horror/plasma
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Plasma.ogg'
+
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror/apply_melee_effects(var/atom/A)
if(isliving(A))
var/mob/living/L = A
@@ -80,12 +105,15 @@
if(prob(poison_chance))
to_chat(L, "You feel nanites digging into your skin!")
L.reagents.add_reagent(poison_type, poison_per_bite)
+
+
// Mech Shredder
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror
name = "Nanite abomination"
desc = "What was once something, now an exposed shell with lashing cables."
icon_state = "ling_cyber_horror"
icon_dead = "ling_cyber_horror_dead"
+ say_list_type = /datum/say_list/cyber_horror/ling
maxHealth = 250
health = 250
@@ -96,13 +124,13 @@
base_attack_cooldown = 2.5
attack_sharp = 1
attack_edge = 1
- attack_sound = 'sound/weapons/bladeslice.ogg'
+ attack_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingMelee.ogg'
attacktext = list ("sliced", "diced", "lashed", "shredded")
// Slow as all sin
movement_cooldown = 9
movement_sound = 'sound/effects/houndstep.ogg'
- ai_holder_type = /datum/ai_holder/simple_mob/melee
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/cyber_horror
// You do NOT Want to get in touchy range of this thing.
armor = list(melee = 75, bullet = -10, laser = -25, bio = 100, rad = 100)
@@ -116,8 +144,11 @@
special_attack_cooldown = 60 SECONDS
// How long the leap telegraphing is.
var/leap_warmup = 2 SECOND
- var/leap_sound = 'sound/weapons/spiderlunge.ogg'
+ var/leap_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingLeap.ogg'
+/datum/say_list/cyber_horror/ling
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Changeling.ogg'
+
// Multiplies damage if the victim is stunned in some form, including a successful leap.
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror/apply_bonus_melee_damage(atom/A, damage_amount)
if(isliving(A))
@@ -126,7 +157,6 @@
return damage_amount * 2.5
return ..()
-
// The actual leaping attack.
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror/do_special_attack(atom/A)
set waitfor = FALSE
@@ -177,24 +207,34 @@
. = TRUE
set_AI_busy(FALSE)
+
+
//Slightly more durable fodder
/mob/living/simple_mob/mechanical/cyber_horror/vox
name = "Vox shambles"
desc = "Once a Vox now torn and changed, peices of a Durand has been grafted onto it."
icon_state = "vox_cyber_horror"
icon_dead = "vox_cyber_horror_dead"
+ say_list_type = /datum/say_list/cyber_horror/vox
armor = list(melee = 40, bullet = 30, laser = 30, bio = 100, rad = 100)
- ai_holder_type = /datum/ai_holder/simple_mob/melee
- // Hit and run mob
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/cyber_horror
+
+/datum/say_list/cyber_horror/vox
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Vox.ogg'
+
+
+// Hit and run mob
/mob/living/simple_mob/mechanical/cyber_horror/tajaran
name = "Tajaran cyber stalker"
desc = "A mangled mess of machine and fur, light seems to bounce off it."
icon_state = "tajaran_cyber_horror"
icon_dead = "tajaran_cyber_horror_dead"
+ say_list_type = /datum/say_list/cyber_horror/tajaran
+ attack_sound = 'modular_chomp/sound/weapons/meleetear.ogg'
- ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run/cyber_horror
var/cloaked_alpha = 30
var/cloaked_bonus_damage = 30
@@ -202,6 +242,9 @@
var/cloak_cooldown = 10 SECONDS
var/last_uncloak = 0
+/datum/say_list/cyber_horror/tajaran
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Tajaran.ogg'
+
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/cloak()
if(cloaked)
return
@@ -256,6 +299,7 @@
. = ..()
break_cloak()
+
//Arcing Ranged Mob
/mob/living/simple_mob/mechanical/cyber_horror/grey
name = "Twisted cyber horror"
@@ -264,13 +308,18 @@
icon_dead = "grey_cyber_horror_dead"
maxHealth = 100
health = 100
+ say_list_type = /datum/say_list/cyber_horror/grey
projectiletype = /obj/item/projectile/arc/blue_energy
- projectilesound = 'sound/weapons/Laser.ogg'
- ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
+ projectilesound = 'modular_chomp/sound/weapons/plasmaNEW.ogg'
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/cyber_horror
armor = list(melee = -30, bullet = 10, laser = 10, bio = 100, rad = 100)
+/datum/say_list/cyber_horror/grey
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Grey.ogg'
+
+
//Direct Ranged Mob
/mob/living/simple_mob/mechanical/cyber_horror/corgi
name = "Malformed Corgi"
@@ -279,14 +328,19 @@
icon_dead = "corgi_cyber_horror_dead"
maxHealth = 50
health = 50
+ say_list_type = /datum/say_list/cyber_horror/corgi
base_attack_cooldown = 4
projectiletype = /obj/item/projectile/beam/drone
- projectilesound = 'sound/weapons/weaponsounds_laserweak.ogg'
+ projectilesound = 'modular_chomp/sound/weapons/SmallLaser.ogg'
movement_sound = 'sound/effects/servostep.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening
+/datum/say_list/cyber_horror/corgi
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Corgi.ogg'
+
+
//Cats and mayhem
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror
name = "Twisted cat"
@@ -294,6 +348,7 @@
icon_state = "cat_cyber_horror"
icon_dead = "cat_cyber_horror_dead"
+ say_list_type = /datum/say_list/cyber_horror/cat
maxHealth = 40
health = 40
@@ -310,6 +365,7 @@
base_attack_cooldown = 2.5
attack_sharp = 1
attack_edge = 1
+ attack_sound = 'sound/weapons/bite.ogg'
attacktext = list("jabbed", "injected")
@@ -318,6 +374,9 @@
var/poison_per_bite = 3
var/poison_type = "mindbreaker"
+/datum/say_list/cyber_horror/cat
+ threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Cat.ogg'
+
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror/apply_melee_effects(var/atom/A)
if(isliving(A))
var/mob/living/L = A
diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi
index 75feb5ee12..541a40a4b3 100644
Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ
diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi
index 045cdaf302..6b6ffed503 100644
Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ
diff --git a/icons/mob/screen1_popups.dmi b/icons/mob/screen1_popups.dmi
index cbdbcc7b8b..e2650ce8f5 100644
Binary files a/icons/mob/screen1_popups.dmi and b/icons/mob/screen1_popups.dmi differ
diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi
index 54be219b75..6dc23e9275 100644
Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ
diff --git a/icons/obj/trash_vr.dmi b/icons/obj/trash_vr.dmi
index 0c4803f3ee..740fd0abc6 100644
Binary files a/icons/obj/trash_vr.dmi and b/icons/obj/trash_vr.dmi differ
diff --git a/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm
new file mode 100644
index 0000000000..9b28792f66
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -0,0 +1,12 @@
+/obj/item/weapon/gripper/scene
+ name = "misc gripper"
+ desc = "A simple grasping tool that can hold a variety of 'general' objects..."
+
+ can_hold = list(
+ /obj/item/capture_crystal,
+ /obj/item/clothing,
+ /obj/item/weapon/implanter,
+ /obj/item/weapon/disk/nifsoft/compliance,
+ /obj/item/weapon/handcuffs,
+ /obj/item/toy
+ )
diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm
new file mode 100644
index 0000000000..0cd595aeba
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm
@@ -0,0 +1,12 @@
+/mob/living/simple_mob/horror/Master/aerostat
+
+ say_list_type = /datum/say_list/cyber_horror/master
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/horrormaster //The final boss of every Gradius game
+
+/datum/say_list/cyber_horror/master
+ threaten_sound = 'modular_chomp/sound/mob/robots/MasterSee.ogg'
+
+/datum/ai_holder/simple_mob/ranged/kiting/horrormaster
+ threaten = TRUE
+ threaten_delay = 1 SECOND
+ threaten_timeout = 30 SECONDS
\ No newline at end of file
diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/disbot.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/disbot.dm
new file mode 100644
index 0000000000..5f0c0da1b3
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/disbot.dm
@@ -0,0 +1,12 @@
+/mob/living/simple_mob/mechanical/infectionbot //This literally just adds onto the base robot at /code/modules/mob/living/simple_mob/subtypes/mechanical/disbot_vr.dm
+ say_list_type = /datum/say_list/disbot
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/disbot
+
+
+/datum/say_list/disbot
+ threaten_sound = 'modular_chomp/sound/mob/robots/infector.ogg'
+
+/datum/ai_holder/simple_mob/melee/disbot
+ threaten = TRUE
+ threaten_delay = 1 SECOND
+ threaten_timeout = 30 SECONDS
\ No newline at end of file
diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/combat_drone.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/combat_drone.dm
new file mode 100644
index 0000000000..8c5d9c40db
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/combat_drone.dm
@@ -0,0 +1,23 @@
+/mob/living/simple_mob/mechanical/combat_drone/lesser/aerostat
+ desc = "A Vir System Authority automated combat drone with an aged apperance."
+ movement_cooldown = 10
+ say_list_type = /datum/say_list/malf_drone/drone_aerostat
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening/drone_aerostat
+
+/datum/say_list/malf_drone/drone_aerostat
+ speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
+ emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
+
+ say_understood = list("Affirmative.", "Positive.")
+ say_cannot = list("Denied.", "Negative.")
+ say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
+ say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
+ say_threaten = list("This area is condemned by Vir System Authority. Please leave immediately. You have 20 seconds to comply.")
+ say_stand_down = list("Visual lost.", "Error: Target not found.")
+ say_escalate = list("Intruder is tresspassing. Maximum force authorized by Vir System Suthority.")
+ threaten_sound = 'modular_chomp/sound/mob/robots/DroneFreezeLong.ogg'
+ stand_down_sound = 'modular_chomp/sound/mob/robots/DroneLostTarget.ogg'
+
+/datum/ai_holder/simple_mob/ranged/kiting/threatening/drone_aerostat
+ threaten_delay = 10 SECOND
+ threaten_timeout = 30 SECONDS
\ No newline at end of file
diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/gygax.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/gygax.dm
new file mode 100644
index 0000000000..be5dcc6a4d
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/gygax.dm
@@ -0,0 +1,22 @@
+/mob/living/simple_mob/mechanical/mecha/combat/gygax/aerostat
+ desc = "A Vir System Authority automated combat mech with an aged apperance."
+ ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
+ say_list = /datum/say_list/gygax_aerostat
+
+/datum/say_list/gygax_aerostat
+ speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
+ emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
+
+ say_understood = list("Affirmative.", "Positive.")
+ say_cannot = list("Denied.", "Negative.")
+ say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
+ say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
+ say_threaten = list("This area is condemned by Vir System Authority. Please leave immediately. You have 20 seconds to comply.")
+ say_stand_down = list("Visual lost.", "Error: Target not found.")
+ say_escalate = list("Intruder is tresspassing. Maximum force authorized by Vir System Suthority.")
+ threaten_sound = 'modular_chomp/sound/mob/robots/GygaxIntruder4.ogg'
+ stand_down_sound = 'modular_chomp/sound/mob/robots/GygaxDanger.ogg'
+
+/datum/ai_holder/simple_mob/ranged/kiting/threatening/drone_aerostat
+ threaten_delay = 20 SECOND
+ threaten_timeout = 30 SECONDS
\ No newline at end of file
diff --git a/modular_chomp/icons/mob/raptorborg/raptor.dmi b/modular_chomp/icons/mob/raptorborg/raptor.dmi
new file mode 100644
index 0000000000..2d07b3d794
Binary files /dev/null and b/modular_chomp/icons/mob/raptorborg/raptor.dmi differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror.ogg
new file mode 100644
index 0000000000..21cf70a6e0
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Cat.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Cat.ogg
new file mode 100644
index 0000000000..a45d87bfdd
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Cat.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Changeling.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Changeling.ogg
new file mode 100644
index 0000000000..39d57ea18b
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Changeling.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingLeap.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingLeap.ogg
new file mode 100644
index 0000000000..bb11c7898a
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingLeap.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingMelee.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingMelee.ogg
new file mode 100644
index 0000000000..66f400c9a5
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingMelee.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Corgi.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Corgi.ogg
new file mode 100644
index 0000000000..b36e96d166
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Corgi.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Grey.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Grey.ogg
new file mode 100644
index 0000000000..0c1d5af640
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Grey.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Plasma.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Plasma.ogg
new file mode 100644
index 0000000000..86fae497ce
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Plasma.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Tajaran.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Tajaran.ogg
new file mode 100644
index 0000000000..c20f634955
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Tajaran.ogg differ
diff --git a/modular_chomp/sound/mob/robots/Cyber_Horror_Vox.ogg b/modular_chomp/sound/mob/robots/Cyber_Horror_Vox.ogg
new file mode 100644
index 0000000000..a1a4132128
Binary files /dev/null and b/modular_chomp/sound/mob/robots/Cyber_Horror_Vox.ogg differ
diff --git a/modular_chomp/sound/mob/robots/DroneFreeze.ogg b/modular_chomp/sound/mob/robots/DroneFreeze.ogg
new file mode 100644
index 0000000000..d6284b6861
Binary files /dev/null and b/modular_chomp/sound/mob/robots/DroneFreeze.ogg differ
diff --git a/modular_chomp/sound/mob/robots/DroneFreezeLong.ogg b/modular_chomp/sound/mob/robots/DroneFreezeLong.ogg
new file mode 100644
index 0000000000..59eb2b4ebb
Binary files /dev/null and b/modular_chomp/sound/mob/robots/DroneFreezeLong.ogg differ
diff --git a/modular_chomp/sound/mob/robots/DroneLostTarget.ogg b/modular_chomp/sound/mob/robots/DroneLostTarget.ogg
new file mode 100644
index 0000000000..85fe3a081f
Binary files /dev/null and b/modular_chomp/sound/mob/robots/DroneLostTarget.ogg differ
diff --git a/modular_chomp/sound/mob/robots/GygaxDanger.ogg b/modular_chomp/sound/mob/robots/GygaxDanger.ogg
new file mode 100644
index 0000000000..df6d257d0e
Binary files /dev/null and b/modular_chomp/sound/mob/robots/GygaxDanger.ogg differ
diff --git a/modular_chomp/sound/mob/robots/GygaxIntruder4.ogg b/modular_chomp/sound/mob/robots/GygaxIntruder4.ogg
new file mode 100644
index 0000000000..47868c1118
Binary files /dev/null and b/modular_chomp/sound/mob/robots/GygaxIntruder4.ogg differ
diff --git a/modular_chomp/sound/mob/robots/MasterSee.ogg b/modular_chomp/sound/mob/robots/MasterSee.ogg
new file mode 100644
index 0000000000..7855751197
Binary files /dev/null and b/modular_chomp/sound/mob/robots/MasterSee.ogg differ
diff --git a/modular_chomp/sound/mob/robots/infector.ogg b/modular_chomp/sound/mob/robots/infector.ogg
new file mode 100644
index 0000000000..9407f86606
Binary files /dev/null and b/modular_chomp/sound/mob/robots/infector.ogg differ
diff --git a/modular_chomp/sound/weapons/SmallLaser.ogg b/modular_chomp/sound/weapons/SmallLaser.ogg
new file mode 100644
index 0000000000..9319ccf6e3
Binary files /dev/null and b/modular_chomp/sound/weapons/SmallLaser.ogg differ
diff --git a/modular_chomp/sound/weapons/meleetear.ogg b/modular_chomp/sound/weapons/meleetear.ogg
new file mode 100644
index 0000000000..edb5a00fca
Binary files /dev/null and b/modular_chomp/sound/weapons/meleetear.ogg differ
diff --git a/modular_chomp/sound/weapons/plasmaNEW.ogg b/modular_chomp/sound/weapons/plasmaNEW.ogg
new file mode 100644
index 0000000000..a004753006
Binary files /dev/null and b/modular_chomp/sound/weapons/plasmaNEW.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index ed46b6e224..9341f6948d 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4550,12 +4550,17 @@
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\protean\protean_species.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\traits\negative.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\traits\positive.dm"
+#include "modular_chomp\code\modules\mob\living\silicon\robot\drone\drone_items.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\donteatbossmonsters.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\simple_mob.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\simple_mob_abilities.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\teppi.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\xenomorph.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\xenomorph_abilities.dm"
+#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\horror\Master.dm"
+#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\disbot.dm"
+#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm"
+#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\greatwolf.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\vore.dm"