-0
+#define AMMO_BOX_FULL_EMPTY 2
+
+#define SUPPRESSED_NONE 0
+#define SUPPRESSED_QUIET 1 ///standard suppressed
+#define SUPPRESSED_VERY 2 /// no message
+
+//Autofire component
+/// Compatible firemode is in the gun. Wait until it's held in the user hands.
+#define AUTOFIRE_STAT_IDLE (1<<0)
+/// Gun is active and in the user hands. Wait until user does a valid click.
+#define AUTOFIRE_STAT_ALERT (1<<1)
+/// Gun is shooting.
+#define AUTOFIRE_STAT_FIRING (1<<2)
+
+#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown"
+ #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0)
+#define COMSIG_AUTOFIRE_SHOT "autofire_shot"
+ #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0)
+
+#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
+
#define MANUFACTURER_NONE null
#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
@@ -14,3 +71,28 @@
#define MANUFACTURER_DONKCO "the Donk! Co. logo"
#define MANUFACTURER_PGF "the Etherbor Industries emblem"
#define MANUFACTURER_IMPORT "Lanchester Import Co."
+
+
+/////////////////
+// PROJECTILES //
+/////////////////
+
+//bullet_act() return values
+#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
+#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
+#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
+
+#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
+
+//Projectile Reflect
+#define REFLECT_NORMAL (1<<0)
+#define REFLECT_FAKEPROJECTILE (1<<1)
+
+#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan.
+#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
+
+#define FIREMODE_SEMIAUTO "single"
+#define FIREMODE_BURST "burst"
+#define FIREMODE_FULLAUTO "auto"
+#define FIREMODE_OTHER "other"
+#define FIREMODE_OTHER_TWO "other2"
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index ff1072ffdbad..49395e9b397d 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -81,7 +81,6 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(31) ///turf/closed
#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(32) ///turf/closed/wall/material
#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(33) ///turf/closed/wall/r_wall/syndicate
-#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(34) ///turf/closed/indestructible/hotelwall
#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(35) ///turf/closed/mineral, /turf/closed/indestructible
#define SMOOTH_GROUP_BOSS_WALLS S_TURF(36) ///turf/closed/indestructible/riveted/boss
#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(37) ///turf/closed/wall/mineral/titanium/survival
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 5498fb607a33..741a0b885720 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -177,5 +177,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list(
/obj/item/tank/internals/plasmaman,
/obj/item/toy)))
-//WS Port - Internals checker
#define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 2ba7553f823c..241136c297b9 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -176,6 +176,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isidcard(I) (istype(I, /obj/item/card/id))
+#define isbankcard(I) (istype(I, /obj/item/card/bank))
+
#define isstructure(A) (istype(A, /obj/structure))
#define ismachinery(A) (istype(A, /obj/machinery))
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 2f01d324b5a0..c9d2a923953d 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -406,7 +406,11 @@
#define WABBAJACK (1<<6)
#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return;
-#define INTERACTING_WITH(X, Y) (Y in X.do_afters)
+
+#define DOING_INTERACTION(user, interaction_key) (LAZYACCESS(user.do_afters, interaction_key))
+#define DOING_INTERACTION_LIMIT(user, interaction_key, max_interaction_count) ((LAZYACCESS(user.do_afters, interaction_key) || 0) >= max_interaction_count)
+#define DOING_INTERACTION_WITH_TARGET(user, target) (LAZYACCESS(user.do_afters, target))
+#define DOING_INTERACTION_WITH_TARGET_LIMIT(user, target, max_interaction_count) ((LAZYACCESS(user.do_afters, target) || 0) >= max_interaction_count)
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 361a24697a39..9e253563fe89 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -39,8 +39,6 @@
#define ROLE_LAVALAND "Lavaland"
#define ROLE_INTERNAL_AFFAIRS "Internal Affairs Agent"
#define ROLE_FAMILIES "Familes Antagonists"
-#define ROLE_SYNDICATE_CYBERSUN "Cybersun Space Syndicate" //Ghost role syndi from Forgottenship ruin
-#define ROLE_SYNDICATE_CYBERSUN_CAPTAIN "Cybersun Space Syndicate Captain" //Forgottenship captain syndie
#define ROLE_BORER "borer"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
diff --git a/code/__DEFINES/species_clothing_defines.dm b/code/__DEFINES/species_clothing_defines.dm
index 4e8b454b7b2f..35a96d67b187 100644
--- a/code/__DEFINES/species_clothing_defines.dm
+++ b/code/__DEFINES/species_clothing_defines.dm
@@ -34,12 +34,12 @@
#define KEPORI_UNIFORM_PATH 'icons/mob/species/kepori/onmob_uniform_kepori.dmi'
#define KEPORI_SHOES_PATH 'icons/mob/species/kepori/onmob_feet_kepori.dmi'
#define KEPORI_SUIT_PATH 'icons/mob/species/kepori/onmob_suit_kepori.dmi'
-//#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi'
+#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi'
#define KEPORI_MASK_PATH 'icons/mob/species/kepori/onmob_mask_kepori.dmi'
#define KEPORI_HEAD_PATH 'icons/mob/species/kepori/onmob_head_kepori.dmi'
+#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi'
#define KEPORI_GLOVES_PATH 'icons/mob/species/kepori/onmob_hands_kepori.dmi'
-//#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi'
-//#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi'
-#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi'
-#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi'
-#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi'
+#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi'
+#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi'
+#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi'
+#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi'
diff --git a/code/__DEFINES/timed_action.dm b/code/__DEFINES/timed_action.dm
new file mode 100644
index 000000000000..90572cdc5416
--- /dev/null
+++ b/code/__DEFINES/timed_action.dm
@@ -0,0 +1,10 @@
+// timed_action_flags parameter for 'proc/do_after'
+
+// The user can move freely without canceling the do_after
+#define IGNORE_USER_LOC_CHANGE (1<<0)
+// The target can move freely without canceling the do_after
+#define IGNORE_TARGET_LOC_CHANGE (1<<1)
+/// Can do the action even if the item is no longer being held
+#define IGNORE_HELD_ITEM (1<<2)
+/// Can do the action even if the mob is incapacitated
+#define IGNORE_INCAPACITATED (1<<3)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index a9c65e8b0580..84e021599a49 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -42,6 +42,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_feathers, GLOB.kepori_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_body_feathers, GLOB.kepori_body_feathers_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_head_feathers, GLOB.kepori_head_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_tail_feathers, GLOB.kepori_tail_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_head_quills, GLOB.vox_head_quills_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_neck_quills, GLOB.vox_neck_quills_list)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 123b9a99656a..f2f3817cdaf2 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -131,6 +131,7 @@
"ipc_chassis" = pick(GLOB.ipc_chassis_list),
"ipc_screen" = pick(GLOB.ipc_screens_list),
"kepori_body_feathers" = pick(GLOB.kepori_body_feathers_list),
+ "kepori_head_feathers" = pick(GLOB.kepori_head_feathers_list),
"kepori_feathers" = pick(GLOB.kepori_feathers_list),
"kepori_tail_feathers" = pick(GLOB.kepori_tail_feathers_list),
"legs" = "Normal Legs",
@@ -279,66 +280,6 @@ GLOBAL_LIST_EMPTY(species_list)
else
return "unknown"
-///Timed action involving two mobs, the user and the target.
-/proc/do_mob(mob/user , mob/target, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks = null, ignore_loc_change = FALSE, hidden = FALSE)
- if(!user || !target)
- return FALSE
-
- if(target && INTERACTING_WITH(user, target))
- to_chat(user, "You're already interacting with [target]!")
- return
-
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/target_loc = target.loc
-
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
- var/holding = user.get_active_held_item()
- var/datum/progressbar/progbar
- var/datum/cogbar/cog
- if (progress)
- progbar = new(user, time, target)
- if(!hidden && time >= 1 SECONDS)
- cog = new(user)
-
- var/endtime = world.time+time
- var/starttime = world.time
- . = TRUE
- while (world.time < endtime)
- stoplag(1)
- if(!QDELETED(progbar))
- progbar.update(world.time - starttime)
- if(QDELETED(user) || QDELETED(target))
- . = FALSE
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
-
- if(!ignore_loc_change && ((!drifting && user.loc != user_loc) || target.loc != target_loc))
- . = FALSE
- break
-
- if(user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break
- if(!QDELETED(progbar))
- progbar.end_progress()
-
- cog?.remove()
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
-
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
if(check_clicks && next_move > world.time)
@@ -353,24 +294,40 @@ GLOBAL_LIST_EMPTY(species_list)
checked_health["health"] = health
return ..()
-///Timed action involving one mob user. Target is optional.
-/proc/do_after(mob/user, delay, needhand = TRUE, atom/target = null, progress = TRUE, datum/callback/extra_checks = null, hidden = FALSE)
+/**
+ * Timed action involving one mob user. A target can also be specified, but it is optional.
+ *
+ * Checks that `user` does not move, change hands, get stunned, etc. for the
+ * given `delay`. Returns `TRUE` on success or `FALSE` on failure.
+ *
+ * Arguments:
+ * * user - the primary "user" of the do_after.
+ * * delay - how long the do_after takes. Defaults to 3 SECONDS.
+ * * target - the (optional) target mob of the do_after. If they move/cease to exist, the do_after is cancelled.
+ * * timed_action_flags - optional flags to override certain do_after checks (see DEFINES/timed_action.dm).
+ * * progress - if TRUE, a progress bar is displayed.
+ * * extra_checks - a callback that can be used to add extra checks to the do_after. Returning false in this callback will cancel the do_after.
+ */
+/proc/do_after(mob/user, delay = 3 SECONDS, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE)
if(!user)
return FALSE
+ if(!isnum(delay))
+ CRASH("do_after was passed a non-number delay: [delay || "null"].")
- if(target && INTERACTING_WITH(user, target))
+ if(target && DOING_INTERACTION_WITH_TARGET(user, target))
to_chat(user, "You're already interacting with [target]!")
return
- var/atom/Tloc = null
- if(target && !isturf(target))
- Tloc = target.loc
-
- if(target)
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
+ if(!interaction_key && target)
+ interaction_key = target //Use the direct ref to the target
+ if(interaction_key) //Do we have a interaction_key now?
+ var/current_interaction_count = LAZYACCESS(user.do_afters, interaction_key) || 0
+ if(current_interaction_count >= max_interact_count) //We are at our peak
+ return
+ LAZYSET(user.do_afters, interaction_key, current_interaction_count + 1)
- var/atom/Uloc = user.loc
+ var/atom/user_loc = user.loc
+ var/atom/target_loc = target?.loc
var/drifting = FALSE
if(!user.Process_Spacemove(0) && user.inertia_dir)
@@ -378,136 +335,59 @@ GLOBAL_LIST_EMPTY(species_list)
var/holding = user.get_active_held_item()
- var/holdingnull = TRUE //User's hand started out empty, check for an empty hand
- if(holding)
- holdingnull = FALSE //Users hand started holding something, check to see if it's still holding that
-
delay *= user.do_after_coefficent()
var/datum/progressbar/progbar
var/datum/cogbar/cog
+
if(progress)
- progbar = new(user, delay, target || user)
+ if(user.client)
+ progbar = new(user, delay, target || user)
+
if(!hidden && delay >= 1 SECONDS)
cog = new(user)
+
var/endtime = world.time + delay
var/starttime = world.time
. = TRUE
while (world.time < endtime)
stoplag(1)
+
if(!QDELETED(progbar))
progbar.update(world.time - starttime)
if(drifting && !user.inertia_dir)
drifting = FALSE
- Uloc = user.loc
+ user_loc = user.loc
- if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke()))
+ // Check flags
+ if(QDELETED(user) \
+ || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
+ || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
+ || (!(timed_action_flags & IGNORE_INCAPACITATED) && HAS_TRAIT(user, TRAIT_INCAPACITATED)) \
+ || (extra_checks && !extra_checks.Invoke()))
. = FALSE
break
- if(isliving(user))
- var/mob/living/L = user
- if(L.IsStun() || L.IsParalyzed())
- . = FALSE
- break
-
- if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
- if((Uloc != Tloc || Tloc != user) && !drifting)
- . = FALSE
- break
-
- if(target && !(target in user.do_afters))
+ // If we have a target, we check for them moving here. We don't care about it if we're drifting or we ignore target loc change
+ if(target && (user != target) && \
+ (QDELETED(target) \
+ || (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc)))
. = FALSE
break
- if(needhand)
- //This might seem like an odd check, but you can still need a hand even when it's empty
- //i.e the hand is used to pull some item/tool out of the construction
- if(!holdingnull)
- if(!holding)
- . = FALSE
- break
- if(user.get_active_held_item() != holding)
- . = FALSE
- break
if(!QDELETED(progbar))
progbar.end_progress()
cog?.remove()
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
+ if(interaction_key)
+ LAZYREMOVE(user.do_afters, interaction_key)
/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1
. = 1
return
-///Timed action involving at least one mob user and a list of targets.
-/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks)
- if(!user)
- return FALSE
- if(!islist(targets))
- targets = list(targets)
- if(!length(targets))
- return FALSE
-
- for(var/i in targets)
- var/mob/living/target = i
- if(INTERACTING_WITH(user, target))
- to_chat(user, "You're already interacting with [target]!")
- return
-
-
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/list/originalloc = list()
- for(var/atom/target in targets)
- originalloc[target] = target.loc
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
-
- var/holding = user.get_active_held_item()
- var/datum/progressbar/progbar
- if(progress)
- progbar = new(user, time, targets[1])
-
- var/endtime = world.time + time
- var/starttime = world.time
- . = TRUE
- mainloop:
- while(world.time < endtime)
- stoplag(1)
- if(!QDELETED(progbar))
- progbar.update(world.time - starttime)
- if(QDELETED(user) || !targets)
- . = FALSE
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
- for(var/atom/target in targets)
- if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break mainloop
- if(!QDELETED(progbar))
- progbar.end_progress()
-
- for(var/thing in targets)
- var/atom/target = thing
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
-
/proc/is_species(A, species_datum)
. = FALSE
if(ishuman(A))
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 8e9a1dbc9979..c8c7b63d0a09 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1329,44 +1329,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
temp = ((temp + (temp>>3))&29127) % 63 //070707
return temp
-//same as do_mob except for movables and it allows both to drift and doesn't draw progressbar
-/proc/do_atom(atom/movable/user , atom/movable/target, time = 30, uninterruptible = 0,datum/callback/extra_checks = null)
- if(!user || !target)
- return TRUE
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/target_drifting = FALSE
- if(!target.Process_Spacemove(0) && target.inertia_dir)
- target_drifting = TRUE
-
- var/target_loc = target.loc
-
- var/endtime = world.time+time
- . = TRUE
- while (world.time < endtime)
- stoplag(1)
- if(QDELETED(user) || QDELETED(target))
- . = 0
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
- if(target_drifting && !target.inertia_dir)
- target_drifting = FALSE
- target_loc = target.loc
-
- if((!drifting && user.loc != user_loc) || (!target_drifting && target.loc != target_loc) || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break
-
//returns a GUID like identifier (using a mostly made up record format)
//guids are not on their own suitable for access or security tokens, as most of their bits are predictable.
// (But may make a nice salt to one)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index f4f000be6d57..f9edbc500142 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -46,6 +46,7 @@ GLOBAL_LIST_EMPTY(spider_legs_list)
GLOBAL_LIST_EMPTY(spider_spinneret_list)
GLOBAL_LIST_EMPTY(kepori_feathers_list)
GLOBAL_LIST_EMPTY(kepori_body_feathers_list)
+GLOBAL_LIST_EMPTY(kepori_head_feathers_list)
GLOBAL_LIST_EMPTY(kepori_tail_feathers_list)
GLOBAL_LIST_EMPTY(vox_head_quills_list)
GLOBAL_LIST_EMPTY(vox_neck_quills_list)
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 59f25efe9823..532ed3f888d7 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -212,7 +212,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items
) = 1,
list(//drinks
/obj/item/reagent_containers/food/drinks/bottle/vodka = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans/crosstalk = 1,
) = 1,
list(//sprayers
/obj/item/reagent_containers/spray = 1,
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index 3386e9952eeb..d6c720380f46 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -11,6 +11,9 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
+GLOBAL_VAR_INIT(total_merits_exchanged, 0)
+GLOBAL_VAR_INIT(hydrogen_stored, 0) // can be -/+, + meaning surplus
+
GLOBAL_LIST_EMPTY(powernets)
GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 9e9e664960ee..8ca114f10723 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -282,7 +282,10 @@ SUBSYSTEM_DEF(ticker)
to_chat(world, "Welcome to [station_name()], enjoy your stay!")
SSredbot.send_discord_message("ooc", "**A new round has begun.**")
- SEND_SOUND(world, sound('sound/roundstart/addiguana.ogg'))
+//[CELADON-EDIT]- MUSIC_CELADON
+// SEND_SOUND(world, sound('sound/roundstart/addiguana.ogg'))//CELADON-EDIT-ORIGINAL
+ SEND_SOUND(world, sound('mod_celadon/music_celadon/sound/sztart.ogg'))
+//[/CELADON-EDIT]
current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME)
@@ -576,7 +579,10 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/repair.ogg',
'sound/roundend/boowomp.ogg',
'sound/roundend/shiptestingthursday.ogg',
- 'sound/roundend/gayrights.ogg'\
+//[CELADON-EDIT]- MUSIC_CELADON
+// 'sound/roundend/gayrights.ogg'\//CELADON-EDIT-ORIGINAL
+ 'mod_celadon/music_celadon/sound/voiko_law.ogg'\
+//[/CELADON-EDIT]
)
///The reference to the end of round sound that we have chosen.
var/sound/end_of_round_sound_ref = sound(round_end_sound)
diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm
index 6ca1f44772f9..f8378c6bda6b 100644
--- a/code/controllers/subsystem/title.dm
+++ b/code/controllers/subsystem/title.dm
@@ -32,8 +32,10 @@ SUBSYSTEM_DEF(title)
file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]"
if(!file_path)
- file_path = "icons/runtime/default_title.dmi"
-
+//[CELADON-EDIT]- MUSIC_CELADON
+ //file_path = "icons/runtime/default_title.dmi"//CELADON-EDIT-ORIGINAL
+ file_path = "mod_celadon/music_celadon/icons/default_title.dmi"
+//[/CELADON-EDIT]
ASSERT(fexists(file_path))
icon = new(fcopy_rsc(file_path))
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index bde93557db14..620d93c941ae 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -41,7 +41,7 @@ SUBSYSTEM_DEF(traumas)
"spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)),
"security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)),
"lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)),
- "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)),
+ "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/human/skeleton)),
"snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/poison/snake)),
"robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai,
/mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/swarmer)),
@@ -93,7 +93,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/clothing/under/rank/security/head_of_security/alt,
/obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck,
/obj/item/clothing/under/rank/security/head_of_security/parade,
- /obj/item/clothing/under/rank/security/head_of_security/parade/female, //WS Edit - Better Command Uniforms
+ /obj/item/clothing/under/rank/security/head_of_security/parade/female,
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/melee/baton/abductor,
/obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer,
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/official,
@@ -132,7 +132,6 @@ SUBSYSTEM_DEF(traumas)
/obj/item/soulstone,
/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff,
/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard,
- /obj/item/gun/magic/staff, /obj/item/gun/magic/wand,
/obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)),
"aliens" = typecacheof(list(
diff --git a/code/datums/action.dm b/code/datums/action.dm
index ff03b689085d..de13fc002dde 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -207,6 +207,7 @@
/datum/action/item_action/toggle_firemode
name = "Toggle Firemode"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
/datum/action/item_action/rcl_col
name = "Change Cable Color"
diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm
index 733c66e9579c..3c6c0266431f 100644
--- a/code/datums/cinematic.dm
+++ b/code/datums/cinematic.dm
@@ -19,10 +19,7 @@
qdel(playing)
/atom/movable/screen/cinematic
-// [CELADON-EDIT] - EVENT_CLY
-// icon = 'icons/effects/station_explosion.dmi' - // CELADON-EDIT - ORIGINAL
- icon = 'mod_celadon/event_cly/icons/station_explosion.dmi'
-// [/CELADON-EDIT]
+ icon = 'icons/effects/station_explosion.dmi'
icon_state = "station_intact"
plane = SPLASHSCREEN_PLANE
layer = SPLASHSCREEN_LAYER
@@ -289,15 +286,4 @@ Nuke.Explosion()
Narsie()
-> Cinematic(CULT,world)
*/
-// [CELADON-ADD] - EVENT_CLY
-/datum/cinematic/colony_nuke
- id = CINEMATIC_COLONYDESTRUCT
-/datum/cinematic/colony_nuke/content()
- cinematic_sound(sound('mod_celadon/event_cly/sound/colony_explode.ogg'))
- flick("intro_colony",screen)
- sleep(35)
- flick("colony_explode",screen)
- special()
- screen.icon_state = "summary_colony"
-// [/CELADON-ADD]
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 7d3767a6aaa8..3032a98dc85c 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -51,10 +51,14 @@
/datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user)
to_chat(user, "You begin to butcher [M]...")
playsound(M.loc, butcher_sound, 50, TRUE, -1)
- if(do_mob(user, M, speed) && M.Adjacent(source))
+ if(do_after(user, speed, M) && M.Adjacent(source))
Butcher(user, M)
/datum/component/butchering/proc/startNeckSlice(obj/item/source, mob/living/carbon/human/H, mob/living/user)
+ if(DOING_INTERACTION_WITH_TARGET(user, H))
+ to_chat(user, "You're already interacting with [H]!")
+ return
+
user.visible_message("[user] is slitting [H]'s throat!", \
"You start slicing [H]'s throat!", \
"You hear a cutting noise!", ignored_mobs = H)
@@ -63,7 +67,7 @@
log_combat(user, H, "starts slicing the throat of")
playsound(H.loc, butcher_sound, 50, TRUE, -1)
- if(do_mob(user, H, clamp(500 / source.force, 30, 100)) && H.Adjacent(source))
+ if(do_after(user, clamp(500 / source.force, 30, 100), H) && H.Adjacent(source))
if(H.has_status_effect(/datum/status_effect/neck_slice))
user.show_message("[H]'s neck has already been already cut, you can't make the bleeding any worse!", MSG_VISUAL, \
"Their neck has already been already cut, you can't make the bleeding any worse!")
diff --git a/code/datums/components/crafting/recipes/tribal.dm b/code/datums/components/crafting/recipes/tribal.dm
index ec974a563fce..c831b85d7878 100644
--- a/code/datums/components/crafting/recipes/tribal.dm
+++ b/code/datums/components/crafting/recipes/tribal.dm
@@ -1,19 +1,17 @@
-/datum/crafting_recipe/bonetalisman
- name = "Bone Talisman"
- result = /obj/item/clothing/accessory/talisman
+/datum/crafting_recipe/bonearmlet
+ name = "Bone Armlet"
+ result = /obj/item/clothing/accessory/bonearmlet
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
-/datum/crafting_recipe/bonenecklace
- name = "Hunter's Necklace"
- result = /obj/item/clothing/accessory/wolftalisman
- time = 35
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/crusher_trophy/wolf_ear = 2,
- /obj/item/crusher_trophy/fang = 1)
+/datum/crafting_recipe/fangnecklace
+ name = "Wolf Fang Necklace"
+ result = /obj/item/clothing/neck/fangnecklace
+ time = 20
+ reqs = list(/obj/item/stack/sheet/sinew = 2,
+ /obj/item/mob_trophy/fang = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bonecodpiece
@@ -21,7 +19,7 @@
result = /obj/item/clothing/accessory/skullcodpiece
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/crusher_trophy/legion_skull = 1,
+ /obj/item/mob_trophy/legion_skull = 1,
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
category = CAT_PRIMAL
diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm
index 3a047d082868..b65a2d8b7e32 100644
--- a/code/datums/components/edible.dm
+++ b/code/datums/components/edible.dm
@@ -33,8 +33,10 @@ Behavior that's still missing from this component that original food items had t
var/datum/callback/after_eat
///Last time we checked for food likes
var/last_check_time
+ ///Color we use when stuffed in things
+ var/filling_color = "#FFFFFF"
-/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat)
+/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, filling_color = "#FFFFFF", datum/callback/after_eat)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
@@ -52,6 +54,7 @@ Behavior that's still missing from this component that original food items had t
src.eatverbs = eatverbs
src.junkiness = junkiness
src.after_eat = after_eat
+ src.filling_color = filling_color
var/atom/owner = parent
@@ -115,7 +118,7 @@ Behavior that's still missing from this component that original food items had t
. = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
if(eater == feeder)//If you're eating it yourself.
- if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time
+ if(!do_after(feeder, eat_time, eater)) //Gotta pass the minimal eat time
return
var/eatverb = pick(eatverbs)
if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
@@ -143,7 +146,7 @@ Behavior that's still missing from this component that original food items had t
eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \
"[feeder] cannot force any more of [parent] down your throat!")
return
- if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed
+ if(!do_after(feeder, target = eater)) //Wait 3 seconds before you can feed
return
log_combat(feeder, eater, "fed", owner.reagents.log_list())
diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm
index ec1ee58735f9..8cabee42d21c 100644
--- a/code/datums/components/fantasy/suffixes.dm
+++ b/code/datums/components/fantasy/suffixes.dm
@@ -131,11 +131,7 @@
/obj/projectile/bullet/honker = 15,
/obj/projectile/temp = 15,
/obj/projectile/ion = 15,
- /obj/projectile/magic/door = 15,
- /obj/projectile/magic/locker = 15,
- /obj/projectile/magic/fetch = 15,
/obj/projectile/beam/emitter = 15,
- /obj/projectile/magic/flying = 15,
/obj/projectile/energy/net = 15,
/obj/projectile/bullet/incendiary/c9mm = 15,
/obj/projectile/temp/hot = 15,
diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm
index 177093a49fef..f3050c7ab76c 100644
--- a/code/datums/components/fullauto.dm
+++ b/code/datums/components/fullauto.dm
@@ -8,7 +8,7 @@
var/turf/target_loc //For dealing with locking on targets due to BYOND engine limitations (the mouse input only happening when mouse moves).
var/autofire_stat = AUTOFIRE_STAT_IDLE
var/mouse_parameters
- var/autofire_shot_delay = 0.3 SECONDS //Time between individual shots.
+ var/autofire_shot_delay = 0.1 SECONDS //Time between individual shots.
var/mouse_status = AUTOFIRE_MOUSEUP //This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar.
var/enabled = TRUE
@@ -22,6 +22,7 @@
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up))
RegisterSignal(parent, COMSIG_GUN_DISABLE_AUTOFIRE, PROC_REF(disable_autofire))
RegisterSignal(parent, COMSIG_GUN_ENABLE_AUTOFIRE, PROC_REF(enable_autofire))
+ RegisterSignal(parent, COMSIG_GUN_SET_AUTOFIRE_SPEED, PROC_REF(set_autofire_speed))
if(_autofire_shot_delay)
autofire_shot_delay = _autofire_shot_delay
if(autofire_stat == AUTOFIRE_STAT_IDLE && ismob(gun.loc))
@@ -161,7 +162,7 @@
if(isgun(parent))
var/obj/item/gun/shoota = parent
- if(!shoota.on_autofire_start(shooter)) //This is needed because the minigun has a do_after before firing and signals are async.
+ if(!shoota.on_autofire_start(shooter=shooter)) //This is needed because the minigun has a do_after before firing and signals are async.
stop_autofiring()
return
if(autofire_stat != AUTOFIRE_STAT_FIRING)
@@ -242,12 +243,12 @@
// Gun procs.
-/obj/item/gun/proc/on_autofire_start(mob/living/shooter)
- if(semicd || shooter.stat || !can_trigger_gun(shooter))
- return FALSE
- if(!can_shoot())
- shoot_with_empty_chamber(shooter)
+/obj/item/gun/proc/on_autofire_start(datum/source, atom/target, mob/living/shooter, params)
+ if(current_cooldown || shooter.stat)
return FALSE
+ if(!can_shoot()) //we call pre_fire so bolts/slides work correctly
+ INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params)
+ return NONE
if(weapon_weight == WEAPON_HEAVY && (!wielded))
to_chat(shooter, "You need a more secure grip to fire [src]!")
return FALSE
@@ -262,32 +263,29 @@
/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params)
SIGNAL_HANDLER
- if(semicd || shooter.incapacitated())
+ if(current_cooldown || shooter.incapacitated())
return NONE
if(weapon_weight == WEAPON_HEAVY && (!wielded))
to_chat(shooter, "You need a more secure grip to fire [src]!")
return NONE
- if(!can_shoot())
- shoot_with_empty_chamber(shooter)
+ if(!can_shoot()) //we stop if we cant shoot but also calling pre_fire so the bolt works correctly if it's a weird open bolt weapon.
+ INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params)
return NONE
INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params)
return COMPONENT_AUTOFIRE_SHOT_SUCCESS //All is well, we can continue shooting.
/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params)
- var/obj/item/gun/akimbo_gun = shooter.get_inactive_held_item()
- var/bonus_spread = 0
- if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM)
- if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter))
- bonus_spread = dual_wield_spread
- addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1)
- process_fire(target, shooter, TRUE, params, null, bonus_spread)
-
-/datum/component/automatic_fire/proc/disable_autofire()
+ pre_fire(target, shooter, TRUE, params, null) //dual wielding is handled here
+
+/datum/component/automatic_fire/proc/disable_autofire(datum/source)
enabled = FALSE
-/datum/component/automatic_fire/proc/enable_autofire()
+/datum/component/automatic_fire/proc/enable_autofire(datum/source)
enabled = TRUE
+/datum/component/automatic_fire/proc/set_autofire_speed(datum/source, newspeed)
+ autofire_shot_delay = newspeed
+
#undef AUTOFIRE_MOUSEUP
#undef AUTOFIRE_MOUSEDOWN
diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm
index 0aa1a5a1e8cc..85701e9c7626 100644
--- a/code/datums/components/gunpoint.dm
+++ b/code/datums/components/gunpoint.dm
@@ -126,7 +126,7 @@
if(weapon.chambered && weapon.chambered.BB)
weapon.chambered.BB.damage *= damage_mult
- weapon.process_fire(target, shooter)
+ weapon.pre_fire(target, shooter)
qdel(src)
/datum/component/gunpoint/proc/cancel()
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 4728e15cc205..89831dafab72 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -258,7 +258,7 @@
return
var/datum/progressbar/progress = new(M, len, I.loc)
var/list/rejections = list()
- while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), things, I.loc, rejections, progress)))
+ while(do_after(M, 10, parent, TRUE, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), things, I.loc, rejections, progress)))
stoplag(1)
progress.end_progress()
to_chat(M, "You put everything you could [insert_preposition] [parent].")
@@ -316,7 +316,7 @@
var/turf/T = get_turf(A)
var/list/things = contents()
var/datum/progressbar/progress = new(M, length(things), T)
- while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, PROC_REF(mass_remove_from_storage), T, things, progress)))
+ while (do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, PROC_REF(mass_remove_from_storage), T, things, progress)))
stoplag(1)
progress.end_progress()
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 6d3959753a9e..1fc6d09cb2cb 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -226,43 +226,3 @@
new_form = /mob/living/simple_animal/hostile/morph
infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic!
transformed_antag_datum = /datum/antagonist/morph
-
-/datum/disease/transformation/gondola
- name = "Gondola Transformation"
- cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help
- cures = list(/datum/reagent/consumable/condensedcapsaicin) //beats the hippie crap right out of your system
- cure_chance = 80
- stage_prob = 5
- agent = "Tranquility"
- desc = "Consuming the flesh of a Gondola comes at a terrible price."
- severity = DISEASE_SEVERITY_BIOHAZARD
- visibility_flags = 0
- stage1 = list("You seem a little lighter in your step.")
- stage2 = list("You catch yourself smiling for no reason.")
- stage3 = list("A cruel sense of calm overcomes you.", "You can't feel your arms!", "You let go of the urge to hurt clowns.")
- stage4 = list("You can't feel your arms. It does not bother you anymore.", "You forgive the clown for hurting you.")
- stage5 = list("You have become a Gondola.")
- new_form = /mob/living/simple_animal/pet/gondola
-
-/datum/disease/transformation/gondola/stage_act()
- ..()
- switch(stage)
- if(2)
- if (prob(5))
- affected_mob.emote("smile")
- if (prob(20))
- affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
- if(3)
- if (prob(5))
- affected_mob.emote("smile")
- if (prob(20))
- affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
- if(4)
- if (prob(5))
- affected_mob.emote("smile")
- if (prob(20))
- affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
- if (prob(2))
- to_chat(affected_mob, "You let go of what you were holding.")
- var/obj/item/I = affected_mob.get_active_held_item()
- affected_mob.dropItemToGround(I)
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index dde90dd5dbe8..abd20fd29212 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -659,8 +659,6 @@
O.Remove(src)
visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart"
O.forceMove(drop_location())
- if(prob(20))
- O.animate_atom_living()
if(9 to 10)
ForceContractDisease(new/datum/disease/gastrolosis())
to_chat(src, "Oh, I actually feel quite alright!")
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index ff11057704c4..0c5227e41074 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -257,10 +257,16 @@
/datum/ert/frontier/assault
leader_role = /datum/antagonist/ert/frontier/leader
- roles = list(/datum/antagonist/ert/frontier, /datum/antagonist/ert/frontier/medic, /datum/antagonist/ert/frontier/engineer)
+ roles = list(/datum/antagonist/ert/frontier/better, /datum/antagonist/ert/frontier/medic, /datum/antagonist/ert/frontier/engineer)
rename_team = "Assault Frontiersmen Team"
polldesc = "a well armed squad of pirates"
+/datum/ert/frontier/unarmed //use for finer control of pirate's armaments
+ leader_role = /datum/antagonist/ert/frontier/leader/unnarmed
+ roles = list(/datum/antagonist/ert/frontier/unnarmed)
+ rename_team = "Unnarmed Frontiersmen Team"
+ polldesc = "a custom squad of pirates"
+
/datum/ert/independent
teamsize = 3
opendoors = FALSE
diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm
index 442daa0c7705..91fad1430a47 100644
--- a/code/datums/mapgen/planetary/SandGenerator.dm
+++ b/code/datums/mapgen/planetary/SandGenerator.dm
@@ -103,7 +103,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50,
/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30,
- /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 25,
+ /mob/living/simple_animal/hostile/human/hermit/survivor/random = 25,
)
/datum/biome/sand/wasteland
@@ -135,7 +135,7 @@
)
mob_spawn_chance = 1
mob_spawn_list = list(
- /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 1,
+ /mob/living/simple_animal/hostile/human/hermit/survivor/random = 1,
)
/datum/biome/sand/grass/dead
@@ -169,7 +169,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 40,
/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 30,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 20,
- /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 40,
+ /mob/living/simple_animal/hostile/human/hermit/survivor/random = 40,
)
/datum/biome/sand/acid //plains
diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm
index aed6577a5af9..62479d90e0d3 100644
--- a/code/datums/materials/pizza.dm
+++ b/code/datums/materials/pizza.dm
@@ -28,4 +28,4 @@
/datum/material/pizza/proc/make_edible(atom/source, amount, material_flags)
var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
- source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat"))
+ source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat"), filling_color = COLOR_YELLOW)
diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm
index f2ffe7c25fd2..53080247b827 100644
--- a/code/datums/mutations/actions.dm
+++ b/code/datums/mutations/actions.dm
@@ -88,67 +88,6 @@
if(direction_text)
to_chat(user,"You consider [tracking_target]'s scent. The trail leads [direction_text].")
-/datum/mutation/human/firebreath
- name = "Fire Breath"
- desc = "An ancient mutation that gives lizards breath of fire."
- quality = POSITIVE
- difficulty = 12
- locked = TRUE
- text_gain_indication = "Your throat is burning!"
- text_lose_indication = "Your throat is cooling down."
- power = /obj/effect/proc_holder/spell/aimed/firebreath
- instability = 30
- energy_coeff = 1
- power_coeff = 1
-
-/datum/mutation/human/firebreath/modify()
- if(power)
- var/obj/effect/proc_holder/spell/aimed/firebreath/S = power
- S.strength = GET_MUTATION_POWER(src)
-
-/obj/effect/proc_holder/spell/aimed/firebreath
- name = "Fire Breath"
- desc = "You can breathe fire at a target."
- school = "evocation"
- charge_max = 600
- clothes_req = FALSE
- range = 20
- projectile_type = /obj/projectile/magic/aoe/fireball/firebreath
- base_icon_state = "fireball"
- action_icon_state = "fireball0"
- sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises
- active_msg = "You built up heat in your mouth."
- deactive_msg = "You swallow the flame."
- var/strength = 1
-
-/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets)
- . = ..()
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- if(C.is_mouth_covered())
- C.adjust_fire_stacks(2)
- C.IgniteMob()
- to_chat(C,"Something in front of your mouth caught fire!")
- return FALSE
-
-/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration)
- if(!istype(P, /obj/projectile/magic/aoe/fireball))
- return
- var/obj/projectile/magic/aoe/fireball/F = P
- switch(strength)
- if(1 to 3)
- F.exp_light = strength-1
- if(4 to INFINITY)
- F.exp_heavy = strength-3
- F.exp_fire += strength
-
-/obj/projectile/magic/aoe/fireball/firebreath
- name = "fire breath"
- exp_heavy = 0
- exp_light = 0
- exp_flash = 0
- exp_fire= 4
-
/datum/mutation/human/void
name = "Void Magnet"
desc = "A rare genome that attracts odd forces not usually observed."
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 34771af91ed2..15a580a89328 100644
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -50,9 +50,13 @@
/// Type path of item to go in the glasses slot
var/glasses = null
+ var/wallet = null
+
/// Type path of item to go in the idcard slot
var/id = null
+ var/bank_card = null
+
/// Type path of item for left pocket slot
var/l_pocket = null
@@ -180,8 +184,13 @@
H.equip_to_slot_or_del(new ears(H),ITEM_SLOT_EARS, TRUE)
if(glasses)
H.equip_to_slot_or_del(new glasses(H),ITEM_SLOT_EYES, TRUE)
- if(id)
- H.equip_to_slot_or_del(new id(H),ITEM_SLOT_ID, TRUE)
+ if(!visualsOnly)
+ if(wallet)
+ H.equip_to_slot_or_del(new wallet(H),ITEM_SLOT_ID, TRUE)
+ if(id)
+ H.equip_to_slot_or_del(new id(H),ITEM_SLOT_ID, TRUE)
+ if(bank_card)
+ H.equip_to_slot_or_del(new bank_card(H),ITEM_SLOT_ID, TRUE)
if(suit_store)
H.equip_to_slot_or_del(new suit_store(H),ITEM_SLOT_SUITSTORE, TRUE)
diff --git a/code/datums/ruins/beachplanet.dm b/code/datums/ruins/beachplanet.dm
index dae334aefae1..b258ef45f0e8 100644
--- a/code/datums/ruins/beachplanet.dm
+++ b/code/datums/ruins/beachplanet.dm
@@ -2,8 +2,6 @@
/datum/map_template/ruin/beachplanet
prefix = "_maps/RandomRuins/BeachRuins/"
- allow_duplicates = FALSE
- cost = 5
ruin_type = RUINTYPE_BEACH
/datum/map_template/ruin/beachplanet/fishinghut
@@ -18,12 +16,6 @@
description = "As you draw near the ancient wall, a sense of foreboding overcomes you. You aren't sure why, but you feel this dusty structure may contain great dangers."
suffix = "beach_ancient_ruin.dmm"
-/datum/map_template/ruin/beachplanet/colony
- name = "Abandoned Beachside Colony"
- id = "beach_colony"
- description = "A abandoned colony. It seems that this colony was abandoned, for a reason or another"
- suffix = "beach_colony.dmm"
-
/datum/map_template/ruin/beachplanet/town
name = "Beachside Town"
id = "beach_town"
@@ -36,18 +28,6 @@
description = "A small pirate outpost formed from the remains of a wrecked shuttle."
suffix = "beach_pirate_crash.dmm"
-/datum/map_template/ruin/beachplanet/fallenstar
- name = "Crashed Starwalker"
- id = "crashed_star"
- description = "A Crashed Starwalker Class Pirate Ship. It's Crew is Long-Dead."
- suffix = "beach_crashed_starwalker.dmm"
-
-/datum/map_template/ruin/beachplanet/knight
- name = "Knight's Rest"
- id = "knights_rest"
- description = "An small castle holding the grave of a renowned warrior"
- suffix = "beach_knights_rest.dmm"
-
/datum/map_template/ruin/beachplanet/treasurecove
name = "Treasure Cove"
id = "beach_treasure_cove"
diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm
index a447a5b6f465..60304e86f6f0 100644
--- a/code/datums/ruins/icemoon.dm
+++ b/code/datums/ruins/icemoon.dm
@@ -2,57 +2,20 @@
/datum/map_template/ruin/icemoon
prefix = "_maps/RandomRuins/IceRuins/"
- allow_duplicates = FALSE
- cost = 5
ruin_type = RUINTYPE_ICE
-// above ground only
-
-/datum/map_template/ruin/icemoon/engioutpost
- name = "Engineer Outpost"
- id = "engioutpost"
- description = "Blown up by an unfortunate accident."
- suffix = "icemoon_surface_engioutpost.dmm"
-
-
-/datum/map_template/ruin/icemoon/hydroponicslab //Shiptest edit
+/datum/map_template/ruin/icemoon/hydroponicslab
name = "Hydroponics Lab"
id = "hydroponicslab"
description = "An abandoned hydroponics research facility containing hostile plant fauna."
suffix = "icemoon_hydroponics_lab.dmm"
-// above and below ground together
-
-
-// below ground only
-
-/datum/map_template/ruin/icemoon
- name = "underground ruin"
-
/datum/map_template/ruin/icemoon/abandonedvillage
name = "Abandoned Village"
id = "abandonedvillage"
description = "Who knows what lies within?"
suffix = "icemoon_underground_abandoned_village.dmm"
-/datum/map_template/ruin/icemoon/corpreject
- name = "NT Security Solutions Site Gamma"
- id = "corpreject"
- description = "Nanotrasen Corporate Security Solutions vault site Gamma."
- suffix = "icemoon_surface_corporate_rejects.dmm"
-
-/datum/map_template/ruin/icemoon/syndicate_outpost
- name = "Abandoned Syndicate Outpost"
- id = "syndicate-outpost-icemoon"
- description = "A outpost that used to be a staging area for nuclear operatives. The Syndicate have moved to another location, but this still remains."
- suffix = "icemoon_underground_abandoned_newcops.dmm"
-
-/datum/map_template/ruin/icemoon/drakelair
- name = "Dragon's Lair"
- id = "drake-lair"
- description = "\"First the creature's Flame breathed from beneath the stone, Hot battle-fumes, and the earth rumbled.\""
- suffix = "icemoon_underground_drakelair.dmm"
-
/datum/map_template/ruin/icemoon/brazillian_lab
name = "Barricaded Compound"
id = "brazillian-lab"
diff --git a/code/datums/ruins/jungle.dm b/code/datums/ruins/jungle.dm
index 5642e7aadacd..f1e2e16bfec8 100644
--- a/code/datums/ruins/jungle.dm
+++ b/code/datums/ruins/jungle.dm
@@ -4,92 +4,12 @@
prefix = "_maps/RandomRuins/JungleRuins/"
ruin_type = RUINTYPE_JUNGLE
-/datum/map_template/ruin/jungle/jungle_botany_ruin
- id = "jungle_botany-ruin"
- suffix = "jungle_botany.dmm"
- name = "Ruined Botany Research Facility"
- description = "A research facility of great botany discoveries. Long since abandoned, willingly or not..."
-
-/datum/map_template/ruin/jungle/ai_ikea
- name = "Space Ikea AI Shipment"
- id = "ikea-ai"
- description = "A Space Ikea Brand AI Core and Necessities Crate, it seems to have missed its intended target."
- suffix = "jungle_surface_ikea_ai.dmm"
-
-/datum/map_template/ruin/jungle/coffinpirate
- name = "Coffin-Shaped Pirate Hut"
- id = "coffinpirate"
- description = "An odd coffin shaped pirate hut that the inhabitant of died in."
- suffix = "jungle_surface_coffinpirate.dmm"
-
-//far more tasteful than its predecessor...
-/datum/map_template/ruin/jungle/lessonintrickery
- name = "Bombmaker's Cabin"
- id = "bombmakers-cabin"
- description = "Playing with bombs again, are we?"
- suffix = "jungle_surface_bombmakers_cabin.dmm"
-
-/datum/map_template/ruin/jungle/weedshack
- name = "Stoner's Cabin"
- id = "weed-shack"
- description = "The Industrial Revolution and its consequences have been a disaster for the human race."
- suffix = "jungle_surface_weed_shack.dmm"
-
-//vae's jungle ruins from bungalowstation
-/datum/map_template/ruin/jungle/pizzawave
- name = "Jungle Pizzawave"
- id = "pizzawave"
- description = "Get some pizza my dude."
- suffix = "jungle_pizzawave.dmm"
-
-/datum/map_template/ruin/jungle/nest
- name = "Jungle Xenonest"
- id = "xenonestjungle"
- description = "A Xeno nest crammed into the Jungle."
- suffix = "jungle_nest.dmm"
-
-/datum/map_template/ruin/jungle/seedling
- name = "Seedling ruin"
- id = "seedling"
- description = "A rare seedling plant."
- suffix = "jungle_seedling.dmm"
-
-/datum/map_template/ruin/jungle/hangar
- name = "Abandoned Hangar"
- id = "hangar"
- description = "An abandoned hangar containing exosuits."
- suffix = "jungle_hangar.dmm"
-
-/datum/map_template/ruin/jungle/pirate
- name = "Jungle Pirates"
- id = "piratejungle"
- description = "A group of pirates on a small ship in the jungle."
- suffix = "jungle_pirate.dmm"
-
/datum/map_template/ruin/jungle/syndicate
name = "Jungle Syndicate Bunker"
id = "syndicatebunkerjungle"
description = "A small bunker owned by the Syndicate."
suffix = "jungle_syndicate.dmm"
-/datum/map_template/ruin/jungle/village
- name = "Monkey Village"
- id = "monkeyvillage"
- description = "A small village of monkeys."
- suffix = "jungle_village.dmm"
-
-/datum/map_template/ruin/jungle/roommates
- name = "Roommates"
- id = "roommates"
- description = "A shack once inhabited by a clown and a mime... and they were roommates."
- suffix = "jungle_surface_roommates.dmm"
-
-/datum/map_template/ruin/jungle/ninjashrine
- name = "Ninja Shrine"
- id = "ninjashrine"
- description = "A ninja shrine."
- suffix = "jungle_surface_ninjashrine.dmm"
-
/datum/map_template/ruin/jungle/interceptor
name = "Old Crashed Interceptor"
id = "crashedcondor"
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index bb4bcf74b31c..816ffd685c14 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -11,64 +11,6 @@
This one seems to simulate the wintery climate of the northern provinces, including a sauna!"
suffix = "lavaland_surface_biodome_winter.dmm"
-/datum/map_template/ruin/lavaland/sin
- cost = 10
- allow_duplicates = FALSE
-
-/datum/map_template/ruin/lavaland/sin/sloth
- name = "Ruin of Sloth"
- id = "sloth"
- description = "..."
- suffix = "lavaland_surface_sloth.dmm"
- // Generates nothing but atmos runtimes and salt
- cost = 0
-
-/datum/map_template/ruin/lavaland/hierophant
- name = "Hierophant's Arena"
- id = "hierophant"
- description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares."
- suffix = "lavaland_surface_hierophant.dmm"
- allow_duplicates = FALSE
-
-/datum/map_template/ruin/lavaland/xeno_nest
- name = "Xenomorph Nest"
- id = "xeno-nest"
- description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava-filled hellscape to focus on what's really important in life. \
- Quality memes."
- suffix = "lavaland_surface_xeno_nest.dmm"
- cost = 20
-
-/datum/map_template/ruin/lavaland/survivalcapsule
- name = "Survival Capsule Ruins"
- id = "survivalcapsule"
- description = "What was once sanctuary to the common miner, is now their tomb."
- suffix = "lavaland_surface_survivalpod.dmm"
- cost = 5
-
-/datum/map_template/ruin/lavaland/pizza
- name = "Ruined Pizza Party"
- id = "pizza"
- description = "Little Timmy's birthday pizza bash took a turn for the worse when a bluespace anomaly passed by."
- suffix = "lavaland_surface_pizzaparty.dmm"
- allow_duplicates = FALSE
- cost = 5
-
-/datum/map_template/ruin/lavaland/hermit
- name = "Makeshift Shelter"
- id = "hermitcave"
- description = "A place of shelter for a lone hermit, scraping by to live another day."
- suffix = "lavaland_surface_hermit.dmm"
- allow_duplicates = FALSE
- cost = 10
-
-/datum/map_template/ruin/lavaland/miningripley
- name = "Ripley"
- id = "ripley"
- description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up."
- suffix = "lavaland_surface_random_ripley.dmm"
- allow_duplicates = FALSE
- cost = 5
-
/datum/map_template/ruin/lavaland/elephant_graveyard
name = "Elephant Graveyard"
id = "Graveyard"
@@ -77,47 +19,26 @@
allow_duplicates = FALSE
cost = 10
-/datum/map_template/ruin/lavaland/comm_outpost
- name = "Syndicate Comm Outpost"
- id = "commoutpost"
- description = "A forgotten outpost home to only a tragic tale."
- suffix = "lavaland_surface_comm_outpost.dmm"
- allow_duplicates = FALSE
- cost = 5
-
-/datum/map_template/ruin/lavaland/dwarffortress
- name = "Legion infested Dwarf Fortress"
- id = "dwarffortress"
- description = "A forgotten fortress home to only a tragic tale and infested corpses."
- suffix = "lavaland_surface_dwarffortress.dmm"
- allow_duplicates = FALSE
-
/datum/map_template/ruin/lavaland/buried_shrine
name = "Buried Shrine"
id = "buried_shrine"
description = "An ancient temple belonging to some long-gone inhabitants, wrecked and buried by the volcanic activity of it's home planet."
suffix = "lavaland_surface_buried_shrine.dmm"
-/datum/map_template/ruin/lavaland/spookycrash
- name = "Spooky Crash"
- id = "spooky_crash"
- description = "A spooky looking crash."
- suffix = "lavaland_surface_SPOOKYCRASH.dmm"
-
-/datum/map_template/ruin/lavaland/crashedpinnance
- name = "Crashed Research Pinnance"
- id = "crashed_pinnance"
- description = "A crashed shuttlecraft, looks like the pilot didn't make it."
- suffix = "lavaland_surface_crashed_pinnance.dmm"
-
-/datum/map_template/ruin/lavaland/codelab
- name = "Nanotrasen Genetic Research Facility"
- id = "codelab"
- description = "A Nanotrasen genetic research facility, abandoned and ripe for looting. Whats that goo over there?"
- suffix = "lavaland_surface_codelab.dmm"
-
/datum/map_template/ruin/lavaland/lava_canyon
name = "Lava Canyon"
id = "lava_canyon"
description = "Tectonic activity has gouged a large fissure into the surface of the planet here. Tucked in the crevasse, the remains of an ashwalker village lay in ashes."
suffix = "lavaland_surface_lava_canyon.dmm"
+
+/datum/map_template/ruin/lavaland/wrecked_factory
+ name = "Wrecked Factory"
+ id = "wreck_factory"
+ description = "A Nanotrasen processing facility, assaulted by a pirate raid that has killed most of the staff. The offices however, remain unbreached for now."
+ suffix = "lavaland_surface_wrecked_factory.dmm"
+
+/datum/map_template/ruin/lavaland/fallenstar
+ name = "Crashed Starwalker"
+ id = "crashed_star"
+ description = "A crashed pirate ship. It would seem that it's crew died a while ago."
+ suffix = "lavaland_crashed_starwalker.dmm"
diff --git a/code/datums/ruins/rockplanet.dm b/code/datums/ruins/rockplanet.dm
index 966694c400f7..f576f1a93464 100644
--- a/code/datums/ruins/rockplanet.dm
+++ b/code/datums/ruins/rockplanet.dm
@@ -2,64 +2,8 @@
/datum/map_template/ruin/rockplanet
prefix = "_maps/RandomRuins/RockRuins/"
- allow_duplicates = FALSE
- cost = 5
- ruin_type = RUINTYPE_ROCK
-
-/datum/map_template/ruin/rockplanet/heirophant
- name = "Ancient Heirophant"
- id = "rockheiro"
- description = "something dangerous"
- suffix = "rockplanet_heirophant.dmm"
-
-/* TODO: GREEBLE
-/datum/map_template/ruin/rockplanet/dangerpod
- name = "Dangerous pod"
- id = "dangerpod"
- description = "A pod holding a dangerous threat."
- suffix = "wasteplanet_dangerpod.dmm"
-*/
-
-/* //TODO: MAKE THIS A MINOR RUIN
-/datum/map_template/ruin/rockplanet/pioneer
- name = "Krusty Krab Pizza"
- id = "pioneer"
- description = "The pioneers used to ride these babies for miles!"
- suffix = "rockplanet_pioneer.dmm"
-*/
-
-/*greeble
-/datum/map_template/ruin/rockplanet/house
- name = "baracaded house"
- id = "house"
- description = "Some sort of house, baracaded in. It must be baracaded for a reason.."
- suffix = "rockplanet_house.dmm"
-*/
-
-/datum/map_template/ruin/rockplanet/mining_expedition
- name = "Mining Expedition"
- id = "expedition"
- description = "A mining operation gone wrong."
- suffix = "rockplanet_miningexpedition.dmm"
-
-/datum/map_template/ruin/rockplanet/boxsci
- name = "Abandoned science wing"
- id = "abandonedscience"
- description = "A chunk of a station that broke off.."
- suffix = "rockplanet_boxsci.dmm"
-
-/datum/map_template/ruin/rockplanet/crash_cult
- name = "Crashed Exploration Clipper"
- description = "A crashed exploration vessel. Hivebots are taking this ship apart for scrap."
- id = "crash_cult"
- suffix = "rockplanet_crash.dmm"
-
-/datum/map_template/ruin/rockplanet/saloon
- name = "Abandoned saloon"
- description = "For whatever reason, someone decided to make a colony with a indie style."
- id = "rockplanet_saloon"
- suffix = "rockplanet_saloon.dmm"
+ ruin_type = RUINTYPE_ROCK
/datum/map_template/ruin/rockplanet/harmfactory
name = "Harm Factory"
@@ -73,7 +17,6 @@
id = "rockplanet_budgetcuts"
suffix = "rockplanet_budgetcuts.dmm"
-
/datum/map_template/ruin/rockplanet/shippingdock
name = "Abandoned Shipping Dock"
description = "An abandoned shipping dock used by small cargo freighters and smugglers alike. Some malicious group seems to have trapped the place to eliminate scavengers."
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index fefb250a1208..1aedb0b9be82 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -12,12 +12,6 @@
name = "Corporate Mining Module"
description = "An old and rusty mining facility, with big ore potential."
-/datum/map_template/ruin/space/excavator_DK
- id = "Excavator-DK"
- suffix = "excavator_DK.dmm"
- name = "Excavator DK Class"
- description = "A heavily damaged DK class excavator"
-
/datum/map_template/ruin/space/bigderelict1
id = "bigderelict1"
suffix = "bigderelict1.dmm"
@@ -31,58 +25,6 @@
name = "DK Excavator 453"
description = "Formerly a thriving planetary mining outpost, now a bit of an exploded mess. One has to wonder how it got here"
-/* shiptest: Replaced with dark_glade ruin
-/datum/map_template/ruin/space/way_home
- id = "way-home"
- suffix = "way_home.dmm"
- name = "Salvation"
- description = "In the darkest times, we will find our way home."
-*/
-
-/datum/map_template/ruin/space/crashedship
- id = "crashedship"
- suffix = "crashedship.dmm"
- name = "Crashed Ship"
- description = "Among civilian vessels the most common cause of tragedy is lack of food. \
- This ship was outfitted with a multitude of food-generating features, then summarily ran into an asteroid shortly after takeoff."
-
-/datum/map_template/ruin/space/vaporwave
- id = "vaporwave"
- suffix = "vaporwave.dmm"
- name = "Aesthetic Outpost"
- description = "Pause and remember-- You are unique.You are special. Every mistake, trial, and hardship has helped to sculpt your real beauty. \
- Stop hating yourself and start appreciating and loving yourself!"
-
-/datum/map_template/ruin/space/hellfactory
- id = "hellfactory"
- suffix = "hellfactory.dmm"
- name = "Heck Brewery"
- description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive."
-
-/datum/map_template/ruin/space/cryocontainment
- id = "cryocontainment"
- suffix = "cryocontainment.dmm"
- name = "Cryogenic Containment Facility"
- description = "Some old facility where they stored something in a cryotube to experiement on, obviously it got out and now the only thing it contains is Space Carps."
-
-/datum/map_template/ruin/space/dangerous_research
- id = "dangerous_research"
- suffix = "dangerous_research.dmm"
- name = "Occult Research Station"
- description = "This station was deemed unsuitable for continued experiments, and quickly abandoned."
-
-/datum/map_template/ruin/space/macspace
- id = "fast_food"
- suffix = "Fast_Food.dmm"
- name = "Mac Space Restaurant"
- description = "A fast food reataurant in space."
-
-/datum/map_template/ruin/space/scav_mining
- id = "mining_asteroid"
- suffix = "scav_mining.dmm"
- name = "Mining asteroid"
- description = "An abandoned mining operation on an asteroid that now has new ocupants that is not happy to se you"
-
/datum/map_template/ruin/space/power_puzzle
id = "power_puzzle"
suffix = "power_puzzle.dmm"
@@ -90,42 +32,12 @@
description = "an abandoned secure storage location. there is no power left in the batteries and the former ocupants locked it pretty tight before leaving.\
You will have to power areas to raise the bolts on the doors. look out for secrets."
-/datum/map_template/ruin/space/transport18
- id = "transport18"
- suffix = "transport18.dmm"
- name = "Booze Cruise"
- description = "A freighter, damaged beyond repair and surrounded by a cloud of aluminium and... beer foam?"
-
-/datum/map_template/ruin/space/fueldepot
- id = "fueldepot"
- suffix = "fueldepot.dmm"
- name = "Fuel Depot"
- description = "An orbital refueling station with the remains of a ship lodged among the debris."
-
-/datum/map_template/ruin/space/ntfacility
- id = "ntfacility"
- suffix = "ntfacility.dmm"
- name = "Abandoned Facility"
- description = "A NT research station. Something has gone horribly wrong here."
-
/datum/map_template/ruin/space/astraeus
id = "astraeus"
suffix = "astraeus.dmm"
name = "Astraeus Ruin"
description = "This vessel served a lengthy period in the Nanotrasen fleet, before an accident in the munitions bay caused to to be destroyed while in active combat."
-/datum/map_template/ruin/space/glade
- id = "dark_glade"
- suffix = "dark_glade.dmm"
- name = "Dark Glade"
- description = "It's always dark in the ancient glade."
-
-/datum/map_template/ruin/space/syndicircle
- id = "provinggrounds"
- suffix = "provinggrounds.dmm"
- name = "Syndicate Battle Sphere"
- description = "The Syndicate Battle Sphere, complete with guns!"
-
/datum/map_template/ruin/space/singularitylab
id = "singularitylab"
suffix = "singularity_lab.dmm"
diff --git a/code/datums/ruins/wasteplanet.dm b/code/datums/ruins/wasteplanet.dm
index 80bf701526be..8083567a7c68 100644
--- a/code/datums/ruins/wasteplanet.dm
+++ b/code/datums/ruins/wasteplanet.dm
@@ -2,66 +2,26 @@
/datum/map_template/ruin/wasteplanet
prefix = "_maps/RandomRuins/WasteRuins/"
- allow_duplicates = FALSE
- cost = 5
ruin_type = RUINTYPE_WASTE
-/datum/map_template/ruin/wasteplanet/fortress
- name = "Fortress of Solitide"
- id = "solitude"
- description = "A fortress, although one you are probably more familiar with."
- suffix = "wasteplanet_fortress_of_solitide.dmm"
-
/datum/map_template/ruin/wasteplanet/weaponstest
name = "Weapons testing facility"
id = "guntested"
description = "A abandoned Nanotrasen weapons facility, presumably the place where the X-01 was manufactured."
suffix = "wasteplanet_lab.dmm"
-/datum/map_template/ruin/wasteplanet/oreprocess
- name = "Ore Processing Facility"
- id = "oreprocess"
- description = "A fortress, although one you are probably more familiar with.."
- suffix = "wasteplanet_ore_proccessing_facility.dmm"
-
/datum/map_template/ruin/wasteplanet/pandora
id = "pandora_arena"
suffix = "wasteplanet_pandora.dmm"
name = "Pandora Arena"
description = "Some... thing has settled here."
-/* Greeble
-/datum/map_template/ruin/wasteplanet/pod
- name = "Derelict pod"
- id = "oldpod"
- description = "A large, old pod."
- suffix = "wasteplanet_pod.dmm"
-*/
-
-/datum/map_template/ruin/wasteplanet/crash_kitchen
- name = "Crashed Kitchen"
- description = "A crashed part of some unlucky ship."
- id = "crash_kitchen"
- suffix = "wasteplanet_crash_kitchen.dmm"
-
/datum/map_template/ruin/wasteplanet/radiation
name = "Honorable deeds storage"
id = "wasteplanet_radiation"
description = "A dumping ground for nuclear waste."
suffix = "wasteplanet_unhonorable.dmm"
-/datum/map_template/ruin/wasteplanet/tradepost
- name = "Tradepost"
- id = "oldpod"
- description = "An abandoned tradepost."
- suffix = "wasteplanet_tradepost.dmm"
-
-/datum/map_template/ruin/wasteplanet/tarpit
- name = "Tar pit"
- id = "tarpit"
- description = "A facility once constructed over a asphalt deposit."
- suffix = "wasteplanet_tarpit.dmm"
-
/datum/map_template/ruin/wasteplanet/abandoned_mechbay
name = "Abandoned Mech Bay"
description = "A military base formerly used for staging 4 mechs and crew. God knows what's in it now."
diff --git a/code/datums/ruins/whitesands.dm b/code/datums/ruins/whitesands.dm
index 8e34f7cf379c..b3e0cb13adcc 100644
--- a/code/datums/ruins/whitesands.dm
+++ b/code/datums/ruins/whitesands.dm
@@ -4,43 +4,12 @@
prefix = "_maps/RandomRuins/SandRuins/"
ruin_type = RUINTYPE_SAND
-/datum/map_template/ruin/whitesands/starfury_crash
- name = "Starfury Crash"
- id = "starfurycrash"
- description = "The remains of an unidentified syndicate battleship has crashed here."
- suffix = "whitesands_surface_starfurycrash.dmm"
- allow_duplicates = FALSE
-
/datum/map_template/ruin/whitesands/medipen_plant
name = "Abandoned Medipen Factory"
id = "medipenplant"
description = "A once prosperous autoinjector manufacturing plant."
suffix = "whitesands_surface_medipen_plant.dmm"
-/datum/map_template/ruin/whitesands/assaultpodcrash
- name = "Crashed Syndicate Assault Drop Pod"
- id = "ws-assaultpodcrash"
- description = "The fauna of desert planets can be deadly even to equipped Syndicate Operatives."
- suffix = "whitesands_surface_assaultpodcrash.dmm"
-
-/datum/map_template/ruin/whitesands/conveniencestore
- name = "Conveniently Abandoned Convenience Store"
- id = "ws-conveniencestore"
- description = "Pretty convenient that they have a convenience store out here, huh?"
- suffix = "whitesands_surface_conveniencestore.dmm"
-
-/datum/map_template/ruin/whitesands/onlyaspoonful
- name = "Abandoned Spoon Factory"
- id = "ws-onlyaspoonful"
- description = "Literally a fucking spoon factory"
- suffix = "whitesands_surface_onlyaspoonful.dmm"
-
-/datum/map_template/ruin/whitesands/chokepoint
- name = "Chokepoint"
- id = "ws-chokepoint"
- description = "Some sort of survivors, brandishing old nanotrasen security gear."
- suffix = "whitesands_surface_chokepoint.dmm"
-
/datum/map_template/ruin/whitesands/pubbyslopcrash
name = "Pubby Slop Crash"
id = "ws-pubbyslopcrash"
@@ -48,19 +17,13 @@
suffix = "whitesands_surface_pubbyslopcrash.dmm"
//////////OUTSIDE SETTLEMENTS/RUINS//////////
-/datum/map_template/ruin/whitesands/survivors/drugstore
- name = "Abandoned Store"
- id = "ws-drugstore"
- description = "A store that once sold a variety of items and equipment."
- suffix = "whitesands_surface_camp_drugstore.dmm"
-
/datum/map_template/ruin/whitesands/survivors/saloon
name = "Hermit Saloon"
id = "ws-saloon"
description = "A western style saloon, most popular spot for the hermits to gather planetside"
suffix = "whitesands_surface_camp_saloon.dmm"
-/datum/map_template/ruin/whitesands/survivors/combination //combined extra large ruin of several other whitesands survivor ruins (excludes the drugstore)
+/datum/map_template/ruin/whitesands/survivors/combination //combined extra large ruin of several other whitesands survivor ruins
name = "Wasteland Survivor Village"
id = "ws-combination"
description = "A small encampment of nomadic survivors of the First Colony, and their descendants. By all accounts, feral and without allegance to anyone but themselves."
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 9694c4746322..029ac3ab549d 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -21,7 +21,8 @@
var/prefix = "ISV"
/// The full name of the ship's faction.
var/faction_name = "Independent"
- var/unique_ship_access = FALSE
+ /// Whether or not players from other ships can open airlocks.
+ var/unique_ship_access = TRUE
/// Set by config JSON. If true, the template's ships' "default" spawn location (when bought by a player or loaded at roundstart)
/// will be in the middle of space, instead of at an outpost.
var/space_spawn = FALSE
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index 11037374b9b3..cc6a91b2f267 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -38,7 +38,7 @@
/datum/status_effect/freon/proc/do_resist()
to_chat(owner, "You start breaking out of the ice cube...")
- if(do_mob(owner, owner, 40))
+ if(do_after(owner, 40))
if(!QDELETED(src))
to_chat(owner, "You break out of the ice cube!")
owner.remove_status_effect(/datum/status_effect/freon)
diff --git a/code/game/MapData/shuttles/srm_elder.dm b/code/game/MapData/shuttles/srm_elder.dm
index db6561b6550c..97805731ec2f 100644
--- a/code/game/MapData/shuttles/srm_elder.dm
+++ b/code/game/MapData/shuttles/srm_elder.dm
@@ -20,15 +20,38 @@
name = "shadow's locker"
desc = "The closet of equipment and attire for the aspiring shadow."
icon_state = "cabinet"
+ open_sound = 'sound/machines/wooden_closet_open.ogg'
+ close_sound = 'sound/machines/wooden_closet_close.ogg'
+
+/obj/structure/closet/secure_closet/flamebearer
+ name = "flamebearer's locker"
+ desc = "The closet of equipment an ascetic Flamebearer would require."
+ icon_state = "cabinet"
+ open_sound = 'sound/machines/wooden_closet_open.ogg'
+ close_sound = 'sound/machines/wooden_closet_close.ogg'
/obj/structure/closet/secure_closet/hunter
name = "hunter's locker"
desc = "Everything a hunter will need, held in one secure closet."
icon_state = "cabinet"
req_access = list(ACCESS_SECURITY)
+ open_sound = 'sound/machines/wooden_closet_open.ogg'
+ close_sound = 'sound/machines/wooden_closet_close.ogg'
+
+/obj/structure/closet/secure_closet/machinist
+ name = "machinist's Locker"
+ desc = "The personal closet with tools of a Machinist."
+ req_access = list(ACCESS_ENGINE)
+ icon_state = "eng_secure"
+
+/obj/structure/closet/secure_closet/collignes
+ name = "\proper hunter colligne's locker"
+ desc = "The posessions of the Hunter Colligne aboard the vessel."
+ req_access = list(ACCESS_HOP)
+ icon_state = "hop"
/obj/structure/closet/secure_closet/montagnes
- name = "\proper Hunter Montagnes Locker"
+ name = "\proper hunter montagne's locker"
desc = "The posessions of the owning Hunter Montagnes."
req_access = list(ACCESS_HOS)
icon_state = "hos"
diff --git a/code/game/area/areas/ruins/beachplanet.dm b/code/game/area/areas/ruins/beachplanet.dm
index 919d2602a3d3..d33825e0087e 100644
--- a/code/game/area/areas/ruins/beachplanet.dm
+++ b/code/game/area/areas/ruins/beachplanet.dm
@@ -1,4 +1,3 @@
-
//tropical ruins here
//Beachside Town
@@ -24,12 +23,6 @@
/area/ruin/beach/oceantown/house
-//Knight's Rest
-
-/area/ruin/beachplanet/knight
- name = "Knight's Rest"
- icon_state = "dkyellow"
-
//Ancient Complex
/area/ruin/beach/complex //seems quite simple to me
@@ -58,12 +51,6 @@
/area/ruin/beach/piratecrash/storage
name = "Scrap Hut"
-//beach_crashed_starwalker
-
-/area/ruin/beach/starwalker
- name = "Crashed Pirate Ship"
- icon_state = "green"
-
//beach_treasure_cove, the beeginning
/area/ruin/beach/treasure_cove
diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm
index d2c8d1ca61f6..8e614c8a0e79 100644
--- a/code/game/area/areas/ruins/icemoon.dm
+++ b/code/game/area/areas/ruins/icemoon.dm
@@ -1,21 +1,5 @@
// Icemoon Ruins
-//Buried Library
-
-/area/ruin/unpowered/buried_library
- name = "Buried Library"
- icon_state = "dk_yellow"
-
-//Bathhouse
-
-/area/ruin/powered/bathhouse
- name = "Bath House"
- icon_state = "dk_yellow"
- mood_bonus = 10
- mood_message = "I wish I could stay here forever.\n"
-
-//corporate rejects
-
//Corporate Rejects
/area/ruin/unpowered/corprejectrooms
diff --git a/code/game/area/areas/ruins/jungle.dm b/code/game/area/areas/ruins/jungle.dm
index 09d0e95f2f36..2d2fc76f97b1 100644
--- a/code/game/area/areas/ruins/jungle.dm
+++ b/code/game/area/areas/ruins/jungle.dm
@@ -1,10 +1,3 @@
-//Thneed Factory
-
-/area/ruin/jungle/onceler/main
- requires_power = FALSE
- name = "Thneed Factory"
- icon_state = "engine"
-
//Interceptor Crash Site
/area/ruin/jungle/interceptor/crashsite
@@ -89,10 +82,6 @@
name = "cargo dump"
icon_state = "dk_yellow"
-/area/ruin/jungle/roommates/shack
- name = "clown and mime hideout"
- icon_state = "crew_quarters"
-
// Bombed Syndicate Starport
/area/ruin/jungle/starport
name = "Bombed Air Base"
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index c4d3f75f8fb7..f7cbb414bc00 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -1,10 +1,5 @@
//Lavaland Ruins
-// Beach
-
-/area/ruin/powered/beach
- icon_state = "dk_yellow"
-
// Winter Biodome
/area/ruin/unpowered/winter_biodome
@@ -26,17 +21,6 @@
/area/ruin/unpowered/winter_biodome/sauna
name = "Biodome Sauna"
-//Gluttony
-
-/area/ruin/powered/gluttony
- icon_state = "dk_yellow"
-
-//Golem Ship
-
-/area/ruin/powered/golem_ship
- name = "Free Golem Ship"
- icon_state = "dk_yellow"
-
//Hierophant Arena
/area/ruin/unpowered/hierophant
@@ -54,66 +38,50 @@
name = "Elephant Graveyard"
icon_state = "green"
-//Syndicate Comms Outpost
-
-/area/ruin/unpowered/syndicate_outpost
- name = "Syndicate Comm Outpost"
- icon_state = "dk_yellow"
-
-
-//Xeno Nest
-
-/area/ruin/unpowered/xenonest
- name = "The Hive"
- always_unpowered = TRUE
- power_environ = FALSE
- power_equip = FALSE
- power_light = FALSE
- poweralm = FALSE
-
-// Crashed Pinnance
+//Lava Canyon
-/area/ruin/unpowered/crashsite
- name = "Crash Site"
- icon_state = "green"
-
-/area/ruin/unpowered/crashsite/pinnance
- name = "Pinnace Wreckage"
- icon_state = "dk_yellow"
- always_unpowered = TRUE
-
-/area/ruin/unpowered/codelab
- name = "Nanotrasen Genetic Research Facility"
- icon_state = "bluenew"
+/area/ruin/unpowered/scorched_hut
+ name = "Scorched Hut"
+ icon_state = "red"
-/area/ruin/unpowered/codelab/exterior
- name = "Nanotrasen Genetic Research Facility Exterior"
+// Wrecked Factory
-/area/ruin/unpowered/codelab/reception
- name = "Nanotrasen Genetic Research Reception"
- icon_state = "green"
+/area/ruin/lavaland/factory/warehouse
+ name = "Factory Warehouse"
+ icon_state = "cargo_warehouse"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/subjectrooms
- name = "Nanotrasen Genetic Research Test Subject Storage"
- icon_state = "Sleep"
+/area/ruin/lavaland/factory/foreman_office
+ name = "Foreman's Office"
+ icon_state = "purple"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/storage
- name = "Nanotrasen Genetic Research Storage"
- icon_state = "cargo_bay"
+/area/ruin/lavaland/factory/adminstrative
+ name = "Adminstrative Wing"
+ icon_state = "bridge_hallway"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/laboratory
- name = "Nanotrasen Genetic Research Laboratory"
+/area/ruin/lavaland/factory/manager_office
+ name ="Manager's Office"
icon_state = "bridge"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/maintenance
- name = "Nanotrasen Genetic Research Maintenance"
- icon_state = "dk_yellow"
+/area/ruin/lavaland/factory/lobby
+ name ="Lobby"
+ icon_state = "hallC"
+ requires_power = FALSE
-/area/ruin/unpowered/scorched_hut
- name = "Scorched Hut"
- icon_state = "red"
+/area/ruin/lavaland/factory/dorms
+ name ="Dormitory"
+ icon_state = "crew_quarters"
+ requires_power = FALSE
+//Buried Shrine
/area/ruin/unpowered/buried_shrine
name = "Buried Shrine"
icon_state = "red"
+//Crashed Starwalker
+
+/area/ruin/unpowered/crashed_starwalker
+ name = "Crashed Pirate Ship"
diff --git a/code/game/area/areas/ruins/rockplanet.dm b/code/game/area/areas/ruins/rockplanet.dm
index ddbe80529771..43516a72376a 100644
--- a/code/game/area/areas/ruins/rockplanet.dm
+++ b/code/game/area/areas/ruins/rockplanet.dm
@@ -2,11 +2,6 @@
/area/ruin/rockplanet
icon_state = "red"
-//syndicate
-/area/ruin/rockplanet/syndicate
- name = "Abandoned Syndicate Mining Facility"
- icon_state = "green"
-
//budgetcuts
/area/ruin/rockplanet/nanotrasen
name = "Abandoned Research Facility"
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index de546d164c96..45a9113d86ba 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -11,29 +11,12 @@
requires_power = FALSE
/////////////
-
-/area/ruin/space/way_home
- name = "\improper Salvation"
- icon_state = "away"
- always_unpowered = FALSE
-
// Onehalf Ruin
/area/ruin/space/has_grav/onehalf
name = "Station Fragment"
icon_state = "away"
-//Dinner For Two
-
-/area/ruin/space/has_grav/powered/dinner_for_two
- name = "Dinner for Two"
-
-//Aesthetic
-
-/area/ruin/space/has_grav/powered/aesthetic
- name = "Aesthetic"
- ambientsounds = list('sound/ambience/ambivapor1.ogg')
-
//Ruin of Derelict Oupost
/area/ruin/space/has_grav/derelictoutpost
@@ -56,210 +39,6 @@
name = "Derelict Outpost Docked Ship"
icon_state = "red"
-//Ruin of Deep Storage
-
-/area/ruin/space/has_grav/deepstorage
- name = "Deep Storage"
- icon_state = "storage"
-
-/area/ruin/space/has_grav/deepstorage/airlock
- name = "Deep Storage Airlock"
- icon_state = "quart"
-
-/area/ruin/space/has_grav/deepstorage/power
- name = "Deep Storage Power and Atmospherics Room"
- icon_state = "engi_storage"
-
-/area/ruin/space/has_grav/deepstorage/hydroponics
- name = "Deep Storage Hydroponics"
- icon_state = "garden"
-
-/area/ruin/space/has_grav/deepstorage/armory
- name = "Deep Storage Secure Storage"
- icon_state = "armory"
-
-/area/ruin/space/has_grav/deepstorage/storage
- name = "Deep Storage Storage"
- icon_state = "storage_wing"
-
-/area/ruin/space/has_grav/deepstorage/dorm
- name = "Deep Storage Dormitory"
- icon_state = "crew_quarters"
-
-/area/ruin/space/has_grav/deepstorage/kitchen
- name = "Deep Storage Kitchen"
- icon_state = "kitchen"
-
-/area/ruin/space/has_grav/deepstorage/crusher
- name = "Deep Storage Recycler"
- icon_state = "storage"
-
-//DERELICT
-
-/area/ruin/space/derelict
- name = "Derelict Station"
- icon_state = "storage"
-
-/area/ruin/space/derelict/hallway/primary
- name = "Derelict Primary Hallway"
- icon_state = "hallP"
-
-/area/ruin/space/derelict/hallway/secondary
- name = "Derelict Secondary Hallway"
- icon_state = "hallS"
-
-/area/ruin/space/derelict/hallway/primary/port
- name = "Derelict Port Hallway"
- icon_state = "hallFP"
-
-/area/ruin/space/derelict/arrival
- name = "Derelict Arrival Centre"
- icon_state = "yellow"
-
-/area/ruin/space/derelict/storage/equipment
- name = "Derelict Equipment Storage"
-
-/area/ruin/space/derelict/bridge
- name = "Derelict Control Room"
- icon_state = "bridge"
-
-/area/ruin/space/derelict/bridge/access
- name = "Derelict Control Room Access"
- icon_state = "auxstorage"
-
-/area/ruin/space/derelict/bridge/ai_upload
- name = "Derelict Computer Core"
- icon_state = "ai"
-
-/area/ruin/space/derelict/solar_control
- name = "Derelict Solar Control"
- icon_state = "engine"
-
-/area/ruin/space/derelict/se_solar
- name = "South East Solars"
- icon_state = "engine"
-
-/area/ruin/space/derelict/medical
- name = "Derelict Medbay"
- icon_state = "medbay"
-
-/area/ruin/space/derelict/medical/chapel
- name = "Derelict Chapel"
- icon_state = "chapel"
-
-/area/solar/derelict_starboard
- name = "Derelict Starboard Solar Array"
- icon_state = "panelsS"
-
-/area/solar/derelict_aft
- name = "Derelict Aft Solar Array"
- icon_state = "yellow"
-
-/area/ruin/space/derelict/singularity_engine
- name = "Derelict Singularity Engine"
- icon_state = "engine"
-
-/area/ruin/space/derelict/gravity_generator
- name = "Derelict Gravity Generator Room"
- icon_state = "red"
-
-/area/ruin/space/derelict/atmospherics
- name = "Derelict Atmospherics"
- icon_state = "red"
-
-//OLD AI SAT
-
-/area/tcommsat/oldaisat
- name = "Abandoned Satellite"
- icon_state = "tcomsatcham"
-
-//ABANDONED BOX WHITESHIP
-
-/area/ruin/space/has_grav/whiteship/box
-
- name = "Abandoned Ship"
- icon_state = "red"
-
-
-//SYNDICATE LISTENING POST STATION
-
-/area/ruin/space/has_grav/listeningstation
- name = "Listening Post"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/powered/ancient_shuttle
- name = "Ancient Shuttle"
- icon_state = "yellow"
-
-//HELL'S FACTORY OPERATING FACILITY
-
-/area/ruin/space/has_grav/hellfactory
- name = "Hell Factory"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/hellfactoryoffice
- name = "Hell Factory Office"
- icon_state = "red"
- area_flags = VALID_TERRITORY | BLOBS_ALLOWED | NOTELEPORT
-
-//Ruin of Transport 18
-
-/area/ruin/space/has_grav/transport18fore
- name = "Booze Cruise Fore"
- icon_state = "crew_quarters"
-
-/area/ruin/space/has_grav/transport18mid
- name = "Booze Cruise Hold"
- icon_state = "cargo_bay"
-
-/area/ruin/space/transport18aft
- name = "Booze Cruise Aft"
- icon_state = "engine"
-
-//Ruin of the rad ship. It's pretty rad.
-
-/area/ruin/space/has_grav/radship/Cargo1
- name = "Cargo Bay 1"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/Cargo2
- name = "Cargo Bay 2"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/Cargo3
- name = "Cargo Bay 3"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/Cargo4
- name = "Cargo Bay 4"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/EngineRoom
- name = "Engine Room"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/radship/Engineering
- name = "Engineering"
- icon_state = "engine"
-
-/area/ruin/space/has_grav/radship/MethLab
- name = "Storage"
- icon_state = "red"
-
-/area/ruin/space/has_grav/radship/CrewQuarters
- name = "Crew Quarters"
- icon_state = "green"
-
-/area/ruin/space/has_grav/radship/Hallway
- name = "Hallway"
- icon_state = "away"
-
-//MACSPACE
-
-/area/ruin/space/has_grav/powered/macspace
- name = "Mac Space Restaurant"
- icon_state = "yellow"
-
//POWER PUZZLE
/area/ruin/space/has_grav/powerpuzzle
@@ -274,20 +53,6 @@
name = "Engineering Wing"
icon_state = "yellow"
-//scav_mining
-
-/area/ruin/space/has_grav/scav_mining/entrance
- name = "Asteroid mine entrance"
- icon_state = "red"
-
-/area/ruin/space/has_grav/scav_mining/core
- name = "Asteroid mine core"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/scav_mining/dorm
- name = "Asteroid mine dorm"
- icon_state = "blue"
-
//astraeus
/area/ruin/space/has_grav/astraeus/hallway
@@ -314,44 +79,6 @@
name = "Custodial Closet"
icon_state = "green"
-/area/ruin/space/has_grav/glade
- name = "\improper Dark Glade"
- icon_state = "away"
- always_unpowered = FALSE
-
-//Syndie battle sphere
-
-/area/ruin/space/has_grav/syndicircle/halls
- name = "Syndicate Battle Sphere Primary Hallway"
- icon_state = "dk_yellow"
- color = "#a5131388"
-
-/area/ruin/space/has_grav/syndicircle/spacewalk
- name = "Syndicate Battle Sphere Shuttle Launch Site"
- icon_state = "dk_yellow"
- color = "#663cb488"
-
-/area/ruin/space/has_grav/syndicircle/research
- name = "Syndicate Battle Sphere Laboratory"
- icon_state = "dk_yellow"
- color = "#228a2b88"
-
-/area/ruin/space/has_grav/syndicircle/escape
- name = "Syndicate Battle Sphere Escape Shuttle"
- icon_state = "dk_yellow"
- color = "#92bb3388"
-
-/area/ruin/space/has_grav/syndicircle/winter
- name = "Syndicate Battle Sphere Snow Outpost"
- icon_state = "dk_yellow"
- color = "#4341c488"
-
-/area/ruin/space/has_grav/syndicircle/training
- name = "Syndicate Battle Sphere Training Grounds"
- icon_state = "dk_yellow"
- color = "#26773a88"
-
-
//Singularity Lab
/area/ruin/space/has_grav/singularitylab
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index a9d7220bd3ca..6060367ca51b 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -189,27 +189,3 @@
/area/shuttle/syndicate_scout
name = "Syndicate Scout"
-
-/area/shuttle/caravan
- requires_power = TRUE
-
-/area/shuttle/caravan/syndicate1
- name = "Syndicate Fighter"
-
-/area/shuttle/caravan/syndicate2
- name = "Syndicate Fighter"
-
-/area/shuttle/caravan/syndicate3
- name = "Syndicate Drop Ship"
-
-/area/shuttle/caravan/pirate
- name = "Pirate Cutter"
-
-/area/shuttle/caravan/freighter1
- name = "Small Freighter"
-
-/area/shuttle/caravan/freighter2
- name = "Tiny Freighter"
-
-/area/shuttle/caravan/freighter3
- name = "Tiny Freighter"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 44d5de773f94..7ffa3255ada1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -84,9 +84,6 @@
var/list/alternate_appearances
- ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
- var/list/targeted_by
-
/// Last appearance of the atom for demo saving purposes
var/image/demo_last_appearance
@@ -310,11 +307,6 @@
LAZYCLEARLIST(overlays)
LAZYCLEARLIST(managed_overlays)
- for(var/i in targeted_by)
- var/mob/M = i
- LAZYREMOVE(M.do_afters, src)
-
- targeted_by = null
QDEL_NULL(light)
if(smoothing_flags & SMOOTH_QUEUED)
@@ -976,7 +968,7 @@
var/list/things = src_object.contents()
var/datum/progressbar/progress = new(user, things.len, src)
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, TYPE_PROC_REF(/datum/component/storage, handle_mass_item_insertion), things, src_object, user, progress)))
+ while (do_after(user, 1 SECONDS, src, NONE, FALSE, CALLBACK(STR, TYPE_PROC_REF(/datum/component/storage, handle_mass_item_insertion), things, src_object, user, progress)))
stoplag(1)
progress.end_progress()
to_chat(user, "You dump as much of [src_object.parent]'s contents [STR.insert_preposition]to [src] as you can.")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 82735ff9d522..65e161f2176b 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -883,31 +883,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
explanation_text = "Steal at least five guns!"
wanted_items = list(/obj/item/gun)
-/datum/objective/steal_five_of_type/summon_magic
- name = "steal magic"
- explanation_text = "Steal at least five magical artefacts!"
- wanted_items = list()
-
-/datum/objective/steal_five_of_type/summon_magic/New()
- wanted_items = GLOB.summoned_magic_objectives
- ..()
-
-/datum/objective/steal_five_of_type/summon_magic/check_completion()
- var/list/datum/mind/owners = get_owners()
- var/stolen_count = 0
- for(var/datum/mind/M in owners)
- if(!isliving(M.current))
- continue
- var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc.
- for(var/obj/I in all_items) //Check for wanted items
- if(istype(I, /obj/item/book/granter/spell))
- var/obj/item/book/granter/spell/spellbook = I
- if(!spellbook.used || !spellbook.oneuse) //if the book still has powers...
- stolen_count++ //it counts. nice.
- else if(is_type_in_typecache(I, wanted_items))
- stolen_count++
- return stolen_count >= 5
-
//Created by admin tools
/datum/objective/custom
name = "custom"
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 4cddf93b2478..3e3939620f3c 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -436,6 +436,7 @@ Class Procs:
for(var/obj/item/I in component_parts)
I.forceMove(loc)
component_parts.Cut()
+ SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled)
qdel(src)
/**
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/beacon.dm
similarity index 100%
rename from code/game/machinery/Beacon.dm
rename to code/game/machinery/beacon.dm
diff --git a/code/game/machinery/bounty_board.dm b/code/game/machinery/bounty_board.dm
index b0991110e80d..4cc3413fe9d9 100644
--- a/code/game/machinery/bounty_board.dm
+++ b/code/game/machinery/bounty_board.dm
@@ -33,8 +33,8 @@ GLOBAL_LIST_EMPTY(request_list)
/obj/machinery/bounty_board/attackby(obj/item/I, mob/living/user, params)
. = ..()
- if(istype(I,/obj/item/card/id))
- var/obj/item/card/id/current_card = I
+ if(istype(I,/obj/item/card/bank))
+ var/obj/item/card/bank/current_card = I
if(current_card.registered_account)
current_user = current_card.registered_account
return TRUE
@@ -72,9 +72,9 @@ GLOBAL_LIST_EMPTY(request_list)
if(request.applicants)
for(var/datum/bank_account/j in request.applicants)
formatted_applicants += list(list("name" = j.account_holder, "request_id" = request.owner_account.account_id, "requestee_id" = j.account_id))
- var/obj/item/card/id/id_card = user.get_idcard()
- if(id_card?.registered_account)
- current_user = id_card.registered_account
+ var/obj/item/card/bank/bank_card = user.get_bankcard()
+ if(bank_card?.registered_account)
+ current_user = bank_card.registered_account
if(current_user)
data["accountName"] = current_user.account_holder
data["requests"] = formatted_requests
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index b665a36bcf32..d7f80fc45680 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -867,7 +867,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
say("WEEWOO! WEEWOO! Spaceport security en route!")
playsound(src, 'sound/items/weeoo1.ogg', 100, FALSE)
for(var/i, i<=3, i++)
- var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion(get_turf(src))
+ var/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion(get_turf(src))
O.target = usr
@@ -1242,7 +1242,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
newgame()
obj_flags |= EMAGGED
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion
name = "spaceport security"
desc = "Premier corporate security forces for all spaceports found along the Orion Trail."
faction = list("orion")
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 0fe059653d5c..3916ad0d4b00 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -534,9 +534,7 @@
if(ishuman(mob_occupant))
dna = C.has_dna()
- var/obj/item/card/id/I = C.get_idcard(TRUE)
- if(I)
- has_bank_account = I.registered_account
+ has_bank_account = C.get_bank_account()
if(isbrain(mob_occupant))
dna = B.stored_dna
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 6bb5a4bab561..121c93a07353 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -958,7 +958,7 @@
to_chat(user, "You need at least 2 metal sheets to reinforce [src].")
return
to_chat(user, "You start reinforcing [src].")
- if(do_after(user, 20, TRUE, src))
+ if(do_after(user, 20, src))
if(!panel_open || !S.use(2))
return
user.visible_message("[user] reinforces \the [src] with metal.",
@@ -972,7 +972,7 @@
to_chat(user, "You need at least 2 plasteel sheets to reinforce [src].")
return
to_chat(user, "You start reinforcing [src].")
- if(do_after(user, 20, TRUE, src))
+ if(do_after(user, 20, src))
if(!panel_open || !S.use(2))
return
user.visible_message("[user] reinforces \the [src] with plasteel.",
@@ -1226,7 +1226,7 @@
var/time_to_open = 50
playsound(src, pry_sound, 100, TRUE, mono_adj = TRUE) //is it aliens or just the CE being a dick?
prying_so_hard = TRUE
- if(do_after(user, time_to_open, TRUE, src))
+ if(do_after(user, time_to_open, src))
open(2)
if(density && !open(2))
to_chat(user, "Despite your attempts, [src] refuses to open.")
@@ -1414,7 +1414,7 @@
playsound(src, 'sound/machines/creaking.ogg', 100, TRUE, mono_adj = TRUE)
- if(do_after(user, time_to_open, TRUE, src))
+ if(do_after(user, time_to_open, src))
if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
to_chat(user, "Despite your efforts, [src] managed to resist your attempts to open it!")
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 81cb1908ce89..1ab88896accb 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -104,7 +104,7 @@
if(!welded && !operating && !(machine_stat & NOPOWER) && (!density || allow_hand_open(user)))
user.visible_message("[user] tries to open \the [src] manually.",
"You operate the manual lever on \the [src].")
- if (!do_after(user, 30, TRUE, src))
+ if (!do_after(user, 30, src))
return FALSE
add_fingerprint(user)
if(density)
@@ -174,7 +174,7 @@
if(is_holding_pressure())
// tell the user that this is a bad idea, and have a do_after as well
to_chat(user, "As you begin crowbarring \the [src] a gush of air blows in your face... maybe you should reconsider?")
- if(!do_after(user, 20, TRUE, src)) // give them a few seconds to reconsider their decision.
+ if(!do_after(user, 20, src)) // give them a few seconds to reconsider their decision.
return
log_game("[key_name(user)] has opened a firelock with a pressure difference at [AREACOORD(loc)]")
user.log_message("has opened a firelock with a pressure difference at [AREACOORD(loc)]", LOG_ATTACK)
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index ce705c71e434..7e3febcc482c 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -157,7 +157,7 @@
if(hasPower())
time_to_open = 15 SECONDS
- if(do_after(user, time_to_open, TRUE, src))
+ if(do_after(user, time_to_open, src))
if(density && !open(TRUE)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!"))
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/drone_dispenser.dm
similarity index 100%
rename from code/game/machinery/droneDispenser.dm
rename to code/game/machinery/drone_dispenser.dm
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 60ded054842a..0e6bc6ed6a6d 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -451,11 +451,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/proc/SetLightsAndPower()
var/total_users = LAZYLEN(masters) + LAZYLEN(holo_calls)
- if(total_users > 0)
- set_active_power()
- else
- set_idle_power()
- active_power_usage = initial(active_power_usage) * total_users
+ //active_power_usage = initial(active_power_usage) * total_users
if(total_users || replay_mode)
set_light(2)
else
diff --git a/code/game/machinery/outpost_electrolyzer.dm b/code/game/machinery/outpost_electrolyzer.dm
new file mode 100644
index 000000000000..29a37c4f95e8
--- /dev/null
+++ b/code/game/machinery/outpost_electrolyzer.dm
@@ -0,0 +1,536 @@
+//allows production of hydrogen from ice chunks
+#define MOLS_PER_ICE 50 //1 ice = 50 mols
+#define MOLS_PER_MERIT 10 //10 mols = 1 merit
+#define MERITS_PER_ICE MOLS_PER_ICE / MOLS_PER_MERIT //1 ice = 5 merits
+#define MERITS_USED_PER_TICK 2
+#define H2_PUMP_SHUTOFF_PRESSURE 4000
+#define CREDITS_TO_MERITS 4 // currently 2:5 credits to mols hydrogen. # of credits per merit
+#define OUTPOST_HYDROGEN_CUT 0.8
+#define HYDROGEN_IDEAL 45000 //used for high and low end of merit multiplier
+#define MERIT_EXPONENT 0.95 //used for diminishing returns, values closer to 1 increase returns, lower decrease.
+
+/obj/machinery/mineral/electrolyzer_unloader
+ name = "ice unloading machine"
+ icon = 'icons/obj/machines/mining_machines.dmi'
+ icon_state = "unloader"
+ density = TRUE
+ input_dir = WEST
+ output_dir = EAST
+ needs_item_input = TRUE
+ processing_flags = START_PROCESSING_MANUALLY
+
+/obj/machinery/mineral/electrolyzer_unloader/pickup_item(datum/source, atom/movable/target, atom/oldLoc)
+ if(istype(target, /obj/structure/ore_box))
+ var/obj/structure/ore_box/box = target
+ for(var/obj/item/stack/ore/ice/chunk in box)
+ unload_mineral(chunk)
+ else if(istype(target, /obj/item/stack/ore/ice))
+ var/obj/item/stack/ore/chunk = target
+ unload_mineral(chunk)
+
+// electrolyzer + console
+
+/obj/machinery/computer/electrolyzer_console
+ name = "electrolyzer console"
+ desc = "Deposits hydrogen merits, with 20% going to outpost upkeep."
+ icon = 'icons/obj/machines/mining_machines.dmi'
+ icon_state = "console"
+
+ var/obj/machinery/mineral/electrolyzer/linked_electrolyzer
+
+/obj/machinery/computer/electrolyzer_console/Initialize()
+ . = ..()
+ find_electrolyzer()
+
+/obj/machinery/computer/electrolyzer_console/proc/find_electrolyzer()
+ for(var/obj/machinery/mineral/electrolyzer/potential in oview(3,src))
+ if(linked_electrolyzer == null)
+ linked_electrolyzer = potential
+ potential.linked_console = src
+
+/obj/machinery/computer/electrolyzer_console/proc/electrolyze_item(obj/item/I)
+ var/obj/item/stack/ore/ice/S = I
+ var/meritval = round(S.get_amount() * MERITS_PER_ICE * OUTPOST_HYDROGEN_CUT,1) // causes a bit of surplus in the "outpost" supply, even if they use all of these merits for hydrogen.
+ GLOB.hydrogen_stored += S.get_amount() * MOLS_PER_ICE
+ new /obj/item/merit/bundle(drop_location(), meritval)
+ qdel(I)
+ playsound(src, 'sound/items/poster_being_created.ogg', 20, FALSE)
+
+/obj/machinery/computer/electrolyzer_console/attackby(item,mob/user)
+ if(istype(item, /obj/item/multitool))
+ var/obj/item/multitool/multi = item
+ if(istype(multi.buffer, /obj/machinery/mineral/electrolyzer))
+ linked_electrolyzer = multi.buffer
+ visible_message("Linked to [linked_electrolyzer]!")
+ return
+ return ..()
+
+/obj/machinery/mineral/electrolyzer
+ name = "ice crusher"
+ desc = "Breaks down ice into hydrogen and oxygen."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "grinder-o1"
+ input_dir = WEST
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 50
+ active_power_usage = 1000
+ max_integrity = 500
+ var/crush_damage = 1000
+ var/obj/machinery/computer/electrolyzer_console/linked_console
+ var/datum/weakref/attached_output
+
+/obj/machinery/mineral/electrolyzer/Initialize()
+ . = ..()
+ update_appearance()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
+/obj/machinery/computer/electrolyzer_console/attackby(item,mob/user)
+ if(istype(item, /obj/item/multitool))
+ var/obj/item/multitool/multi = item
+ multi.buffer = src
+ to_chat(user, "[src] stored in [multi].")
+ return
+ return ..()
+
+/obj/machinery/mineral/electrolyzer/CanAllowThrough(atom/movable/mover, border_dir)
+ . = ..()
+ if(!anchored)
+ return
+ if(border_dir == input_dir)
+ return TRUE
+
+/obj/machinery/mineral/electrolyzer/proc/on_entered(datum/source, atom/movable/AM)
+ SIGNAL_HANDLER
+ INVOKE_ASYNC(src, PROC_REF(electrolyze), AM)
+
+/obj/machinery/mineral/electrolyzer/proc/electrolyze(atom/movable/electrolyze_target, sound=TRUE)
+ if(istype(electrolyze_target, /obj/effect) || !linked_console || !isturf(electrolyze_target.loc) || (machine_stat & (BROKEN|NOPOWER)))
+ return
+ if(!istype(electrolyze_target, /obj/item/stack/ore/ice))
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE, 1)
+ if(isliving(electrolyze_target))
+ crush_living(electrolyze_target)
+ return
+ if(!ismob(electrolyze_target)) //MULCH IT IF IT AINT ICE
+ qdel(electrolyze_target)
+ return
+ else
+ linked_console.electrolyze_item(electrolyze_target)
+
+/obj/machinery/mineral/electrolyzer/proc/crush_living(mob/living/L)
+
+ L.forceMove(loc)
+
+ if(issilicon(L))
+ playsound(src, 'sound/items/welder.ogg', 50, TRUE)
+ else
+ playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
+
+ if(iscarbon(L) && L.stat == CONSCIOUS)
+ L.emote("scream")
+
+ // Instantly lie down, also go unconscious from the pain, before you die.
+ L.Unconscious(100)
+ L.adjustBruteLoss(crush_damage)
+
+//Hydrogen pump stuff
+
+/obj/machinery/atmospherics/components/unary/hydrogen_pump
+ name = "hydrogen pump"
+ desc = "Lets you use merits to buy hydrogen."
+ icon = 'icons/obj/atmos.dmi'
+ icon_state = "hydrogen_pump"
+
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 50
+ active_power_usage = 1000
+
+ density = TRUE
+ max_integrity = 400
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30)
+ layer = OBJ_LAYER
+ showpipe = TRUE
+ pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
+ var/not_processing_bug = TRUE//remove when fixed
+ var/merit
+
+/obj/machinery/atmospherics/components/unary/hydrogen_pump/examine(mob/user)
+ . = ..()
+ if(merit)
+ . += "[src] has [merit] merits, equaling [merit * MOLS_PER_MERIT] mols of hydrogen."
+ else
+ . += "[src] has no merits, get some from the electrolyzer or buy them to get hydrogen!"
+ . += "[src] is currently [on ? "on" : "off"], and shuts off above [H2_PUMP_SHUTOFF_PRESSURE] kPa."
+ . += "[src] can be Alt-Clicked to eject merits."
+ if(not_processing_bug == TRUE)
+ . += "[src] is temporarily disabled. Check back later!"
+
+/obj/machinery/atmospherics/components/unary/hydrogen_pump/process_atmos()
+ ..()
+ var/datum/gas_mixture/air = airs[1] //hydrogen out
+ not_processing_bug = FALSE
+ if(!on)
+ return
+ if(!merit || air.return_pressure() > H2_PUMP_SHUTOFF_PRESSURE)
+ on = FALSE
+ visible_message("[src] shuts off!")
+ playsound(src, 'sound/machines/switch2.ogg', 10, FALSE)
+ return
+ var/meritused
+ if(merit >= MERITS_USED_PER_TICK)
+ merit -= MERITS_USED_PER_TICK
+ meritused = MERITS_USED_PER_TICK
+ else
+ meritused = merit
+ merit = 0
+ on = FALSE
+ air.adjust_moles(GAS_HYDROGEN, meritused * MOLS_PER_MERIT)
+ GLOB.hydrogen_stored -= meritused * MOLS_PER_MERIT
+ air.set_temperature(T20C) //hydrogen from adjust_mols takes the temp of the container, and if the container is empty it defaults to 0K. this works for now
+
+/obj/machinery/atmospherics/components/unary/hydrogen_pump/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/merit/bundle))
+ var/obj/item/merit/bundle/C = I
+ merit += C.value
+ to_chat(user, "You deposit [I], for a total of [merit] merits.")
+ qdel(I)
+ return
+ return ..()
+
+/obj/machinery/atmospherics/components/unary/hydrogen_pump/attack_hand(mob/user)
+ if(..())
+ return
+ on = !on
+ if(on)
+ SSair.start_processing_machine(src)
+ playsound(src, 'sound/machines/switch3.ogg', 10, FALSE)
+ to_chat(user, "You toggle the pump [on ? "on" : "off"].")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS)
+ update_appearance()
+
+/obj/machinery/atmospherics/components/unary/hydrogen_pump/AltClick(mob/user)
+ if(merit)
+ new /obj/item/merit/bundle(drop_location(), merit)
+ merit = FALSE
+ playsound(src, 'sound/items/poster_being_created.ogg', 10, FALSE)
+ to_chat(user, "You retrieve the hydrogen merits.")
+ else
+ to_chat(user, "There were no merits left to retrieve.")
+
+
+//Hydrogen exchange
+
+/obj/machinery/computer/hydrogen_exchange
+ name = "Hydrogen Exchange"
+ desc = "Credits to Merits at reasonable rates!"
+ icon_screen = "exchange"
+ icon_keyboard = "power_key"
+
+ //GLOB.total_merits_exchanged starts at 0
+ var/merits = NONE
+ var/credits = NONE
+
+/obj/machinery/computer/hydrogen_exchange/attackby(obj/item/I, mob/user)
+ var/value = 0
+ if(istype(I, /obj/item/spacecash/bundle))
+ var/obj/item/spacecash/bundle/C = I
+ value = C.value
+ else if(istype(I, /obj/item/holochip))
+ var/obj/item/holochip/H = I
+ value = H.credits
+ if(value)
+ credits += value
+ to_chat(user, "You deposit [I], for a total of [credits] credits.")
+ qdel(I)
+ return
+ if(istype(I, /obj/item/merit/bundle))
+ var/obj/item/merit/bundle/C = I
+ merits += C.value
+ to_chat(user, "You deposit [I], for a total of [merits] merits.")
+ qdel(I)
+ return
+ return ..()
+
+/obj/machinery/computer/hydrogen_exchange/proc/meritmultiplier()
+ var/extra = clamp(((GLOB.hydrogen_stored / HYDROGEN_IDEAL) + 1), 0, 2) * 0.3 //results in a number between 0 and .6
+ var/actual = round((0.4 + extra), 0.01) //.4 on low end, 1 on high end
+ return actual
+
+/obj/machinery/computer/hydrogen_exchange/proc/dispense_funds()
+ var/makenoise
+ if(merits)
+ new /obj/item/merit/bundle(drop_location(), merits)
+ merits = 0
+ makenoise = TRUE
+ if(credits)
+ new /obj/item/spacecash/bundle(drop_location(), credits)
+ credits = 0
+ makenoise = TRUE
+ if(makenoise)
+ playsound(src, 'sound/machines/coindrop.ogg', 20, FALSE)
+
+/obj/machinery/computer/hydrogen_exchange/proc/resetmerits() //debug proc
+ GLOB.total_merits_exchanged = 0
+
+/obj/machinery/computer/hydrogen_exchange/proc/convert_to_credits()
+ if(merits)
+ playsound(src, 'sound/machines/pda_button1.ogg', 20, FALSE)
+ var/oldtotal = GLOB.total_merits_exchanged ** MERIT_EXPONENT
+ var/newtotal = (GLOB.total_merits_exchanged + merits) ** MERIT_EXPONENT
+ var/reducedmerits = newtotal - oldtotal
+ GLOB.total_merits_exchanged += merits
+ credits += round(reducedmerits * CREDITS_TO_MERITS, 1)
+ merits = 0
+ else
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 20, FALSE)
+
+/obj/machinery/computer/hydrogen_exchange/proc/convert_to_merits()
+ if(credits)
+ playsound(src, 'sound/machines/pda_button1.ogg', 20, FALSE)
+ merits += round(credits * meritmultiplier() / CREDITS_TO_MERITS, 1)
+ credits = 0
+ else
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 20, FALSE)
+
+/obj/machinery/computer/hydrogen_exchange/AltClick(mob/user)
+ dispense_funds()
+ to_chat(user, "You force the credits and merits out of the machine.")
+
+/obj/machinery/computer/hydrogen_exchange/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "HydrogenExchange", name)
+ ui.open()
+
+/obj/machinery/computer/hydrogen_exchange/ui_data(mob/user)
+ var/next_merit_rate
+ if(GLOB.total_merits_exchanged)
+ next_merit_rate = round((GLOB.total_merits_exchanged ** MERIT_EXPONENT) / GLOB.total_merits_exchanged * CREDITS_TO_MERITS, 0.01)
+ else
+ next_merit_rate = CREDITS_TO_MERITS
+ var/list/data = list()
+ data["credits"] = credits
+ data["merits"] = merits
+ data["next_merit_rate"] = next_merit_rate
+ data["credits_to_merits"] = CREDITS_TO_MERITS
+ data["credit_tax"] = (1 - meritmultiplier()) * 100
+ return data
+
+/obj/machinery/computer/hydrogen_exchange/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("convert_to_credits")
+ convert_to_credits()
+ . = TRUE
+ if("convert_to_merits")
+ convert_to_merits()
+ . = TRUE
+ if("dispense")
+ dispense_funds()
+ . = TRUE
+
+//SCRIP!
+
+/obj/item/merit
+ name = "hydrogen?"
+ desc = "If you can see this, please make a bug report. If you're a mapper, use the bundle subtype!"
+ icon = 'icons/obj/economy.dmi'
+ icon_state = "merit0"
+ throwforce = 1
+ throw_speed = 2
+ throw_range = 2
+ w_class = WEIGHT_CLASS_TINY
+ var/value = 0
+ grind_results = list(/datum/reagent/iron = 10)
+
+/obj/item/merit/Initialize(mapload, amount)
+ . = ..()
+ if(amount)
+ value = amount
+ update_appearance()
+
+/obj/item/merit/attackby(obj/item/I, mob/user)
+ if(!istype(I, /obj/item/merit))
+ return
+ var/obj/item/merit/bundle/bundle
+ if(istype(I, /obj/item/merit/bundle))
+ bundle = I
+ else
+ var/obj/item/merit/cash = I
+ bundle = new (loc)
+ bundle.value = cash.value
+ user.dropItemToGround(cash)
+ qdel(cash)
+
+ bundle.value += value
+ bundle.update_appearance()
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.dropItemToGround(src)
+ H.dropItemToGround(bundle)
+ H.put_in_hands(bundle)
+ to_chat(user, "You add [value] merits worth of money to the bundle.
It now holds [bundle.value] merits.")
+ qdel(src)
+
+/obj/item/merit/Destroy()
+ . = ..()
+ value = 0 // Prevents money from be duplicated anytime.//I'll trust eris on this one
+
+/obj/item/merit/bundle
+ icon_state = "merit16"
+
+/obj/item/merit/bundle/Initialize()
+ . = ..()
+ update_appearance()
+
+/obj/item/merit/bundle/update_appearance()
+ icon_state = "nothing"
+ cut_overlays()
+ var/remaining_value = value
+ var/iteration = 0
+ var/coins_only = TRUE
+ var/list/coin_denominations = list(16, 4, 1)
+ var/list/banknote_denominations = list(4096, 1024, 256, 64)
+ for(var/i in banknote_denominations)
+ while(remaining_value >= i && iteration < 50)
+ remaining_value -= i
+ iteration++
+ var/image/banknote = image('icons/obj/economy.dmi', "merit[i]")
+ var/matrix/M = matrix()
+ M.Translate(rand(-6, 6), rand(-4, 8))
+ banknote.transform = M
+ overlays += banknote
+ coins_only = FALSE
+
+ if(remaining_value)
+ for(var/i in coin_denominations)
+ while(remaining_value >= i && iteration < 50)
+ remaining_value -= i
+ iteration++
+ var/image/coin = image('icons/obj/economy.dmi', "merit[i]")
+ var/matrix/M = matrix()
+ M.Translate(rand(-6, 6), rand(-4, 8))
+ coin.transform = M
+ overlays += coin
+
+ if(coins_only)
+ if(value == 1)
+ name = "one hydrogen merit"
+ desc = "Heavier then it looks."
+ drop_sound = 'sound/items/handling/coin_drop.ogg'
+ pickup_sound = 'sound/items/handling/coin_pickup.ogg'
+ else
+ name = "[value] hydrogen merits"
+ desc = "Heavier than they look."
+ gender = PLURAL
+ drop_sound = 'sound/items/handling/coin_drop.ogg'
+ pickup_sound = 'sound/items/handling/coin_pickup.ogg'
+ else
+ if(value <= 3000)
+ name = "[value] hydrogen merits"
+ gender = NEUTER
+ desc = "Some cold, hard cash."
+ drop_sound = 'sound/items/handling/dosh_drop.ogg'
+ pickup_sound = 'sound/items/handling/dosh_pickup.ogg'
+ else
+ name = "[value] hydrogen merit"
+ gender = NEUTER
+ desc = "That's a lot of dosh."
+ drop_sound = 'sound/items/handling/dosh_drop.ogg'
+ pickup_sound = 'sound/items/handling/dosh_pickup.ogg'
+ return ..()
+
+/obj/item/merit/bundle/attack_self(mob/user)
+ var/cashamount = input(user, "How many merits do you want to take? (0 to [value])", "Take Merits", 20) as num
+ cashamount = round(clamp(cashamount, 0, value))
+ if(!cashamount)
+ return
+
+ if(!Adjacent(user))
+ to_chat(user, "You need to be in arm's reach for that!")
+ return
+
+ value -= cashamount
+ if(!value)
+ user.dropItemToGround(src)
+ qdel(src)
+
+ var/obj/item/merit/bundle/bundle = new (user.loc)
+ bundle.value = cashamount
+ update_appearance()
+
+/obj/item/merit/bundle/AltClick(mob/living/user)
+ var/cashamount = input(user, "How many merits do you want to take? (0 to [value])", "Take Merits", 20) as num
+ cashamount = round(clamp(cashamount, 0, value))
+ if(!cashamount)
+ return
+
+ else if(!Adjacent(user))
+ to_chat(user, "You need to be in arm's reach for that!")
+ return
+
+ value -= cashamount
+ if(!value)
+ user.dropItemToGround(src)
+ qdel(src)
+
+ var/obj/item/merit/bundle/bundle = new (user.loc)
+ bundle.value = cashamount
+ bundle.update_appearance()
+ user.put_in_hands(bundle)
+ update_appearance()
+
+/obj/item/merit/bundle/attack_hand(mob/user)
+ if(user.get_inactive_held_item() != src)
+ return ..()
+ if(value == 0)//may prevent any edge case duping
+ qdel(src)
+ return
+ value--
+ user.put_in_hands(new /obj/item/merit/bundle(loc, 1))
+ update_appearance()
+
+//bundles for mapping + testing
+
+/obj/item/merit/bundle/m1
+ value = 1
+ icon_state = "merit1"
+
+/obj/item/merit/bundle/m4
+ value = 4
+ icon_state = "merit4"
+
+/obj/item/merit/bundle/m16
+ value = 16
+ icon_state = "merit16"
+
+/obj/item/merit/bundle/m64
+ value = 64
+ icon_state = "merit64"
+
+/obj/item/merit/bundle/m256
+ value = 256
+ icon_state = "merit256"
+
+/obj/item/merit/bundle/m1024
+ value = 1024
+ icon_state = "merit1024"
+
+/obj/item/merit/bundle/m4096
+ value = 4096
+ icon_state = "merit4096"
+
+#undef MOLS_PER_ICE
+#undef MOLS_PER_MERIT
+#undef MERITS_PER_ICE
+#undef MERITS_USED_PER_TICK
+#undef H2_PUMP_SHUTOFF_PRESSURE
+#undef CREDITS_TO_MERITS
+#undef MERIT_EXPONENT
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 2720443d2424..b0e030206a0f 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -21,6 +21,7 @@
/obj/item/ammo_box/magazine/recharge,
/obj/item/modular_computer,
/obj/item/gun/ballistic/automatic/powered,
+ /obj/item/gun/ballistic/automatic/assault/e40,
))
/obj/machinery/recharger/RefreshParts()
diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm
index 351f1c42ae5e..a36bf79a41b3 100644
--- a/code/game/machinery/roulette_machine.dm
+++ b/code/game/machinery/roulette_machine.dm
@@ -39,7 +39,7 @@
var/chosen_bet_type = "0"
var/last_anti_spam = 0
var/anti_spam_cooldown = 20
- var/obj/item/card/id/my_card
+ var/obj/item/card/bank/my_card
var/playing = FALSE
var/locked = FALSE
var/drop_dir = SOUTH
@@ -81,7 +81,7 @@
data["Spinning"] = playing
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/obj/item/card/id/C = H.get_idcard(TRUE)
+ var/obj/item/card/bank/C = H.get_bankcard()
if(C)
data["AccountBalance"] = C.registered_account.account_balance
else
@@ -114,7 +114,7 @@
return
if(playing)
return ..()
- if(istype(W, /obj/item/card/id))
+ if(istype(W, /obj/item/card/bank))
playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE)
if(machine_stat & MAINT || !on || locked)
@@ -122,7 +122,7 @@
return FALSE
if(my_card)
- var/obj/item/card/id/player_card = W
+ var/obj/item/card/bank/player_card = W
if(player_card.registered_account.account_balance < chosen_bet_amount) //Does the player have enough funds
audible_message("You do not have the funds to play! Lower your bet or get more money.")
playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE)
@@ -167,7 +167,7 @@
addtimer(CALLBACK(src, PROC_REF(play), user, player_card, chosen_bet_type, chosen_bet_amount, potential_payout), 4) //Animation first
return TRUE
else
- var/obj/item/card/id/new_card = W
+ var/obj/item/card/bank/new_card = W
if(new_card.registered_account)
var/msg = stripped_input(user, "Name of your roulette wheel:", "Roulette Naming", "Roulette Machine")
if(!msg)
@@ -181,7 +181,7 @@
return ..()
///Proc called when player is going to try and play
-/obj/machinery/roulette/proc/play(mob/user, obj/item/card/id/player_id, bet_type, bet_amount, potential_payout)
+/obj/machinery/roulette/proc/play(mob/user, obj/item/card/bank/player_id, bet_type, bet_amount, potential_payout)
var/payout = potential_payout
@@ -203,7 +203,7 @@
playsound(src, 'sound/machines/piston_lower.ogg', 70)
///Ran after a while to check if the player won or not.
-/obj/machinery/roulette/proc/finish_play(obj/item/card/id/player_id, bet_type, bet_amount, potential_payout, rolled_number)
+/obj/machinery/roulette/proc/finish_play(obj/item/card/bank/player_id, bet_type, bet_amount, potential_payout, rolled_number)
last_spin = rolled_number
var/is_winner = check_win(bet_type, bet_amount, rolled_number) //Predetermine if we won
diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm
index c6256355ca13..94dd0d98bd89 100644
--- a/code/game/machinery/shuttle/shuttle_engine.dm
+++ b/code/game/machinery/shuttle/shuttle_engine.dm
@@ -8,6 +8,7 @@
desc = "A thruster for shuttles."
circuit = /obj/item/circuitboard/machine/shuttle/engine
CanAtmosPass = FALSE //so people can actually tend to their engines
+ dir = EAST //most ships face east
///Whether or not the engine is enabled and can be used. Controlled from helm consoles and by hitting with a multitool.
var/enabled = TRUE
///How much thrust this engine generates when burned fully.
diff --git a/code/game/machinery/shuttle/shuttle_engine_types.dm b/code/game/machinery/shuttle/shuttle_engine_types.dm
index 4a94dda88918..58f12ca70fd9 100644
--- a/code/game/machinery/shuttle/shuttle_engine_types.dm
+++ b/code/game/machinery/shuttle/shuttle_engine_types.dm
@@ -85,9 +85,16 @@
if(!found.anchored)
continue
attached_heater = WEAKREF(found)
+ var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater?.resolve()
+ RegisterSignal(resolved_heater, COMSIG_OBJ_DECONSTRUCT, PROC_REF(remove_heater))
update_icon_state()
return TRUE
+/obj/machinery/power/shuttle/engine/fueled/proc/remove_heater(datum/source, disassembled)
+ SIGNAL_HANDLER
+
+ attached_heater = null
+
/obj/machinery/power/shuttle/engine/fueled/plasma
name = "plasma thruster"
desc = "A thruster that burns plasma from an adjacent heater to create thrust."
@@ -121,6 +128,90 @@
// [/CELADON-EDIT] - кто вообще видел эти движки в игре ???
//All fuel code already handled
+/**
+ * ### Combustion/Fire engines
+ * Engines that use oxidizer and fuel to output thrust. Theoretically works with any mix of fuels and oxiders. Wish me luck.
+*/
+
+/obj/machinery/power/shuttle/engine/fire
+ name = "combustion thruster"
+ desc = "A thruster that burns fuel with oxider that is stored in an adjacent heater."
+ icon_state = "burst_plasma"
+ icon_state_off = "burst_plasma_off"
+ circuit = /obj/item/circuitboard/machine/shuttle/engine/fire
+
+ idle_power_usage = 0
+ ///what portion of the mols in the attached heater to "burn"
+ var/fuel_consumption = 0.0125
+ //multiplier for thrust
+ thrust = 3
+ //used by stockparts, efficiency_multiplier
+ var/consumption_multiplier = 1
+ //If this engine should create heat when burned.
+ var/heat_creation = FALSE
+ //A weakref of the connected engine heater with fuel.
+ var/datum/weakref/attached_heater
+
+
+/obj/machinery/power/shuttle/engine/fire/burn_engine(percentage = 100, deltatime)
+ . = ..()
+ var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
+ if(!resolved_heater)
+ return
+ if(heat_creation)
+ heat_engine()
+ var/actual_consumption = fuel_consumption * (percentage / 100) * deltatime * consumption_multiplier
+ return resolved_heater.consume_fuel(actual_consumption) * thrust //this proc returns the min of the fuel/oxy possible burns, multiply by our thrust value
+
+/obj/machinery/power/shuttle/engine/fire/return_fuel()
+ . = ..()
+ var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
+ return resolved_heater?.return_gas()
+
+/obj/machinery/power/shuttle/engine/fire/return_fuel_cap()
+ . = ..()
+ var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
+ return resolved_heater?.return_gas_capacity()
+
+/obj/machinery/power/shuttle/engine/fire/screwdriver_act(mob/living/user, obj/item/I)
+ . = ..()
+ update_icon_state()
+
+/obj/machinery/power/shuttle/engine/fire/update_engine()
+ if(!..())
+ return
+ if(!attached_heater && !set_heater())
+ thruster_active = FALSE
+ return FALSE
+
+/obj/machinery/power/shuttle/engine/fire/proc/set_heater()
+ for(var/direction in GLOB.cardinals)
+ for(var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/found in get_step(get_turf(src), direction))
+ if(found.dir != dir)
+ continue
+ if(found.panel_open)
+ continue
+ if(!found.anchored)
+ continue
+ attached_heater = WEAKREF(found)
+ var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
+ RegisterSignal(resolved_heater, COMSIG_OBJ_DECONSTRUCT, PROC_REF(remove_heater))
+ update_icon_state()
+ return TRUE
+
+/obj/machinery/power/shuttle/engine/fire/proc/remove_heater(datum/source, disassembled)
+ SIGNAL_HANDLER
+
+ var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
+ UnregisterSignal(resolved_heater, COMSIG_OBJ_DECONSTRUCT)
+ attached_heater = null
+
+/obj/machinery/power/shuttle/engine/fire/RefreshParts()
+ var/laz = 0
+ for(var/obj/item/stock_parts/micro_laser/L in component_parts)
+ laz += L.rating
+ consumption_multiplier = laz
+
/**
* ### Ion Engines
* Engines that convert electricity to thrust. Yes, I know that's not how it works, it needs a propellant, but this is a video game.
@@ -163,6 +254,7 @@
name = "electric engine precharger"
desc = "A medium-capacity, high transfer superconducting magnetic energy storage unit specially made for use with shuttle engines."
icon = 'icons/obj/shuttle.dmi'
+ dir = EAST
input_level = 5000
input_level_max = 50000
output_level = 50000
diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm
index 513f98eae2c6..8c594e8064b4 100644
--- a/code/game/machinery/shuttle/shuttle_heater.dm
+++ b/code/game/machinery/shuttle/shuttle_heater.dm
@@ -4,6 +4,26 @@
//but instead of changing temp, it stores plasma and uses
//it for the engine.
//-----------------------------------------------
+
+#define O2_OXIDATION_VALUE 1
+#define NITRYL_OXIDATION_VALUE 1
+#define NITROUS_OXIDATION_VALUE 3
+
+#define PLASMA_THRUSTER_VALUE 1
+#define TRITRIUM_THRUSTER_VALUE 3
+#define HYDROGEN_THRUSTER_VALUE 0.5
+
+#define NITROUS_COOLING_MULTIPIER 500
+#define NITROUS_COOLING_MIN 173
+
+#define DAMAGE_NONE 0
+#define DAMAGE_LOW 1
+#define DAMAGE_MED 2
+#define DAMAGE_HIGH 3
+
+#define PRESSURE_LIMIT 1010 //in kpa
+#define PRESSURE_DAMAGE_MAX 1200 //gives 10 minutes per stage at the pressure limit
+
/obj/machinery/atmospherics/components/unary/shuttle
name = "shuttle atmospherics device"
desc = "This does something to do with shuttle atmospherics"
@@ -12,6 +32,7 @@
// icon = 'icons/obj/shuttle.dmi' // CELADON-EDIT - ORIGINAL
icon = 'mod_celadon/balance/icons/shuttle.dmi'
// [/CELADON-EDIT]
+ dir = EAST
/obj/machinery/atmospherics/components/unary/shuttle/heater
name = "engine heater"
@@ -183,3 +204,262 @@
. = ..()
fuel_tank = new /obj/item/tank/internals/plasma/full(src)
use_tank = TRUE
+
+//combustion heater
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater
+ name = "combustion engine heater"
+ desc = "Directs fuel mix into an attached combustion thruster."
+ icon_state = "heater_pipe"
+ var/icon_state_closed = "heater_pipe"
+ var/icon_state_open = "heater_pipe_open"
+ var/gas_amount = 0 //amount of gas used in calculations
+ var/gas_capacity = 0
+ var/efficiency_multiplier = 1
+ var/pressure_damage = 0
+ var/damage_state = 0
+ var/metal_repair = FALSE //used to see if metal's been added during repair step
+ idle_power_usage = 50
+ circuit = /obj/item/circuitboard/machine/shuttle/fire_heater
+
+ density = TRUE
+ max_integrity = 400
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30)
+ layer = OBJ_LAYER
+ showpipe = TRUE
+
+ pipe_flags = PIPING_ONE_PER_TURF
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/on_construction(obj_color, set_layer)
+ var/obj/item/circuitboard/machine/shuttle/fire_heater/board = circuit
+ if(board)
+ piping_layer = board.pipe_layer
+ set_layer = piping_layer
+ ..()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/New()
+ . = ..()
+ SetInitDirections()
+ update_adjacent_engines()
+ update_gas_stats()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/Destroy()
+ . = ..()
+ update_adjacent_engines()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/on_construction()
+ ..(dir, dir)
+ SetInitDirections()
+ update_adjacent_engines()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/process_atmos()
+ var/datum/gas_mixture/air_contents = airs[1]
+ var/pressure = air_contents.return_pressure()
+ if(pressure > PRESSURE_LIMIT)
+ pressure_damage += pressure / PRESSURE_LIMIT //always more than 1
+ if(rand(1, 48) == 48) //process_atmos() calls around twice a second, so this'll go off on average every 24 seconds.
+ playsound(loc, "hull_creaking", 60, TRUE, 20, pressure_affected = FALSE) // the ship is Not happy
+ if(pressure_damage >= PRESSURE_DAMAGE_MAX)
+ damage_state += 1 //damage state starts at 0, 1 causes temp leak, 2 causes gas leak, 3 causes explosion
+ pressure_damage = 0 // reset our counter here
+ playsound(loc, 'sound/effects/bang.ogg', 240, TRUE, 5)
+ if(damage_state >= DAMAGE_LOW)
+ var/loc_air = loc.return_air()
+ air_contents.temperature_share(loc_air, 0.4) //equalizes temp with its turf
+ if(damage_state >= DAMAGE_MED)
+ assume_air_ratio(air_contents, 0.01) //leaks a bit of its tank
+ if(damage_state >= DAMAGE_HIGH)
+ var/epicenter = loc
+ explosion(epicenter, 2, 2, 3, 3, TRUE, TRUE) //boom
+ update_parents()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/default_change_direction_wrench(mob/user, obj/item/I)
+ if(!..())
+ return FALSE
+ SetInitDirections()
+ var/obj/machinery/atmospherics/node = nodes[1]
+ if(node)
+ node.disconnect(src)
+ nodes[1] = null
+ if(!parents[1])
+ return
+ nullifyPipenet(parents[1])
+
+ atmosinit()
+ node = nodes[1]
+ if(node)
+ node.atmosinit()
+ node.addMember(src)
+ SSair.add_to_rebuild_queue(src)
+ return TRUE
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/RefreshParts()
+ var/cap = 0
+ var/eff = 0
+ for(var/obj/item/stock_parts/matter_bin/M in component_parts)
+ cap += M.rating
+ for(var/obj/item/stock_parts/micro_laser/L in component_parts)
+ eff += L.rating
+ gas_capacity = 5000 * ((cap - 1) ** 2) + 1000
+ efficiency_multiplier = round(sqrt(eff), 0.1)
+ update_gas_stats()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/examine(mob/user)
+ . = ..()
+ . += "The engine heater's gas dial reads [return_gas()] kPa."
+ . += "A lightly burnt hazard sticker reports a safe pressure of [PRESSURE_LIMIT] kPa. "
+ if(damage_state == DAMAGE_MED && metal_repair == FALSE)
+ . += "The engine heater's plating could be repaired with metal."
+ if(damage_state == DAMAGE_MED && metal_repair == TRUE)
+ . += "The engine heater's plating is ready to be bolted down."
+ if(damage_state == DAMAGE_LOW)
+ . += "The engine heater's insulation layer could be pried back into place."
+ if(damage_state == DAMAGE_NONE && pressure_damage >= PRESSURE_DAMAGE_MAX / 2)
+ . += "The engine heater's screws seem loose."
+ if(damage_state == DAMAGE_NONE && pressure_damage < PRESSURE_DAMAGE_MAX / 2)
+ . += "The engine heater is in good condition."
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/return_gas()
+ var/datum/gas_mixture/air_contents = airs[1]
+ return air_contents?.return_pressure()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/return_gas_capacity()
+ var/datum/gas_mixture/air_contents = airs[1]
+ return air_contents?.return_volume()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/update_gas_stats()
+ var/datum/gas_mixture/air_contents = airs[1]
+ if(!air_contents)
+ return
+ air_contents.set_volume(gas_capacity)
+ air_contents.set_temperature(T20C)
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/has_fuel(required, datum/gas/gas_type)
+ var/datum/gas_mixture/air_contents = airs[1]
+ if(!air_contents)
+ return
+ return air_contents.get_moles(gas_type) >= required
+
+/**
+ * consumes a portion of the mols and checks how much could combust to make thrust.
+ * oxidation_power is the total value of all the oxidizers
+ * fuel_power is ^ but for fuel
+ */
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/consume_fuel(gas_consumed)
+ var/datum/gas_mixture/air_contents = airs[1]
+ if(!air_contents)
+ return
+
+ else
+ var/oxidation_power = 0
+ var/fuel_power = 0
+ var/thrust_power = 0
+ var/gas_amount = 0
+
+ for(var/id in air_contents.get_gases())
+ gas_amount = air_contents.get_moles(id) * gas_consumed //this takes a percent (set by gas_consumed) and multiplies it by the total gas to get the amount of gas used by the calculation.
+
+ switch(id)
+ // adds each oxidizer's power to the total oxidation max
+ if(GAS_O2)
+ oxidation_power += O2_OXIDATION_VALUE * gas_amount
+ if(GAS_NITRYL)
+ oxidation_power += NITRYL_OXIDATION_VALUE * gas_amount
+ if(GAS_NITROUS) //burning nitrous cools down the heater's main tank, just like it cools the intake on real cars.
+ oxidation_power += NITROUS_OXIDATION_VALUE * gas_amount
+ var/heat_capacity = gas_amount * NITROUS_COOLING_MULTIPIER
+ var/air_heat_capacity = air_contents.heat_capacity()
+ var/combined_heat_capacity = heat_capacity + air_heat_capacity
+ if(combined_heat_capacity > 0)
+ var/combined_energy = heat_capacity * NITROUS_COOLING_MIN + air_heat_capacity * air_contents.return_temperature()
+ air_contents.set_temperature(combined_energy / combined_heat_capacity)
+ // adds each fuel gas's power to the fuel max (air.get_fuel_amount is busted, and trit should be Better anyways.)
+ if(GAS_PLASMA)
+ fuel_power += PLASMA_THRUSTER_VALUE * gas_amount
+ if(GAS_TRITIUM)
+ fuel_power += TRITRIUM_THRUSTER_VALUE * gas_amount
+ if(GAS_HYDROGEN)
+ fuel_power += HYDROGEN_THRUSTER_VALUE * gas_amount
+
+ air_contents.adjust_moles(id, -gas_amount)
+ thrust_power = min(oxidation_power, fuel_power) * efficiency_multiplier //"simulates" how much possible thrust either oxidizer or fuel could make, and takes the min
+ return thrust_power
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/attackby(obj/item/I, mob/living/user, params)
+ update_adjacent_engines()
+ if(damage_state == DAMAGE_MED && istype(I, /obj/item/stack/sheet/metal) && metal_repair == FALSE) //fix med damage with metal
+ var/obj/item/stack/sheet/metal/S = I
+ if(S.get_amount() < 2)
+ to_chat(user, "You need at least 2 metal sheets to repair [src].")
+ return
+ to_chat(user, "You start adding new plating.")
+ if(do_after(user, 40, src, TRUE))
+ if(!I.use(2))
+ return
+ to_chat(user, "You add new plating.")
+ I.use(1, FALSE, TRUE)
+ metal_repair = TRUE
+ pressure_damage = 0 //lets be nice and not let them explode while fixing this
+ playsound(loc, 'sound/items/deconstruct.ogg', 50)
+ return
+ return
+
+ if(damage_state == DAMAGE_MED && I.tool_behaviour == TOOL_WRENCH && metal_repair == TRUE)
+ to_chat(user, "You start wrenching down the new plating.")
+ if(I.use_tool(src, user, 60, volume=75))
+ metal_repair = FALSE
+ damage_state = DAMAGE_LOW
+ pressure_damage = 0
+ to_chat(user, "You secure the new plating.")
+ return
+ return
+
+ if(damage_state == DAMAGE_LOW && I.tool_behaviour == TOOL_CROWBAR) //fix low damage with screwdriver
+ to_chat(user, "You start prying in the insulation layer.")
+ if(I.use_tool(src, user, 60, volume=75))
+ damage_state = DAMAGE_NONE
+ pressure_damage = 0
+ to_chat(user, "You secure the insulation layer.")
+ return
+ return
+
+ if(damage_state == DAMAGE_NONE && I.tool_behaviour == TOOL_SCREWDRIVER && pressure_damage >= PRESSURE_DAMAGE_MAX / 2) //lets you fix pressure damage before it increases damage state
+ to_chat(user, "You start tightening loose screws.")
+ if(I.use_tool(src, user, 60, volume=75))
+ pressure_damage = 0
+ to_chat(user, "You tighten the screws.")
+ return
+ return
+
+ if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I))
+ return
+ if(default_pry_open(I))
+ return
+ if(panel_open)
+ if(default_change_direction_wrench(user, I))
+ return
+ if(default_deconstruction_crowbar(I))
+ return
+ return ..()
+
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/update_adjacent_engines()
+ var/engine_turf = get_step(src, dir)
+ if(!isturf(engine_turf))
+ return
+ for(var/obj/machinery/power/shuttle/engine/E in engine_turf)
+ E.update_icon_state()
+
+/obj/item/paper/guides/jobs/engi/combustion_thruster
+ name = "paper- 'Combustion Thruster Safety Instructions'"
+ default_raw_text = {"Combustion Thruster Basics
+ Firstly, combustion thrusters are delicate machines due to their unique function, and therefore come with certain limits to said function.
+ The specific limit to remember is 1000 kPa, above which your warranty will expire and the combustion heater will begin to take damage, with catastrophic failure inevitable after long periods of high pressure.
+ The second thing to keep in mind is the fuel mix you are using. If you put in the wrong ratio, the thruster will waste the excess and you'll get less thrust.
+ The most notable mixes are a 2:1 ratio of hydrogen to oxygen and a 1:1 ratio of plasma to oxygen.
+ Additionally, nitrous oxide has been known to provide beneficial properties on top of being a potent oxidizer.
+
+ It's making scary noises and leaking!
+ Set your internals, pull a fire alarm, grab a fire suit, and continue with the following steps. Ensure you disable all sources of ignition!
+ - Place two metal sheets over the leak in the heater.
+ - Wrench the new sheets of metal into place to stop the leak.
+ - Pry the insulation layer into place with a crowbar to stop the heat transfer.
+ - For minor damages, tighten loosened screws.
"}
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/sleeper.dm
similarity index 100%
rename from code/game/machinery/Sleeper.dm
rename to code/game/machinery/sleeper.dm
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index f63ad15004a1..107c5656c034 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -406,7 +406,7 @@
else
target.visible_message(span_warning("[user] starts shoving [target] into [src]!"), span_userdanger("[user] starts shoving you into [src]!"))
- if(do_mob(user, target, 30))
+ if(do_after(user, 30, target))
if(occupant || helmet || suit || storage)
return
if(target == user)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 90138488c361..48cc0388b508 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -831,7 +831,7 @@
//An actual AI (simple_animal mecha pilot) entering the mech
-/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
+/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/pilot_mob)
if(pilot_mob && pilot_mob.Adjacent(src))
if(occupant)
return
@@ -841,7 +841,7 @@
pilot_mob.forceMove(src)
GrantActions(pilot_mob)//needed for checks, and incase a badmin puts somebody in the mob
-/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
+/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/pilot_mob)
if(occupant == pilot_mob)
occupant = null
if(pilot_mob.mecha == src)
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 42c32e04fa98..fbe90058fc3e 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -210,7 +210,7 @@
M.visible_message("[user] starts buckling [M] to [src]!",\
"[user] starts buckling you to [src]!",\
"You hear metal clanking.")
- if(!do_after(user, 2 SECONDS, TRUE, M))
+ if(!do_after(user, 2 SECONDS, M))
return FALSE
// Sanity check before we attempt to buckle. Is everything still in a kosher state for buckling after the 3 seconds have elapsed?
diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm
index e62b1e52f7b3..4a85f9321154 100644
--- a/code/game/objects/effects/anomalies/_anomalies.dm
+++ b/code/game/objects/effects/anomalies/_anomalies.dm
@@ -133,7 +133,7 @@
/obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params)
if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal)
to_chat(user, span_notice("You start analyzing [src]."))
- if(do_after(user, 20, TRUE, src))
+ if(do_after(user, 20, src, hidden = TRUE))
to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code]."))
if(bSignal)
to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is highly unstable." ))
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 975f94102ecf..2dfea3173feb 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -39,7 +39,7 @@
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/obj/effect/turf_decal
- icon = 'icons/turf/decals.dmi'
+ icon = 'icons/turf/decals/decals.dmi'
icon_state = "warningfulltile"
plane = FLOOR_PLANE
layer = TURF_DECAL_LAYER
diff --git a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
index 4cd17b47f074..fc23ed89c278 100644
--- a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
+++ b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
@@ -418,7 +418,6 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/plaque
name = "plaque"
icon_state = "plaque"
- icon = 'icons/turf/decals.dmi'
/obj/effect/turf_decal/chapel
name = "chapel"
@@ -801,10 +800,95 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/solgov/all/bottom_right
icon_state = "bottom-right-all"
+// suns
+
/obj/effect/turf_decal/suns
- icon = 'icons/obj/suns_floor.dmi'
+ icon = 'icons/turf/decals/suns_floor.dmi'
icon_state = "suns-columm1-bottom"
+/obj/effect/turf_decal/suns/capital_s
+ icon_state = "capital-s"
+
+/obj/effect/turf_decal/suns/capital_u
+ icon_state = "capital-u"
+
+/obj/effect/turf_decal/suns/capital_n
+ icon_state = "capital-n"
+
+/obj/effect/turf_decal/suns/capital_s/fancy
+ icon_state = "capitalfancy-s"
+
+/obj/effect/turf_decal/suns/capital_u/fancy
+ icon_state = "capitalfancy-u"
+
+/obj/effect/turf_decal/suns/capital_n/fancy
+ icon_state = "capitalfancy-n"
+
+/obj/effect/turf_decal/suns/capital_s/marble
+ icon_state = "capitalmarble-s"
+
+/obj/effect/turf_decal/suns/capital_u/marble
+ icon_state = "capitalmarble-u"
+
+/obj/effect/turf_decal/suns/capital_n/marble
+ icon_state = "capitalmarble-n"
+
+// borders
+
+/obj/effect/turf_decal/suns/line
+ icon_state = "suns-border"
+
+/obj/effect/turf_decal/suns/line/corner
+ icon_state = "suns-bordercorner"
+
+/obj/effect/turf_decal/suns/line/end
+ icon_state = "suns-borderend"
+
+/obj/effect/turf_decal/suns/line/fill
+ icon_state = "suns-fill"
+
+/obj/effect/turf_decal/suns/line/fill/corner
+ icon_state = "suns-fillcorner"
+
+/obj/effect/turf_decal/suns/line/fill/end
+ icon_state = "suns-fillend"
+
+/obj/effect/turf_decal/suns/line/fancy
+ icon_state = "sunsfancy-border"
+
+/obj/effect/turf_decal/suns/line/fancy/corner
+ icon_state = "sunsfancy-bordercorner"
+
+/obj/effect/turf_decal/suns/line/fancy/end
+ icon_state = "sunsfancy-borderend"
+
+/obj/effect/turf_decal/suns/line/fancy/fill
+ icon_state = "sunsfancy-fill"
+
+/obj/effect/turf_decal/suns/line/fancy/fill/corner
+ icon_state = "sunsfancy-fillcorner"
+
+/obj/effect/turf_decal/suns/line/fancy/fill/end
+ icon_state = "sunsfancy-fillend"
+
+/obj/effect/turf_decal/suns/line/marble
+ icon_state = "sunsmarble-border"
+
+/obj/effect/turf_decal/suns/line/marble/corner
+ icon_state = "sunsmarble-bordercorner"
+
+/obj/effect/turf_decal/suns/line/marble/end
+ icon_state = "sunsmarble-borderend"
+
+/obj/effect/turf_decal/suns/line/marble/fill
+ icon_state = "sunsmarble-fill"
+
+/obj/effect/turf_decal/suns/line/marble/fill/corner
+ icon_state = "sunsmarble-fillcorner"
+
+/obj/effect/turf_decal/suns/line/marble/fill/end
+ icon_state = "sunsmarble-fillend"
+
// suns 3x6 decal
/obj/effect/turf_decal/suns/columm1
@@ -852,6 +936,97 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/suns/columm6/top
icon_state = "suns-columm6-top"
+/obj/effect/turf_decal/suns/marble/columm1
+ icon_state = "sunsmarble-columm1-bottom"
+
+/obj/effect/turf_decal/suns/marble/columm1/middle
+ icon_state = "sunsmarble-columm1-middle"
+
+/obj/effect/turf_decal/suns/marble/columm1/top
+ icon_state = "sunsmarble-columm1-top"
+
+/obj/effect/turf_decal/suns/marble/columm2
+ icon_state = "sunsmarble-columm2-bottom"
+
+/obj/effect/turf_decal/suns/marble/columm2/middle
+ icon_state = "sunsmarble-columm2-middle"
+
+/obj/effect/turf_decal/suns/marble/columm2/top
+ icon_state = "sunsmarble-columm2-top"
+
+/obj/effect/turf_decal/suns/marble/columm3
+ icon_state = "sunsmarble-columm3-bottom"
+
+/obj/effect/turf_decal/suns/marble/columm3/middle
+ icon_state = "sunsmarble-columm3-middle"
+
+/obj/effect/turf_decal/suns/marble/columm3/top
+ icon_state = "sunsmarble-columm3-top"
+
+/obj/effect/turf_decal/suns/marble/columm4
+ icon_state = "sunsmarble-columm4-middle"
+
+/obj/effect/turf_decal/suns/marble/columm4/top
+ icon_state = "sunsmarble-columm4-top"
+
+/obj/effect/turf_decal/suns/marble/columm5
+ icon_state = "sunsmarble-columm5-middle"
+
+/obj/effect/turf_decal/suns/marble/columm5/top
+ icon_state = "sunsmarble-columm5-top"
+
+/obj/effect/turf_decal/suns/marble/columm6
+ icon_state = "sunsmarble-columm6-middle"
+
+/obj/effect/turf_decal/suns/marble/columm6/top
+ icon_state = "sunsmarble-columm6-top"
+
+/obj/effect/turf_decal/suns/fancy/columm1
+ icon_state = "sunsfancy-columm1-bottom"
+
+/obj/effect/turf_decal/suns/fancy/columm1/middle
+ icon_state = "sunsfancy-columm1-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm1/top
+ icon_state = "sunsfancy-columm1-top"
+
+/obj/effect/turf_decal/suns/fancy/columm2
+ icon_state = "sunsfancy-columm2-bottom"
+
+/obj/effect/turf_decal/suns/fancy/columm2/middle
+ icon_state = "sunsfancy-columm2-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm2/top
+ icon_state = "sunsfancy-columm2-top"
+
+/obj/effect/turf_decal/suns/fancy/columm3
+ icon_state = "sunsfancy-columm3-bottom"
+
+/obj/effect/turf_decal/suns/fancy/columm3/middle
+ icon_state = "sunsfancy-columm3-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm3/top
+ icon_state = "sunsfancy-columm3-top"
+
+/obj/effect/turf_decal/suns/fancy/columm4
+ icon_state = "sunsfancy-columm4-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm4/top
+ icon_state = "sunsfancy-columm4-top"
+
+/obj/effect/turf_decal/suns/fancy/columm5
+ icon_state = "sunsfancy-columm5-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm5/top
+ icon_state = "sunsfancy-columm5-top"
+
+/obj/effect/turf_decal/suns/fancy/columm6
+ icon_state = "sunsfancy-columm6-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm6/top
+ icon_state = "sunsfancy-columm6-top"
+
+
// suns alt decal
/obj/effect/turf_decal/suns/alt
@@ -884,6 +1059,96 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/suns/alt/bottom_right
icon_state = "sunsalt-bottom-right"
+/obj/effect/turf_decal/suns/alt/fancy
+ icon_state = "sunsaltfancy-top-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/top_left
+ icon_state = "sunsaltfancy-top-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/top_center
+ icon_state = "sunsaltfancy-top-center"
+
+/obj/effect/turf_decal/suns/alt/fancy/top_right
+ icon_state = "sunsaltfancy-top-right"
+
+/obj/effect/turf_decal/suns/alt/fancy/middle_left
+ icon_state = "sunsaltfancy-middle-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/middle_center
+ icon_state = "sunsaltfancy-middle-center"
+
+/obj/effect/turf_decal/suns/alt/fancy/middle_right
+ icon_state = "sunsaltfancy-middle-right"
+
+/obj/effect/turf_decal/suns/alt/fancy/bottom_left
+ icon_state = "sunsaltfancy-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/bottom_center
+ icon_state = "sunsaltfancy-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/fancy/bottom_right
+ icon_state = "sunsaltfancy-bottom-right"
+
+/obj/effect/turf_decal/suns/alt/marble
+ icon_state = "sunsaltmarble-top-left"
+
+/obj/effect/turf_decal/suns/alt/marble/top_left
+ icon_state = "sunsaltmarble-top-left"
+
+/obj/effect/turf_decal/suns/alt/marble/top_center
+ icon_state = "sunsaltmarble-top-center"
+
+/obj/effect/turf_decal/suns/alt/marble/top_right
+ icon_state = "sunsaltmarble-top-right"
+
+/obj/effect/turf_decal/suns/alt/marble/middle_left
+ icon_state = "sunsaltmarble-middle-left"
+
+/obj/effect/turf_decal/suns/alt/marble/middle_center
+ icon_state = "sunsaltmarble-middle-center"
+
+/obj/effect/turf_decal/suns/alt/marble/middle_right
+ icon_state = "sunsaltmarble-middle-right"
+
+/obj/effect/turf_decal/suns/alt/marble/bottom_left
+ icon_state = "sunsaltmarble-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/marble/bottom_center
+ icon_state = "sunsaltmarble-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/marble/bottom_right
+ icon_state = "sunsaltmarble-bottom-right"
+
+/obj/effect/turf_decal/suns/alt/transparent
+ icon_state = "sunsalttrans-top-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/top_left
+ icon_state = "sunsalttrans-top-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/top_center
+ icon_state = "sunsalttrans-top-center"
+
+/obj/effect/turf_decal/suns/alt/transparent/top_right
+ icon_state = "sunsalttrans-top-right"
+
+/obj/effect/turf_decal/suns/alt/transparent/middle_left
+ icon_state = "sunsalttrans-middle-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/middle_center
+ icon_state = "sunsalttrans-middle-center"
+
+/obj/effect/turf_decal/suns/alt/transparent/middle_right
+ icon_state = "sunsalttrans-middle-right"
+
+/obj/effect/turf_decal/suns/alt/transparent/bottom_left
+ icon_state = "sunsalttrans-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/bottom_center
+ icon_state = "sunsalttrans-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/transparent/bottom_right
+ icon_state = "sunsalttrans-bottom-right"
+
// suns 3x6 decal transparent
/obj/effect/turf_decal/suns/transparent/columm1
@@ -931,38 +1196,6 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/suns/transparent/columm6/top
icon_state = "sunstrans-columm6-top"
-// suns alt decal
-
-/obj/effect/turf_decal/suns/transparent/alt
- icon_state = "sunsalttrans-top-left"
-
-/obj/effect/turf_decal/suns/transparent/alt/top_left
- icon_state = "sunsalttrans-top-left"
-
-/obj/effect/turf_decal/suns/transparent/alt/top_center
- icon_state = "sunsalttrans-top-center"
-
-/obj/effect/turf_decal/suns/transparent/alt/top_right
- icon_state = "sunsalttrans-top-right"
-
-/obj/effect/turf_decal/suns/transparent/alt/middle_left
- icon_state = "sunsalttrans-middle-left"
-
-/obj/effect/turf_decal/suns/transparent/alt/middle_center
- icon_state = "sunsalttrans-middle-center"
-
-/obj/effect/turf_decal/suns/transparent/alt/middle_right
- icon_state = "sunsalttrans-middle-right"
-
-/obj/effect/turf_decal/suns/transparent/alt/bottom_left
- icon_state = "sunsalttrans-bottom-left"
-
-/obj/effect/turf_decal/suns/transparent/alt/bottom_center
- icon_state = "sunsalttrans-bottom-center"
-
-/obj/effect/turf_decal/suns/transparent/alt/bottom_right
- icon_state = "sunsalttrans-bottom-right"
-
// nanotrasen
/obj/effect/turf_decal/nanotrasen //placeholder for sorting these together, add 3x3 NT and Vigilitas logos later
diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm
index e0a0746f5a2d..860f8f0bd2b2 100644
--- a/code/game/objects/effects/decals/turfdecal/markings.dm
+++ b/code/game/objects/effects/decals/turfdecal/markings.dm
@@ -229,32 +229,28 @@
/obj/effect/turf_decal/syndicateemblem/top/right
icon_state = "s3,3"
+/obj/effect/turf_decal/atmos
+ icon = 'icons/turf/decals/decals.dmi'
+
/obj/effect/turf_decal/atmos/oxygen
- icon = 'icons/turf/decals.dmi'
icon_state = "oxygen"
/obj/effect/turf_decal/atmos/carbon_dioxide
- icon = 'icons/turf/decals.dmi'
icon_state = "carbon_dioxide"
/obj/effect/turf_decal/atmos/nitrogen
- icon = 'icons/turf/decals.dmi'
icon_state = "nitrogen"
/obj/effect/turf_decal/atmos/air
- icon = 'icons/turf/decals.dmi'
icon_state = "air"
/obj/effect/turf_decal/atmos/nitrous_oxide
- icon = 'icons/turf/decals.dmi'
icon_state = "nitrous_oxide"
/obj/effect/turf_decal/atmos/plasma
- icon = 'icons/turf/decals.dmi'
icon_state = "plasma"
/obj/effect/turf_decal/atmos/mix
- icon = 'icons/turf/decals.dmi'
icon_state = "mix"
/**
@@ -339,169 +335,129 @@
// centered number decals
+
/obj/effect/turf_decal/number/one
- icon = 'icons/turf/decals.dmi'
icon_state = "1"
/obj/effect/turf_decal/number/two
- icon = 'icons/turf/decals.dmi'
icon_state = "2"
/obj/effect/turf_decal/number/three
- icon = 'icons/turf/decals.dmi'
icon_state = "3"
/obj/effect/turf_decal/number/four
- icon = 'icons/turf/decals.dmi'
icon_state = "4"
/obj/effect/turf_decal/number/five
- icon = 'icons/turf/decals.dmi'
icon_state = "5"
/obj/effect/turf_decal/number/six
- icon = 'icons/turf/decals.dmi'
icon_state = "6"
/obj/effect/turf_decal/number/seven
- icon = 'icons/turf/decals.dmi'
icon_state = "7"
/obj/effect/turf_decal/number/eight
- icon = 'icons/turf/decals.dmi'
icon_state = "8"
/obj/effect/turf_decal/number/nine
- icon = 'icons/turf/decals.dmi'
icon_state = "9"
/obj/effect/turf_decal/number/zero
- icon = 'icons/turf/decals.dmi'
icon_state = "0"
// right-shifted number decals (1s digit)
/obj/effect/turf_decal/number/right_one
- icon = 'icons/turf/decals.dmi'
icon_state = "-1"
/obj/effect/turf_decal/number/right_two
- icon = 'icons/turf/decals.dmi'
icon_state = "-2"
/obj/effect/turf_decal/number/right_three
- icon = 'icons/turf/decals.dmi'
icon_state = "-3"
/obj/effect/turf_decal/number/right_four
- icon = 'icons/turf/decals.dmi'
icon_state = "-4"
/obj/effect/turf_decal/number/right_five
- icon = 'icons/turf/decals.dmi'
icon_state = "-5"
/obj/effect/turf_decal/number/right_six
- icon = 'icons/turf/decals.dmi'
icon_state = "-6"
/obj/effect/turf_decal/number/right_seven
- icon = 'icons/turf/decals.dmi'
icon_state = "-7"
/obj/effect/turf_decal/number/right_eight
- icon = 'icons/turf/decals.dmi'
icon_state = "-8"
/obj/effect/turf_decal/number/right_nine
- icon = 'icons/turf/decals.dmi'
icon_state = "-9"
/obj/effect/turf_decal/number/right_zero
- icon = 'icons/turf/decals.dmi'
icon_state = "-0"
// left-shifted number decals (10s digit)
/obj/effect/turf_decal/number/left_one
- icon = 'icons/turf/decals.dmi'
icon_state = "1-"
/obj/effect/turf_decal/number/left_two
- icon = 'icons/turf/decals.dmi'
icon_state = "2-"
/obj/effect/turf_decal/number/left_three
- icon = 'icons/turf/decals.dmi'
icon_state = "3-"
/obj/effect/turf_decal/number/left_four
- icon = 'icons/turf/decals.dmi'
icon_state = "4-"
/obj/effect/turf_decal/number/left_five
- icon = 'icons/turf/decals.dmi'
icon_state = "5-"
/obj/effect/turf_decal/number/left_six
- icon = 'icons/turf/decals.dmi'
icon_state = "6-"
/obj/effect/turf_decal/number/left_seven
- icon = 'icons/turf/decals.dmi'
icon_state = "7-"
/obj/effect/turf_decal/number/left_eight
- icon = 'icons/turf/decals.dmi'
icon_state = "8-"
/obj/effect/turf_decal/number/left_nine
- icon = 'icons/turf/decals.dmi'
icon_state = "9-"
/obj/effect/turf_decal/number/left_zero
- icon = 'icons/turf/decals.dmi'
icon_state = "0-"
/obj/effect/turf_decal/dept/hop
- icon = 'icons/turf/decals.dmi'
icon_state = "hop"
/obj/effect/turf_decal/dept/bar
- icon = 'icons/turf/decals.dmi'
icon_state = "bar"
/obj/effect/turf_decal/dept/cargo
- icon = 'icons/turf/decals.dmi'
icon_state = "cargo"
/obj/effect/turf_decal/dept/medical
- icon = 'icons/turf/decals.dmi'
icon_state = "med"
/obj/effect/turf_decal/dept/science
- icon = 'icons/turf/decals.dmi'
icon_state = "sci"
/obj/effect/turf_decal/dept/security
- icon = 'icons/turf/decals.dmi'
icon_state = "sec"
/obj/effect/turf_decal/dept/mining
- icon = 'icons/turf/decals.dmi'
icon_state = "mine"
/obj/effect/turf_decal/zoo
- icon = 'icons/turf/decals.dmi'
icon_state = "zoo"
/obj/effect/turf_decal/no
- icon = 'icons/turf/decals.dmi'
icon_state = "no"
/obj/effect/turf_decal/radiation
- icon = 'icons/turf/decals.dmi'
icon_state = "radiation"
/obj/effect/turf_decal/radiation/white
- icon = 'icons/turf/decals.dmi'
icon_state = "radiation-w"
diff --git a/code/game/objects/effects/decals/turfdecal/weather.dm b/code/game/objects/effects/decals/turfdecal/weather.dm
index 04dcf807314a..0c8284b53f8c 100644
--- a/code/game/objects/effects/decals/turfdecal/weather.dm
+++ b/code/game/objects/effects/decals/turfdecal/weather.dm
@@ -13,12 +13,10 @@
/obj/effect/turf_decal/weather/dirt
name = "dirt siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "dirt_side"
/obj/effect/turf_decal/weather/dirt/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "dirt_side_corner"
/obj/effect/turf_decal/weather/sand
@@ -36,30 +34,24 @@
/obj/effect/turf_decal/weather/asteroid
name = "asteroid siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "asteroid_side"
/obj/effect/turf_decal/weather/asteroid/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "asteroid_side_corner"
/obj/effect/turf_decal/weather/whitesands
name = "salted sand siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "ws_side"
/obj/effect/turf_decal/weather/whitesands/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "ws_side_corner"
/obj/effect/turf_decal/weather/rock
name = "rock siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "rock_side"
/obj/effect/turf_decal/weather/rock/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "rock_side_corner"
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index d763c46e84e9..08d1514f7bbe 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -468,12 +468,18 @@
/obj/structure/salvageable/destructive_analyzer
)
+/obj/effect/spawner/lootdrop/ripley
+ name = "25% mech 75% wreckage ripley spawner"
+ loot = list(/obj/mecha/working/ripley/mining = 1,
+ /obj/structure/mecha_wreckage/ripley = 5)
+ lootdoubles = FALSE
+
/obj/effect/spawner/lootdrop/salvage_50
name = "50% salvage spawner"
loot = list(
/obj/effect/spawner/lootdrop/maintenance = 13,
/obj/effect/spawner/lootdrop/salvage_machine = 12,
- /obj/effect/spawner/lootdrop/whiteship_cere_ripley = 12,
+ /obj/effect/spawner/lootdrop/ripley = 12,
/obj/structure/closet/crate/secure/loot = 13,
"" = 50
)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 7e64ce658e8b..033307e5472f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -395,7 +395,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(grav > STANDARD_GRAVITY)
var/grav_power = min(3,grav - STANDARD_GRAVITY)
to_chat(user,"You start picking up [src]...")
- if(!do_mob(user,src,30*grav_power))
+ if(!do_after(user, 30*grav_power, src))
return
@@ -926,7 +926,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/datum/callback/tool_check = CALLBACK(src, PROC_REF(tool_check_callback), user, amount, extra_checks)
if(ismob(target))
- if(!do_mob(user, target, delay, extra_checks=tool_check))
+ if(!do_after(user, delay, target, extra_checks=tool_check))
return
else
diff --git a/code/game/objects/items/bank_card.dm b/code/game/objects/items/bank_card.dm
new file mode 100644
index 000000000000..4a7f2f9d2f21
--- /dev/null
+++ b/code/game/objects/items/bank_card.dm
@@ -0,0 +1,160 @@
+/obj/item/card/bank
+ name = "cash card"
+ desc = "Managed by a bank outside the sector."
+ icon_state = "data_1"
+ var/mining_points = 0 //For redeeming at mining equipment vendors
+
+ var/registered_name = null // The name registered_name on the card
+ var/datum/bank_account/registered_account
+ var/obj/machinery/paystand/my_store
+
+/obj/item/card/bank/Destroy()
+ if (registered_account)
+ registered_account.bank_cards -= src
+ if (my_store && my_store.my_card == src)
+ my_store.my_card = null
+ return ..()
+
+/obj/item/card/bank/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/holochip))
+ insert_money(W, user)
+ return
+ else if(istype(W, /obj/item/spacecash/bundle))
+ insert_money(W, user, TRUE)
+ return
+ else if(istype(W, /obj/item/coin))
+ insert_money(W, user, TRUE)
+ return
+ else if(istype(W, /obj/item/storage/bag/money))
+ var/obj/item/storage/bag/money/money_bag = W
+ var/list/money_contained = money_bag.contents
+
+ var/money_added = mass_insert_money(money_contained, user)
+
+ if (money_added)
+ to_chat(user, "You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")
+ return
+ else
+ return ..()
+
+/obj/item/card/bank/proc/insert_money(obj/item/I, mob/user, physical_currency)
+ var/cash_money = I.get_item_credit_value()
+ if(!cash_money)
+ to_chat(user, "[I] doesn't seem to be worth anything!")
+ return
+
+ if(!registered_account)
+ to_chat(user, "[src] doesn't have a linked account to deposit [I] into!")
+ return
+
+ registered_account.adjust_money(cash_money)
+ SSblackbox.record_feedback("amount", "credits_inserted", cash_money)
+ log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]")
+ if(physical_currency)
+ to_chat(user, "You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")
+ else
+ to_chat(user, "You insert [I] into [src], adding [cash_money] credits to the linked account.")
+
+ to_chat(user, "The linked account now reports a balance of [registered_account.account_balance] cr.")
+ qdel(I)
+
+/obj/item/card/bank/proc/mass_insert_money(list/money, mob/user)
+ if (!money || !money.len)
+ return FALSE
+
+ var/total = 0
+
+ for (var/obj/item/physical_money in money)
+ var/cash_money = physical_money.get_item_credit_value()
+
+ total += cash_money
+
+ registered_account.adjust_money(cash_money)
+ SSblackbox.record_feedback("amount", "credits_inserted", total)
+ log_econ("[total] credits were inserted into [src] owned by [src.registered_name]")
+ QDEL_LIST(money)
+
+ return total
+
+/obj/item/card/bank/proc/alt_click_can_use_id(mob/living/user)
+ if(!isliving(user))
+ return
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+
+ return TRUE
+
+// Returns true if new account was set.
+/obj/item/card/bank/proc/set_new_account(mob/living/user)
+ . = FALSE
+ var/datum/bank_account/old_account = registered_account
+
+ var/new_bank_id = input(user, "Enter your account ID number.", "Account Reclamation", 111111) as num | null
+
+ if (isnull(new_bank_id))
+ return
+
+ if(!alt_click_can_use_id(user))
+ return
+ if(!new_bank_id || new_bank_id < 111111 || new_bank_id > 999999)
+ to_chat(user, "The account ID number needs to be between 111111 and 999999.")
+ return
+ if (registered_account && registered_account.account_id == new_bank_id)
+ to_chat(user, "The account ID was already assigned to this card.")
+ return
+
+ for(var/A in SSeconomy.bank_accounts)
+ var/datum/bank_account/B = A
+ if(B.account_id == new_bank_id)
+ if (old_account)
+ old_account.bank_cards -= src
+
+ B.bank_cards += src
+ registered_account = B
+ to_chat(user, "The provided account has been linked to this ID card.")
+
+ return TRUE
+
+ to_chat(user, "The account ID number provided is invalid.")
+ return
+
+/obj/item/card/bank/AltClick(mob/living/user)
+ if(!alt_click_can_use_id(user))
+ return
+
+ if(!registered_account)
+ set_new_account(user)
+ return
+
+ var/amount_to_remove = FLOOR(input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null, 1)
+
+ if(!amount_to_remove || amount_to_remove < 0)
+ return
+ if(!alt_click_can_use_id(user))
+ return
+ if(registered_account.adjust_money(-amount_to_remove))
+ var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
+ user.put_in_hands(holochip)
+ to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.")
+ SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove)
+ log_econ("[amount_to_remove] credits were removed from [src] owned by [registered_account.account_holder]")
+ return
+ else
+ var/difference = amount_to_remove - registered_account.account_balance
+ registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
+
+/obj/item/card/bank/examine(mob/user)
+ . = ..()
+ if(registered_account)
+ . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
+ . += "The card indicates that the holder is [registered_account.holder_age] years old. [(registered_account.holder_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
+ . += "Alt-Click the ID to pull money from the linked account in the form of holochips."
+ . += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID."
+ . += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number."
+ else
+ . += "There is no registered account linked to this card. Alt-Click to add one."
+ if(mining_points)
+ . += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
+
+/obj/item/card/bank/GetBankCard()
+ return src
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index f44359ca656c..31af53aa3fc7 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -104,7 +104,7 @@
var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE)
if(!new_appearance)
return FALSE
- if(!do_after(user, 10, FALSE, src, TRUE))
+ if(!do_after(user, 10, src, progress = TRUE))
return FALSE
if(!check_menu(user, crayon))
return FALSE
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 2df043019c3e..ae7aa27cdc3f 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -149,14 +149,12 @@
slot_flags = ITEM_SLOT_ID
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
- var/mining_points = 0 //For redeeming at mining equipment vendors
var/list/access = list()
var/list/ship_access = list()
var/registered_name = null // The name registered_name on the card
var/assignment = null
var/access_txt // mapping aid
- var/datum/bank_account/registered_account
- var/obj/machinery/paystand/my_store
+ //var/datum/bank_account/registered_account
var/uses_overlays = TRUE
var/icon/cached_flat_icon
var/registered_age = 18 // default age for ss13 players
@@ -171,13 +169,6 @@
update_appearance()
RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, PROC_REF(update_in_wallet))
-/obj/item/card/id/Destroy()
- if (registered_account)
- registered_account.bank_cards -= src
- if (my_store && my_store.my_card == src)
- my_store.my_card = null
- return ..()
-
/obj/item/card/id/attack_self(mob/user)
if(Adjacent(user))
var/id_message = "\the [initial(name)] "
@@ -201,172 +192,29 @@
if(NAMEOF(src, assignment),NAMEOF(src, registered_name),NAMEOF(src, registered_age))
update_label()
-/obj/item/card/id/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/holochip))
- insert_money(W, user)
- return
- else if(istype(W, /obj/item/spacecash/bundle))
- insert_money(W, user, TRUE)
- return
- else if(istype(W, /obj/item/coin))
- insert_money(W, user, TRUE)
- return
- else if(istype(W, /obj/item/storage/bag/money))
- var/obj/item/storage/bag/money/money_bag = W
- var/list/money_contained = money_bag.contents
-
- var/money_added = mass_insert_money(money_contained, user)
-
- if (money_added)
- to_chat(user, "You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")
- return
- else
- return ..()
-
-/obj/item/card/id/proc/insert_money(obj/item/I, mob/user, physical_currency)
- var/cash_money = I.get_item_credit_value()
- if(!cash_money)
- to_chat(user, "[I] doesn't seem to be worth anything!")
- return
-
- if(!registered_account)
- to_chat(user, "[src] doesn't have a linked account to deposit [I] into!")
- return
-
- registered_account.adjust_money(cash_money)
- SSblackbox.record_feedback("amount", "credits_inserted", cash_money)
- log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]")
- if(physical_currency)
- to_chat(user, "You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")
- else
- to_chat(user, "You insert [I] into [src], adding [cash_money] credits to the linked account.")
-
- to_chat(user, "The linked account now reports a balance of [registered_account.account_balance] cr.")
- qdel(I)
-
-/obj/item/card/id/proc/mass_insert_money(list/money, mob/user)
- if (!money || !money.len)
- return FALSE
-
- var/total = 0
-
- for (var/obj/item/physical_money in money)
- var/cash_money = physical_money.get_item_credit_value()
-
- total += cash_money
-
- registered_account.adjust_money(cash_money)
- SSblackbox.record_feedback("amount", "credits_inserted", total)
- log_econ("[total] credits were inserted into [src] owned by [src.registered_name]")
- QDEL_LIST(money)
-
- return total
-
-/obj/item/card/id/proc/alt_click_can_use_id(mob/living/user)
- if(!isliving(user))
- return
- if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
- return
-
- return TRUE
-
-// Returns true if new account was set.
-/obj/item/card/id/proc/set_new_account(mob/living/user)
- . = FALSE
- var/datum/bank_account/old_account = registered_account
-
- var/new_bank_id = input(user, "Enter your account ID number.", "Account Reclamation", 111111) as num | null
-
- if (isnull(new_bank_id))
- return
-
- if(!alt_click_can_use_id(user))
- return
- if(!new_bank_id || new_bank_id < 111111 || new_bank_id > 999999)
- to_chat(user, "The account ID number needs to be between 111111 and 999999.")
- return
- if (registered_account && registered_account.account_id == new_bank_id)
- to_chat(user, "The account ID was already assigned to this card.")
- return
-
- for(var/A in SSeconomy.bank_accounts)
- var/datum/bank_account/B = A
- if(B.account_id == new_bank_id)
- if (old_account)
- old_account.bank_cards -= src
-
- B.bank_cards += src
- registered_account = B
- to_chat(user, "The provided account has been linked to this ID card.")
-
- return TRUE
-
- to_chat(user, "The account ID number provided is invalid.")
- return
-
-/obj/item/card/id/AltClick(mob/living/user)
- if(!alt_click_can_use_id(user))
- return
-
- if(!registered_account)
- set_new_account(user)
- return
-
- var/amount_to_remove = FLOOR(input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null, 1)
-
- if(!amount_to_remove || amount_to_remove < 0)
- return
- if(!alt_click_can_use_id(user))
- return
- if(registered_account.adjust_money(-amount_to_remove))
- var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
- user.put_in_hands(holochip)
- to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.")
- SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove)
- log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]")
- return
- else
- var/difference = amount_to_remove - registered_account.account_balance
- registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
-
/obj/item/card/id/examine(mob/user)
. = ..()
- . += "There's more information below, you can look again to take a closer look..."
-
-/obj/item/card/id/examine_more(mob/user)
- var/list/msg = list("You examine [src] closer, and note the following...")
+ . += "
CARD INFO:"
if(registered_name)
- msg += "NAME:"
- msg += "[registered_name]"
+ . += "NAME:"
+ . += "[registered_name]"
if(registered_age)
- msg += "AGE:"
- msg += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
+ . += "AGE:"
+ . += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
if(length(ship_access))
- msg += "SHIP ACCESS:"
+ . += "SHIP ACCESS:"
var/list/ship_factions = list()
for(var/datum/overmap/ship/controlled/ship in ship_access)
var/faction = ship.get_faction()
if(!(faction in ship_factions))
ship_factions += faction
- msg += "[ship_factions.Join(", ")]"
+ . += "[ship_factions.Join(", ")]"
var/list/ship_names = list()
for(var/datum/overmap/ship/controlled/ship in ship_access)
ship_names += ship.name
- msg += "[ship_names.Join(", ")]"
-
- if(registered_account)
- msg += "ACCOUNT:"
- msg += "LINKED ACCOUNT HOLDER: '[registered_account.account_holder]'"
- msg += "BALANCE: [registered_account.account_balance] cr."
- msg += "Alt-click the ID to pull money from the account in the form of holochips."
- msg += "You can insert credits into the account by pressing holochips, cash, or coins against the ID."
- if(registered_account.account_holder == user.real_name)
- msg += "If you lose this ID card, you can reclaim your account by Alt-click a blank ID card and entering your account ID number."
- else
- msg += "There is no registered account. Alt-click to add one."
- return msg
+ . += "[ship_names.Join(", ")]"
/obj/item/card/id/GetAccess()
return access
@@ -482,7 +330,7 @@ update_label()
else
return ..()
- var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset", "Change Account ID")
+ var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset")
if(user.incapacitated())
return
if(popup_input == "Forge/Reset" && !forged)
@@ -512,17 +360,6 @@ update_label()
to_chat(user, "You successfully forge the ID card.")
log_game("[key_name(user)] has forged \the [initial(name)] with name \"[registered_name]\" and occupation \"[assignment]\".")
- // First time use automatically sets the account id to the user.
- if (first_use && !registered_account)
- if(ishuman(user))
- var/mob/living/carbon/human/accountowner = user
-
- for(var/bank_account in SSeconomy.bank_accounts)
- var/datum/bank_account/account = bank_account
- if(account.account_id == accountowner.account_id)
- account.bank_cards += src
- registered_account = account
- to_chat(user, "Your account number has been automatically assigned.")
return
else if (popup_input == "Forge/Reset" && forged)
registered_name = initial(registered_name)
@@ -534,9 +371,6 @@ update_label()
forged = FALSE
to_chat(user, "You successfully reset the ID card.")
return
- else if (popup_input == "Change Account ID")
- set_new_account(user)
- return
return ..()
/obj/item/card/id/syndicate/anyone
@@ -551,7 +385,6 @@ update_label()
icon_state = "syndie"
access = list(ACCESS_SYNDICATE)
uses_overlays = FALSE
- registered_age = null
/obj/item/card/id/syndicate_command/crew_id
assignment = "Operative"
@@ -739,11 +572,6 @@ update_label()
registered_name = "Prisoner #13-007"
icon_state = "prisoner_007"
-/obj/item/card/id/mining
- name = "mining ID"
- access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MECH_MINING, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
- custom_price = 250
-
/obj/item/card/id/away
name = "\proper a perfectly generic identification card"
desc = "A perfectly generic identification card. Looks like it could use some flavor."
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index f63a5e9dd45a..baa541662e20 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -51,7 +51,7 @@
item_flags = DROPDEL
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = FALSE
- fire_delay = 50
+ fire_delay = 5 SECONDS
var/obj/item/chrono_eraser/TED = null
var/obj/structure/chrono_field/field = null
var/turf/startpos = null
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 1acd4a880696..7031802c8ed2 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1445,6 +1445,15 @@
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/micro_laser = 1)
+/obj/item/circuitboard/machine/shuttle/engine/fire
+ name = "Combustion Thruster (Machine Board)"
+ build_path = /obj/machinery/power/shuttle/engine/fire
+ req_components = list(
+ /obj/item/stock_parts/micro_laser = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/sheet/plasteel = 2
+ )
+
/obj/item/circuitboard/machine/shuttle/engine/electric
name = "Ion Thruster (Machine Board)"
build_path = /obj/machinery/power/shuttle/engine/electric
@@ -1500,6 +1509,26 @@
. = ..()
. += "It is set to layer [pipe_layer]."
+/obj/item/circuitboard/machine/shuttle/fire_heater
+ name = "Combustion Engine Heater (Machine Board)"
+ desc = "You can use mulitool to switch pipe layers"
+ var/pipe_layer = PIPING_LAYER_DEFAULT
+ build_path = /obj/machinery/atmospherics/components/unary/shuttle/fire_heater
+ req_components = list(
+ /obj/item/stock_parts/micro_laser = 1,
+ /obj/item/stock_parts/matter_bin = 1
+ )
+
+/obj/item/circuitboard/machine/shuttle/fire_heater/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_MULTITOOL)
+ pipe_layer = (pipe_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (pipe_layer + 1)
+ to_chat(user, "You change the circuitboard to layer [pipe_layer].")
+ return
+
+/obj/item/circuitboard/machine/shuttle/fire_heater/examine()
+ . = ..()
+ . += "It is set to layer [pipe_layer]."
+
/obj/item/circuitboard/machine/shuttle/smes
name = "Electric Engine Precharger (Machine Board)"
build_path = /obj/machinery/power/smes/shuttle
diff --git a/code/game/objects/items/decal_painter.dm b/code/game/objects/items/decal_painter.dm
index ea54fea0331b..c5d35d864bdf 100644
--- a/code/game/objects/items/decal_painter.dm
+++ b/code/game/objects/items/decal_painter.dm
@@ -221,9 +221,9 @@
to_chat(user, "\The [src] can only be used on flooring.")
return
if(color_disallowed.Find(decal_state))
- F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', decal_state, decal_dir, FALSE, color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals/decals.dmi', decal_state, decal_dir, FALSE, color, null, null, alpha)
else
- F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', decal_state, decal_dir, FALSE, decal_color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals/decals.dmi', decal_state, decal_dir, FALSE, decal_color, null, null, alpha)
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE)
/obj/item/decal_painter/attack_self(mob/user)
@@ -235,7 +235,7 @@
/obj/item/decal_painter/interact(mob/user as mob) //TODO: Make TGUI for this because ouch
if(!decal_icon)
- decal_icon = icon('icons/turf/decals.dmi', decal_state, decal_dir)
+ decal_icon = icon('icons/turf/decals/decals.dmi', decal_state, decal_dir)
user << browse_rsc(decal_icon, "floor.png")
var/dat = {"
@@ -308,7 +308,7 @@
decal_color = chosen_colour
- decal_icon = icon('icons/turf/decals.dmi', decal_state, decal_dir)
+ decal_icon = icon('icons/turf/decals/decals.dmi', decal_state, decal_dir)
if(usr)
attack_self(usr)
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index bf08b704beb0..61486cf07bf2 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -85,7 +85,7 @@
pai.master_dna = M.dna.unique_enzymes
to_chat(pai, "You have been bound to a new master.")
pai.laws.set_zeroth_law("Serve your master.")
- pai.emittersemicd = FALSE
+ pai.emittercurrent_cooldown = FALSE
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
if(confirm == "Yes")
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 34563d5e649c..a11539595805 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -62,7 +62,7 @@
if(target != user)
target.visible_message("[user] is trying to inject [target] with [src]!", \
"[user] is trying to inject you with [src]!")
- if(!do_mob(user, target) || used)
+ if(!do_after(user, target = target) || used)
return
target.visible_message("[user] injects [target] with the syringe with [src]!", \
"[user] injects you with the syringe with [src]!")
@@ -90,11 +90,6 @@
desc = "This will make you big and strong, but give you a bad skin condition."
add_mutations = list(HULK)
-/obj/item/dnainjector/firebreath
- name = "\improper DNA injector (Fire Breath)"
- desc = "Restores the dragon ancestry."
- add_mutations = list(FIREBREATH)
-
/obj/item/dnainjector/xraymut
name = "\improper DNA injector (X-ray)"
desc = "Finally you can see what the Captain does."
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index 111dd3aa96bc..1396521aaf9a 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -59,7 +59,7 @@
shaking = TRUE
start_shaking(user)
- if(do_after(user, shake_time, needhand=TRUE, target=user, progress=TRUE))
+ if(do_after(user, shake_time, target=user))
var/answer = get_answer()
say(answer)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index 6a1e439422a4..813e53111f61 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -183,9 +183,9 @@
update_appearance()
#define REQUIRED_POWER_TO_FIRE_FLAMETHROWER 10
-#define FLAMETHROWER_POWER_MULTIPLIER 0.5
-#define FLAMETHROWER_RANGE 4
-#define FLAMETHROWER_RELEASE_AMOUNT 8
+#define FLAMETHROWER_POWER_MULTIPLIER 0.8
+#define FLAMETHROWER_RANGE 5
+#define FLAMETHROWER_RELEASE_AMOUNT 5
/obj/item/flamethrower/proc/flame_turf(target)
if(!beaker)
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 0681892fd47e..50da920b06f1 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -12,7 +12,7 @@
/obj/item/book/granter/proc/turn_page(mob/user)
playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, TRUE)
- if(do_after(user, 50, TRUE, src))
+ if(do_after(user, 50, src, hidden = TRUE))
if(remarks.len)
to_chat(user, "[pick(remarks)]")
else
@@ -57,7 +57,7 @@
on_reading_stopped()
reading = FALSE
return
- if(do_after(user, 50, TRUE, src))
+ if(do_after(user, 50, src, hidden = TRUE))
on_reading_finished(user)
reading = FALSE
return TRUE
@@ -247,19 +247,6 @@
user.Stun(40, ignore_canstun = TRUE)
user.petrify(30)
-/obj/item/book/granter/spell/cards
- spell = /obj/effect/proc_holder/spell/aimed/spell_cards
- spellname = "spellcards"
- icon_state ="bookspellcards"
- desc = "The ultimate card trick, for users ten and up."
- remarks = list("It's all about the razzmataz.", "...I don't think I'll actually be sawing anyone in half", "These are pretty flimsy, most armor would defeat them.", "They do burn damage? Weird.", "Why the dumb stance? It's just a flick of the hand...", "Are these cards? They feel stiffer then pages.", "Best performed using a top hat...")
-
-/obj/item/book/granter/spell/cards/recoil(mob/living/user)
- ..()
- to_chat(user,"The cards are against you!")
- user.Stun(40, ignore_canstun = TRUE)
- user.petrify(30)
-
/obj/item/book/granter/spell/shapechange
spell = /obj/effect/proc_holder/spell/targeted/shapeshift
spellname = "shapechange"
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index f41deb5598a6..9fece4feedd4 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -57,7 +57,8 @@
"[user] is trying to put [src.name] on you!")
playsound(loc, cuffsound, 30, TRUE, -2)
- if(do_mob(user, C, 30) && C.canBeHandcuffed())
+ log_combat(user, C, "attempted to handcuff")
+ if(do_after(user, 3 SECONDS, C) && C.canBeHandcuffed())
if(iscyborg(user))
apply_cuffs(C, user, TRUE)
else
diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm
index 5b8db550a87d..6de461954cb2 100644
--- a/code/game/objects/items/implants/implanter.dm
+++ b/code/game/objects/items/implants/implanter.dm
@@ -27,7 +27,7 @@
M.visible_message("[user] is attempting to implant [M].")
var/turf/T = get_turf(M)
- if(T && (M == user || do_mob(user, M, 50)))
+ if(T && (M == user || do_after(user, 5 SECONDS, M)))
if(src && imp)
if(imp.implant(M, user))
if (M == user)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index f4fbd42be38b..9d90a1a43373 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -646,31 +646,6 @@
held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]."
update_appearance()
-/obj/item/melee/cleric_mace
- name = "cleric mace"
- desc = "The grandson of the club, yet the grandfather of the baseball bat. Most notably used by holy orders in days past."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "mace_greyscale"
- item_state = "mace_greyscale"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
- custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
- slot_flags = ITEM_SLOT_BELT
- force = 14
- w_class = WEIGHT_CLASS_BULKY
- throwforce = 8
- armour_penetration = 50
- attack_verb = list("smacked", "struck", "cracked", "beaten")
- var/overlay_state = "mace_handle"
- var/mutable_appearance/overlay
-
-/obj/item/melee/cleric_mace/Initialize()
- . = ..()
- overlay = mutable_appearance(icon, overlay_state)
- overlay.appearance_flags = RESET_COLOR
- add_overlay(overlay)
-
/obj/item/melee/greykingsword
name = "blade of the grey-king"
desc = "A legendary sword made with 3 replica katanas nailed together and dipped in heavy narcotics."
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index d9311f5e2b43..a08b1398aad8 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -165,7 +165,7 @@
user.visible_message("[user] starts loading [target] into [src].", \
"You start loading [target] into [src]...", null, null, target)
to_chat(target, "[user] starts loading you into [user.p_their()] [name]!")
- if(!do_mob(user, target, 30))
+ if(!do_after(user, 3 SECONDS, target))
return
if(target in occupants)
return
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 473bcd945c58..9f937312b561 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -21,50 +21,35 @@
color = "#f0da12"
puzzle_id = "cheese"
-/obj/item/keycard/swordfish
- name = "titanic keycard"
- desc = "Smells like it was at the bottom of a harbor."
- color = "#3bbbdb"
- puzzle_id = "swordfish"
+/obj/item/keycard/harmfactory
+ name = "factory keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#727a7c"
+ puzzle_id = "factory"
+
+/obj/item/keycard/harmfactory/stockroom
+ name = "stockroom keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#cf2323"
+ puzzle_id = "stockroom"
+
+/obj/item/keycard/harmfactory/office
+ name = "office keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#1dac22"
+ puzzle_id = "office"
+
+/obj/item/keycard/harmfactory/entry
+ name = "entry keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#1a27e7"
+ puzzle_id = "entry"
+
+
/obj/item/keycard/gatedrop
icon_state = "golden_key"
-/obj/item/keycard/gatedrop/drakelair
- name = "Drake's Key"
- desc = "A dull, golden key originally kept by a menacing ash drake."
- puzzle_id = "drakelairkey"
-
-/obj/item/keycard/gatedrop/disciple
- name = "Altar Key"
- desc = "A key held dear by the late Disciple of The Priest. Only by shutting themselves in with their stone idol were they able to spare those they love most from their madness and obsession."
- puzzle_id = "disciplekey"
-
-/obj/item/keycard/gatedrop/guard
- name = "Armory Key"
- desc = "A golden key entrusted to the Captain of the Holy Guard of The Priest. Entrusted by His Holiness to guard the greatest weapon in His arsenal"
- puzzle_id = "guardcap"
-
-/obj/item/keycard/gatedrop/heathen
- name = "Heathen's Key"
- desc = "And thus the Heathen stole away with the key to the forbidden gates. Hiding with his sect of followers until death cometh."
- puzzle_id = "heathen"
-
-/obj/item/keycard/gatedrop/gatekeeper
- name = "GateKeeper's Key"
- desc = "Only by slaying the keeper of the gates may one path through into the depths of The Priest's holiest sanctums."
- puzzle_id = "gatekeeper"
-
-/obj/item/keycard/gatedrop/bishop
- name = "Key of the lost"
- desc = "A key held only by the warring Bishop, forever lost to the Golden City of old."
- puzzle_id = "bishopkey"
-
-/obj/item/keycard/gatedrop/priest
- name = "The Priest's Key"
- desc = "A key belonging to a once peaceful scholar, brought to death and ruin through means of violence by savage outsider."
- puzzle_id = "priestkey"
-
/obj/item/keycard/gatedrop/lavacanyon
name = "Vault Key"
desc = "A dusty key, smudged with dried blood."
@@ -128,6 +113,26 @@
desc = "If nautical nonsense be something you wish."
puzzle_id = "swordfish"
+/obj/machinery/door/keycard/harmfactory
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the factory keycard"
+ puzzle_id = "factory"
+
+/obj/machinery/door/keycard/harmfactory/stockroom
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the stockroom keycard"
+ puzzle_id = "stockroom"
+
+/obj/machinery/door/keycard/harmfactory/office
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the office keycard"
+ puzzle_id = "office"
+
+/obj/machinery/door/keycard/harmfactory/entry
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the entry keycard"
+ puzzle_id = "entry"
+
/obj/machinery/door/keycard/gates
gender = PLURAL
name = "locked gates"
@@ -155,39 +160,6 @@
. = ..()
icon_state = density ? "closed" : "open"
-/obj/machinery/door/keycard/gates/drakelair
- puzzle_id = "drakelairkey"
-
-/obj/machinery/door/keycard/gates/disciple
- name = "Tithe Gates"
- desc = "Gates protecting the ritual tithe collected by The Priest and his Disciples."
- puzzle_id = "disciplekey"
-
-/obj/machinery/door/keycard/gates/guard
- name = "Armory Gates"
- desc = "Gates protecting the most versatile and dangerous of The Priest's armory."
- puzzle_id = "guardcap"
-
-/obj/machinery/door/keycard/gates/heathen
- name = "Sect Gates"
- desc = "Gates guarding the forbidden treasures stolen away by the Heathen. Bloody in nature, and hidden from sight."
- puzzle_id = "heathen"
-
-/obj/machinery/door/keycard/gates/gatekeeper
- name = "Sanctum Gates"
- desc = "The Gatekeeper holds the key, only through bloodshed can they be opened."
- puzzle_id = "gatekeeper"
-
-/obj/machinery/door/keycard/gates/bishop
- name = "Lost Golden City Gates"
- desc = "He took their lives and locked their culture and heritage behind indestructible gates of virtue. The Bishop spread conversion through death and swallowed the key."
- puzzle_id = "bishopkey"
-
-/obj/machinery/door/keycard/gates/priest
- name = "The Priest's Treasury"
- desc = "Gates holding The Priest's eternal hoarde. Drakeborn, incapable of avoiding the grand desire to collect and learn."
- puzzle_id = "priestkey"
-
/obj/machinery/door/keycard/gates/lavacanyon
puzzle_id = "lavacanyonkey"
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index a0e5865e1528..243b84b7e1ec 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -176,7 +176,7 @@
return
to_chat(user, "You connect to [M]'s power line...")
- while(do_after(user, 15, target = M, progress = 0))
+ while(do_after(user, 15, target = M, progress = TRUE))
if(!user || !user.cell || mode != "draw")
return
@@ -210,7 +210,7 @@
to_chat(user, "You connect to [target]'s power port...")
- while(do_after(user, 15, target = target, progress = 0))
+ while(do_after(user, 15, target = target, progress = TRUE))
if(!user || !user.cell || mode != "draw")
return
@@ -248,7 +248,7 @@
to_chat(user, "You connect to [target]'s power port...")
- while(do_after(user, 15, target = target, progress = 0))
+ while(do_after(user, 15, target = target, progress = TRUE))
if(!user || !user.cell || mode != "charge")
return
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 842c880d2ed9..264ab12646ea 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -31,17 +31,17 @@
return
if(target == user)
playsound(src, islist(apply_sounds) ? pick(apply_sounds) : apply_sounds, 25)
- if(!do_mob(user, target, self_delay, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
- return
if(!silent)
user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...")
+ if(!do_after(user, self_delay, target, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ return
else if(other_delay)
playsound(src, islist(apply_sounds) ? pick(apply_sounds) : apply_sounds, 25)
- if(!do_mob(user, target, other_delay, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
- return
if(!silent)
user.visible_message("[user] starts to apply \the [src] on [target].", "You begin applying \the [src] on [target]...")
+ if(!do_after(user, other_delay, target, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ return
if(heal(target, user))
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 68a6772bb4e4..ead6b8aeb8f1 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -221,9 +221,9 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cotton
- var/pull_effort = 30
- var/loom_result = /obj/item/stack/sheet/cotton/cloth
grind_results = list(/datum/reagent/cellulose = 20)
+ var/pull_effort = 10
+ var/loom_result = /obj/item/stack/sheet/cotton/cloth
GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("white jumpskirt", /obj/item/clothing/under/color/jumpskirt/white, 3), /*Ladies first*/ \
@@ -339,7 +339,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
singular_name = "raw durathread ball"
icon_state = "sheet-durathreadraw"
merge_type = /obj/item/stack/sheet/cotton/durathread
- pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
grind_results = list()
diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm
index f27f80888635..63fc55116d5a 100644
--- a/code/game/objects/items/stacks/tape.dm
+++ b/code/game/objects/items/stacks/tape.dm
@@ -115,7 +115,7 @@
return
if(use(1))
playsound(loc, usesound, 30, TRUE, -2)
- if(do_mob(user, C, other_delay) && (!C.is_mouth_covered() || !C.is_muzzled()))
+ if(do_after(user, other_delay, C) && (!C.is_mouth_covered() || !C.is_muzzled()))
apply_gag(C, user)
C.visible_message("[user] tapes [C]s mouth shut.", \
"[user] taped your mouth shut!")
@@ -135,7 +135,7 @@
"[user] is trying to put [src.name] on you!")
playsound(loc, usesound, 30, TRUE, -2)
- if(do_mob(user, C, self_delay) && (C.canBeHandcuffed()))
+ if(do_after(user, self_delay, C) && (C.canBeHandcuffed()))
apply_tapecuffs(C, user)
C.visible_message("[user] tapecuffs [C].", \
"[user] tapecuffs you.")
@@ -153,11 +153,11 @@
if(C == user)
playsound(loc, usesound, 30, TRUE, -2)
user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...")
- if(!do_mob(user, C, self_delay, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, self_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
else if(other_delay)
user.visible_message("[user] starts to apply \the [src] on [C].", "You begin applying \the [src] on [C]...")
- if(!do_mob(user, C, other_delay, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, other_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
if(heal(C, user))
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index f8bb97d3a411..5d87b42b78e5 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -226,7 +226,7 @@
/obj/item/storage/backpack/satchel/leather
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
- icon = 'icons/obj/storage.dmi' //WS Edit - Suitcases
+ icon = 'icons/obj/storage.dmi'
icon_state = "satchel"
item_state = "satchel"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index c578c318e73a..2904745f25aa 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -248,6 +248,16 @@
new /obj/item/hypospray/mkii(src)
update_appearance()
+/obj/item/storage/belt/medical/webbing/surgery/PopulateContents()
+ new /obj/item/scalpel(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/surgicaldrill(src)
+ new /obj/item/retractor(src)
+ new /obj/item/cautery(src)
+ new /obj/item/hemostat(src)
+ new /obj/item/hypospray/mkii(src)
+ update_appearance()
+
/obj/item/storage/belt/security
name = "security belt"
desc = "Can hold security gear like handcuffs and flashes."
@@ -514,13 +524,12 @@
/obj/item/reagent_containers/food/snacks/rofflewaffles,
/obj/item/reagent_containers/food/snacks/donkpocket,
/obj/item/reagent_containers/food/drinks/soda_cans/cola,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind,
- /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb,
- /obj/item/reagent_containers/food/drinks/soda_cans/starkist,
+ /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail,
+ /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up,
- /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game,
- /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime,
- /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola
+ /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel,
+ /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda
))
new rig_snacks(src)
@@ -600,33 +609,6 @@
/obj/item/multitool = 1)
generate_items_inside(items_inside,src)
-
-/obj/item/storage/belt/wands
- name = "wand belt"
- desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic."
- icon_state = "soulstone"
- item_state = "soulstone"
-
-/obj/item/storage/belt/wands/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 6
- STR.set_holdable(list(
- /obj/item/gun/magic/wand
- ))
-
-/obj/item/storage/belt/wands/full/PopulateContents()
- new /obj/item/gun/magic/wand/death(src)
- new /obj/item/gun/magic/wand/resurrection(src)
- new /obj/item/gun/magic/wand/polymorph(src)
- new /obj/item/gun/magic/wand/teleport(src)
- new /obj/item/gun/magic/wand/door(src)
- new /obj/item/gun/magic/wand/fireball(src)
-
- for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition
- W.max_charges = initial(W.max_charges)
- W.charges = W.max_charges
-
/obj/item/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 660c89219d72..176f3f0c641e 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -124,8 +124,12 @@
var/radio_type = /obj/item/radio
/obj/item/storage/box/survival/PopulateContents()
- new mask_type(src)
- new radio_type(src)
+ if(!isnull(mask_type))
+ new mask_type(src)
+
+ if(!isnull(radio_type))
+ new radio_type(src)
+
if(!isnull(medipen_type))
new medipen_type(src)
@@ -165,10 +169,12 @@
/obj/item/storage/box/survival/clip/balaclava
mask_type = /obj/item/clothing/mask/gas/sechailer/balaclava
-
-/obj/item/storage/box/survival/clip/balaclava
internal_type = /obj/item/tank/internals/emergency_oxygen/double
+/obj/item/storage/box/survival/frontier
+ mask_type = null // we spawn in gas masks in frontiersmen bags alongside this, so it isn't nessary
+ internal_type = /obj/item/tank/internals/emergency_oxygen //frontiersmen dont
+
/obj/item/storage/box/gloves
name = "box of latex gloves"
desc = "Contains sterile latex gloves."
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index c20df37e7b48..2962451762a4 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -124,6 +124,11 @@
else
return ..()
+/obj/item/storage/wallet/GetBankCard()
+ for(var/obj/item/card/I in contents)
+ if(istype(I, /obj/item/card/bank))
+ return I
+
/obj/item/storage/wallet/random
icon_state = "random_wallet"
diff --git a/code/game/objects/items/survery_handheld.dm b/code/game/objects/items/survery_handheld.dm
index 79523b574030..a10097031485 100644
--- a/code/game/objects/items/survery_handheld.dm
+++ b/code/game/objects/items/survery_handheld.dm
@@ -51,7 +51,7 @@
src_turf.visible_message("Warning: unable to locate valuable information in current sector.")
break
- if(!do_after_mob(user, list(src), survey_delay / penalty))
+ if(!do_after(user, survey_delay / penalty, src))
flick(icon_state + "-corrupted", src)
playsound(src, 'sound/machines/buzz-sigh.ogg', 20)
src_turf.visible_message("Warning: results corrupted. Please try again.")
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 69efcd42af15..971ba3cbedce 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -93,7 +93,7 @@
if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am???
adjusted_climb_time *= 0.8
structureclimber = user
- if(do_mob(user, user, adjusted_climb_time))
+ if(do_after(user, adjusted_climb_time))
if(src.loc) //Checking if structure has been destroyed
if(do_climb(user))
user.visible_message("[user] climbs onto [src].", \
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 417a1f8d86a6..714129498e4c 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -343,7 +343,7 @@
"You [actuallyismob ? "try to ":""]stuff [O] into [src].", \
"You hear clanging.")
if(actuallyismob)
- if(do_after_mob(user, targets, 40))
+ if(do_after(user, 40, targets))
user.visible_message(
"[user] stuffs [O] into [src].", \
"You stuff [O] into [src].", \
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index cdd98f22196f..77d75164b185 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -83,10 +83,10 @@
/obj/structure/closet/crate/secure/owned/togglelock(mob/living/user, silent)
if(privacy_lock)
if(!broken)
- var/obj/item/card/id/id_card = user.get_idcard(TRUE)
- if(id_card)
- if(id_card.registered_account)
- if(id_card.registered_account == buyer_account)
+ var/obj/item/card/bank/bank_card = user.get_bankcard()
+ if(bank_card)
+ if(bank_card.registered_account)
+ if(bank_card.registered_account == buyer_account)
if(iscarbon(user))
add_fingerprint(user)
locked = !locked
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 37c816335977..4e95b5558842 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -422,7 +422,7 @@
. = ..()
if(.)
return
- var/obj/item/card/id/potential_acc = usr.get_idcard(hand_first = TRUE)
+ var/obj/item/card/bank/potential_acc = usr.get_bankcard()
switch(action)
if("Buy")
if(!showpiece)
@@ -497,9 +497,9 @@
return TRUE
. = TRUE
/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params)
- if(isidcard(I))
+ if(isbankcard(I))
//Card Registration
- var/obj/item/card/id/potential_acc = I
+ var/obj/item/card/bank/potential_acc = I
if(!potential_acc.registered_account)
to_chat(user, "This ID card has no account registered!")
return
diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm
deleted file mode 100644
index 4f98e919ffc5..000000000000
--- a/code/game/objects/structures/fugitive_role_spawners.dm
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-/obj/effect/mob_spawn/human/fugitive
- assignedrole = "Fugitive Hunter"
- flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details
- roundstart = FALSE
- death = FALSE
- random = TRUE
- show_flavour = FALSE
- density = TRUE
- var/back_story = "error"
-
-/obj/effect/mob_spawn/human/fugitive/Initialize(mapload)
- . = ..()
- notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE)
-
-/obj/effect/mob_spawn/human/fugitive/spacepol
- name = "police pod"
- desc = "A small sleeper typically used to put people to sleep for briefing on the mission."
- mob_name = "a spacepol officer"
- flavour_text = "Justice has arrived. I am a member of the Spacepol!"
- back_story = "space cop"
- outfit = /datum/outfit/spacepol
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper"
-
-/obj/effect/mob_spawn/human/fugitive/russian
- name = "russian pod"
- flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!"
- back_story = "russian"
- desc = "A small sleeper typically used to make long distance travel a bit more bearable."
- mob_name = "russian"
- outfit = /datum/outfit/frontier/hunter
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper"
-
-/obj/effect/mob_spawn/human/fugitive/bounty
- name = "bounty hunter pod"
- flavour_text = "We got a new bounty on some fugitives, dead or alive."
- back_story = "bounty hunters"
- desc = "A small sleeper typically used to make long distance travel a bit more bearable."
- mob_name = "bounty hunter"
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper"
-
-/obj/effect/mob_spawn/human/fugitive/bounty/Destroy()
- var/obj/structure/fluff/empty_sleeper/S = new(drop_location())
- S.setDir(dir)
- return ..()
-
-/obj/effect/mob_spawn/human/fugitive/bounty/armor
- outfit = /datum/outfit/bountyarmor
-
-/obj/effect/mob_spawn/human/fugitive/bounty/hook
- outfit = /datum/outfit/bountyhook
-
-/obj/effect/mob_spawn/human/fugitive/bounty/synth
- outfit = /datum/outfit/bountysynth
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 112218650f85..aed3ae724c59 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -211,37 +211,3 @@
/obj/effect/mob_spawn/human/pirate/gunner
rank = "Gunner"
-
-/datum/outfit/syndicatespace
- name = "Syndicate Spacer"
- uniform = /obj/item/clothing/under/syndicate/combat
- mask = /obj/item/clothing/mask/gas/syndicate
-
-/datum/outfit/syndicatespace/syndicrew
- name = "Syndicate Ship Crew Member"
- glasses = /obj/item/clothing/glasses/night
- ears = /obj/item/radio/headset/syndicate/alt
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- back = /obj/item/storage/backpack
- l_pocket = /obj/item/gun/ballistic/automatic/pistol
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/military/assault
- id = /obj/item/card/id/syndicate_command/crew_id
- implants = list(/obj/item/implant/weapons_auth)
-
-/datum/outfit/syndicatespace/syndicaptain
- name = "Syndicate Ship Captain"
- suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
- glasses = /obj/item/clothing/glasses/night
- head = /obj/item/clothing/head/HoS/beret/syndicate
- ears = /obj/item/radio/headset/syndicate/alt/captain
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- back = /obj/item/storage/backpack
- l_pocket = /obj/item/gun/ballistic/automatic/pistol/APS
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/military/assault
- id = /obj/item/card/id/syndicate_command/captain_id
- backpack_contents = list(/obj/item/documents/syndicate/red, /obj/item/paper/fluff/ruins/forgottenship/password)
- implants = list(/obj/item/implant/weapons_auth)
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
index d1fc91c8e596..93cdfcaa9a23 100644
--- a/code/game/objects/structures/icemoon/cave_entrance.dm
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -206,7 +206,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
*/
/obj/effect/collapsing_demonic_portal/proc/drop_loot()
visible_message("Something slips out of [src]!")
- var/loot = rand(1, 23)
+ var/loot = rand(1, 21)
switch(loot)
if(1)//Clown hell. God help you if you roll this.
visible_message("You can hear screaming and joyful honking.")//now THIS is what we call a critical failure
@@ -310,18 +310,18 @@ GLOBAL_LIST_INIT(ore_probability, list(
playsound(loc,'sound/ambience/ambiholy.ogg', 100, FALSE, 50, TRUE, TRUE)
if(prob(30))
new /obj/item/reagent_containers/glass/bottle/potion/flight(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
else
new /obj/item/clothing/neck/memento_mori(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
if(prob(35))
new /obj/item/storage/box/holy_grenades(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
if(prob(40))
new /obj/item/claymore(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
if(prob(45))
new /obj/item/gun/ballistic/bow(loc)
new /obj/item/storage/bag/quiver(loc)
@@ -330,38 +330,30 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
if(prob(30))
new /obj/item/stack/sheet/mineral/wood/fifty(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
if(prob(35))
new /obj/item/staff/bostaff(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- if(prob(45))
- new /obj/item/disk/design_disk/adv/cleric_mace(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
if(prob(25))
new /obj/item/shield/riot/roman(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
if(prob(55))
new /obj/item/clothing/suit/armor/riot/knight/blue(loc)
new /obj/item/clothing/head/helmet/knight/blue(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- if(prob(35))
- new /obj/item/disk/design_disk/adv/knight_gear(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
- new /mob/living/simple_animal/hostile/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
new /obj/item/instrument/trombone(loc)
new /obj/item/stack/sheet/bone(loc)
new /obj/item/stack/sheet/bone(loc)
new /obj/item/stack/sheet/bone(loc)
new /obj/item/stack/sheet/bone(loc)
- new /mob/living/simple_animal/hostile/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
new /turf/open/floor/mineral/silver(loc)
if(4)//syndicate incursion. Again, high-quality loot at low chances, this time with excessive levels of danger
visible_message("Radio chatter echoes out from the portal. Red-garbed figures step through, weapons raised.")
@@ -370,74 +362,74 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(prob(35))
if(prob(15))
new /obj/item/clothing/suit/space/hardsuit/syndi/elite(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
else
if(prob(50))
new /obj/item/clothing/suit/space/hardsuit/syndi(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
else
new /obj/item/clothing/suit/space/hardsuit/syndi(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
if(prob(25))//the real prize
new /obj/effect/spawner/lootdrop/donkpockets(loc)
new /obj/effect/spawner/lootdrop/donkpockets(loc)
new /obj/effect/spawner/lootdrop/donkpockets(loc)
if(prob(35))
new /obj/item/clothing/shoes/magboots/syndie(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
if(prob(25))
new /obj/item/gun/ballistic/automatic/pistol/suppressed(loc)
new /obj/item/ammo_box/magazine/
- new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
if(prob(25))
new /obj/item/gun/ballistic/automatic/pistol/tec9(loc)
new /obj/item/ammo_box/magazine/tec9(loc)
new /obj/item/ammo_box/magazine/tec9(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
if(prob(35))
new /obj/item/clothing/gloves/rapid(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
if(prob(35))
new /obj/item/wrench/combat(loc)
new /obj/item/storage/toolbox/syndicate(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
if(prob(35))
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(loc)
if(prob(35))
new /obj/item/borg/upgrade/transform/assault(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
if(prob(25))
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
if(prob(25))
- new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
if(prob(25))
- new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
new /obj/item/storage/backpack/duffelbag/syndie/c4(loc)
if(prob(35))
new /obj/item/storage/belt/military(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
if(prob(35))
new /obj/item/kinetic_crusher/syndie_crusher(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
if(prob(25))
new /obj/item/card/id/syndicate/anyone(loc)
if(prob(35))
new /obj/item/clothing/glasses/thermal/syndi(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
if(prob(35))
new /obj/item/reagent_containers/hypospray(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/shotgun(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
if(prob(25))
new /obj/item/card/emag(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc)
- new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc)
- new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
new /turf/open/floor/mineral/plastitanium/red(loc)
if(5)//;HELP BLOB IN MEDICAL
visible_message("You hear a robotic voice saying something about a \"Delta-level biohazard\".")
@@ -743,7 +735,6 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/item/clothing/suit/space/hardsuit/carp(loc)
new /mob/living/simple_animal/hostile/carp(loc)
if(prob(45))
- new /obj/item/gun/magic/hook(loc)
new /mob/living/simple_animal/hostile/carp(loc)
if(prob(45))
new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc)
@@ -806,9 +797,9 @@ GLOBAL_LIST_INIT(ore_probability, list(
visible_message("You hear a geiger counter click and smell ash.")
playsound(loc,'sound/items/radiostatic.ogg', 100, FALSE, 50, TRUE, TRUE)
if(prob(50))
- new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
- new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
- new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
+ new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola(loc)
+ new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola(loc)
+ new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola(loc)
new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
if(prob(50))
new /obj/structure/radioactive/stack(loc)
@@ -825,41 +816,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/item/geiger_counter(loc)
new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
new /turf/open/floor/plating/dirt(loc)
-
- if(15)//the cultists amoung us
- visible_message("Chanting and a hateful red glow spill through the portal.")
- playsound(loc,'sound/spookoween/ghost_whisper.ogg', 100, FALSE, 50, TRUE, TRUE)
- if(prob(50))
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- if(prob(45))
- new /obj/item/borg/upgrade/modkit/lifesteal(loc)
- new /obj/item/bedsheet/cult(loc)
- new /mob/living/simple_animal/hostile/construct/wraith/hostile(loc)
- if(prob(50))
- new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
- if(prob(35))
- new /obj/item/sharpener/cult(loc)
- new /mob/living/simple_animal/hostile/construct/artificer/hostile(loc)
- if(prob(15))
- new /obj/item/cult_bastard(loc)
- new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(loc)
- if(prob(35))
- new /obj/item/cult_shift(loc)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- if(prob(45))
- new /obj/item/gem/bloodstone(loc)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- if(prob(35))
- new /obj/item/nullrod/scythe/talking/necro(loc)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- if(prob(35))
- new /obj/item/clothing/suit/space/hardsuit/cult/(loc)
- new /mob/living/simple_animal/hostile/construct/artificer/hostile(loc)
- new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(loc)
- new /mob/living/simple_animal/hostile/construct/wraith/hostile(loc)
- new /obj/structure/destructible/cult/pylon(loc)
- new /turf/open/floor/plasteel/cult(loc)
- if(16)//the backroom freezer
+ if(15)//the backroom freezer
visible_message("The faint hallogen glow of a faraway kitchen greets you.")
if(prob(45))
new /obj/item/kitchen/knife/bloodletter(loc)
@@ -903,14 +860,14 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /mob/living/simple_animal/hostile/killertomato(loc)
new /mob/living/simple_animal/hostile/alien/maid(loc)
new /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor(loc)
- if(17)//legion miniboss
+ if(16)//legion miniboss
visible_message("The ground quakes. An immense figure reaches through the portal, crouching to squeeze through.")
playsound(loc,'sound/magic/knock.ogg', 100, FALSE, 50, TRUE, TRUE)
new /mob/living/simple_animal/hostile/big_legion(loc)
if(prob(75))
new /obj/structure/closet/crate/necropolis/tendril/greater(loc)
new /turf/open/indestructible/necropolis(loc)
- if(18)//xenobiologist's hubris
+ if(17)//xenobiologist's hubris
visible_message("You catch a glimpse of a wobbling sea of slimy friends. An abused-looking keeper slips through the portal.")
playsound(loc,'sound/effects/footstep/slime1.ogg', 100, FALSE, 50, TRUE, TRUE)
if(prob(25))
@@ -960,64 +917,64 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/effect/mob_spawn/human/scientist(loc)
new /turf/open/floor/mineral/titanium/purple(loc)
new /mob/living/simple_animal/slime/random(loc)
- if(19)//hey, free elite tumor!
+ if(18)//hey, free elite tumor!
visible_message("A large, pulsating structure falls through the portal and crashes to the floor.")
playsound(loc,'sound/effects/break_stone.ogg', 100, FALSE, 50, TRUE, TRUE)
new /obj/structure/elite_tumor(loc)
new /turf/open/floor/plating/asteroid/basalt(loc)
- if(20)//*you flush the toilet.*
+ if(19)//*you flush the toilet.*
visible_message("You hear the faint noise of a long flush.")
new /obj/structure/toilet(loc)
new /obj/effect/decal/remains(loc)
new /obj/item/newspaper(loc)
new /turf/open/floor/plastic(loc)
new /obj/item/clothing/head/papersack/smiley(loc) //welcome to the bathroom
- if(21)//Research & Zombies
+ if(20)//Research & Zombies
visible_message("Flashing lights and quarantine alarms echo through the portal. You smell rotting flesh and plasma.")
playsound(loc,'sound/misc/bloblarm.ogg', 120, FALSE, 50, TRUE, TRUE)
if(prob(35))
new /obj/item/storage/box/rndboards(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(35))
new /obj/item/storage/box/stockparts/deluxe(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(15))
new /obj/effect/spawner/lootdrop/stockparts(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(15))
new /obj/effect/spawner/lootdrop/stockparts(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(15))
new /obj/effect/spawner/lootdrop/stockparts(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(15))
new /obj/effect/spawner/lootdrop/stockparts(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(30))
new /obj/item/circuitboard/machine/rdserver(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(35))
new /obj/item/research_notes/loot/big(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
else
new /obj/item/research_notes/loot/medium(loc)
if(prob(35))
new /obj/item/research_notes/loot/medium(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
else
new /obj/item/research_notes/loot/small(loc)
if(prob(35))
new /obj/item/pneumatic_cannon(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
if(prob(45))
new /obj/item/research_notes/loot/medium(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
else
new /obj/item/research_notes/loot/small(loc)
new/turf/open/floor/mineral/titanium/purple(loc)
- new /mob/living/simple_animal/hostile/zombie(loc)
- if(22)//Silverback's locker room
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(21)//Silverback's locker room
visible_message("You catch a glimpse of verdant green. Smells like a locker room.")
playsound(loc,'sound/creatures/gorilla.ogg', 75, FALSE, 50, TRUE, TRUE)
new /mob/living/simple_animal/hostile/gorilla(loc)
@@ -1045,7 +1002,6 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(prob(45))
new /obj/item/dnainjector/dwarf(loc)
if(prob(35))
- new /obj/item/dnainjector/firebreath(loc)
new /mob/living/simple_animal/hostile/gorilla(loc)
if(prob(35))
new /mob/living/simple_animal/hostile/gorilla(loc)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index d863b693604f..6512a0683947 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -64,7 +64,7 @@
/obj/structure/kitchenspike/attack_hand(mob/user)
if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs())
var/mob/living/L = user.pulling
- if(do_mob(user, src, 120))
+ if(do_after(user, 12 SECONDS, src))
if(has_buckled_mobs()) //to prevent spam/queing up attacks
return
if(L.buckled)
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
index 28ff5a8de732..e2c3b8909913 100644
--- a/code/game/objects/structures/loom.dm
+++ b/code/game/objects/structures/loom.dm
@@ -31,11 +31,9 @@
user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", MSG_VISUAL)
return FALSE
user.show_message("You start weaving \the [W.name] through the loom..", MSG_VISUAL)
- if(W.use_tool(src, user, W.pull_effort))
- if(W.amount >= FABRIC_PER_SHEET)
- new W.loom_result(drop_location())
- W.use(FABRIC_PER_SHEET)
- user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL)
+ while(W.use_tool(src, user, W.pull_effort) && W.use(FABRIC_PER_SHEET))
+ new W.loom_result(drop_location())
+ user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL)
return TRUE
#undef FABRIC_PER_SHEET
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index fa964a55619b..ffd4e021086a 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -336,7 +336,7 @@
if((user.a_intent != INTENT_HARM) && istype(I, /obj/item/paper) && (obj_integrity < max_integrity))
user.visible_message("[user] starts to patch the holes in [src].", "You start patching some of the holes in [src]!")
- if(do_after(user, 20, TRUE, src))
+ if(do_after(user, 20, src))
obj_integrity = min(obj_integrity+4,max_integrity)
qdel(I)
user.visible_message("[user] patches some of the holes in [src].", "You patch some of the holes in [src]!")
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index 3684c69c1beb..f96d11703943 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -281,7 +281,7 @@
/obj/structure/sign/number
name = "zero"
desc = "A numeral sign."
- icon = 'icons/turf/decals.dmi'
+ icon = 'icons/turf/decals/decals.dmi'
icon_state = "0"
/obj/structure/sign/number/one
diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm
index c3c8e07cc3ab..d44606a1a57b 100644
--- a/code/game/objects/structures/spawner.dm
+++ b/code/game/objects/structures/spawner.dm
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(astroloot, list(
icon = 'icons/obj/device.dmi'
icon_state = "syndbeacon"
spawn_text = "warps in from"
- mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged)
+ mob_types = list(/mob/living/simple_animal/hostile/human/syndicate/ranged)
faction = list(ROLE_SYNDICATE)
/obj/structure/spawner/skeleton
@@ -68,7 +68,7 @@ GLOBAL_LIST_INIT(astroloot, list(
max_integrity = 150
max_mobs = 15
spawn_time = 150
- mob_types = list(/mob/living/simple_animal/hostile/skeleton)
+ mob_types = list(/mob/living/simple_animal/hostile/human/skeleton)
spawn_text = "climbs out of"
faction = list("skeleton")
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 2257a3c10c3a..4ebd416675b8 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -106,6 +106,8 @@
return TRUE
if(locate(/obj/structure/table) in get_turf(mover))
return TRUE
+ if(mover.movement_type & FLOATING)
+ return TRUE
/obj/structure/table/CanAStarPass(ID, dir, caller)
. = !density
@@ -372,7 +374,7 @@
check_break(M)
/obj/structure/table/glass/proc/check_break(mob/living/M)
- if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING))
+ if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & (FLYING || FLOATING)))
table_shatter(M)
/obj/structure/table/glass/proc/table_shatter(mob/living/L)
@@ -746,7 +748,7 @@
return
building = TRUE
to_chat(user, "You start assembling [src]...")
- if(do_after(user, 50, target = user, progress=TRUE))
+ if(do_after(user, 50, target = user))
if(!user.temporarilyRemoveItemFromInventory(src))
return
var/obj/structure/R = new construction_type(user.loc)
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index f56cfae9a5b8..4c6c3173cded 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -144,16 +144,3 @@
/obj/structure/trap/ward/Initialize()
. = ..()
QDEL_IN(src, time_between_triggers)
-
-/obj/structure/trap/cult
- name = "unholy trap"
- desc = "A trap that rings with unholy energy. You think you hear... chittering?"
- icon_state = "trap-cult"
-
-/obj/structure/trap/cult/trap_effect(mob/living/L)
- to_chat(L, "With a crack, the hostile constructs come out of hiding, stunning you!")
- L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
- L.Paralyze(20)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- QDEL_IN(src, 30)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 377c40d4e7ce..c22858ea591d 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -40,7 +40,7 @@
GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...")
swirlie = GM
var/was_alive = (swirlie.stat != DEAD)
- if(do_after(user, 30, 0, target = src))
+ if(do_after(user, 30, target = src, timed_action_flags = IGNORE_HELD_ITEM))
GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.")
if(iscarbon(GM))
var/mob/living/carbon/C = GM
diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm
index 4866dbfb3f60..2b7d93ae2590 100644
--- a/code/game/turfs/closed/_closed.dm
+++ b/code/game/turfs/closed/_closed.dm
@@ -77,6 +77,16 @@
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_AIRLOCK)
canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK)
+/turf/closed/indestructible/titanium
+ name = "wall"
+ desc = "A light-weight titanium wall used in shuttles. Effectively impervious to conventional methods of destruction."
+ icon = 'icons/turf/walls/shuttle_wall.dmi'
+ icon_state = "shuttle_wall-0"
+ base_icon_state = "shuttle_wall"
+ flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE)
/turf/closed/indestructible/riveted
icon = 'icons/turf/walls/riveted.dmi'
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index 370afeaeedf2..33fcf315fc52 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -208,12 +208,6 @@
/obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45,
/obj/item/stack/ore/silver = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal)
-/turf/closed/mineral/random/high_chance/volcanic/icecropolis
- environment_type = "basalt"
- turf_type = /turf/open/indestructible/necropolis/air
- baseturfs = /turf/open/indestructible/necropolis/air
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
-
/turf/closed/mineral/random/low_chance
mineralChance = 3
mineralSpawnChanceList = list(
@@ -238,12 +232,6 @@
/obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40,
/turf/closed/mineral/gibtonite/volcanic = 4, /obj/item/stack/ore/bluespace_crystal = 1)
-/turf/closed/mineral/random/volcanic/icecropolis
- environment_type = "basalt"
- turf_type = /turf/open/indestructible/necropolis/air
- baseturfs = /turf/open/indestructible/necropolis/air
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
-
/turf/closed/mineral/random/snow
name = "schist"
desc = "Say it fives times fast."
@@ -280,6 +268,7 @@
opacity = FALSE
light_range = 2
light_power = 1
+ mineralType = /obj/item/stack/ore/ice
/turf/closed/mineral/random/snow/underground
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 89a00d04c142..53dbb9479f3b 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -226,8 +226,6 @@
icon_state = "wood_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS | SMOOTH_CONNECTORS
-/turf/closed/wall/mineral/wood/nonmetal/icecropolis
- baseturfs = /turf/open/indestructible/necropolis/air
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.get_sharpness() && W.force)
@@ -266,9 +264,6 @@
icon_state = "iron_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
-/turf/closed/wall/mineral/iron/icecropolis
- baseturfs = /turf/open/indestructible/necropolis/air
-
/turf/closed/wall/mineral/snow
name = "packed snow wall"
desc = "A wall made of densely packed snow blocks."
diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm
index 20fcb2cb9f57..7fbcab55504a 100644
--- a/code/game/turfs/closed/wall/misc_walls.dm
+++ b/code/game/turfs/closed/wall/misc_walls.dm
@@ -63,10 +63,6 @@
icon_state = "rusty_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
-/turf/closed/wall/rust/icecropolis
- baseturfs = /turf/open/indestructible/necropolis/air
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
-
/turf/closed/wall/r_wall/rust
name = "rusted reinforced wall"
desc = "A huge chunk of rusted reinforced metal."
diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm
index 27a3225dbb03..44acbe06f6bf 100644
--- a/code/game/turfs/open/_open.dm
+++ b/code/game/turfs/open/_open.dm
@@ -99,9 +99,6 @@
heavyfootstep = FOOTSTEP_LAVA
tiled_dirt = FALSE
-/turf/open/indestructible/necropolis/icecropolis
- initial_gas_mix = ICEMOON_DEFAULT_ATMOS
-
/turf/open/indestructible/necropolis/Initialize(mapload, inherited_virtual_z)
. = ..()
if(prob(12))
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 37c369a3d8c9..3a0184849450 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -41,9 +41,6 @@
/turf/open/floor/wood/yew
color = WOOD_COLOR_YELLOW
-/turf/open/floor/wood/icecropolis
- baseturfs = /turf/open/indestructible/necropolis/air
-
/turf/open/floor/wood/examine(mob/user)
. = ..()
. += "There's a few screws and a small crack visible."
diff --git a/code/game/turfs/open/floor/plasteel_floor.dm b/code/game/turfs/open/floor/plasteel_floor.dm
index c8e32104fdef..3da6df104fb4 100644
--- a/code/game/turfs/open/floor/plasteel_floor.dm
+++ b/code/game/turfs/open/floor/plasteel_floor.dm
@@ -335,6 +335,3 @@
icon_state = "tiled_light"
base_icon_state = "tiled_light"
color = "#938170"
-
-/turf/open/floor/plasteel/icecropolis
- baseturfs = /turf/open/indestructible/necropolis/air
diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm
index 89f48aee49a1..996d122a4ac9 100644
--- a/code/game/turfs/open/floor/plating/asteroid.dm
+++ b/code/game/turfs/open/floor/plating/asteroid.dm
@@ -101,7 +101,7 @@
to_chat(user, "There is already a grave there!")
return
to_chat(user, "You start piling the dirt...")
- if(do_after(user,30, target = src))
+ if(do_after(user, 30, target = src))
if(locate(/obj/structure/closet/crate/grave) in dest_turf)
return
if(istype(W, /obj/item/stack/sheet/mineral/wood))
diff --git a/code/game/turfs/open/floor/plating/lavaland.dm b/code/game/turfs/open/floor/plating/lavaland.dm
index 1dd8d49d746d..84e0173819b7 100644
--- a/code/game/turfs/open/floor/plating/lavaland.dm
+++ b/code/game/turfs/open/floor/plating/lavaland.dm
@@ -37,15 +37,6 @@
planetary_atmos = TRUE
baseturfs = /turf/open/lava/smooth/lava_land_surface
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface/icecropolis
- initial_gas_mix = ICEMOON_DEFAULT_ATMOS
- baseturfs = /turf/open/indestructible/necropolis/icecropolis
-
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface/icecropolis/inside
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
- planetary_atmos = FALSE
- baseturfs = /turf/open/indestructible/necropolis/air
-
/turf/open/floor/plating/asteroid/basalt/purple
icon = 'icons/turf/lavaland_purple.dmi'
baseturfs = /turf/open/floor/plating/asteroid/basalt/purple
@@ -102,3 +93,39 @@
light_range = 2
light_power = 0.6
light_color = LIGHT_COLOR_FIRE
+
+/turf/open/floor/concrete/lava
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ light_range = 2
+ light_power = 0.6
+ light_color = LIGHT_COLOR_FIRE
+
+/turf/open/floor/concrete/slab_1/lava
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ light_range = 2
+ light_power = 0.6
+ light_color = LIGHT_COLOR_FIRE
+
+/turf/open/floor/plating/lava
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ light_range = 2
+ light_power = 0.6
+ light_color = LIGHT_COLOR_FIRE
+
+/turf/open/floor/plating/rust/lava
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ light_range = 2
+ light_power = 0.6
+ light_color = LIGHT_COLOR_FIRE
+
+/turf/open/floor/plasteel/white/lava
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ light_range = 2
+ light_power = 0.6
+ light_color = LIGHT_COLOR_FIRE
+
+/turf/open/floor/plasteel/dark/lava
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ light_range = 2
+ light_power = 0.6
+ light_color = LIGHT_COLOR_FIRE
diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm
index e9b28fb4a613..84a49d1a0038 100644
--- a/code/game/turfs/open/floor/plating/misc_plating.dm
+++ b/code/game/turfs/open/floor/plating/misc_plating.dm
@@ -11,11 +11,6 @@
icon_state = "plating"
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
-/turf/open/floor/plating/icecropolis
- icon_state = "plating"
- baseturfs = /turf/open/indestructible/necropolis/air
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
-
/turf/open/floor/plating/abductor
name = "alien floor"
icon_state = "alienpod1"
diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm
index a164b159d6f6..7fb94e541bda 100644
--- a/code/game/turfs/open/floor/reinf_floor.dm
+++ b/code/game/turfs/open/floor/reinf_floor.dm
@@ -133,6 +133,13 @@
name = "fuel mix floor"
initial_gas_mix = ATMOS_TANK_FUEL
+/turf/open/floor/engine/hydrogen
+ name = "\improper hydrogen floor"
+ initial_gas_mix = ATMOS_TANK_HYDROGEN
+
+/turf/open/floor/engine/hydrogen_fuel
+ name = "hydrogen mix floor"
+ initial_gas_mix = ATMOS_TANK_HYDROGEN_FUEL
/turf/open/floor/engine/cult
name = "engraved floor"
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 4ed4b47297a2..e5cc9709559c 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -461,12 +461,12 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists)
return
if(length(src_object.contents()))
to_chat(usr, "You start dumping out the contents...")
- if(!do_after(usr,20,target=src_object.parent))
+ if(!do_after(usr, 20, target=src_object.parent))
return FALSE
var/list/things = src_object.contents()
var/datum/progressbar/progress = new(user, things.len, src)
- while (do_after(usr, 10, TRUE, src, FALSE, CALLBACK(src_object, TYPE_PROC_REF(/datum/component/storage, mass_remove_from_storage), src, things, progress)))
+ while (do_after(usr, 10, src, TRUE, FALSE, CALLBACK(src_object, TYPE_PROC_REF(/datum/component/storage, mass_remove_from_storage), src, things, progress)))
stoplag(1)
progress.end_progress()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 7b147385c556..82e75d63b30e 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -731,7 +731,7 @@
/datum/admins/proc/podspawn_atom(object as text)
set category = "Event.Spawning"
set desc = "(atom path) Spawn an atom via supply drop"
- set name = "Supply drop spawn"
+ set name = "Podspawn"
if(!check_rights(R_SPAWN))
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index f4913b6be1e8..9c4f15b9d460 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -171,13 +171,10 @@ GLOBAL_PROTECT(admin_verbs_debug)
/client/proc/cmd_display_del_log,
/client/proc/cmd_display_init_log,
/client/proc/cmd_display_overlay_log,
- /client/proc/cmd_admin_grantfullaccess,
- /client/proc/cmd_assume_direct_control, //-errorage
- /client/proc/cmd_give_direct_control,
/client/proc/getserverlogs, /*for accessing server logs*/
/client/proc/getcurrentlogs, /*for accessing server logs for the current round*/
/client/proc/restart_controller,
- /client/proc/disable_debug_verbs,
+ /client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/callproc_datum,
/client/proc/SDQL2_query,
@@ -214,12 +211,6 @@ GLOBAL_PROTECT(admin_verbs_debug)
/datum/admins/proc/overmap_view, /* Opens HTML overmap viewer UI */
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
/client/proc/toggle_cdn,
- /client/proc/check_timer_sources,
- /client/proc/air_status, //Air things
- /client/proc/air_status_loc, //More air things
- /client/proc/manipulate_organs,
- /client/proc/set_server_fps, //allows you to set the ticklag.
- /client/proc/start_singlo,
)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
GLOBAL_PROTECT(admin_verbs_possess)
@@ -280,7 +271,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cmd_debug_make_powernets,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_debug_del_all,
- /client/proc/disable_debug_verbs,
+ /client/proc/enable_debug_verbs,
/proc/possess,
/proc/release,
/client/proc/reload_admins,
@@ -313,7 +304,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
if(rights & R_SERVER)
add_verb(src, GLOB.admin_verbs_server)
if(rights & R_DEBUG)
- add_verb(src, list(GLOB.admin_verbs_debug, GLOB.admin_verbs_debug_extra))
+ add_verb(src, GLOB.admin_verbs_debug)
if(rights & R_POSSESS)
add_verb(src, GLOB.admin_verbs_possess)
if(rights & R_PERMISSIONS)
@@ -347,7 +338,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
GLOB.admin_verbs_spawn,
/*Debug verbs added by "show debug verbs"*/
GLOB.admin_verbs_debug_extra,
- /client/proc/disable_debug_verbs,
+ /client/proc/enable_debug_verbs,
/client/proc/readmin
))
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 6757eec255c5..43fdcf8b65d8 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -49,6 +49,7 @@
H.dna.features["squid_face"] = pick(GLOB.squid_face_list)
H.dna.features["kepori_feathers"] = pick(GLOB.kepori_feathers_list)
H.dna.features["kepori_body_feathers"] = pick(GLOB.kepori_body_feathers_list)
+ H.dna.features["kepori_head_feathers"] = pick(GLOB.kepori_head_feathers_list)
H.dna.features["vox_head_quills"] = pick(GLOB.vox_head_quills_list)
H.dna.features["vox_neck_quills"] = pick(GLOB.vox_neck_quills_list)
H.dna.features["elzu_horns"] = pick(GLOB.elzu_horns_list)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index ae039c216120..9a226bbcb617 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -27,7 +27,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
*/
/client/proc/air_status_loc()
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Air Status in Location"
if(!mob)
return
@@ -185,7 +185,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_grantfullaccess(mob/M in GLOB.mob_list)
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Grant Full Access"
if(!SSticker.HasRoundStarted())
@@ -228,7 +228,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
message_admins("[key_name_admin(usr)] has granted [M.key] full access.")
/client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list)
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Assume direct control"
set desc = "Direct intervention"
@@ -249,7 +249,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list)
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Give direct control"
if(!M)
@@ -530,7 +530,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return dresscode
/client/proc/start_singlo()
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Start Singularity"
set desc = "Sets up the singularity and all machines to get power flowing through the station"
@@ -797,7 +797,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/// A debug verb to check the sources of currently running timers
/client/proc/check_timer_sources()
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Check Timer Sources"
set desc = "Checks the sources of the running timers"
if (!check_rights(R_DEBUG))
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 7e89d542eb2b..469c0cda08f3 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -1,5 +1,5 @@
/client/proc/air_status(turf/target)
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Display Air Status"
if(!isturf(target))
diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm
index a3e7c5f5df0b..8ac8d6b91d44 100644
--- a/code/modules/admin/verbs/fps.dm
+++ b/code/modules/admin/verbs/fps.dm
@@ -1,6 +1,6 @@
//replaces the old Ticklag verb, fps is easier to understand
/client/proc/set_server_fps()
- set category = "Debug"
+ set category = "Debug.Debug"
set name = "Set Server FPS"
set desc = "Sets game speed in frames-per-second. Can potentially break the game"
diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm
index 0695777a6897..42873241b71b 100644
--- a/code/modules/admin/verbs/manipulate_organs.dm
+++ b/code/modules/admin/verbs/manipulate_organs.dm
@@ -1,6 +1,6 @@
/client/proc/manipulate_organs(mob/living/carbon/C in world)
set name = "Manipulate Organs"
- set category = "Debug"
+ set category = "Debug.Debug"
var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") as null|anything in list("add organ", "add implant", "drop organ/implant", "remove organ/implant", "cancel")
if (!operation)
return
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 6d8bac8adcfc..8f1b69bc831d 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -43,6 +43,15 @@ GLOBAL_LIST_INIT(admin_verbs_debug_extra, list(
/client/proc/show_line_profiling,
/client/proc/start_line_profiling,
/client/proc/stop_line_profiling,
+ /client/proc/check_timer_sources,
+ /client/proc/air_status, //Air things
+ /client/proc/air_status_loc, //More air things
+ /client/proc/manipulate_organs,
+ /client/proc/set_server_fps, //allows you to set the ticklag.
+ /client/proc/start_singlo,
+ /client/proc/cmd_admin_grantfullaccess,
+ /client/proc/cmd_assume_direct_control, //-errorage
+ /client/proc/cmd_give_direct_control,
))
GLOBAL_PROTECT(admin_verbs_debug_extra)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index df5b1d6d18d3..f189fdf6106d 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -735,8 +735,6 @@
M.audible_message("...wabbajack...wabbajack...")
playsound(M.loc, 'sound/magic/staff_change.ogg', 50, TRUE, -1)
- wabbajack(M)
-
message_admins("Mass polymorph started by [who_did_it] is complete.")
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 5efddfb3cf8c..5bce8014babe 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -384,7 +384,7 @@
ammo_type = list(/obj/item/ammo_casing/energy/shrink)
item_state = "shrink_ray"
icon_state = "shrink_ray"
- fire_delay = 30
+ fire_delay = 3 SECONDS
selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds
trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them)
@@ -577,9 +577,11 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(!C.handcuffed)
if(C.canBeHandcuffed())
playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
- C.visible_message("[user] begins restraining [C] with [src]!", \
- "[user] begins shaping an energy field around your hands!")
- if(do_mob(user, C, time_to_cuff) && C.canBeHandcuffed())
+ C.visible_message(
+ "[user] begins restraining [C] with [src]!", \
+ "[user] begins shaping an energy field around your hands!"
+ )
+ if(do_after(user, time_to_cuff, C) && C.canBeHandcuffed())
if(!C.handcuffed)
C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(C))
C.update_handcuffed()
diff --git a/code/modules/antagonists/borer/borer.dm b/code/modules/antagonists/borer/borer.dm
index 511bbbec1fd5..92a1e728dc8b 100644
--- a/code/modules/antagonists/borer/borer.dm
+++ b/code/modules/antagonists/borer/borer.dm
@@ -422,7 +422,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 3)
"[src] tears [H.ears] off of your ear!") //coz, you know, they go in the ear holes
to_chat(src, "You slither up [H] and begin probing at their ear canal...")
- if(!do_mob(src, H, 30))
+ if(!do_after(src, 3 SECONDS, H))
to_chat(src, "As [H] moves away, you are dislodged and fall to the ground.")
return
diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm
index 33e0a8f75d48..a54cdc4cd09c 100644
--- a/code/modules/antagonists/changeling/powers/absorb.dm
+++ b/code/modules/antagonists/changeling/powers/absorb.dm
@@ -43,7 +43,7 @@
target.take_overall_damage(40)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("Absorb DNA", "[i]"))
- if(!do_mob(user, target, 150))
+ if(!do_after(user, 15 SECONDS, target))
to_chat(user, "Our absorption of [target] has been interrupted!")
changeling.isabsorbing = 0
return
diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm
index a0008dec26de..f158499d8b0f 100644
--- a/code/modules/antagonists/changeling/powers/linglink.dm
+++ b/code/modules/antagonists/changeling/powers/linglink.dm
@@ -58,7 +58,7 @@
target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!")
to_chat(target, "You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!")
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]"))
- if(!do_mob(user, target, 20))
+ if(!do_after(user, 2 SECONDS, target))
to_chat(user, "Our link with [target] has ended!")
changeling.islinking = 0
target.mind.linglink = 0
@@ -67,7 +67,7 @@
to_chat(user, "We must keep holding on to [target] to sustain the link. ")
while(user.pulling && user.grab_state >= GRAB_NECK)
target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 0.5) // So they don't choke to death while you interrogate them
- do_mob(user, target, 100, TRUE)
+ do_after(user, 10 SECONDS, target, hidden = TRUE)
changeling.islinking = 0
target.mind.linglink = 0
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index f32c0dcc215b..28a4ae06d16b 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -211,185 +211,6 @@
if(can_drop)
new /obj/item/melee/synthetic_arm_blade(get_turf(user))
-/***************************************\
-|***********COMBAT TENTACLES*************|
-\***************************************/
-
-/datum/action/changeling/weapon/tentacle
- name = "Tentacle"
- desc = "We ready a tentacle to grab items or victims with. Costs 10 chemicals."
- helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \
- Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \
- and Harm will pull it in and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form."
- button_icon_state = "tentacle"
- chemical_cost = 10
- dna_cost = 2
- req_human = 1
- weapon_type = /obj/item/gun/magic/tentacle
- weapon_name_simple = "tentacle"
- silent = TRUE
-
-/obj/item/gun/magic/tentacle
- name = "tentacle"
- desc = "A fleshy tentacle that can stretch out and grab things or people."
- icon = 'icons/obj/changeling_items.dmi'
- icon_state = "tentacle"
- item_state = "tentacle"
- lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
- item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON
- flags_1 = NONE
- w_class = WEIGHT_CLASS_HUGE
- slot_flags = NONE
- ammo_type = /obj/item/ammo_casing/magic/tentacle
- fire_sound = 'sound/effects/splat.ogg'
- force = 0
- max_charges = 1
- fire_delay = 1
- throwforce = 0 //Just to be on the safe side
- throw_range = 0
- throw_speed = 0
-
-/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
- if(ismob(loc))
- if(!silent)
- loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!")
- else
- to_chat(loc, "You prepare to extend a tentacle.")
-
-
-/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
- to_chat(user, "The [name] is not ready yet.")
-
-/obj/item/gun/magic/tentacle/process_fire()
- . = ..()
- if(charges == 0)
- qdel(src)
-
-/obj/item/ammo_casing/magic/tentacle
- name = "tentacle"
- desc = "A tentacle."
- projectile_type = /obj/projectile/tentacle
- caliber = "tentacle"
- icon_state = "arrow"
- firing_effect_type = null
- var/obj/item/gun/magic/tentacle/gun //the item that shot it
-
-/obj/item/ammo_casing/magic/tentacle/Initialize()
- gun = loc
- . = ..()
-
-/obj/item/ammo_casing/magic/tentacle/Destroy()
- gun = null
- return ..()
-
-/obj/projectile/tentacle
- name = "tentacle"
- icon_state = "tentacle_end"
- pass_flags = PASSTABLE
- damage = 0
- damage_type = BRUTE
- range = 8
- hitsound = 'sound/weapons/thudswoosh.ogg'
- var/chain
- var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
-
-/obj/projectile/tentacle/Initialize()
- source = loc
- . = ..()
-
-/obj/projectile/tentacle/fire(setAngle)
- if(firer)
- chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE)
- ..()
-
-/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H)
- if(H.throw_mode)
- H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item
-
-/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C)
- if(H.Adjacent(C))
- if(H.get_active_held_item() && !H.get_inactive_held_item())
- H.swap_hand()
- if(H.get_active_held_item())
- return
- C.grabbedby(H)
- C.grippedby(H, instant = TRUE) //instant aggro grab
-
-/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C)
- if(H.Adjacent(C))
- for(var/obj/item/I in H.held_items)
- if(I.get_sharpness())
- C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!")
- C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
- H.do_item_attack_animation(C, used_item = I)
- H.add_mob_blood(C)
- playsound(get_turf(H),I.hitsound,75,TRUE)
- return
-
-/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE)
- var/mob/living/carbon/human/H = firer
- if(blocked >= 100)
- return BULLET_ACT_BLOCK
- if(isitem(target))
- var/obj/item/I = target
- if(!I.anchored)
- to_chat(firer, "You pull [I] towards yourself.")
- H.throw_mode_on()
- I.throw_at(H, 10, 2)
- . = BULLET_ACT_HIT
-
- else if(isliving(target))
- var/mob/living/L = target
- if(!L.anchored && !L.throwing)//avoid double hits
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- var/firer_intent = INTENT_HARM
- var/mob/M = firer
- if(istype(M))
- firer_intent = M.a_intent
- switch(firer_intent)
- if(INTENT_HELP)
- C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
- C.throw_at(get_step_towards(H,C), 8, 2)
- return BULLET_ACT_HIT
-
- if(INTENT_DISARM)
- var/obj/item/I = C.get_active_held_item()
- if(I)
- if(C.dropItemToGround(I))
- C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!")
- on_hit(I) //grab the item as if you had hit it directly with the tentacle
- return BULLET_ACT_HIT
- else
- to_chat(firer, "You can't seem to pry [I] off [C]'s hands!")
- return BULLET_ACT_BLOCK
- else
- to_chat(firer, "[C] has nothing in hand to disarm!")
- return BULLET_ACT_HIT
-
- if(INTENT_GRAB)
- C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
- C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C))
- return BULLET_ACT_HIT
-
- if(INTENT_HARM)
- C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!")
- C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C))
- return BULLET_ACT_HIT
- else
- L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
- L.throw_at(get_step_towards(H,L), 8, 2)
- . = BULLET_ACT_HIT
-
-/obj/projectile/tentacle/Destroy()
- qdel(chain)
- source = null
- return ..()
-
-
/***************************************\
|****************SHIELD*****************|
\***************************************/
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 00dc550c11ce..c9232857a547 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -535,7 +535,7 @@
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
C.visible_message("[user] begins restraining [C] with dark magic!", \
"[user] begins shaping dark magic shackles around your wrists!")
- if(do_mob(user, C, 30))
+ if(do_after(user, 3 SECONDS, C))
if(!C.handcuffed)
C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C))
C.update_handcuffed()
@@ -812,7 +812,7 @@
/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user)
if(iscultist(user))
- var/list/options = list("Blood Spear (150)", "Blood Bolt Barrage (300)", "Blood Beam (500)")
+ var/list/options = list("Blood Spear (150)", "Blood Beam (500)")
var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options
if(!choice)
to_chat(user, "You decide against conducting a greater blood rite.")
@@ -835,18 +835,6 @@
user.visible_message(
"A [rite.name] appears at [user]'s feet!", \
"A [rite.name] materializes at your feet.")
- if("Blood Bolt Barrage (300)")
- if(uses < BLOOD_BARRAGE_COST)
- to_chat(user, "You need [BLOOD_BARRAGE_COST] charges to perform this rite.")
- else
- var/obj/rite = new /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/blood()
- uses -= BLOOD_BARRAGE_COST
- qdel(src)
- if(user.put_in_hands(rite))
- to_chat(user, "Your hands glow with power!")
- else
- to_chat(user, "You need a free hand for this rite!")
- qdel(rite)
if("Blood Beam (500)")
if(uses < BLOOD_BEAM_COST)
to_chat(user, "You need [BLOOD_BEAM_COST] charges to perform this rite.")
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 6eed283b02f1..53d17bf325aa 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -703,47 +703,6 @@
L.visible_message("An unseen force pulls the blood spear from [L]'s hands!")
spear.throw_at(owner, 10, 2, owner)
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/blood
- name = "blood bolt barrage"
- desc = "Blood for blood."
- color = "#ff0000"
- guns_left = 24
- mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood
- fire_sound = 'sound/magic/wand_teleport.ogg'
-
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood
- ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood
-
-/obj/item/ammo_casing/magic/arcane_barrage/blood
- projectile_type = /obj/projectile/magic/arcane_barrage/blood
- firing_effect_type = /obj/effect/temp_visual/cult/sparks
-
-/obj/projectile/magic/arcane_barrage/blood
- name = "blood bolt"
- icon_state = "mini_leaper"
- nondirectional_sprite = TRUE
- damage_type = BRUTE
- impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter
-
-/obj/projectile/magic/arcane_barrage/blood/Bump(atom/target)
- var/turf/T = get_turf(target)
- playsound(T, 'sound/effects/splat.ogg', 50, TRUE)
- if(iscultist(target))
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(H.stat != DEAD)
- H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4)
- if(isshade(target) || isconstruct(target))
- var/mob/living/simple_animal/M = target
- if(M.health+5 < M.maxHealth)
- M.adjustHealth(-5)
- new /obj/effect/temp_visual/cult/sparks(T)
- qdel(src)
- else
- ..()
-
/obj/item/blood_beam
name = "\improper magical aura"
desc = "Sinister looking aura that distorts the flow of reality around it."
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
index 5f4be638f78a..ace534f94dfa 100644
--- a/code/modules/antagonists/devil/devil.dm
+++ b/code/modules/antagonists/devil/devil.dm
@@ -154,10 +154,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
return pick(OBLIGATION_FOOD, OBLIGATION_FIDDLE, OBLIGATION_DANCEOFF, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME)
/proc/randomdevilban()
- // [CELADON-EDIT] - TAJARA - Модульно не сделать, увы... Добавляется BAN_HURTTAJARA в конец.
- // return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL) // CELADON-EDIT - ORIGINAL
- return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL, BAN_HURTTAJARA)
- // [/CELADON-EDIT]
+ return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL)
/proc/randomdevilbanish()
return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB)
diff --git a/code/modules/antagonists/ert/frontiersmen.dm b/code/modules/antagonists/ert/frontiersmen.dm
index 3c76dcebed9c..d6a1a5182cf0 100644
--- a/code/modules/antagonists/ert/frontiersmen.dm
+++ b/code/modules/antagonists/ert/frontiersmen.dm
@@ -26,6 +26,9 @@
outfit = /datum/outfit/job/frontiersmen/ert/leader
role = "Officer"
+/datum/antagonist/ert/frontier/leader/unnarmed
+ outfit = /datum/outfit/job/frontiersmen/ert/leader/unnarmed
+
/datum/antagonist/ert/frontier/medic
name = "Frontiersmen Medic"
outfit = /datum/outfit/job/frontiersmen/ert/medic
@@ -35,3 +38,11 @@
name = "Frontiersmen Engineer"
outfit = /datum/outfit/job/frontiersmen/ert/engineer
role = "Sapper"
+
+/datum/antagonist/ert/frontier/better
+ name = "Frontiersmen Grunt"
+ outfit = /datum/outfit/job/frontiersmen/ert/grunt/skm
+
+/datum/antagonist/ert/frontier/unnarmed
+ name = "Frontiersmen Grunt"
+ outfit = /datum/outfit/job/frontiersmen/ert/grunt
diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm
deleted file mode 100644
index df784813df40..000000000000
--- a/code/modules/antagonists/fugitive/fugitive_outfits.dm
+++ /dev/null
@@ -1,154 +0,0 @@
-/datum/outfit/prisoner
- name = "Prison Escapee"
- uniform = /obj/item/clothing/under/rank/prisoner
- shoes = /obj/item/clothing/shoes/sneakers/orange
- r_pocket = /obj/item/kitchen/knife/shiv
-
-/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
- if(visualsOnly)
- return
- H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom
-
-/datum/outfit/yalp_cultist
- name = "Cultist of Yalp Elor"
- uniform = /obj/item/clothing/under/rank/civilian/chaplain
- suit = /obj/item/clothing/suit/chaplainsuit/holidaypriest
- gloves = /obj/item/clothing/gloves/color/red
- shoes = /obj/item/clothing/shoes/sneakers/black
- mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor
-
-/datum/outfit/waldo
- name = "Waldo"
- uniform = /obj/item/clothing/under/pants/jeans
- suit = /obj/item/clothing/suit/striped_sweater
- head = /obj/item/clothing/head/beanie/waldo
- shoes = /obj/item/clothing/shoes/sneakers/brown
- ears = /obj/item/radio/headset
- glasses = /obj/item/clothing/glasses/regular/circle
-
-/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
- if(visualsOnly)
- return
- H.fully_replace_character_name(null,"Waldo")
- H.eye_color = "000"
- H.gender = MALE
- H.skin_tone = "caucasian3"
- H.hairstyle = "Business Hair 3"
- H.facial_hairstyle = "Shaved"
- H.hair_color = "000"
- H.facial_hair_color = H.hair_color
- H.update_body()
- if(H.mind)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
- var/list/no_drops = list()
- no_drops += H.get_item_by_slot(ITEM_SLOT_FEET)
- no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING)
- no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING)
- no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD)
- no_drops += H.get_item_by_slot(ITEM_SLOT_EYES)
- for(var/i in no_drops)
- var/obj/item/I = i
- ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT)
-
-/datum/outfit/synthetic
- name = "Factory Error Synth"
- uniform = /obj/item/clothing/under/color/white
- ears = /obj/item/radio/headset
-
-/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
- var/obj/item/organ/eyes/robotic/glow/eyes = new()
- eyes.Insert(src, drop_if_replaced = FALSE)
-
-/datum/outfit/spacepol
- name = "Spacepol Officer"
- uniform = /obj/item/clothing/under/rank/security/officer/beatcop
- suit = /obj/item/clothing/suit/armor/vest/blueshirt
- belt = /obj/item/gun/ballistic/automatic/pistol/candor
- head = /obj/item/clothing/head/helmet/police
- gloves = /obj/item/clothing/gloves/tackler/combat
- shoes = /obj/item/clothing/shoes/jackboots
- mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol
- glasses = /obj/item/clothing/glasses/sunglasses
- ears = /obj/item/radio/headset
- l_pocket = /obj/item/ammo_box/magazine/m45
- r_pocket = /obj/item/restraints/handcuffs
- id = /obj/item/card/id
-
-/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
- var/obj/item/card/id/W = H.wear_id
- W.assignment = "Police Officer"
- W.registered_name = H.real_name
- W.update_label()
-
-/datum/outfit/frontier/hunter
- name = "Frontiersman Corpse (Hunter)"
- ears = /obj/item/radio/headset
- r_hand = /obj/item/gun/ballistic/rifle/illestren
-
-/datum/outfit/frontier/hunter/pre_equip(mob/living/carbon/human/H)
- if(prob(50))
- head = /obj/item/clothing/head/trapper
-
-/datum/outfit/bountyarmor
- name = "Bounty Hunter - Armored"
- uniform = /obj/item/clothing/under/rank/prisoner
- head = /obj/item/clothing/head/hunter
- suit = /obj/item/clothing/suit/space/hunter
- gloves = /obj/item/clothing/gloves/tackler/combat
- shoes = /obj/item/clothing/shoes/jackboots
- mask = /obj/item/clothing/mask/gas/hunter
- glasses = /obj/item/clothing/glasses/sunglasses/garb
- ears = /obj/item/radio/headset
- l_pocket = /obj/item/tank/internals/emergency_oxygen
- r_pocket = /obj/item/restraints/handcuffs/cable
- id = /obj/item/card/id
- r_hand = /obj/item/flamethrower/full/tank
-
-/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
- var/obj/item/card/id/W = H.wear_id
- W.assignment = "Bounty Hunter"
- W.registered_name = H.real_name
- W.update_label()
-
-/datum/outfit/bountyhook
- name = "Bounty Hunter - Hook"
- uniform = /obj/item/clothing/under/rank/prisoner
- back = /obj/item/storage/backpack
- head = /obj/item/clothing/head/scarecrow_hat
- gloves = /obj/item/clothing/gloves/botanic_leather
- ears = /obj/item/radio/headset
- shoes = /obj/item/clothing/shoes/jackboots
- mask = /obj/item/clothing/mask/scarecrow
- r_pocket = /obj/item/restraints/handcuffs/cable
- id = /obj/item/card/id
- r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel/hook
-
- backpack_contents = list(
- /obj/item/ammo_casing/shotgun/incapacitate = 6
- )
-
-/datum/outfit/bountyhook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
- var/obj/item/card/id/W = H.wear_id
- W.assignment = "Bounty Hunter"
- W.registered_name = H.real_name
- W.update_label()
-
-/datum/outfit/bountysynth
- name = "Bounty Hunter - Synth"
- uniform = /obj/item/clothing/under/rank/prisoner
- back = /obj/item/storage/backpack
- suit = /obj/item/clothing/suit/armor/riot
- shoes = /obj/item/clothing/shoes/jackboots
- glasses = /obj/item/clothing/glasses/eyepatch
- r_pocket = /obj/item/restraints/handcuffs/cable
- ears = /obj/item/radio/headset
- id = /obj/item/card/id
- r_hand = /obj/item/storage/firstaid/regular
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index f3d6bb31abf4..648803185661 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -126,7 +126,7 @@
if(istype(I, /obj/item/nuke_core_container))
var/obj/item/nuke_core_container/core_box = I
to_chat(user, "You start loading the plutonium core into [core_box]...")
- if(do_after(user,50,target=src, hidden = TRUE))
+ if(do_after(user, 50, target = src, hidden = TRUE))
if(core_box.load(core, user))
to_chat(user, "You load the plutonium core into [core_box].")
deconstruction_state = NUKESTATE_CORE_REMOVED
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index b235199ed750..ca568bce6316 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -34,7 +34,7 @@
draining = TRUE
essence_drained += rand(15, 20)
to_chat(src, "You search for the soul of [target].")
- if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second?
+ if(do_after(src, rand(10, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted in that second?
if(target.ckey)
to_chat(src, "[target.p_their(TRUE)] soul burns with intelligence.")
essence_drained += rand(20, 30)
@@ -43,7 +43,7 @@
essence_drained += rand(40, 50)
else
to_chat(src, "[target.p_their(TRUE)] soul is weak and faltering.")
- if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW?
+ if(do_after(src, rand(15, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted NOW?
switch(essence_drained)
if(1 to 30)
to_chat(src, "[target] will not yield much essence. Still, every bit counts.")
@@ -53,7 +53,7 @@
to_chat(src, "Such a feast! [target] will yield much essence to you.")
if(90 to INFINITY)
to_chat(src, "Ah, the perfect soul. [target] will yield massive amounts of essence to you.")
- if(do_after(src, rand(15, 25), 0, target)) //how about now
+ if(do_after(src, rand(15, 25), target, timed_action_flags = IGNORE_HELD_ITEM)) //how about now
if(!target.stat)
to_chat(src, "[target.p_theyre(TRUE)] now powerful enough to fight off your draining.")
to_chat(target, "You feel something tugging across your body before subsiding.")
@@ -76,7 +76,7 @@
draining = FALSE
return
var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY)
- if(do_after(src, 46, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
+ if(do_after(src, 46, target, timed_action_flags = IGNORE_HELD_ITEM)) //As one cannot prove the existence of ghosts, ghosts cannot prove the existence of the target they were draining.
change_essence_amount(essence_drained, FALSE, target)
if(essence_drained <= 90 && target.stat != DEAD)
essence_regen_cap += 5
diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm
index 0e38dc57105d..1fb457eea64b 100644
--- a/code/modules/antagonists/survivalist/survivalist.dm
+++ b/code/modules/antagonists/survivalist/survivalist.dm
@@ -26,17 +26,3 @@
guns.owner = owner
objectives += guns
..()
-
-/datum/antagonist/survivalist/magic
- name = "Amateur Magician"
- greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way."
-
-/datum/antagonist/survivalist/magic/greet()
- ..()
- to_chat(owner, "As a wonderful magician, you should remember that spellbooks don't mean anything if they are used up.")
-
-/datum/antagonist/survivalist/magic/forge_objectives()
- var/datum/objective/steal_five_of_type/summon_magic/magic = new
- magic.owner = owner
- objectives += magic
- ..()
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 6fec09373797..ea6fe83c8a07 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -456,7 +456,7 @@
to_chat(src, "Attempting to remove this being from our presence.")
- if(!do_mob(src, target, 30))
+ if(!do_after(src, 3 SECONDS, target))
return
var/turf/open/floor/F
@@ -491,7 +491,7 @@
D.pixel_x = target.pixel_x
D.pixel_y = target.pixel_y
D.pixel_z = target.pixel_z
- if(do_mob(src, target, 100))
+ if(do_after(src, 10 SECONDS, target))
to_chat(src, "Dismantling complete.")
var/atom/Tsec = target.drop_location()
new /obj/item/stack/sheet/metal(Tsec, 5)
@@ -604,7 +604,7 @@
if(resources < 5)
to_chat(src, "We do not have the resources for this!")
return
- if(do_mob(src, src, 10))
+ if(do_after(src, 1 SECONDS))
Fabricate(/obj/structure/swarmer/blockade, 5)
@@ -633,7 +633,7 @@
if(!isturf(loc))
to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.")
return
- if(do_mob(src, src, 100))
+ if(do_after(src, 10 SECONDS))
var/createtype = SwarmerTypeToCreate()
if(createtype && Fabricate(createtype, 50))
playsound(loc,'sound/items/poster_being_created.ogg',50, TRUE, -1)
@@ -650,7 +650,7 @@
if(!isturf(loc))
return
to_chat(src, "Attempting to repair damage to our body, stand by...")
- if(do_mob(src, src, 100))
+ if(do_after(src, 10 SECONDS))
adjustHealth(-100)
to_chat(src, "We successfully repaired ourselves.")
diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm
index a6edcb075361..d6bbba359303 100644
--- a/code/modules/antagonists/traitor/syndicate_contract.dm
+++ b/code/modules/antagonists/traitor/syndicate_contract.dm
@@ -143,10 +143,10 @@
// Pay contractor their portion of ransom
if (status == CONTRACT_STATUS_COMPLETE)
var/mob/living/carbon/human/H
- var/obj/item/card/id/C
+ var/obj/item/card/bank/C
if(ishuman(contract.owner.current))
H = contract.owner.current
- C = H.get_idcard(TRUE)
+ C = H.get_bankcard()
if(C && C.registered_account)
C.registered_account.adjust_money(ransom * 0.35, "syndicate_contract")
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 58e397a64d40..69ff4bcfc2f5 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -106,10 +106,6 @@
name = "Fireball"
spell_type = /obj/effect/proc_holder/spell/aimed/fireball
-/datum/spellbook_entry/spell_cards
- name = "Spell Cards"
- spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards
-
/datum/spellbook_entry/rod_form
name = "Rod Form"
spell_type = /obj/effect/proc_holder/spell/targeted/rod_form
@@ -223,18 +219,6 @@
. = ..()
REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell")
-/datum/spellbook_entry/infinite_guns
- name = "Lesser Summon Guns"
- spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun
- cost = 3
- no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
-
-/datum/spellbook_entry/arcane_barrage
- name = "Arcane Barrage"
- spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
- cost = 3
- no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun
-
/datum/spellbook_entry/barnyard
name = "Barnyard Curse"
spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse
@@ -291,47 +275,6 @@
dat += "[surplus] left.
"
return dat
-/datum/spellbook_entry/item/staffchange
- name = "Staff of Change"
- desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
- item_path = /obj/item/gun/magic/staff/change
-
-/datum/spellbook_entry/item/staffanimation
- name = "Staff of Animation"
- desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines."
- item_path = /obj/item/gun/magic/staff/animate
- category = "Assistance"
-
-/datum/spellbook_entry/item/staffchaos
- name = "Staff of Chaos"
- desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended."
- item_path = /obj/item/gun/magic/staff/chaos
-
-/datum/spellbook_entry/item/spellblade
- name = "Spellblade"
- desc = "A sword capable of firing blasts of energy which rip targets limb from limb."
- item_path = /obj/item/gun/magic/staff/spellblade
-
-/datum/spellbook_entry/item/staffdoor
- name = "Staff of Door Creation"
- desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass."
- item_path = /obj/item/gun/magic/staff/door
- cost = 1
- category = "Mobility"
-
-/datum/spellbook_entry/item/staffhealing
- name = "Staff of Healing"
- desc = "An altruistic staff that can heal the lame and raise the dead."
- item_path = /obj/item/gun/magic/staff/healing
- cost = 1
- category = "Defensive"
-
-/datum/spellbook_entry/item/lockerstaff
- name = "Staff of the Locker"
- desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind."
- item_path = /obj/item/gun/magic/staff/locker
- category = "Defensive"
-
/datum/spellbook_entry/item/scryingorb
name = "Scrying Orb"
desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon others and talk to the deceased. In addition, buying it will permanently grant you X-ray vision."
@@ -356,12 +299,6 @@
item_path = /obj/item/necromantic_stone
category = "Assistance"
-/datum/spellbook_entry/item/wands
- name = "Wand Assortment"
- desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt."
- item_path = /obj/item/storage/belt/wands/full
- category = "Defensive"
-
/datum/spellbook_entry/item/armor
name = "Mastercrafted Armor Set"
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 14cf56d51ae0..96a41b2ac07b 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -204,7 +204,6 @@
if(APPRENTICE_HEALING)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
- H.put_in_hands(new /obj/item/gun/magic/staff/healing(H))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned life-saving survival spells. You are able to cast charge and forcewall.")
if(APPRENTICE_ROBELESS)
owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm
index e128623f9cb8..fb0d7026a6d1 100644
--- a/code/modules/atmospherics/auxgm/gas_types.dm
+++ b/code/modules/atmospherics/auxgm/gas_types.dm
@@ -155,3 +155,15 @@
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE *30
fusion_power = -5
+
+/datum/gas/hydrogen
+ id = GAS_HYDROGEN
+ specific_heat = 10
+ name = "Hydrogen"
+ flags = GAS_FLAG_DANGEROUS
+ moles_visible = MOLES_GAS_VISIBLE
+ color = "#ffe"
+ fusion_power = 0
+ fire_products = list(GAS_H2O = 1)
+ fire_burn_rate = 2
+ fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 895bfdc96cf4..e5a1be0294d6 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -121,7 +121,8 @@
GAS_STIMULUM = new/datum/tlv/dangerous,
GAS_NITRYL = new/datum/tlv/dangerous,
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- GAS_FREON = new/datum/tlv/dangerous
+ GAS_FREON = new/datum/tlv/dangerous,
+ GAS_HYDROGEN = new/datum/tlv/dangerous
)
/obj/machinery/airalarm/server // No checks here.
@@ -140,7 +141,8 @@
GAS_STIMULUM = new/datum/tlv/no_checks,
GAS_NITRYL = new/datum/tlv/no_checks,
GAS_PLUOXIUM = new/datum/tlv/no_checks,
- GAS_FREON = new/datum/tlv/no_checks
+ GAS_FREON = new/datum/tlv/no_checks,
+ GAS_HYDROGEN = new/datum/tlv/no_checks
)
heating_manage = FALSE
@@ -160,7 +162,8 @@
GAS_STIMULUM = new/datum/tlv/dangerous,
GAS_NITRYL = new/datum/tlv/dangerous,
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- GAS_FREON = new/datum/tlv/dangerous
+ GAS_FREON = new/datum/tlv/dangerous,
+ GAS_HYDROGEN = new/datum/tlv/dangerous
)
heating_manage = FALSE
@@ -564,7 +567,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
GAS_BZ,
GAS_STIMULUM,
GAS_PLUOXIUM,
- GAS_FREON
+ GAS_FREON,
+ GAS_HYDROGEN
),
"scrubbing" = 1,
"widenet" = 1
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index c32a750848da..7416014ee463 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -204,18 +204,18 @@
piping_layer = 2
icon_state = "volpump_map-2"
-/obj/machinery/atmospherics/components/binary/volume_pump/layer2
- piping_layer = 2
- icon_state = "volpump_map-2"
+/obj/machinery/atmospherics/components/binary/volume_pump/layer4
+ piping_layer = 4
+ icon_state = "volpump_map-4"
/obj/machinery/atmospherics/components/binary/volume_pump/on
on = TRUE
- icon_state = "volpump_map-2"
+ icon_state = "volpump_on_map-3"
/obj/machinery/atmospherics/components/binary/volume_pump/on/layer2
piping_layer = 2
- icon_state = "volpump_map-2"
+ icon_state = "volpump_on_map-2"
/obj/machinery/atmospherics/components/binary/volume_pump/on/layer4
piping_layer = 4
- icon_state = "volpump_map-4"
+ icon_state = "volpump_on_map-4"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 3705cb361d82..5ff6b2e396b5 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -299,7 +299,7 @@
close_machine(target)
else
user.visible_message("[user] starts shoving [target] inside [src].", "You start shoving [target] inside [src].")
- if (do_after(user, 25, target=target))
+ if (do_after(user, 25, target = target))
close_machine(target)
/obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm
index ca85e9cc5569..9f5a6a9aa6db 100644
--- a/code/modules/atmospherics/machinery/other/miner.dm
+++ b/code/modules/atmospherics/machinery/other/miner.dm
@@ -178,3 +178,8 @@
name = "\improper Water Vapor Gas Miner"
overlay_color = "#99928E"
spawn_id = GAS_H2O
+
+/obj/machinery/atmospherics/miner/hydrogen
+ name = "\improper Hydrogen Gas Miner"
+ overlay_color = "#ffffffda"
+ spawn_id = GAS_HYDROGEN
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 6b0f025b6b89..f2e563c07b5e 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -52,7 +52,9 @@
"stimulum" = /obj/machinery/portable_atmospherics/canister/stimulum,
"pluoxium" = /obj/machinery/portable_atmospherics/canister/pluoxium,
"caution" = /obj/machinery/portable_atmospherics/canister,
- "freon" = /obj/machinery/portable_atmospherics/canister/freon
+ "freon" = /obj/machinery/portable_atmospherics/canister/freon,
+ "hydrogen" = /obj/machinery/portable_atmospherics/canister/hydrogen,
+ "fuel mix" = /obj/machinery/portable_atmospherics/canister/fuel
)
/obj/machinery/portable_atmospherics/canister/interact(mob/user)
@@ -147,6 +149,27 @@
gas_type = GAS_FREON
filled = 1
+/obj/machinery/portable_atmospherics/canister/hydrogen
+ name = "hydrogen canister"
+ desc = "Hydrogen. Used in thruster fuel."
+ icon_state = "orangews"
+ gas_type = GAS_HYDROGEN
+
+/obj/machinery/portable_atmospherics/canister/fuel
+ name = "fuel canister"
+ desc = "A highly volatile mix of hydrogen and oxygen."
+ icon_state = "orangewshaz"
+
+/obj/machinery/portable_atmospherics/canister/fuel_test
+ name = "test canister"
+ desc = "Hydrogen. Used in thruster fuel."
+ icon_state = "orangewshaz"
+
+/obj/machinery/portable_atmospherics/canister/fuel_test/create_gas()
+ air_contents.set_moles(GAS_O2, 500)
+ air_contents.set_moles(GAS_HYDROGEN, 1000)
+ air_contents.set_temperature(T20C)
+
/obj/machinery/portable_atmospherics/canister/fusion_test
name = "fusion test canister"
desc = "Don't be a badmin."
@@ -216,6 +239,11 @@
air_contents.set_moles(GAS_O2, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
air_contents.set_moles(GAS_N2, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
+/obj/machinery/portable_atmospherics/canister/fuel/create_gas()
+ air_contents.set_temperature(starter_temp)
+ air_contents.set_moles(GAS_HYDROGEN, (2/3 * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
+ air_contents.set_moles((GAS_O2), (1/3 * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
+
/obj/machinery/portable_atmospherics/canister/update_icon_state()
if(machine_stat & BROKEN)
icon_state = "[icon_state]-1"
diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
index 8e71222ab4d4..7505d2b8789e 100644
--- a/code/modules/atmospherics/machinery/portable/scrubber.dm
+++ b/code/modules/atmospherics/machinery/portable/scrubber.dm
@@ -8,7 +8,7 @@
var/volume_rate = 1000
var/overpressure_m = 80
var/use_overlays = TRUE
- var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_FREON)
+ var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_FREON, GAS_HYDROGEN)
/obj/machinery/portable_atmospherics/scrubber/Destroy()
var/turf/T = get_turf(src)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index d06775267770..52e1a7c879a9 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -30,7 +30,7 @@
var/mob_color //Change the mob's color
var/assignedrole
var/show_flavour = TRUE
- var/banType = ROLE_LAVALAND
+ var/ban_type = ROLE_LAVALAND
var/ghost_usable = TRUE
/// Weakref to the mob this spawner created - just if you needed to do something with it.
var/datum/weakref/spawned_mob_ref
@@ -42,7 +42,7 @@
if(!uses)
to_chat(user, "This spawner is out of charges!")
return
- if(is_banned_from(user.key, banType))
+ if(is_banned_from(user.key, ban_type))
to_chat(user, "You are jobanned!")
return
if(!allow_spawn(user))
@@ -230,7 +230,7 @@
C.sensor_mode = NO_SENSORS
- var/obj/item/card/id/W = H.wear_id
+ var/obj/item/card/id/W = H.get_idcard()
if(W)
if(H.age)
W.registered_age = H.age
@@ -443,7 +443,7 @@
/datum/outfit/spacebartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/card/id/W = H.wear_id
+ var/obj/item/card/id/W = H.get_idcard()
if(H.age < AGE_MINOR)
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index c7aa46af728b..b64a2abf02de 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -487,7 +487,6 @@
/obj/item/shield/energy = 6,
/obj/item/shield/riot/tele = 12,
/obj/item/dnainjector/lasereyesmut = 7,
- /obj/item/gun/magic/wand/fireball/inert = 3,
/obj/item/pneumatic_cannon = 15,
/obj/item/melee/transforming/energy/sword = 7,
/obj/item/book/granter/spell/knock = 15,
@@ -515,8 +514,6 @@
/obj/item/dualsaber = 15,
/obj/item/organ/heart/demon = 7,
/obj/item/gun/ballistic/automatic/smg/c20r = 16,
- /obj/item/gun/magic/wand/resurrection/inert = 15,
- /obj/item/gun/magic/wand/resurrection = 10,
/obj/item/uplink/old = 2,
/obj/item/book/granter/spell/charge = 12,
/obj/item/grenade/clusterbuster/spawner_manhacks = 15,
@@ -556,16 +553,6 @@
desc = "High speed, low drag combat boots, now with an added layer of insulation."
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
-/obj/item/gun/magic/wand/fireball/inert
- name = "weakened wand of fireball"
- desc = "This wand shoots scorching balls of fire that explode into destructive flames. The years of the cold have weakened the magic inside the wand."
- max_charges = 4
-
-/obj/item/gun/magic/wand/resurrection/inert
- name = "weakened wand of healing"
- desc = "This wand uses healing magics to heal and revive. The years of the cold have weakened the magic inside the wand."
- max_charges = 5
-
/obj/effect/mob_spawn/human/syndicatesoldier/coldres
name = "Syndicate Snow Operative"
outfit = /datum/outfit/snowsyndie/corpse
diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm
index dee4def256b0..efe429b86b73 100644
--- a/code/modules/awaymissions/mission_code/spacebattle.dm
+++ b/code/modules/awaymissions/mission_code/spacebattle.dm
@@ -41,11 +41,11 @@
name = "Hidden Chamber"
icon_state = "awaycontent10"
-/mob/living/simple_animal/hostile/syndicate/ranged/spacebattle
+/mob/living/simple_animal/hostile/human/syndicate/ranged/spacebattle
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier,
/obj/item/gun/ballistic/automatic/smg/c20r,
/obj/item/shield/energy)
-/mob/living/simple_animal/hostile/syndicate/melee/spacebattle
+/mob/living/simple_animal/hostile/human/syndicate/melee/spacebattle
deathmessage = "falls limp as they release their grip from the energy weapons, activating their self-destruct function!"
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
index 951574fedfe2..a4c4195beca0 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
@@ -160,7 +160,7 @@
/datum/blackmarket_item/clothing/ramzi_suit
name = "Rusted Red Hardsuit"
desc = "A vintage ICW Era Gorlex Maruader hardsuit. The previous owner said we could have it when we pried it off their cold dead hands. Dry cleaning not included."
- item = /obj/item/clothing/head/helmet/space/hardsuit/syndi/ramzi
+ item = /obj/item/clothing/suit/space/hardsuit/syndi/ramzi
price_min = 1500
price_max = 2500
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm
index 6e6551b58e86..e3a20e0e8905 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm
@@ -161,10 +161,10 @@
availability_prob = 80
unlimited = TRUE
-/datum/blackmarket_item/consumable/thirteenloko
- name = "Can of Thirteen Loko"
+/datum/blackmarket_item/consumable/vimukti
+ name = "Can of Vimukti"
desc = "This product was quietly discontinued after multiple health related incidents. But you aren't a coward, are you?"
- item = /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko
+ item = /obj/item/reagent_containers/food/drinks/soda_cans/vimukti
price_min = 10
price_max = 50
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
index 0c86f608e51c..384886ac30d3 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
@@ -1,46 +1,6 @@
/datum/blackmarket_item/tool
category = "Tools"
-/datum/blackmarket_item/tool/caravan_wrench
- name = "Experimental Wrench"
- desc = "The extra fast and handy wrench you always wanted!"
- item = /obj/item/wrench/caravan
-
- price_min = 100
- price_max = 200
- stock_max = 3
- availability_prob = 40
-
-/datum/blackmarket_item/tool/caravan_wirecutters
- name = "Experimental Wirecutters"
- desc = "The extra fast and handy wirecutters you always wanted!"
- item = /obj/item/wirecutters/caravan
-
- price_min = 100
- price_max = 200
- stock_max = 3
- availability_prob = 40
-
-/datum/blackmarket_item/tool/caravan_screwdriver
- name = "Experimental Screwdriver"
- desc = "The extra fast and handy screwdriver you always wanted!"
- item = /obj/item/screwdriver/caravan
-
- price_min = 100
- price_max = 200
- stock_max = 3
- availability_prob = 40
-
-/datum/blackmarket_item/tool/caravan_crowbar
- name = "Experimental Crowbar"
- desc = "The extra fast and handy crowbar you always wanted!"
- item = /obj/item/crowbar/red/caravan
-
- price_min = 100
- price_max = 200
- stock_max = 3
- availability_prob = 40
-
/datum/blackmarket_item/tool/combat_wrench
name = "Combat Wrench"
desc = "Under fire while doing repairs? With this dual purpose wrench, never be caught unprepared again!"
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
index 8951f20938b0..11fef220ee01 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
@@ -122,8 +122,8 @@
pair_item = /datum/blackmarket_item/weapon/e40_mag
price_min = 7000
- price_max = 13000
- stock = 1
+ price_max = 15000
+ stock_max = 2
availability_prob = 20
/datum/blackmarket_item/weapon/e40_mag
@@ -134,7 +134,7 @@
price_min = 750
price_max = 1250
stock_min = 2
- stock_max = 4
+ stock_max = 6
availability_prob = 0
/datum/blackmarket_item/weapon/e50
diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm
index b2df34d8f964..4eb48b09c7cb 100644
--- a/code/modules/cargo/bounties/mining.dm
+++ b/code/modules/cargo/bounties/mining.dm
@@ -41,7 +41,7 @@
description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing."
reward = 7500
required_count = 3
- wanted_types = list(/obj/item/clothing/accessory/talisman)
+ wanted_types = list(/obj/item/clothing/accessory/bonearmlet)
/datum/bounty/item/mining/bone_dagger
name = "Bone Daggers"
diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm
index a3ece1cce8c6..0fcbbf4f1794 100644
--- a/code/modules/cargo/bounties/reagent.dm
+++ b/code/modules/cargo/bounties/reagent.dm
@@ -71,7 +71,7 @@
/datum/reagent/consumable/ethanol/syndicatebomb,\
/datum/reagent/consumable/ethanol/tequila_sunrise,\
/datum/reagent/consumable/ethanol/manly_dorf,\
- /datum/reagent/consumable/ethanol/thirteenloko,\
+ /datum/reagent/consumable/ethanol/vimukti,\
/datum/reagent/consumable/triple_citrus,\
/datum/reagent/consumable/ethanol/vodkamartini,\
/datum/reagent/consumable/ethanol/whiskeysoda,\
@@ -100,10 +100,7 @@
/datum/reagent/consumable/ethanol/booger,\
/datum/reagent/consumable/ethanol/hippies_delight,\
/datum/reagent/consumable/ethanol/drunkenblumpkin,\
- /datum/reagent/consumable/ethanol/fetching_fizz,\
/datum/reagent/consumable/ethanol/goldschlager,\
- /datum/reagent/consumable/ethanol/manhattan_proj,\
- /datum/reagent/consumable/ethanol/narsour,\
/datum/reagent/consumable/ethanol/neurotoxin,\
/datum/reagent/consumable/ethanol/patron,\
/datum/reagent/consumable/ethanol/quadruple_sec,\
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index 0a2f0c2c4d32..00a11c81cca2 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -10,7 +10,6 @@
unit_name = "minor lava planet artifact"
export_types = list(/obj/item/immortality_talisman,
/obj/item/book_of_babel,
- /obj/item/gun/magic/hook,
/obj/item/wisp_lantern,
/obj/item/reagent_containers/glass/bottle/potion/flight,
/obj/item/katana/cursed,
@@ -26,9 +25,7 @@
/obj/item/lava_staff,
/obj/item/ship_in_a_bottle,
/obj/item/clothing/shoes/clown_shoes/banana_shoes,
- /obj/item/gun/magic/staff/honk,
/obj/item/kitchen/knife/envy,
- /obj/item/gun/ballistic/revolver/russian/soul,
/obj/item/veilrender/vealrender,
/obj/item/nullrod/scythe/talking/necro,
/obj/item/clothing/suit/armor/ascetic)
@@ -64,33 +61,32 @@
/obj/machinery/anomalous_crystal,
/obj/item/mayhem,
/obj/item/blood_contract,
- /obj/item/guardiancreator/miner/choose,//this is basically the most valulable mining loot so good luck getting a miner to part ways
- /obj/item/gun/magic/staff/spellblade,
+ /obj/item/guardiancreator/miner/choose//this is basically the most valulable mining loot so good luck getting a miner to part ways
)
-
+/*
/datum/export/lavaland/trophycommon
// [CELADON-EDIT] - CARGO_ITEMS - Ребаланс цен
// cost = 1500 // CELADON-EDIT - ORIGINAL
cost = 900
// [/CELADON-EDIT]
unit_name = "common hunting trophy"
- export_types = list(/obj/item/crusher_trophy/legion_skull,
- /obj/item/crusher_trophy/wolf_ear,
- /obj/item/crusher_trophy/bear_paw,
- /obj/item/crusher_trophy/goliath_tentacle,
- /obj/item/crusher_trophy/watcher_wing)
+ export_types = list(/obj/item/mob_trophy/legion_skull,
+ /obj/item/mob_trophy/wolf_ear,
+ /obj/item/mob_trophy/bear_paw,
+ /obj/item/mob_trophy/goliath_tentacle,
+ /obj/item/mob_trophy/watcher_wing)
/datum/export/lavaland/trophyrare
cost = 5000
unit_name = "rare hunting trophy"
- export_types = list(/obj/item/crusher_trophy/dwarf_skull,
- /obj/item/crusher_trophy/fang,
- /obj/item/crusher_trophy/war_paw,
- /obj/item/crusher_trophy/elder_tentacle,
- /obj/item/crusher_trophy/ice_crystal,
- /obj/item/crusher_trophy/magma_wing,
- /obj/item/crusher_trophy/tail_spike,
- /obj/item/crusher_trophy/ice_wing)
+ export_types = list(/obj/item/mob_trophy/dwarf_skull,
+ /obj/item/mob_trophy/fang,
+ /obj/item/mob_trophy/war_paw,
+ /obj/item/mob_trophy/elder_tentacle,
+ /obj/item/mob_trophy/ice_crystal,
+ /obj/item/mob_trophy/magma_wing,
+ /obj/item/mob_trophy/tail_spike,
+ /obj/item/mob_trophy/ice_wing)
/datum/export/lavaland/trophymega
// [CELADON-EDIT] - CARGO_ITEMS - Ребаланс цен
@@ -98,15 +94,15 @@
cost = 5000
// [/CELADON-EDIT]
unit_name = "big game hunting trophy"
- export_types = list(/obj/item/crusher_trophy/legionnaire_spine,
- /obj/item/crusher_trophy/ash_spike,
- /obj/item/crusher_trophy/demon_claws,
- /obj/item/crusher_trophy/broodmother_tongue,
- /obj/item/crusher_trophy/ice_block_talisman,
- /obj/item/crusher_trophy/king_goat,
- /obj/item/crusher_trophy/miner_eye,
- /obj/item/crusher_trophy/vortex_talisman,
- /obj/item/crusher_trophy/blaster_tubes)
+ export_types = list(/obj/item/mob_trophy/legionnaire_spine,
+ /obj/item/mob_trophy/ash_spike,
+ /obj/item/mob_trophy/demon_claws,
+ /obj/item/mob_trophy/broodmother_tongue,
+ /obj/item/mob_trophy/ice_block_talisman,
+ /obj/item/mob_trophy/miner_eye,
+ /obj/item/mob_trophy/vortex_talisman,
+ /obj/item/mob_trophy/blaster_tubes)
+*/
/datum/export/lavaland/megafauna/total_printout(datum/export_report/ex, notes = TRUE) //in the unlikely case a miner feels like selling megafauna loot
. = ..()
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index aa165cbc8149..3ad93e2a0d6e 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -18,10 +18,10 @@
contains = list(/obj/item/ammo_box/magazine/m45)
cost = 500
-/datum/supply_pack/ammo/m45_speedloader
- name = ".45 ACP Speedloader Crate"
- desc = "Contains a .45 ACP speedloader for the HP Montagne, containing six rounds."
- contains = list(/obj/item/ammo_box/c45_speedloader)
+/datum/supply_pack/ammo/a44roum_speedloader
+ name = ".44 Roumain Speedloader Crate"
+ desc = "Contains a .44 Roumain speedloader for the HP Montagne, containing six rounds."
+ contains = list(/obj/item/ammo_box/a44roum_speedloader)
cost = 400
/datum/supply_pack/ammo/c38_mag
@@ -213,19 +213,23 @@
name = "9mm Ammo Box Crate"
desc = "Contains a fifty-round 9mm box for pistols and SMGs such as the Commander or Saber."
contains = list(/obj/item/ammo_box/c9mm)
- cost = 250
+ cost = 200
+//[СELADON-REMOVE] - CELADON_WEAPONS - хватит это терпеть! Хрен я эти патроны дам продавать по 500 кредитов - mod_celadon/weapons/code/ammo.dm
+/*
/datum/supply_pack/ammo/a308_ammo_box
name = "308 Ammo Box Crate"
desc = "Contains a thirty-round .308 box for DMRs such as the SsG-04 and CM-GAL-S."
contains = list(/obj/item/ammo_box/a308)
cost = 500
+*/
+//[/СELADON-REMOVE]
/datum/supply_pack/ammo/c9mmap_ammo_box
name = "9mm AP Ammo Box Crate"
desc = "Contains a fifty-round 9mm box loaded with armor piercing ammo."
contains = list(/obj/item/ammo_box/c9mm/ap)
- cost = 500
+ cost = 400
/datum/supply_pack/ammo/a357match_ammo_box
name = ".357 Match Ammo Box Crate"
@@ -255,7 +259,7 @@
name = "9mm HP Ammo Box Crate"
desc = "Contains a fifty-round 9mm box loaded with hollow point ammo, great against unarmored targets."
contains = list(/obj/item/ammo_box/c9mm/hp)
- cost = 500
+ cost = 400
/datum/supply_pack/ammo/a357hp_ammo_box
name = ".357 HP Ammo Box Crate"
@@ -284,7 +288,7 @@
name = "9mm Rubber Ammo Box Crate"
desc = "Contains a fifty-round 9mm box loaded with less-than-lethal rubber rounds."
contains = list(/obj/item/ammo_box/c9mm/rubbershot)
- cost = 250
+ cost = 200
/datum/supply_pack/ammo/c10mmrubber_ammo_box
name = "10mm Rubber Ammo Box Crate"
@@ -370,3 +374,21 @@
desc = "Contains a fifty-round box for high-powered gauss guns such as the GAR assault rifle."
contains = list(/obj/item/ammo_box/ferrolancebox)
cost = 250
+
+/datum/supply_pack/ammo/a44roum
+ name = ".44 Roumain Ammo Box Crate"
+ desc = "Contains a fifty-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne."
+ contains = list(/obj/item/ammo_box/a44roum)
+ cost = 250
+
+/datum/supply_pack/ammo/a44roum_rubber
+ name = ".44 Roumain Rubber Ammo Box Crate"
+ desc = "Contains a fifty-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/ammo_box/a44roum/rubber)
+ cost = 250
+
+/datum/supply_pack/ammo/a44roum_hp
+ name = ".44 Roumain Hollow Point Ammo Box Crate"
+ desc = "Contains a fifty-round box of .44 roumain hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/ammo_box/a44roum/hp)
+ cost = 500
diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm
index abaefeaff22c..f40859eeec61 100644
--- a/code/modules/cargo/packs/food.dm
+++ b/code/modules/cargo/packs/food.dm
@@ -228,7 +228,7 @@
// [/CELADON-EDIT]
contains = list(/obj/item/stack/sheet/mineral/coal/five,
/obj/machinery/grill/unwrenched,
- /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy)
+ /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy)
crate_name = "grilling starter kit crate"
crate_type = /obj/structure/closet/crate/large
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index a8a779fea3d4..ede26532fde7 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -52,7 +52,7 @@
/datum/supply_pack/gun/shadowrevolver
name = "Shadow Revolver Crate"
- desc = "Contains a concealable Shadow revolver, chambered in .45 ACP."
+ desc = "Contains a concealable Shadow revolver, chambered in .44 Roumain."
cost = 1000
contains = list(/obj/item/gun/ballistic/revolver/shadow)
diff --git a/code/modules/cargo/packs/machinery.dm b/code/modules/cargo/packs/machinery.dm
index e51e2c8e4922..6de1fd9250df 100644
--- a/code/modules/cargo/packs/machinery.dm
+++ b/code/modules/cargo/packs/machinery.dm
@@ -217,6 +217,15 @@
crate_name = "plasma thruster crate"
crate_type = /obj/structure/closet/crate/engineering
+/datum/supply_pack/machinery/combustion_thruster
+ name = "Combustion Thruster Crate"
+ desc = "A crate containing a combustion thruster and its heater's electronics. For when you need complicated thrust."
+ cost = 2000
+ contains = list(/obj/item/circuitboard/machine/shuttle/fire_heater,
+ /obj/item/circuitboard/machine/shuttle/engine/fire)
+ crate_name = "combustion thruster crate"
+ crate_type = /obj/structure/closet/crate/engineering
+
/datum/supply_pack/machinery/drill_crate
name = "Heavy duty laser mining drill"
desc = "An experimental laser-based mining drill that Nanotrasen is kindly allowing YOU, the customer, to opt into testing of."
diff --git a/code/modules/client/loadout/loadout_accessories.dm b/code/modules/client/loadout/loadout_accessories.dm
index b81588c8e72e..70225b60cc2e 100644
--- a/code/modules/client/loadout/loadout_accessories.dm
+++ b/code/modules/client/loadout/loadout_accessories.dm
@@ -50,6 +50,16 @@
display_name = "tie, recolorable"
path = /obj/item/clothing/neck/tie
+//Bone
+/datum/gear/accessory/fangnecklace
+ display_name = "wolf fang necklace"
+ path = /obj/item/clothing/neck/fangnecklace
+
+/datum/gear/accessory/bonearmlet
+ display_name = "bone armlet"
+ path = /obj/item/clothing/accessory/bonearmlet
+ slot = null
+
//Misc
/datum/gear/accessory/waistcoat
diff --git a/code/modules/client/loadout/loadout_general.dm b/code/modules/client/loadout/loadout_general.dm
index 4c081a67e92f..6277a8a3a601 100644
--- a/code/modules/client/loadout/loadout_general.dm
+++ b/code/modules/client/loadout/loadout_general.dm
@@ -62,10 +62,6 @@
display_name = "toy, magic eight ball"
path = /obj/item/toy/eightball
-/datum/gear/wallet
- display_name = "wallet"
- path = /obj/item/storage/wallet
-
/datum/gear/pai
display_name = "personal AI device"
path = /obj/item/paicard
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 51985fa11e82..dfc8c38e998f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -114,9 +114,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"ipc_tail" = "None",
"ipc_chassis" = "Morpheus Cyberkinetics (Custom)",
"ipc_brain" = "Posibrain",
- "kepori_feathers" = "Plain",
- "kepori_body_feathers" = "Plain",
- "kepori_tail_feathers" = "Fan",
+ "kepori_feathers" = "None",
+ "kepori_body_feathers" = "None",
+ "kepori_head_feathers" = "None",
+ "kepori_tail_feathers" = "None",
"vox_head_quills" = "Plain",
"vox_neck_quills" = "Plain",
"elzu_horns" = "None",
@@ -244,7 +245,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return
#define APPEARANCE_CATEGORY_COLUMN ""
-#define MAX_MUTANT_ROWS 4
+#define MAX_MUTANT_ROWS 5
/datum/preferences/proc/ShowChoices(mob/user)
show_loadout = (current_tab != 1) ? show_loadout : FALSE
@@ -728,6 +729,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " | "
mutant_category = 0
+ if("kepori_head_feathers" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Head Feathers
"
+ dat += "[features["kepori_head_feathers"]]
"
+ dat += " Change
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+
if("kepori_body_feathers" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -925,10 +939,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//Adds a thing to select which phobia because I can't be assed to put that in the quirks window
if("Phobia" in all_quirks)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
dat += "Phobia
"
dat += "[phobia]
"
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+
if("Smoker" in all_quirks)
dat += "Smoker
"
@@ -942,16 +963,25 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[features["body_size"]]
"
-
- dat += "Character Adjective
"
-
- dat += "[generic_adjective]
"
-
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
+ if(generic_adjective)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Character Adjective
"
+
+ dat += "[generic_adjective]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ // end generic adjective
+
if("wings" in pref_species.default_features && GLOB.r_wings_list.len >1)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -2083,6 +2113,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (new_kepori_feathers)
features["kepori_feathers"] = new_kepori_feathers
+ if("kepori_head_feathers")
+ var/new_kepori_feathers
+ new_kepori_feathers = input(user, "Choose your character's head feathers:", "Character Preference") as null|anything in GLOB.kepori_head_feathers_list
+ if (new_kepori_feathers)
+ features["kepori_head_feathers"] = new_kepori_feathers
+
if("kepori_body_feathers")
var/new_kepori_feathers
new_kepori_feathers = input(user, "Choose your character's body feathers:", "Character Preference") as null|anything in GLOB.kepori_body_feathers_list
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 7d075dae77dd..ddeea09fdaad 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -412,6 +412,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
READ_FILE(S["uplink_loc"], uplink_spawn_loc)
READ_FILE(S["phobia"], phobia)
READ_FILE(S["preferred_smoke_brand"], preferred_smoke_brand)
+ READ_FILE(S["generic_adjective"], generic_adjective)
READ_FILE(S["randomise"], randomise)
READ_FILE(S["body_size"], features["body_size"])
READ_FILE(S["prosthetic_limbs"], prosthetic_limbs)
@@ -443,6 +444,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
READ_FILE(S["feature_ipc_brain"], features["ipc_brain"])
READ_FILE(S["feature_kepori_feathers"], features["kepori_feathers"])
READ_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"])
+ READ_FILE(S["feature_kepori_head_feathers"], features["kepori_head_feathers"])
READ_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"])
READ_FILE(S["feature_vox_head_quills"], features["vox_head_quills"])
READ_FILE(S["feature_vox_neck_quills"], features["vox_neck_quills"])
@@ -526,7 +528,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
facial_hairstyle = sanitize_inlist(facial_hairstyle, GLOB.tajara_facial_hairs_list)
features["grad_style"] = sanitize_inlist(features["grad_style"], GLOB.hair_gradients_list)
features["grad_color"] = sanitize_hexcolor(features["grad_color"])
- // [/CELADON-EDIT]
+ // [/CELADON-EDIT]
else
// [CELADON-EDIT] - TAJARA
// hairstyle = sanitize_inlist(hairstyle, GLOB.hairstyles_list)
@@ -586,8 +588,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list)
features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list)
features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain")
- features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain")
- features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan")
+ features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "None")
+ features["kepori_head_feathers"] = sanitize_inlist(features["kepori_head_feathers"], GLOB.kepori_head_feathers_list, "None")
+ features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "None")
features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None")
features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None")
features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list)
@@ -647,6 +650,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["randomise"] , randomise)
WRITE_FILE(S["species"] , pref_species.id)
WRITE_FILE(S["preferred_smoke_brand"] , preferred_smoke_brand)
+ WRITE_FILE(S["preferred_smoke_brand"] , preferred_smoke_brand)
WRITE_FILE(S["phobia"] , phobia)
WRITE_FILE(S["generic_adjective"] , generic_adjective)
WRITE_FILE(S["body_size"] , features["body_size"])
@@ -680,6 +684,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_ipc_brain"] , features["ipc_brain"])
WRITE_FILE(S["feature_kepori_feathers"] , features["kepori_feathers"])
WRITE_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"])
+ WRITE_FILE(S["feature_kepori_head_feathers"], features["feature_kepori_head_feathers"])
WRITE_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"])
WRITE_FILE(S["feature_vox_head_quills"] , features["vox_head_quills"])
WRITE_FILE(S["feature_vox_neck_quills"] , features["vox_neck_quills"])
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index b1e1cc1f2105..166f437dc3af 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -286,7 +286,7 @@
if("[layer]" in mob_species.offset_clothing)
// This code taken from Baystation 12
- var/icon/final_I = icon('icons/blanks/32x32.dmi', "nothing")
+ var/icon/final_I = icon('icons/blanks/64x64.dmi', "nothing")
var/list/shifts = mob_species.offset_clothing["[layer]"]
// Apply all pixel shifts for each direction.
@@ -294,9 +294,10 @@
var/list/facing_list = shifts[shift_facing]
var/use_dir = text2num(shift_facing)
var/icon/equip = icon(file2use, icon_state = state2use, dir = use_dir)
- var/icon/canvas = icon('icons/blanks/32x32.dmi', "nothing")
+ var/icon/canvas = icon('icons/blanks/64x64.dmi', "nothing")
canvas.Blend(equip, ICON_OVERLAY, facing_list["x"]+1, facing_list["y"]+1)
final_I.Insert(canvas, dir = use_dir)
+
final_I = fcopy_rsc(final_I)
GLOB.species_clothing_icons[mob_species.id]["[file2use]-[state2use]"] = final_I
return TRUE
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index 97eed2728fb6..ce87ea624d7a 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -163,6 +163,16 @@
supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE
+/obj/item/clothing/suit/armor/vest/clip_correspondent
+ name = "press armor vest"
+ desc = "A slim Type I armored vest that provides decent protection against most types of damage. The white letters on the front read \"PRESS\" in CLIP Kalixcian."
+
+ icon = 'icons/obj/clothing/faction/clip/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/clip/suits.dmi'
+
+ icon_state = "armor_correspondant"
+ item_state = "armor_correspondant"
+
//spacesuits
/obj/item/clothing/suit/space/hardsuit/clip_patroller
name = "\improper CM-410 'Patroller' EVA Hardsuit"
@@ -309,6 +319,17 @@
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_HEAD))
+/obj/item/clothing/head/helmet/bulletproof/m10/clip_correspondent
+ name = "CLIP War Correspondant M10 Helmet"
+ desc = "A light bulletproof helmet worn by War Correspondants of the CLIP."
+
+ icon = 'icons/obj/clothing/faction/clip/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
+
+ icon_state = "clip_m10_correspondant"
+ item_state = "clip_m10_correspondant"
+
/obj/item/clothing/head/helmet/riot/clip
name = "\improper Minutemen riot helmet"
desc = "Designed to protect against close range attacks. Mainly used by the CMM-BARD against hostile xenofauna, it also sees prolific use on some Minutemen member worlds."
diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm
new file mode 100644
index 000000000000..9bac6c40a004
--- /dev/null
+++ b/code/modules/clothing/factions/frontiersmen.dm
@@ -0,0 +1,260 @@
+//////////////
+//Jumpsuits//
+/////////////
+
+/obj/item/clothing/under/frontiersmen
+ name = "\improper frontiersmen uniform"
+ desc = "Fatigues worn by members of the Frontiersmen pirate fleet. Its poor-quality linen is very uncomfortable to move around in."
+ icon_state = "frontier"
+ item_state = "frontier"
+ can_adjust = FALSE
+ icon = 'icons/obj/clothing/faction/frontiersmen/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/uniforms.dmi'
+
+/obj/item/clothing/under/frontiersmen/deckhand
+ name = "\improper deckhand jumpsuit"
+ desc = "A cheap olive-green jumpsuit used by the Frontiersmen on their vessels. It has an old smell permeating it."
+ icon_state = "frontier_deckhand"
+ item_state = "frontier_deckhand"
+
+/obj/item/clothing/under/frontiersmen/fireproof
+ name = "\improper fireproof frontiersmen fatigues"
+ desc = "An all-black set of fatigues worn by the flamethrower units of the Frontiersmen. It feels oddly itchy when worn..."
+ icon_state = "frontier_fireproof"
+ item_state = "frontier_fireproof"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/under/frontiersmen/officer
+ name = "\improper Frontiersmen officer's uniform"
+ desc = "Worn by officers of the Frontiersmen pirate fleet. It's less comfortable than it looks."
+ icon_state = "frontier_officer"
+
+/obj/item/clothing/under/frontiersmen/admiral
+ name = "\improper frontiersmen admiral uniform"
+ desc = "Worn by admirals of the Frontiersmen pirate fleet, adorned with a tasteful amount of gold and completed with a very-stylish all-white aesthetic. Quite snobby for a bunch of pirates."
+ icon_state = "frontier_admiral"
+ item_state = "frontier_admiral"
+
+////////////////////
+//Unarmored suits//
+///////////////////
+
+/obj/item/clothing/suit/frontiersmen
+ name = "frontiersmen smock"
+ desc = "A basic white surgical apron worn by the Frontiersmen. It seems it could stain very easily..."
+ icon_state = "frontier_surgery"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+
+//////////////////
+//Armored suits//
+/////////////////
+
+/obj/item/clothing/suit/armor/vest/bulletproof/frontier
+ name = "\improper Frontiersmen bulletproof armor"
+ desc = "A scrap piece of armor made of disused protective plates. This one was used to protect the squishy bits of a Frontiersman, once."
+ icon_state = "frontier_armor"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/vest/marine/frontier
+ name = "light tactical armor vest"
+ desc = "A bulky set of stamped plasteel armor plates, coated with the intimidating grey of the Frontiersmen. If you have the time to inspect this vest, either you are about to die, or you have killed the one who wore it originally."
+ icon_state = "marine_frontier"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+
+/obj/item/clothing/suit/armor/frontier
+ name = "reinforced fur coat"
+ desc = "A stiff olive-green coat, meant for frigid conditions. Commonly worn by Frontiersmen command."
+ icon_state = "frontier_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ heat_protection = CHEST|GROIN|ARMS
+ icon_state = "frontier_coat"
+ item_state = "frontier_coat"
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+
+/obj/item/clothing/suit/armor/frontier/fireproof
+ name = "frontiersmen fireproof coat"
+ desc = "A stiff olive-green coat, used particularly by Frontiersmen flame troopers. It seems to be lined with asbestos, to provide maximum heat and fire deterrence... At the cost of comfort. And mesothelioma."
+ icon_state = "frontier_fireproof_suit"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ w_class = WEIGHT_CLASS_BULKY
+ gas_transfer_coefficient = 0.9
+ permeability_coefficient = 0.5
+ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ slowdown = 0.5
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
+ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar)
+
+///////////////
+//Spacesuits//
+//////////////
+
+/obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
+ name = "\improper Frontiersmen hardsuit helmet"
+ desc = "An old hardsuit helmet based on a even older hardsuit helmet. Used prolifically by the Frontiersmen pirate fleet."
+ icon_state = "hardsuit0-frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+ hardsuit_type = "frontier"
+
+/obj/item/clothing/suit/space/hardsuit/security/independent/frontier
+ name = "\improper Frontiersmen hardsuit"
+ desc = "An old hardsuit based on a even older hardsuit. Used prolifically by the Frontiersmen pirate fleet."
+ icon_state = "hardsuit_frontier"
+ hardsuit_type = "hardsuit_frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
+
+/////////
+//Hats//
+////////
+
+/obj/item/clothing/head/soft/frontiersmen
+ name = "frontiersman cap"
+ desc = "An olive-green and grey baseball hat, worn by cargo technicians working under the Frontiersmen. Even they have the rights for a cool cap!"
+ icon_state = "frontiersoft"
+ soft_type = "frontiersmen"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/beret/sec/frontier
+ name = "\improper Frontiersmen beret"
+ desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew."
+ icon_state = "frontier_beret"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/beret/sec/frontier/officer
+ name = "\improper Frontiersmen officer beret"
+ desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains."
+ icon_state = "frontier_officer_beret"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/head/frontier
+ name = "frontier surgical cap"
+ desc = "A white surgical cap used by the quite uncommon doctors part of the Frontiersmen."
+ icon_state = "frontier_surgery"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/hardhat/frontier
+ name = "faded white hard hat"
+ desc = "A grimy white hardhat used by the mechanics and engineers of the Frontiersmen fleet. Smells old."
+ icon_state = "frontier_hardhat"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/frontier/peaked
+ name = "\improper frontiersmen commander's cap"
+ desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
+ icon_state = "frontier_cap"
+
+/obj/item/clothing/head/frontier/admiral
+ name = "\improper frontiersmen admiral's cap"
+ desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
+ icon_state = "frontier_admiral_cap"
+
+/obj/item/clothing/head/helmet/bulletproof/x11/frontier
+ name = "\improper frontiersmen X-11 helmet"
+ desc = "A heavily modified X-11 pattern helmet used by the Frontiersmen pirate fleet."
+ icon_state = "x11helm_frontier"
+ unique_reskin = null
+
+/obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
+ name = "\improper fireproof frontiersmen X-11 helmet"
+ desc = "A subtly but helpful modifcation of the Frontiersmen X11 to make it fireproof."
+ heat_protection = HEAD
+ max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ cold_protection = HEAD
+ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+ resistance_flags = FIRE_PROOF
+ armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
+
+/obj/item/clothing/head/helmet/marine/frontier
+ name = "frontiersmen reinforced helmet"
+ desc = "A reinforced Frontiersmen X-11. The front plate has a small window to let the user see."
+ icon_state = "marine_frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+////////////
+//Glasses//
+///////////
+
+//////////
+//Masks//
+/////////
+
+/obj/item/clothing/mask/gas/frontiersmen
+ name = "sack gas mask"
+ desc = "A gas mask that can be connected to an air supply. It's made out of sack, but still works just as good for protecting you."
+ icon_state = "gasmask_frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/mask.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/mask.dmi'
+ resistance_flags = FIRE_PROOF
+
+//////////
+//Neck//
+/////////
+
+//////////
+//Belts//
+/////////
+
+/obj/item/storage/belt/security/military/frontiersmen
+ name = "leather bandolier"
+ desc = "A rudimentary leather bandolier, utilized by both independents and frontiersmen alike. Usually slung diagonally, from the shoulder to the waist."
+ icon_state = "frontierwebbing"
+ item_state = "frontierwebbing"
+ icon = 'icons/obj/clothing/faction/frontiersmen/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/belt.dmi'
+
+ unique_reskin = null
+
+/obj/item/storage/belt/medical/webbing/frontiersmen
+ name = "leather medical bandolier"
+ desc = "A rudimentary leather bandolier, utilized by both independents and frontiersmen alike. This one is painted white, usually to be worn by a medic."
+ icon_state = "frontiermedicalwebbing"
+ item_state = "frontiermedicalwebbing"
+ icon = 'icons/obj/clothing/faction/frontiersmen/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/belt.dmi'
+
+/obj/item/storage/belt/medical/webbing/frontiersmen/surgery/PopulateContents()
+ new /obj/item/scalpel(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/surgicaldrill(src)
+ new /obj/item/retractor(src)
+ new /obj/item/cautery(src)
+ new /obj/item/hemostat(src)
+ new /obj/item/hypospray/mkii(src)
+ update_appearance()
+
+
+/obj/item/storage/belt/security/military/frontiersmen/skm_ammo/PopulateContents()
+ for(var/i in 1 to 4)
+ new /obj/item/ammo_box/magazine/skm_762_40(src)
+ new /obj/item/grenade/frag(src)
+
+/obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo/PopulateContents() //replace with spitter. remind me.
+ for(var/i in 1 to 4)
+ new /obj/item/ammo_box/magazine/pistolm9mm(src)
+ new /obj/item/grenade/frag(src)
+
+/obj/item/storage/belt/security/military/frontiersmen/flamer/PopulateContents()
+ for(var/i in 1 to 4)
+ new /obj/item/reagent_containers/glass/beaker/large/napalm(src)
+ new /obj/item/grenade/frag(src)
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
index fe6a6d9bdb6a..96c6eee3c734 100644
--- a/code/modules/clothing/factions/gezena.dm
+++ b/code/modules/clothing/factions/gezena.dm
@@ -36,7 +36,7 @@
item_state = "bluecloth"
blood_overlay_type = "coat"
togglename = "zipper"
- body_parts_covered = CHEST|ARMS
+ body_parts_covered = CHEST
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
armor = list("melee" = 20, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
@@ -53,20 +53,11 @@
icon_state = "coat"
item_state = "bluecloth"
blood_overlay_type = "coat"
- body_parts_covered = CHEST|ARMS|GROIN|LEGS
+ body_parts_covered = CHEST|GROIN
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
armor = list("melee" = 35, "bullet" = 35, "laser" = 20, "energy" = 40, "bomb" = 20, "bio" = 20, "rad" = 0, "fire" = 50, "acid" = 50)
- allowed = list(
- /obj/item/flashlight,
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/tank/internals/plasmaman,
- /obj/item/toy,
- /obj/item/storage/fancy/cigarettes,
- /obj/item/lighter,
- /obj/item/radio,
- /obj/item/gun/energy/kalix,
- )
+ allowed = null
/obj/item/clothing/suit/armor/gezena/engi
name = "engineer navywear coat"
diff --git a/code/modules/clothing/factions/hardliners.dm b/code/modules/clothing/factions/hardliners.dm
new file mode 100644
index 000000000000..5c3423f745c0
--- /dev/null
+++ b/code/modules/clothing/factions/hardliners.dm
@@ -0,0 +1,181 @@
+//////////////
+//Jumpsuits//
+/////////////
+
+/obj/item/clothing/under/syndicate/hardliners
+ name = "hardliners uniform"
+ desc = "A crimson combat uniform, reminiscent of the Gorlex Marauders at the height of the Inter-Corporate Wars. It's oddly comfortable, and warm."
+ icon_state = "hardliners"
+ item_state = "hardliners"
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+ can_adjust = FALSE
+ icon = 'icons/obj/clothing/faction/hardliners/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/uniforms.dmi'
+
+/obj/item/clothing/under/syndicate/hardliners/jumpsuit
+ name = "hardliners jumpsuit"
+ desc = "A black jumpsuit with white overalls, a scant reminder of the old miners of Gorlex VII."
+ icon_state = "hl_jumpsuit"
+ item_state = "hl_jumpsuit"
+
+/obj/item/clothing/under/syndicate/hardliners/officer
+ name = "hardliners officer uniform"
+ desc = "A button-up uniform with cargo pants, certainly more tactical than most officer uniforms."
+ icon_state = "hl_officer"
+ item_state = "hl_officer"
+
+////////////////////
+//Unarmored suits//
+///////////////////
+
+/obj/item/clothing/suit/hardliners
+ name = "white smock"
+ desc = "A plain-white surgical smock typically worn by both Hardliners and Cybersun staff. Even mercenaries need medical attention!"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ icon_state = "hl_apron"
+ item_state = "whitecloth"
+
+/obj/item/clothing/suit/hazardvest/hardliners
+ name = "blood-red hazard vest"
+ desc = "A white high-visibility vest, worn by mechanics associated with Hardliners. Safety first!"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ icon_state = "hl_hazard"
+ item_state = "whitecloth"
+
+//////////////////
+//Armored suits//
+/////////////////
+
+/obj/item/clothing/suit/armor/hardliners
+ name = "hardliners armor vest"
+ desc = "A slim Type I armored vest, painted in a classic white associated with the Hardliners. It would probably make bloodstains very obvious..."
+ icon_state = "hl_vest"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/hardliners/jacket
+ name = "hardliners armored kutte"
+ desc = "A leather Kutte with a slim Type I armored vest, painted in a classic white associated with the Hardliners. The patch of the Hardliner movement can be seen behind the leather kutte, a nostalgic callback to the leather outfits used by the civilians of Gorlex VII."
+ icon_state = "hl_jacket"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/hardliners/sergeant
+ name = "hardliners sergeant jacket"
+ desc = "An armored jacket typically worn by sergeant of the Hardliners. They're reminiscent of the garb worn by old Gorlex navymen, prior to its destruction."
+ body_parts_covered = CHEST|GROIN|ARMS
+ icon_state = "hl_sergeant"
+ item_state = "hl_sergeant"
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/suit/toggle/armor/vest/hardliners
+ name = "hardliners captain coat"
+ desc = "An imposing armored coat worn by captains of Hardliner fleets, hand-designed by Cybersun tailors to provide maximum protection to its wearer."
+ body_parts_covered = CHEST|GROIN|ARMS
+ icon_state = "hl_captain"
+ item_state = "hl_captain"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ togglename = "buttons"
+
+///////////////
+//Spacesuits//
+//////////////
+
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
+ name = "white-red hardsuit helmet"
+ desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in EVA mode. Manufactured by Cybersun Biodynamics."
+ alt_desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in combat mode. Manufactured by Cybersun Biodynamics."
+ icon_state = "hardsuit1-hl"
+ item_state = "hardsuit1-hl"
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+ hardsuit_type = "hl"
+
+/obj/item/clothing/suit/space/hardsuit/syndi/hl
+ name = "white-red hardsuit"
+ desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in EVA mode. Manufactured by Cybersun Biodynamics."
+ alt_desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in combat mode. Manufactured by Cybersun Biodynamics."
+ icon_state = "hardsuit1-hl"
+ item_state = "hardsuit1-hl"
+ hardsuit_type = "hl"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
+ lightweight = 1
+ jetpack = null
+
+/////////
+//Hats//
+////////
+
+/obj/item/clothing/head/hardliners
+ name = "white surgical cap"
+ desc = "A surgical cap used by doctors of Hardliner fleets, matching their white smocks."
+ icon_state = "hl_surgery"
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+
+
+/obj/item/clothing/head/hardhat/hardliners
+ name = "white-red hard hat"
+ desc = "A white-red hardhat typically used by both miners and mechanics under the Hardliner fleets."
+ icon_state = "hl_hardhat"
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+
+/obj/item/clothing/head/hardliners/peaked
+ name = "Hardliner peaked cap"
+ desc = "A stylish peaked cap utilized by high-ranking officers of the Hardliner movement. Most who wear it are likely to have been a veteran of the ICW, still vying for revenge against Nanotrasen..."
+ icon_state = "hl_officer"
+ item_state = "hl_officer"
+
+/obj/item/clothing/head/helmet/hardliners
+ name = "hardliners X-11 helmet"
+ desc = "A well-armored helmet utilized by the Hardliners, though painted in their iconic white. Either it makes them stick out like a sore thumb, or it provides excellent camouflage in snow-covered planets."
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+ armor = list("melee" = 40, "bullet" = 60, "laser" = 35, "energy" = 35, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) // The guys who specialize in ballistics would probably have better bullet armor. Maybe.
+ icon_state = "hl_x11"
+ item_state = "hl_x11"
+
+/obj/item/clothing/head/helmet/hardliners/swat
+ name = "hardliners pilot helmet"
+ desc = "A modified X-11 helmet utilized by regular pilots, as well as the feared mech pilots of the Hardliner movement. The attached visor helps protect against sudden flashes from explosions."
+ flash_protect = FLASH_PROTECTION_WELDER
+ icon_state = "hl_pilot"
+ item_state = "hl_pilot"
+
+////////////
+//Glasses//
+///////////
+
+/obj/item/clothing/glasses/hud/security/sunglasses/hardliners
+ name = "hardliners security goggles"
+ desc = "Tinted-red flash-proof goggles used by Hardliners, with an integrated security HUD, courtesy of their partners, Cybersun."
+ icon_state = "hl_goggles"
+ item_state = "hl_goggles"
+ icon = 'icons/obj/clothing/faction/hardliners/eyes.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/eyes.dmi'
+ glass_colour_type = /datum/client_colour/glass_colour/red
+
+//////////
+//Belts//
+/////////
+
+/obj/item/storage/belt/security/webbing/hardliners
+ name = "hardliners webbing"
+ desc = "A set of tactical webbing for operators of the Hardliner movement, can hold security gear."
+ icon_state = "hl_webbing"
+ item_state = "hl_webbing"
+ icon = 'icons/obj/clothing/faction/hardliners/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/belt.dmi'
diff --git a/code/modules/clothing/factions/srm.dm b/code/modules/clothing/factions/srm.dm
new file mode 100644
index 000000000000..cd901306b7a7
--- /dev/null
+++ b/code/modules/clothing/factions/srm.dm
@@ -0,0 +1,154 @@
+//////////////
+//Jumpsuits//
+/////////////
+
+/obj/item/clothing/under/suit/roumain
+ name = "saint-roumain's worksuit"
+ desc = "A simple, hard-wearing suit designed for the hardworking hunters of the Saint-Roumain Militia."
+ icon_state = "rouma_work"
+ item_state = "rouma_work"
+ can_adjust = FALSE
+ icon = 'icons/obj/clothing/faction/srm/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/uniforms.dmi'
+
+//////////////////
+//Armored suits//
+/////////////////
+
+/obj/item/clothing/suit/armor/roumain
+ name = "saint-roumain duster"
+ desc = "A coat made from hard leather. Meant to withstand long hunts in harsh wilderness."
+ icon_state = "armor_rouma"
+ item_state = "rouma_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ heat_protection = CHEST|GROIN|ARMS
+ icon = 'icons/obj/clothing/faction/srm/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
+
+/obj/item/clothing/suit/armor/roumain/shadow
+ name = "saint-roumain shadow duster"
+ desc = "A coat made from hard leather. Its rough, barely-treated finish is typical of one of the Saint-Roumain Militia's trainees."
+ icon_state = "armor_rouma_shadow"
+ item_state = "rouma_shadow_coat"
+
+/obj/item/clothing/suit/toggle/labcoat/roumain_med
+ name = "saint-roumain medical duster"
+ desc = "A coat made from hard leather and further treated with exotic sterilizing oils and wax. The treatment and its more closed design offers much better protection against biological hazards."
+ icon = 'icons/obj/clothing/faction/srm/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
+ icon_state = "rouma_med_coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/suit/hazardvest/roumain
+ name = "saint-roumain machinist leather vest"
+ desc = "A modified Roumain leather duster with its large flaps and sleeves cut off to provide extra mobility when maintaining weapons and vessels belonging to the Church of Saint Roumain. Its specialty treatment grants it better protection against acid and fire."
+ icon = 'icons/obj/clothing/faction/srm/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
+ icon_state = "armor_rouma_machinist"
+ item_state = "rouma_coat"
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 40, "bomb" = 35, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
+
+/obj/item/clothing/suit/armor/roumain/flamebearer
+ name = "saint-roumain flamebearer robes"
+ desc = "A set of ashy-grey robes made from hard leather, adorned with gold trims. Its rough finish after a near-char and application of aromatics is heavily favored for the ecclesiastical sect of the Church of Saint Roumain, a living reminder of the Ashen Huntsman himself."
+ icon_state = "armor_rouma_flamebearer"
+
+/obj/item/clothing/suit/armor/roumain/colligne
+ name = "saint-roumain colligne coat"
+ desc = "A well-maintained hard leather coat typically worn to denote the rank of Colligne, a trainee Hunter Montagne. It is treated with bullet-resistant materials, and lined with the dark fur of Illestrian dire wolves."
+ icon_state = "armor_rouma_colligne"
+ item_state = "rouma_coat"
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS
+ cold_protection = CHEST|GROIN|LEGS|ARMS
+ heat_protection = CHEST|GROIN|LEGS|ARMS
+
+/obj/item/clothing/suit/armor/roumain/montagne
+ name = "saint-roumain montagne coat"
+ desc = "A stylish red coat to indicate that you are, in fact, a Hunter Montagne. Made of extra hard exotic leather, treated with bullet-resistant materials, and lined with the fur of some unidentifiable creature."
+ icon_state = "armor_rouma_montagne"
+ item_state = "rouma_montagne_coat"
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
+ cold_protection = CHEST|GROIN|LEGS|ARMS
+ heat_protection = CHEST|GROIN|LEGS|ARMS
+
+///////////////
+//Spacesuits//
+//////////////
+
+/obj/item/clothing/head/helmet/space/hardsuit/solgov/roumain
+ name = "\improper roumain hardsuit helmet"
+ desc = "An armored helmet with an unusual design that recalls both pre-industrial Solarian armor and iconography depicting the Ashen Huntsman. Though hand-made, it is surprisingly quite spaceworthy."
+ icon = 'icons/obj/clothing/faction/srm/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/head.dmi'
+ icon_state = "hardsuit0-roumain"
+ item_state = "hardsuit0-roumain"
+ hardsuit_type = "roumain"
+ worn_y_offset = 4
+
+/obj/item/clothing/suit/space/hardsuit/solgov/roumain
+ name = "\improper roumain hardsuit"
+ desc = "A hand-crafted suit of armor either modified from a set of normal plate armor or designed to resemble one. A powered exoskeleton has been cleverly integrated into the design and, surprisingly, it is completely vacuum-proof. Suits like this are a testament to what the master craftsmen of Hunter's Pride are capable of."
+ icon = 'icons/obj/clothing/faction/srm/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
+ icon_state = "hardsuit-roumain"
+ item_state = "hardsuit-roumain"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/solgov/roumain
+ slowdown = 0.5
+
+/////////
+//Hats//
+////////
+
+/obj/item/clothing/head/cowboy/sec/roumain
+ name = "hunter's hat"
+ desc = "A fancy hat with a nice feather. The way it covers your eyes makes you feel like a badass."
+ icon_state = "rouma_hat"
+ icon = 'icons/obj/clothing/faction/srm/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/srm/head.dmi'
+
+/obj/item/clothing/head/cowboy/sec/roumain/shadow
+ name = "shadow's hat"
+ desc = "A rough, simple hat. The way it covers your eyes makes you feel badass, but you just look like a wannabe hunter."
+ icon_state = "rouma_shadow_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/machinist
+ name = "machinist's hat"
+ desc = "A small, humble leather top hat. It gives you the gnawing urge to create classical gizmos and goobers, or alternatively repair any breaches within your vessel."
+ icon_state = "rouma_machinist_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/med
+ name = "medical hunter's hat"
+ desc = "A very wide-brimmed, round hat treated with oil and wax. Somehow manages to look stylish and creepy at the same time."
+ icon_state = "rouma_med_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/flamebearer
+ name = "flamebearer's hat"
+ desc = "A wide-brimmed, pointed hat with charred leather, granting it an ash-grey appearance. The design honors the one the Ashen Huntsman himself wore, according to legend."
+ icon_state = "rouma_flamebearer_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/colligne
+ name = "colligne's hat"
+ desc = "A fancy, pointy leather hat with a large feather plume to signal that you are, in fact... A Hunter Colligne. You still have some ways to go before you gain the title of Montagne."
+ icon_state = "rouma_colligne_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/montagne
+ name = "montagne's hat"
+ desc = "A very fancy hat with a large feather plume to signal that you are, in fact, a Hunter Montagne. The exotic fur lining is impeccably soft."
+ icon_state = "rouma_montagne_hat"
+
+///////////////
+//Accessories//
+///////////////
+
+//These are stored in clothing/accessories.dmi instead of a factional variant due to accessory code being dogwater
+//Please transfer them over to a factional file if accessory code is ever fixed
+
+/obj/item/clothing/accessory/waistcoat/roumain
+ name = "roumain waistcoat"
+ desc = "A warm, red wool waistcoat, worn by any member of the Church of Saint Roumain, though heavily favored by Machinists for the added warmth given to their rather breezy outfit."
+ icon_state = "rouma_waistcoat"
+ icon = 'icons/obj/clothing/accessories.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/accessories.dmi'
+ minimize_when_attached = TRUE
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 385baa647432..0698981207bf 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -248,7 +248,6 @@
tint = 1
glass_colour_type = /datum/client_colour/glass_colour/gray
-
/obj/item/clothing/glasses/hud/spacecop/hidden // for the undercover cop
name = "sunglasses"
desc = "These sunglasses are special, and let you view potential criminals."
@@ -274,4 +273,3 @@
desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. This pair also corrects nearsightedness."
icon_state = "prescriptionsecurityhud"
vision_correction = 1
-
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 06bd05a45795..cbac3e0e8901 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -220,7 +220,7 @@
icon_state = "nitrile"
transfer_prints = FALSE
carrytrait = TRAIT_QUICKER_CARRY
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/gloves/color/latex/nitrile/evil
name = "red nitrile gloves"
@@ -240,10 +240,8 @@
desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_gauntlets"
- siemens_coefficient = 0 //WS Station eddit "Tinkers Gloves Insuls"
- permeability_coefficient = 0.05 //WS Station eddit "Tinkers Gloves Insuls"
- //siemens_coefficient = 0.8 WS Station eddit "Tinkers Gloves Insuls"
- //permeability_coefficient = 0.3 WS Station eddit "Tinkers Gloves Insuls"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
carrytrait = TRAIT_QUICK_BUILD
custom_materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000)
@@ -276,7 +274,8 @@
/obj/item/clothing/gloves/color/light_brown = 1,
/obj/item/clothing/gloves/color/brown = 1,
/obj/item/clothing/gloves/color/white = 1,
- /obj/item/clothing/gloves/color/rainbow = 1)
+ /obj/item/clothing/gloves/color/rainbow = 1,
+ )
/obj/item/clothing/gloves/maid
name = "maid arm covers"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 314af8aaf44a..9d8db3c035d8 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -38,7 +38,7 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/gloves/combat/maid
name = "combat maid sleeves"
diff --git a/code/modules/clothing/head/berets.dm b/code/modules/clothing/head/berets.dm
index 8d6f97eb4bd2..9d3ca21ed4f0 100644
--- a/code/modules/clothing/head/berets.dm
+++ b/code/modules/clothing/head/berets.dm
@@ -214,19 +214,6 @@
desc = "A snow white beret with an air of distinction around it, emblazoned with the golden shield of the IRMG as the badge."
icon_state = "inteq_honorable_beret"
-// Frontier
-
-/obj/item/clothing/head/beret/sec/frontier
- name = "\improper Frontiersmen beret"
- desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew."
- icon_state = "frontier_beret"
-
-/obj/item/clothing/head/beret/sec/frontier/officer
- name = "\improper Frontiersmen officer beret"
- desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains."
- icon_state = "frontier_officer_beret"
-
-
// CentCom
/obj/item/clothing/head/beret/centcom_formal
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index dee6b0d0c9ee..352349783bae 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -230,10 +230,11 @@
/obj/item/clothing/head/helmet/marine
name = "tactical combat helmet"
- desc = "A tactical black helmet, sealed from outside hazards with a plate of reinforced glass."
+ desc = "A tactical black helmet, sealed from outside hazards with a reinforced visor."
icon_state = "marine_command"
item_state = "helmetalt"
- armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 25, "bomb" = 50, "bio" = 100, "fire" = 40, "acid" = 50)
+ armor = list("melee" = 50, "bullet" = 75, "laser" = 55, "energy" = 25, "bomb" = 60, "bio" = 100, "fire" = 70, "acid" = 50)
+ slowdown = 0.3
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
clothing_flags = STOPSPRESSUREDAMAGE
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -500,6 +501,7 @@
icon_state = "inteq_swat"
item_state = "inteq_swat"
flags_inv = HIDEHAIR
+ supports_variations = KEPORI_VARIATION
content_overlays = TRUE
/obj/item/clothing/head/helmet/inteq
@@ -508,6 +510,7 @@
icon_state = "inteq_helmet"
icon_state = "inteq_helmet"
can_flashlight = TRUE
+ supports_variations = KEPORI_VARIATION
content_overlays = TRUE
/obj/item/clothing/head/solgov
@@ -586,9 +589,3 @@
"Snow" = "x11helm_snow",
"Urban" = "x11helm_urban",
)
-
-/obj/item/clothing/head/helmet/bulletproof/x11/frontier
- name = "\improper Frontiersmen X11 Helmet"
- desc = "A heavily modified X11 used by the Frontiersmen pirate fleet."
- icon_state = "x11helm_frontier"
- unique_reskin = null
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 8521bdca2cff..3e04245e1a14 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -37,12 +37,12 @@
name = "captain's hat"
icon_state = "captain_nt"
-/obj/item/clothing/head/caphat/frontier
+/obj/item/clothing/head/frontier/peaked
name = "\improper Frontiersmen commander's cap"
desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
icon_state = "frontier_cap"
-/obj/item/clothing/head/caphat/frontier/admiral
+/obj/item/clothing/head/frontier/peaked/admiral
name = "\improper Frontiersmen admiral's cap"
desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
icon_state = "frontier_admiral_cap"
@@ -138,26 +138,6 @@
desc = "A robust stetson adorned with a deputy's badge. Its imitation leather is thick and worn."
icon_state = "cowboysec"
-/obj/item/clothing/head/cowboy/sec/roumain
- name = "hunter's hat"
- desc = "A fancy hat with a nice feather. The way it covers your eyes makes you feel like a badass."
- icon_state = "rouma_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/shadow
- name = "shadow's hat"
- desc = "A rough, simple hat. The way it covers your eyes makes you feel badass, but you just look like a wannabe hunter."
- icon_state = "rouma_shadow_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/med
- name = "medical hunter's hat"
- desc = "A very wide-brimmed, round hat treated with oil and wax. Somehow manages to look stylish and creepy at the same time."
- icon_state = "rouma_med_hat"
-
-/obj/item/clothing/head/HoS/cowboy/montagne
- name = "montagne's hat"
- desc = "A very fancy hat with a large feather plume to signal that you are, in fact, a Hunter Montagne. The exotic fur lining is impeccably soft and bafflingly bulletproof."
- icon_state = "rouma_montagne_hat"
-
/obj/item/clothing/head/HoS/syndicate
name = "syndicate cap"
desc = "A black cap fit for a high ranking syndicate officer."
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 8d5251e9e8c8..3f431df81ccb 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -433,3 +433,9 @@
playsound(src,"shatter", 70)
new /obj/effect/decal/cleanable/glass/strange(get_turf(src))
return ..()
+
+/obj/item/clothing/neck/fangnecklace
+ name = "wolf fang necklace"
+ desc = "A necklace made out of a wolf's fang and some sinew. According to a common Frontier superstition, it brings good luck to its wearer."
+ icon_state = "fang_necklace"
+ cuttable = FALSE
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index f0fd3bb81eb2..b3a2b20f687c 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -1,11 +1,10 @@
-/datum/outfit/job/frontiersmen/ert
+/datum/outfit/job/frontiersmen/ert //most basic of grunts
name = "ERT - Frontiersman Basic"
- head = /obj/item/clothing/head/beret/sec/frontier
- mask = /obj/item/clothing/mask/gas/sechailer/balaclava
+ head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
suit_store = /obj/item/gun/ballistic/rifle/illestren
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
ears = /obj/item/radio/headset/pirate/alt
@@ -13,9 +12,10 @@
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
+ box = /obj/item/storage/box/survival/frontier
id = null // lol
- backpack_contents = list(/obj/item/ammo_box/magazine/illestren_a850r=5, /obj/item/grenade/frag=1)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/ammo_box/magazine/illestren_a850r=5, /obj/item/grenade/frag=1)
/datum/outfit/job/frontiersmen/ert/random
name = "ERT - Frontiersman Randomized"
@@ -48,7 +48,7 @@
if(prob(30))
mask = pickweight(list(
- /obj/item/clothing/mask/gas = 5,
+ /obj/item/clothing/mask/gas/frontiersmen = 5,
/obj/item/clothing/mask/gas/sechailer/balaclava = 5,
/obj/item/clothing/mask/breath = 5,
/obj/item/clothing/mask/whistle = 3))
@@ -61,6 +61,7 @@
/obj/item/melee/baton/cattleprod/loaded = 5,
/obj/item/reagent_containers/food/snacks/baguette = 2, // yes you can put this on your back
/obj/item/deployable_turret_folded = 1,
+ /obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended = 1,
))
if(prob(90))
@@ -74,6 +75,8 @@
if("Doctor")
backpack_contents += list(/obj/item/storage/firstaid/regular = 1)
gloves = /obj/item/clothing/gloves/color/latex
+ suit = /obj/item/clothing/suit/frontiersmen
+ head = /obj/item/clothing/head/frontier
if(prob(50))
belt = /obj/item/storage/belt/medical/surgery
if(prob(30))
@@ -83,7 +86,16 @@
if(prob(10))
belt = /obj/item/storage/belt/grenade/full
if("Ammo Carrier")
- backpack_contents += list(/obj/item/ammo_box/a762_40 = 1)
+ var/loops = rand(1,3)
+ for(var/i in 1 to loops)
+ var/ammotype = pick(list(
+ /obj/item/ammo_box/c8x50mm_box,
+ /obj/item/ammo_box/c45,
+ /obj/item/ammo_box/a357_box,
+ /obj/item/ammo_box/c45,
+ /obj/item/ammo_box/a4570,
+ /obj/item/stock_parts/cell/gun/mini))
+ backpack_contents += ammotype
var/weapon = pick(list("Bolt-Action", "Pistol", "Melee"))
switch(weapon)
@@ -96,50 +108,78 @@
if("Pistol")
r_hand = pick(list(
/obj/item/gun/ballistic/automatic/pistol/disposable,
- /obj/item/gun/ballistic/automatic/pistol,
+ /obj/item/gun/ballistic/automatic/pistol/candor,
/obj/item/gun/ballistic/revolver/firebrand,
+ /obj/item/gun/ballistic/revolver/shadow,
+ /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn,
/obj/item/gun/energy/e_gun/mini))
if(prob(30))
l_hand = pick(list(
/obj/item/gun/ballistic/automatic/pistol/disposable,
- /obj/item/gun/ballistic/automatic/pistol,
+ /obj/item/gun/ballistic/automatic/pistol/candor,
/obj/item/gun/ballistic/revolver/firebrand,
+ /obj/item/gun/ballistic/revolver/shadow,
+ /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn,
/obj/item/gun/energy/e_gun/mini))
if("Melee")
r_hand = pickweight(list(
- /obj/item/kitchen/knife = 15,
+ /obj/item/kitchen/knife/combat/survival = 15,
/obj/item/melee/baseball_bat = 10,
- /obj/item/melee/cleric_mace = 7,
/obj/item/melee/roastingstick = 2,
/obj/item/kitchen/fork = 1,
/obj/item/melee/flyswatter = 1,
))
+/datum/outfit/job/frontiersmen/ert/grunt //better armed, use for quick creating pirate ships
+ name = "ERT - Frontiersman Grunt (Unarmed)"
+
+ suit_store = null
+ belt = /obj/item/storage/belt/security/military/frontiersmen
+
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
+
+/datum/outfit/job/frontiersmen/ert/grunt/skm
+ name = "ERT - Frontiersman Grunt (SKM-24)"
+
+ suit_store = /obj/item/gun/ballistic/automatic/assault/skm
+ belt = /obj/item/storage/belt/security/military/frontiersmen/skm_ammo
+
+/datum/outfit/job/frontiersmen/ert/grunt/aps_mp //remember. Remind me to replace this with the spitter.
+ name = "ERT - Frontiersman Grunt (Stechkin APS)"
+
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
+ belt = /obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo
/datum/outfit/job/frontiersmen/ert/leader
name = "ERT - Frontiersman Officer"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
head = /obj/item/clothing/head/beret/sec/frontier/officer
ears = /obj/item/radio/headset/pirate/alt/captain
back = /obj/item/storage/backpack/satchel/leather
suit = /obj/item/clothing/suit/armor/frontier
- suit_store = /obj/item/gun/ballistic/revolver
- belt = /obj/item/storage/belt/military/assault
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/deagle
+
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/ammo_box/magazine/m50=2, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
+
+/datum/outfit/job/frontiersmen/ert/leader/unnarmed
+ name = "ERT - Frontiersman Officer (Unnarmed)"
+
+ suit_store = null
- backpack_contents = list(/obj/item/ammo_box/a357=3, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
/datum/outfit/job/frontiersmen/ert/medic
name = "ERT - Frontiersman Medic"
+ head = /obj/item/clothing/head/frontier
back = /obj/item/storage/backpack/medic
mask = /obj/item/clothing/mask/surgical
gloves = /obj/item/clothing/gloves/color/latex/nitrile
- belt = /obj/item/storage/belt/medical/surgery
- suit = null
- suit_store = null
+ belt = /obj/item/storage/belt/medical/webbing/frontiersmen/surgery
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
- backpack_contents = list(/obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3, /obj/item/ammo_box/magazine/pistolm9mm=2)
/datum/outfit/job/frontiersmen/ert/engineer
@@ -147,8 +187,38 @@
back = /obj/item/storage/backpack/industrial
belt = /obj/item/storage/belt/utility/full
- head = /obj/item/clothing/head/hardhat/weldhat
+ head = /obj/item/clothing/head/hardhat/frontier
+ glasses = /obj/item/clothing/glasses/welding
suit_store = null
- backpack_contents = list(/obj/item/grenade/c4=3, /obj/item/crowbar/large=1)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/grenade/c4=3, /obj/item/crowbar/large=1)
+
+/datum/outfit/job/frontiersmen/ert/flamer
+ name = "ERT - Frontiersman Flame Trooper"
+
+ head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
+ mask = /obj/item/clothing/mask/gas/frontiersmen
+ suit = /obj/item/clothing/suit/armor/frontier/fireproof
+ suit_store = /obj/item/tank/internals/oxygen/red
+ uniform = /obj/item/clothing/under/frontiersmen/fireproof
+ gloves = /obj/item/clothing/gloves/combat
+ back = /obj/item/storage/backpack
+ belt = /obj/item/storage/belt/security/military/frontiersmen/flamer
+
+ l_hand = /obj/item/flamethrower/full/tank
+
+ backpack_contents = list(/obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1,/obj/item/ammo_box/a12g=1,/obj/item/extinguisher=2,/obj/item/radio=1)
+
+
+/datum/outfit/job/frontiersmen/ert/sentry_lmg
+ name = "ERT - Frontiersman Sentry (SKM-24v)"
+
+ head = /obj/item/clothing/head/helmet/marine/frontier
+ mask = /obj/item/clothing/mask/gas/sechailer/balaclava
+ suit = /obj/item/clothing/suit/armor/vest/marine/frontier
+ suit_store = /obj/item/gun/ballistic/automatic/hmg/skm_lmg/drum_mag
+ gloves = /obj/item/clothing/gloves/combat
+
+ belt = /obj/item/gun/ballistic/revolver/mateba
+ backpack_contents = list(/obj/item/ammo_box/magazine/skm_762_40/drum=2,/obj/item/ammo_box/a357=2,/obj/item/grenade/frag=1,/obj/item/radio=1)
diff --git a/code/modules/clothing/outfits/factions/frontiersmen.dm b/code/modules/clothing/outfits/factions/frontiersmen.dm
index e8119ddffac4..7045f5182188 100644
--- a/code/modules/clothing/outfits/factions/frontiersmen.dm
+++ b/code/modules/clothing/outfits/factions/frontiersmen.dm
@@ -3,7 +3,7 @@
// faction_icon = "bg_frontiersmen"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
r_pocket = /obj/item/radio
shoes = /obj/item/clothing/shoes/jackboots
ears = /obj/item/radio/headset/pirate
@@ -24,13 +24,14 @@
// Assistant
/datum/outfit/job/frontiersmen/assistant
- name = "Frontiersmen - Rookie"
- id_assignment = "Rookie"
+ name = "Frontiersmen - Deckhand"
+ id_assignment = "Deckhand"
job_icon = "assistant"
jobtype = /datum/job/assistant
+ uniform = /obj/item/clothing/under/frontiersmen/deckhand
head = /obj/item/clothing/head/beret/sec/frontier
- shoes = /obj/item/clothing/shoes/sneakers/black // you do not get jackboots!!!! fuck you!!!!
+ shoes = /obj/item/clothing/shoes/workboots
// Atmospheric Technician
@@ -40,7 +41,7 @@
jobtype = /datum/job/atmos
accessory = /obj/item/clothing/accessory/armband/engine
- head = /obj/item/clothing/head/hardhat
+ head = /obj/item/clothing/head/hardhat/frontier
// Cargo Technician
@@ -50,9 +51,8 @@
jobtype = /datum/job/cargo_tech
accessory = /obj/item/clothing/accessory/armband/cargo
- suit = /obj/item/clothing/suit/hazardvest
shoes = /obj/item/clothing/shoes/workboots
- head = /obj/item/clothing/head/soft
+ head = /obj/item/clothing/head/soft/frontiersmen
backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo)
// Captain
@@ -63,21 +63,21 @@
jobtype = /datum/job/captain
ears = /obj/item/radio/headset/pirate/alt/captain
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
- head = /obj/item/clothing/head/caphat/frontier
+ uniform = /obj/item/clothing/under/frontiersmen/officer
+ head = /obj/item/clothing/head/frontier/peaked
suit = /obj/item/clothing/suit/armor/frontier
- shoes = /obj/item/clothing/shoes/cowboy/black
+ shoes = /obj/item/clothing/shoes/jackboots
gloves = /obj/item/clothing/gloves/combat
/datum/outfit/job/frontiersmen/captain/admiral
name = "Frontiersmen - Admiral"
id_assignment = "Admiral"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/admiral
- head = /obj/item/clothing/head/caphat/frontier/admiral
- shoes = /obj/item/clothing/shoes/cowboy/white
+ uniform = /obj/item/clothing/under/frontiersmen/admiral
+ head = /obj/item/clothing/head/frontier/peaked/admiral
+ shoes = /obj/item/clothing/shoes/jackboots
ears = /obj/item/radio/headset/pirate/captain
- gloves = /obj/item/clothing/gloves/color/evening
+ gloves = /obj/item/clothing/gloves/combat
suit = null
// Chief Engineer
@@ -89,8 +89,8 @@
accessory = /obj/item/clothing/accessory/armband/engine
ears = /obj/item/radio/headset/pirate/captain
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
- head = /obj/item/clothing/head/hardhat/weldhat/white
+ uniform = /obj/item/clothing/under/frontiersmen/officer
+ head = /obj/item/clothing/head/hardhat/frontier
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
belt = /obj/item/storage/belt/utility/full
@@ -103,9 +103,8 @@
jobtype = /datum/job/engineer
accessory = /obj/item/clothing/accessory/armband/engine
- suit = /obj/item/clothing/suit/hazardvest
shoes = /obj/item/clothing/shoes/workboots
- head = /obj/item/clothing/head/hardhat
+ head = /obj/item/clothing/head/hardhat/frontier
r_pocket = /obj/item/analyzer
@@ -117,7 +116,7 @@
job_icon = "cook"
jobtype = /datum/job/cook
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
head = /obj/item/clothing/head/chefhat
suit = /obj/item/clothing/suit/apron/chef
@@ -130,8 +129,8 @@
jobtype = /datum/job/head_of_personnel
ears = /obj/item/radio/headset/pirate/alt
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
- shoes = /obj/item/clothing/shoes/cowboy/black
+ uniform = /obj/item/clothing/under/frontiersmen/officer
+ shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/sec/frontier/officer
gloves = /obj/item/clothing/gloves/combat
r_pocket = /obj/item/kitchen/knife/combat/survival
@@ -144,12 +143,12 @@
jobtype = /datum/job/hos
accessory = /obj/item/clothing/accessory/armband
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
head = /obj/item/clothing/head/beret/sec/frontier/officer
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
- shoes = /obj/item/clothing/shoes/cowboy/black
+ shoes = /obj/item/clothing/shoes/jackboots
gloves = /obj/item/clothing/gloves/combat
- backpack_contents = list(/obj/item/melee/baton/loaded=1)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/melee/baton/loaded=1)
suit_store = null
// Security Officer
@@ -161,16 +160,19 @@
jobtype = /datum/job/officer
accessory = /obj/item/clothing/accessory/armband
- mask = /obj/item/clothing/mask/gas/sechailer/balaclava
suit = null
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
ears = /obj/item/radio/headset/pirate/alt
+ box = /obj/item/storage/box/survival/frontier
+
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
+
// Medical Doctor
/datum/outfit/job/frontiersmen/doctor
@@ -180,6 +182,9 @@
jobtype = /datum/job/doctor
accessory = /obj/item/clothing/accessory/armband/med
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
glasses = /obj/item/clothing/glasses/hud/health
r_pocket = /obj/item/kitchen/knife/combat/survival
+ suit = /obj/item/clothing/suit/frontiersmen
+ head = /obj/item/clothing/head/frontier
+ belt = /obj/item/storage/belt/medical/webbing/frontiersmen
diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm
index c819246f7cae..db227c2903c7 100644
--- a/code/modules/clothing/outfits/factions/independent.dm
+++ b/code/modules/clothing/outfits/factions/independent.dm
@@ -6,8 +6,6 @@
box = /obj/item/storage/box/survival
id = /obj/item/card/id
- r_pocket = /obj/item/storage/wallet
-
// Assistant
/datum/outfit/job/independent/assistant
@@ -19,8 +17,21 @@
/datum/outfit/job/independent/assistant/waiter
name = "Independent - Assistant (Waiter)"
+
uniform = /obj/item/clothing/under/suit/waiter
+ alt_uniform = /obj/item/clothing/under/suit/waiter/syndicate
+ gloves = /obj/item/clothing/gloves/color/evening
+ ears = /obj/item/radio/headset/headset_srv
shoes = /obj/item/clothing/shoes/laceup
+ l_pocket = /obj/item/lighter
+ r_pocket = /obj/item/reagent_containers/glass/rag
+
+/datum/outfit/job/independent/assistant/waiter/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(visualsOnly)
+ return
+ var/obj/item/card/id/W = H.wear_id
+ W.access += list(ACCESS_KITCHEN)
/datum/outfit/job/independent/assistant/fancy
name = "Independent - Assistant (Formal Uniform)"
@@ -138,6 +149,18 @@
implants = list(/obj/item/implant/radio)
accessory = null
+/datum/outfit/job/independent/captain/manager
+ name = "Independent - Captain (Manager)"
+
+ id = /obj/item/card/id
+ gloves = /obj/item/clothing/gloves/color/white
+ uniform = /obj/item/clothing/under/suit/black_really
+ alt_uniform = /obj/item/clothing/under/suit/blacktwopiece
+ dcoat = null
+ glasses = /obj/item/clothing/glasses/sunglasses
+ head = null
+ accessory = null
+
// Head of Personnel
/datum/outfit/job/independent/hop
@@ -289,7 +312,6 @@
jobtype = /datum/job/engineer
belt = /obj/item/storage/belt/utility/full/engi
- l_pocket = /obj/item/storage/wallet
gloves = /obj/item/clothing/gloves/color/yellow
ears = /obj/item/radio/headset/headset_eng
uniform = /obj/item/clothing/under/rank/engineering/engineer
@@ -368,7 +390,6 @@
id = /obj/item/card/id/silver
belt = /obj/item/storage/belt/utility/chief/full
- l_pocket = /obj/item/storage/wallet
ears = /obj/item/radio/headset/headset_com
uniform = /obj/item/clothing/under/rank/engineering/chief_engineer
dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
@@ -586,7 +607,8 @@
job_icon = "cook"
ears = /obj/item/radio/headset/headset_srv
- uniform = /obj/item/clothing/under/rank/civilian/chef //WS Edit - Alt Uniforms
+ shoes = /obj/item/clothing/shoes/laceup
+ uniform = /obj/item/clothing/under/rank/civilian/chef
suit = /obj/item/clothing/suit/toggle/chef
alt_suit = /obj/item/clothing/suit/apron/chef
head = /obj/item/clothing/head/chefhat
@@ -601,8 +623,6 @@
var/chosen_box = pick(possible_boxes)
var/obj/item/storage/box/I = new chosen_box(src)
H.equip_to_slot_or_del(I,ITEM_SLOT_BACKPACK)
- var/datum/martial_art/cqc/under_siege/justacook = new
- justacook.teach(H)
// Bartender
@@ -617,6 +637,14 @@
suit = /obj/item/clothing/suit/armor/vest
backpack_contents = list(/obj/item/storage/box/beanbag=1)
shoes = /obj/item/clothing/shoes/laceup
+ accessory = /obj/item/clothing/accessory/waistcoat
+
+/datum/outfit/job/independent/bartender/disarmed //No armor, no shotgun ammo.
+ name = "Independent - Bartender (Disarmed)"
+
+ suit = null
+ alt_suit = null
+ backpack_contents = null
/datum/outfit/job/independent/bartender/pharma
name = "Independent - Bartender (Mixologist)"
@@ -628,6 +656,7 @@
belt = /obj/item/storage/belt
gloves = /obj/item/clothing/gloves/color/latex/nitrile
uniform = /obj/item/clothing/under/suit/black
+ accessory = null
// Lawyer
diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm
index a8ce0907a35a..1d12eb25c4e9 100644
--- a/code/modules/clothing/outfits/factions/minutemen.dm
+++ b/code/modules/clothing/outfits/factions/minutemen.dm
@@ -246,6 +246,21 @@
r_pocket = /obj/item/radio
+/datum/outfit/job/clip/correspondant
+ name = "CLIP - War Correspondent"
+ job_icon = "curator"
+ jobtype = /datum/job/curator
+
+ head = /obj/item/clothing/head/helmet/bulletproof/m10/clip_correspondent
+ uniform = /obj/item/clothing/under/clip/formal/with_shirt
+ suit = /obj/item/clothing/suit/armor/vest/clip_correspondent
+ shoes = /obj/item/clothing/shoes/laceup
+
+ backpack = /obj/item/storage/backpack/satchel/leather
+ satchel = /obj/item/storage/backpack/satchel/leather
+
+ r_pocket = /obj/item/radio
+
// Colonial League Minutemen
/datum/outfit/job/clip/minutemen
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index 93f1ee3a347c..e93c7b4b8e52 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -220,7 +220,6 @@
id = /obj/item/card/id/silver
belt = /obj/item/storage/belt/utility/chief/full
- l_pocket = /obj/item/storage/wallet
ears = /obj/item/radio/headset/headset_com
uniform = /obj/item/clothing/under/nanotrasen/engineering/director
dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
diff --git a/code/modules/clothing/outfits/factions/roumain.dm b/code/modules/clothing/outfits/factions/roumain.dm
index 424827e69010..fe31fddd9041 100644
--- a/code/modules/clothing/outfits/factions/roumain.dm
+++ b/code/modules/clothing/outfits/factions/roumain.dm
@@ -19,7 +19,7 @@
name = "Saint-Roumain Militia - Shadow"
id_assignment = "Shadow"
jobtype = /datum/job/assistant
- job_icon = "assistant"
+ job_icon = "srm_shadow"
uniform = /obj/item/clothing/under/suit/roumain
alt_uniform = null
@@ -33,14 +33,40 @@
/datum/outfit/job/roumain/captain
name = "Saint-Roumain Militia - Hunter Montagne"
id_assignment = "Hunter Montagne"
- job_icon = "captain"
+ job_icon = "srm_montagne"
jobtype = /datum/job/captain
+ ears = /obj/item/radio/headset/headset_com/alt
+ uniform = /obj/item/clothing/under/suit/roumain
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ suit = /obj/item/clothing/suit/armor/roumain/montagne
+ head = /obj/item/clothing/head/cowboy/sec/roumain/montagne
+ id = /obj/item/card/id/gold
+
+ duffelbag = /obj/item/storage/backpack/cultpack
+ courierbag = /obj/item/storage/backpack/cultpack
+ backpack = /obj/item/storage/backpack/cultpack
+ satchel = /obj/item/storage/backpack/cultpack
+
+ backpack_contents = list(/obj/item/book/manual/srmlore=1,
+ /obj/item/stamp/chap = 1,
+ /obj/item/melee/classic_baton/telescopic=1,
+ )
+ chameleon_extras = null
+
+// Second-In-Command
+
+/datum/outfit/job/roumain/hop
+ name = "Saint-Roumain Militia - Hunter Colligne"
+ id_assignment = "Hunter Colligne"
+ job_icon = "srm_colligne"
+ jobtype = /datum/job/head_of_personnel
+
ears = /obj/item/radio/headset/headset_com
uniform = /obj/item/clothing/under/suit/roumain
shoes = /obj/item/clothing/shoes/workboots/mining
- suit = /obj/item/clothing/suit/armor/hos/roumain/montagne
- head = /obj/item/clothing/head/HoS/cowboy/montagne
+ suit = /obj/item/clothing/suit/armor/roumain/colligne
+ head = /obj/item/clothing/head/cowboy/sec/roumain/colligne
id = /obj/item/card/id/silver
duffelbag = /obj/item/storage/backpack/cultpack
@@ -58,7 +84,7 @@
name = "Saint-Roumain Militia - Hunter"
id_assignment = "Hunter"
jobtype = /datum/job/officer
- job_icon = "securityofficer"
+ job_icon = "hsrm_hunter"
uniform = /obj/item/clothing/under/suit/roumain
alt_uniform = null
@@ -74,12 +100,34 @@
backpack_contents = null
+// engineer
+
+/datum/outfit/job/roumain/engineer
+ name = "Saint-Roumain Militia - Machinist"
+ id_assignment = "Machinist"
+ job_icon = "srm_machinist"
+ jobtype = /datum/job/engineer
+
+ uniform = /obj/item/clothing/under/suit/roumain
+ alt_uniform = null
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ belt = /obj/item/storage/belt/utility/full/engi
+ suit = /obj/item/clothing/suit/hazardvest/roumain
+ head = /obj/item/clothing/head/cowboy/sec/roumain/machinist
+ accessory = /obj/item/clothing/accessory/waistcoat/roumain
+ gloves = null
+
+ backpack = /obj/item/storage/backpack
+ satchel = /obj/item/storage/backpack/satchel
+ duffelbag = /obj/item/storage/backpack/duffelbag
+ courierbag = /obj/item/storage/backpack/messenger
+
// Medical Doctor
/datum/outfit/job/roumain/doctor
name = "Saint-Roumain Militia - Hunter Doctor"
id_assignment = "Hunter Doctor"
- job_icon = "medicaldoctor"
+ job_icon = "srm_doctor"
jobtype = /datum/job/doctor
uniform = /obj/item/clothing/under/suit/roumain
@@ -94,3 +142,27 @@
satchel = /obj/item/storage/backpack/satchel
duffelbag = /obj/item/storage/backpack/duffelbag
courierbag = /obj/item/storage/backpack/messenger
+
+// Chaplain
+
+/datum/outfit/job/roumain/flamebearer
+ name = "Saint-Roumain Militia - Flamebearer"
+ id_assignment = "Flamebearer"
+ job_icon = "srm_flamebearer"
+ jobtype = /datum/job/chaplain
+
+ uniform = /obj/item/clothing/under/suit/roumain
+ alt_uniform = null
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ suit = /obj/item/clothing/suit/armor/roumain/flamebearer
+ head = /obj/item/clothing/head/cowboy/sec/roumain/flamebearer
+ gloves = null
+
+ duffelbag = /obj/item/storage/backpack/cultpack
+ courierbag = /obj/item/storage/backpack/cultpack
+ backpack = /obj/item/storage/backpack/cultpack
+ satchel = /obj/item/storage/backpack/cultpack
+
+ backpack_contents = list(/obj/item/book/manual/srmlore=1,
+ /obj/item/stamp/chap = 1,
+ )
diff --git a/code/modules/clothing/outfits/factions/syndicate.dm b/code/modules/clothing/outfits/factions/syndicate.dm
index 8f13554f4b00..03254ed8927e 100644
--- a/code/modules/clothing/outfits/factions/syndicate.dm
+++ b/code/modules/clothing/outfits/factions/syndicate.dm
@@ -22,10 +22,11 @@
//generates a codename and assigns syndicate access, used in the twinkleshine.
/datum/outfit/job/syndicate/proc/assign_codename(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 12)) // squidquest real
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
+ var/obj/item/card/id/I = H.get_idcard()
+ if(I)
+ I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 12)) // squidquest real
+ I.access |= list(ACCESS_SYNDICATE)
+ I.update_label()
//and now, for the Assistants
@@ -54,10 +55,10 @@
box = /obj/item/storage/box/survival/syndie
/datum/outfit/job/syndicate/assistant/gorlex
- name = "Syndicate - Junior Agent (Gorlex Marauders)"
+ name = "Syndicate - Junior Agent (Hardliner)"
- uniform = /obj/item/clothing/under/syndicate/gorlex
- alt_uniform = /obj/item/clothing/under/syndicate
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ alt_uniform = /obj/item/clothing/under/syndicate/hardliners/jumpsuit
/datum/outfit/job/syndicate/assistant/ngr
name = "Syndicate - Initiate (New Gorlex Republic)"
@@ -199,7 +200,7 @@
/datum/outfit/job/syndicate/bartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/card/id/W = H.wear_id
+ var/obj/item/card/id/W = H.get_idcard()
if(H.age < AGE_MINOR)
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
@@ -306,11 +307,12 @@
/datum/outfit/job/syndicate/captain/gorlex
- name = "Syndicate - Captain (Gorlex Marauders)"
- uniform = /obj/item/clothing/under/syndicate/ngr/officer
+ name = "Syndicate - Captain (Hardliner)"
+ uniform = /obj/item/clothing/under/syndicate/hardliners/officer
- head = /obj/item/clothing/head/ngr/peaked
- suit = /obj/item/clothing/suit/armor/ngr/captain
+ head = /obj/item/clothing/head/hardliners/peaked
+ suit = /obj/item/clothing/suit/toggle/armor/vest/hardliners
+ shoes = /obj/item/clothing/shoes/combat
/datum/outfit/job/syndicate/captain/ngr
name = "Syndicate - Captain (New Gorlex Republic)"
@@ -428,17 +430,6 @@
id = /obj/item/card/id/syndicate_command/captain_id
gloves = /obj/item/clothing/gloves/combat
-/datum/outfit/job/syndicate/ce/gorlex
- name = "Syndicate - Foreman (Gorlex Marauders)"
-
- ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/syndicate/gorlex
- alt_uniform = null
- suit = /obj/item/clothing/suit/toggle/hazard
- alt_suit = null
- shoes = /obj/item/clothing/shoes/jackboots
- gloves = /obj/item/clothing/gloves/combat
-
/datum/outfit/job/syndicate/ce/ngr
name = "Syndicate - Foreman (New Gorlex Republic)"
@@ -566,24 +557,27 @@
backpack_contents = list(/obj/item/melee/baton/loaded=1)
/datum/outfit/job/syndicate/hos/gorlex
- name = "Syndicate - Sergeant (Gorlex)"
+ name = "Syndicate - Sergeant (Hardliner)"
id_assignment = "Sergeant"
+ uniform = /obj/item/clothing/under/syndicate/hardliners/officer
+ head = /obj/item/clothing/head/hardliners/peaked
+ suit = /obj/item/clothing/suit/armor/hardliners/sergeant
+ id = /obj/item/card/id/syndicate_command/crew_id
+ shoes = /obj/item/clothing/shoes/combat
+ suit_store = /obj/item/gun/ballistic/automatic/pistol
+
/datum/outfit/job/syndicate/hos/ngr
name = "Syndicate - Lieutenant (New Gorlex Republic)"
id_assignment = "Lieutenant"
- ears = /obj/item/radio/headset/syndicate/alt
uniform = /obj/item/clothing/under/syndicate/ngr/officer
head = /obj/item/clothing/head/ngr/peaked
- suit =/obj/item/clothing/suit/armor/ngr/lieutenant
+ suit = /obj/item/clothing/suit/armor/ngr/lieutenant
id = /obj/item/card/id/syndicate_command/crew_id
shoes = /obj/item/clothing/shoes/combat
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses
suit_store = /obj/item/gun/ballistic/automatic/pistol
- r_pocket = /obj/item/assembly/flash/handheld
- l_pocket = /obj/item/restraints/handcuffs
- backpack_contents = list(/obj/item/melee/baton/loaded=1)
+
/datum/outfit/job/syndicate/hos/twink
name = "Syndicate - Lieutenant (Twinkleshine, NGR)"
@@ -691,13 +685,15 @@
uniform = /obj/item/clothing/under/syndicate/medic
accessory = /obj/item/clothing/accessory/armband/medblue
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/combat
/datum/outfit/job/syndicate/doctor/gorlex
- name = "Syndicate - Medical Doctor (Gorlex)"
+ name = "Syndicate - Medical Doctor (Hardliner)"
- uniform = /obj/item/clothing/under/syndicate/gorlex
- glasses = /obj/item/clothing/glasses/hud/health/prescription
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ head = /obj/item/clothing/head/hardliners
+ suit = /obj/item/clothing/suit/hardliners
+ glasses = /obj/item/clothing/glasses/hud/health
r_pocket = /obj/item/kitchen/knife/combat/survival
back = /obj/item/storage/backpack/duffelbag/syndie/med
id = /obj/item/card/id/syndicate_command/crew_id
@@ -904,7 +900,25 @@
/datum/outfit/job/syndicate/security/gorlex
- name = "Syndicate - Assault Operative (Gorlex)"
+ name = "Syndicate - Trooper (Hardliner)"
+ id_assignment = "Trooper"
+ job_icon = "securityofficer"
+
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ belt = /obj/item/storage/belt/security/webbing/hardliners
+ suit = /obj/item/clothing/suit/armor/hardliners
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/helmet/hardliners
+ shoes = /obj/item/clothing/shoes/combat
+ l_pocket = /obj/item/restraints/handcuffs
+ r_pocket = /obj/item/assembly/flash/handheld
+
+/datum/outfit/job/syndicate/security/gorlex
+ name = "Syndicate - Pilot (Hardliner)"
+ id_assignment = "Pilot"
+ job_icon = "securityofficer"
+
+ head = /obj/item/clothing/head/helmet/hardliners/swat
/datum/outfit/job/syndicate/security/ngr
name = "Syndicate - Operative (New Gorlex Republic)"
@@ -920,6 +934,14 @@
l_pocket = /obj/item/restraints/handcuffs
r_pocket = /obj/item/assembly/flash/handheld
+/datum/outfit/job/syndicate/security/ngr/pilot
+ name = "Syndicate - Pilot (New Gorlex Republic)"
+ id_assignment = "Pilot"
+ job_icon = "securityofficer"
+
+ uniform = /obj/item/clothing/under/syndicate/ngr/fatigues
+ head = /obj/item/clothing/head/helmet/ngr/swat
+
/datum/outfit/job/syndicate/security/twink
name = "Syndicate - Operative (Twinkleshine)"
@@ -987,10 +1009,12 @@
/obj/item/stack/marker_beacon/ten=1)
/datum/outfit/job/syndicate/miner/gorlex
- name = "Syndicate - Wrecker (Gorlex Marauders)"
+ name = "Syndicate - Wrecker (Hardliner)"
id_assignment = "Wrecker"
- uniform = /obj/item/clothing/under/syndicate/gorlex
+ head = /obj/item/clothing/head/hardhat/hardliners
+ suit = /obj/item/clothing/suit/hazardvest/hardliners
+ uniform = /obj/item/clothing/under/syndicate/hardliners/jumpsuit
accessory = /obj/item/clothing/accessory/armband/cargo
shoes = /obj/item/clothing/shoes/workboots
ears = /obj/item/radio/headset/alt
@@ -1090,10 +1114,12 @@
id = /obj/item/card/id/syndicate_command/crew_id
/datum/outfit/job/syndicate/engineer/gorlex
- name = "Syndicate - Mechanic (Gorlex Marauders)"
+ name = "Syndicate - Mechanic (Hardliner)"
id_assignment = "Mechanic"
- uniform = /obj/item/clothing/under/syndicate/gorlex
+ head = /obj/item/clothing/head/hardhat/hardliners
+ suit = /obj/item/clothing/suit/hazardvest/hardliners
+ uniform = /obj/item/clothing/under/syndicate/hardliners
shoes = /obj/item/clothing/shoes/workboots
glasses = null
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index d039d06dae35..100cc7ff0f52 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -226,8 +226,6 @@
backpack_contents = list(
/obj/item/melee/transforming/energy/axe=1,\
/obj/item/storage/part_replacer/bluespace/tier4=1,\
- /obj/item/gun/magic/wand/resurrection/debug=1,\
- /obj/item/gun/magic/wand/death/debug=1,\
/obj/item/debug/human_spawner=1,\
/obj/item/debug/omnitool=1
)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 1b5f0ae58fae..336ac43c7d4d 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -134,9 +134,12 @@
return
if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards
+ if(DOING_INTERACTION_WITH_TARGET(user, our_guy))
+ to_chat(user, span_warning("You're already interacting with [src]!"))
+ return
user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...")
- if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy)))
+ if(do_after(user, lace_time, target = our_guy, extra_checks = CALLBACK(src, PROC_REF(still_shoed), our_guy)))
to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].")
if(tied == SHOES_UNTIED)
adjust_laces(SHOES_TIED, user)
@@ -151,13 +154,16 @@
if(tied == SHOES_KNOTTED)
to_chat(user, "The laces on [loc]'s [src.name] are already a hopelessly tangled mess!")
return
+ if(DOING_INTERACTION_WITH_TARGET(user, our_guy))
+ to_chat(user, span_warning("You're already interacting with [src]!"))
+ return
var/mod_time = lace_time
to_chat(user, "You quietly set to work [tied ? "untying" : "knotting"] [loc]'s [src.name]...")
if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this
mod_time *= 0.75
- if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy), hidden = TRUE))
+ if(do_after(user, mod_time, target = our_guy, extra_checks = CALLBACK(src, PROC_REF(still_shoed), our_guy)))
to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].")
if(tied == SHOES_UNTIED)
adjust_laces(SHOES_KNOTTED, user)
@@ -232,8 +238,12 @@
/obj/item/clothing/shoes/attack_self(mob/user)
. = ..()
+ if(DOING_INTERACTION_WITH_TARGET(user, src))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+
to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...")
- if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, PROC_REF(still_shoed), user)))
+ if(do_after(user, lace_time, target = src,extra_checks = CALLBACK(src, PROC_REF(still_shoed), user)))
to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].")
adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user)
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index bd1817e1bf45..cb98f607089c 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -40,7 +40,7 @@
slowdown = 1
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
+ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index ff0101ffd58b..1eb72d3bbdf0 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -166,7 +166,7 @@
if(L.status)
to_chat(user, "This bulb is too damaged to use as a replacement!")
return
- if(do_after(user, 50, 1, src))
+ if(do_after(user, 50, src))
qdel(I)
helmet = new helmettype(src)
to_chat(user, "You have successfully repaired [src]'s helmet.")
@@ -456,27 +456,6 @@
supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
// [/CELADON-ADD]
-//Hardliner Syndie suit
-/obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
- name = "white-red hardsuit helmet"
- desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in EVA mode. Manufactured by Second Battlegroup."
- alt_desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in combat mode. Manufactured by Second Battlegroup."
- icon_state = "hardsuit1-hl"
- item_state = "hardsuit1-hl"
- hardsuit_type = "hl"
-
-/obj/item/clothing/suit/space/hardsuit/syndi/hl
- name = "white-red hardsuit"
- desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in EVA mode. Manufactured by Second Battlegroup."
- alt_desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in combat mode. Manufactured by the Second Battlegroup."
- icon_state = "hardsuit1-hl"
- item_state = "hardsuit1-hl"
- hardsuit_type = "hl"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
- lightweight = 1
- jetpack = null
-
-
//Elite Syndie suit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit helmet"
@@ -1107,12 +1086,6 @@
supports_variations = VOX_VARIATION | TAJARA_VARIATION
// [/CELADON-EDIT]
-/obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
- name = "\improper Frontiersmen hardsuit helmet"
- desc = "An old hardsuit helmet based on a even older hardsuit helmet. Used prolifically by the Frontiersmen pirate fleet."
- icon_state = "hardsuit0-frontier"
- hardsuit_type = "frontier"
-
/obj/item/clothing/suit/space/hardsuit/security/independent
icon_state = "hardsuit-independent-sec"
name = "security hardsuit"
@@ -1127,13 +1100,6 @@
supports_variations = VOX_VARIATION | TAJARA_VARIATION
// [/CELADON-EDIT]
-/obj/item/clothing/suit/space/hardsuit/security/independent/frontier
- name = "\improper Frontiersmen hardsuit"
- desc = "An old hardsuit based on a even older hardsuit. Used prolifically by the Frontiersmen pirate fleet."
- icon_state = "hardsuit_frontier"
- hardsuit_type = "hardsuit_frontier"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
-
//Mining
/obj/item/clothing/head/helmet/space/hardsuit/mining/independent
name = "mining hardsuit helmet"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 889bcc0420f2..f3b864966c8a 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -34,21 +34,22 @@
desc = "A Type I armored vest that provides decent protection against most types of damage."
icon_state = "armor_alt"
item_state = "armoralt"
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/armor/vest/marine
- name = "light tactical armor vest"
- desc = "A set of the finest mass-produced stamped plasteel armor plates money can buy."
+ name = "tactical armor vest"
+ desc = "A heavy set of the finest mass-produced stamped plasteel armor plates money can buy."
icon_state = "marine_light"
item_state = "armor"
clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 25, "bomb" = 50, "bio" = 100, "fire" = 40, "acid" = 50)
+ armor = list("melee" = 50, "bullet" = 75, "laser" = 55, "energy" = 25, "bomb" = 60, "bio" = 100, "fire" = 70, "acid" = 50)
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
resistance_flags = FIRE_PROOF | ACID_PROOF
supports_variations = VOX_VARIATION | DIGITIGRADE_VARIATION_NO_NEW_ICON
+ slowdown = 0.5
/obj/item/clothing/suit/armor/vest/marine/medium
name = "medium tactical armor vest"
@@ -58,11 +59,6 @@
name = "large tactical armor vest"
icon_state = "marine_heavy"
-/obj/item/clothing/suit/armor/vest/marine/trauma
- name = "cybersun trauma team armor vest"
- icon_state = "traumavest"
- desc = "A set of stamped plasteel armor plates decorated with a medical cross and colors associated with the medical division of Cybersun."
-
/obj/item/clothing/suit/armor/vest/old
name = "degrading armor vest"
desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in."
@@ -202,11 +198,6 @@
strip_delay = 70
equip_delay_other = 50
-/obj/item/clothing/suit/armor/vest/bulletproof/frontier
- name = "\improper Frontiersmen bulletproof armor"
- desc = "A scrap piece of armor made of disused protective plates. This one was used to protect the squishy bits of a Frontiersman, once."
- icon_state = "frontier_armor"
-
/obj/item/clothing/suit/armor/laserproof
name = "reflector vest"
desc = "A vest that excels in protecting the wearer against energy projectiles, as well as occasionally reflecting them."
@@ -326,7 +317,7 @@
desc = "A luxurious brown coat made from a crossweave of kevlar and ballistic fibre, the collar and wrist trims are made from genuine wolf fur. as protective as it is stylish."
icon_state = "armor_inteq_battlecoat"
item_state = "inteq_battlecoat"
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/suit/armor/hos/inteq/honorable //Basically CC higherup clothing for inteq
name = "honorable vanguard battlecoat"
@@ -334,7 +325,7 @@
icon_state = "armor_inteq_honorable_battlecoat"
item_state = "inteq_honorable_battlecoat"
armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/armor/inteq/corpsman
name = "inteq corpsman vest"
@@ -364,27 +355,6 @@
/obj/item/melee/baton,
)
-/obj/item/clothing/suit/armor/roumain
- name = "saint-roumain duster"
- desc = "A coat made from hard leather. Meant to withstand long hunts in harsh wilderness."
- icon_state = "armor_rouma"
- item_state = "rouma_coat"
- body_parts_covered = CHEST|GROIN|ARMS
- cold_protection = CHEST|GROIN|ARMS
- heat_protection = CHEST|GROIN|ARMS
-
-/obj/item/clothing/suit/armor/roumain/shadow
- name = "saint-roumain shadow duster"
- desc = "A coat made from hard leather. Its rough, barely-treated finish is typical of one of the Saint-Roumain Militia's trainees."
- icon_state = "armor_rouma_shadow"
- item_state = "rouma_shadow_coat"
-
-/obj/item/clothing/suit/armor/hos/roumain/montagne
- name = "saint-roumain montagne coat"
- desc = "A stylish red coat to indicate that you are, in fact, a Hunter Montagne. Made of extra hard exotic leather, treated with bullet-resistant materials, and lined with the fur of some unidentifiable creature."
- icon_state = "armor_rouma_montagne"
- item_state = "rouma_montagne_coat"
-
/obj/item/clothing/suit/armor/vest/bulletproof/solgov
name = "\improper Sonnensoldner gambison"
desc = "A standard armor vest fielded for SolGov's Sonnensoldners."
@@ -486,14 +456,6 @@
icon_state = "armor_brigphysjacket"
body_parts_covered = CHEST|ARMS
-/obj/item/clothing/suit/armor/frontier
- name = "reinforced fur coat"
- desc = "A stiff coat, meant for frigid conditions."
- icon_state = "frontier_coat"
- body_parts_covered = CHEST|GROIN|ARMS
- cold_protection = CHEST|GROIN|ARMS
- heat_protection = CHEST|GROIN|ARMS
-
/obj/item/clothing/suit/toggle/armor/vest/centcom_formal
name = "\improper CentCom formal coat"
desc = "A stylish coat given to CentCom Commanders. Perfect for sending ERTs to suicide missions with style!"
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index f95a91ab27fe..858b494564e6 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -68,12 +68,6 @@ You're pretty sure this is just a raincoat.
icon_state = "raincoat"
item_state = "raincoat"
-/obj/item/clothing/suit/toggle/labcoat/roumain_med
- name = "saint-roumain medical duster"
- desc = "A coat made from hard leather and further treated with exotic sterilizing oils and wax. The treatment and its more closed design offers much better protection against biological hazards."
- icon_state = "rouma_med_coat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
-
/obj/item/clothing/suit/longcoat
name = "longcoat"
desc = "A long, victorian styled labcoat."
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 588a8f1600de..9b141148e5a2 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -1,5 +1,7 @@
// WINTER COATS
+//Someone please make the allowed lists globals or something
+
/obj/item/clothing/suit/hooded/wintercoat
name = "winter coat"
desc = "A heavy jacket made from 'synthetic' animal furs."
@@ -10,14 +12,14 @@
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
- allowed = list( /obj/item/flashlight,
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/tank/internals/plasmaman,
- /obj/item/toy,
- /obj/item/storage/fancy/cigarettes,
- /obj/item/lighter,
- )
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood
name = "winter hood"
@@ -29,13 +31,11 @@
cold_protection = HEAD
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
item_state = "coatcaptain"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
hoodtype = /obj/item/clothing/head/hooded/winterhood/captain
/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize()
@@ -44,13 +44,11 @@
/obj/item/clothing/head/hooded/winterhood/captain
icon_state = "hood_captain"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
item_state = "coatsecurity"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/security
/obj/item/clothing/suit/hooded/wintercoat/security/Initialize()
@@ -59,19 +57,37 @@
/obj/item/clothing/head/hooded/winterhood/security
icon_state = "hood_security"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "coatmedical"
item_state = "coatmedical"
- allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
+ allowed = list(
+ /obj/item/analyzer,
+ /obj/item/sensor_device,
+ /obj/item/stack/medical,
+ /obj/item/dnainjector,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/healthanalyzer,
+ /obj/item/flashlight/pen,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,
+ /obj/item/storage/pill_bottle,
+ /obj/item/paper,
+ /obj/item/melee/classic_baton/telescopic,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ )
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "hood_medical"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
/obj/item/clothing/suit/hooded/wintercoat/medical/paramedic
name = "paramedic winter coat"
@@ -86,25 +102,52 @@
name = "science winter coat"
icon_state = "coatscience"
item_state = "coatscience"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
+ allowed = list(
+ /obj/item/analyzer,
+ /obj/item/stack/medical,
+ /obj/item/dnainjector,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/healthanalyzer,
+ /obj/item/flashlight/pen,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,
+ /obj/item/storage/pill_bottle,
+ /obj/item/paper,
+ /obj/item/melee/classic_baton/telescopic,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ )
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "hood_science"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
icon_state = "coatengineer"
item_state = "coatengineer"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/t_scanner,
+ /obj/item/construction/rcd,
+ /obj/item/pipe_dispenser,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
+
/obj/item/clothing/head/hooded/winterhood/engineering
icon_state = "hood_engineer"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
name = "atmospherics winter coat"
@@ -119,8 +162,22 @@
name = "hydroponics winter coat"
icon_state = "coathydro"
item_state = "coathydro"
- allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro
+ allowed = list(
+ /obj/item/reagent_containers/spray/plantbgone,
+ /obj/item/plant_analyzer,
+ /obj/item/seeds,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/cultivator,
+ /obj/item/reagent_containers/spray/pestspray,
+ /obj/item/hatchet,
+ /obj/item/storage/bag/plants,
+ /obj/item/toy,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood/hydro
icon_state = "hood_hydro"
@@ -138,13 +195,18 @@
name = "mining winter coat"
icon_state = "coatminer"
item_state = "coatminer"
- allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/miner
+ allowed = list(
+ /obj/item/pickaxe,
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood/miner
icon_state = "hood_miner"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
// Inteq
@@ -154,18 +216,17 @@
icon_state = "coatinteq"
item_state = "coatinteq"
hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/hooded/winterhood/security/inteq
icon_state = "hood_inteq"
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt
name = "inteq hooded coat"
desc = "A hooded coat with a fur trim around the hood, comfy! It has a small 'IRMG' embroidered onto the shoulder."
icon_state = "coatinteq_alt"
item_state = "coatinteq_alt"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq/alt
/obj/item/clothing/head/hooded/winterhood/security/inteq/alt
@@ -173,15 +234,14 @@
desc = "A comfortable looking brown hood."
icon_state = "hood_inteq_alt"
item_state = "hood_inteq_alt"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
// CentCom
+
/obj/item/clothing/suit/hooded/wintercoat/centcom
name = "centcom winter coat"
desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper."
icon_state = "coatcentcom"
item_state = "coatcentcom"
- armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60)
hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload)
@@ -190,7 +250,6 @@
/obj/item/clothing/head/hooded/winterhood/centcom
icon_state = "hood_centcom"
- armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60)
// SolGov
@@ -199,9 +258,7 @@
desc = "An environment-resistant wintercoat in the colors of the Solarian Confederation."
icon_state = "coatsolgov"
item_state = "coatsolgov"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/solgov
/obj/item/clothing/head/hooded/winterhood/solgov
icon_state = "hood_solgov"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 41c1cddde5a1..451d428760f3 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -148,39 +148,6 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
resistance_flags = FLAMMABLE
-/obj/item/clothing/suit/wizrobe/paper
- name = "papier-mache robe" // no non-latin characters!
- desc = "A robe held together by various bits of clear-tape and paste."
- icon_state = "wizard-paper"
- item_state = "wizard-paper"
- var/robe_charge = TRUE
- actions_types = list(/datum/action/item_action/stickmen)
-
-
-/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action)
- stickmen()
-
-
-/obj/item/clothing/suit/wizrobe/paper/verb/stickmen()
- set category = "Object"
- set name = "Summon Stick Minions"
- set src in usr
- if(!isliving(usr))
- return
- if(!robe_charge)
- to_chat(usr, "The robe's internal magic supply is still recharging!")
- return
-
- usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning")
- playsound(src.loc, 'sound/magic/summon_magic.ogg', 50, TRUE, TRUE)
- var/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr))
- var/list/factions = usr.faction
- M.faction = factions
- src.robe_charge = FALSE
- sleep(30)
- src.robe_charge = TRUE
- to_chat(usr, "The robe hums, its internal magic supply restored.")
-
/obj/item/clothing/suit/space/hardsuit/shielded/wizard
name = "battlemage armour"
desc = "Not all wizards are afraid of getting up close and personal."
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 76de51b173cd..f7710d52a12d 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -381,22 +381,13 @@
//OONGA BOONGA//
////////////////
-/obj/item/clothing/accessory/talisman
- name = "bone talisman"
- desc = "A hunter's talisman, some say the old gods smile on those who wear it."
- icon_state = "talisman"
- armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
+/obj/item/clothing/accessory/bonearmlet
+ name = "bone armlet"
+ desc = "An armlet made out of animal bone and sinew. According to a common Frontier superstition, it brings good luck to its wearer."
+ icon_state = "bone_armlet"
attachment_slot = ARMS
above_suit = TRUE
-/obj/item/clothing/accessory/wolftalisman
- name = "hunter's necklace"
- desc = "A thick necklace woven from sinew and bits of wolfhide, adorned with a carved fang. Slaying such beasts is rumoured to elate the gods of old, and such an item proves your worth."
- icon_state = "wolf_talisman"
- armor = list("melee" = 15 , "bullet" = 15, "laser" = 10, "energy" = 10, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 25, "acid" = 25)
- attachment_slot = CHEST
- above_suit = TRUE
-
/obj/item/clothing/accessory/skullcodpiece
name = "skull codpiece"
desc = "A legion skull fitted to a codpiece, intended to protect the important things in life."
diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm
index 2341da5567a9..0af578bfd452 100644
--- a/code/modules/clothing/under/jobs/cargo.dm
+++ b/code/modules/clothing/under/jobs/cargo.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/under/rank/cargo
icon = 'icons/obj/clothing/under/cargo.dmi'
mob_overlay_icon = 'icons/mob/clothing/under/cargo.dmi'
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/under/rank/cargo/qm
name = "quartermaster's jumpsuit"
@@ -16,7 +16,7 @@
item_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/rank/cargo/tech
name = "cargo technician's jumpsuit"
@@ -24,7 +24,7 @@
icon_state = "cargotech"
item_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/cargo/tech/skirt
@@ -33,7 +33,7 @@
icon_state = "cargo_skirt"
item_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
can_adjust = FALSE
/obj/item/clothing/under/rank/cargo/miner
@@ -43,7 +43,7 @@
item_state = "miner"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0)
resistance_flags = NONE
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/under/rank/cargo/miner/lavaland
desc = "A light uniform for operating in hazardous environments, manufactured en-masse by EXOCOM for the profitable frontier prospector market. Adventurous khaki jeans included."
@@ -51,14 +51,14 @@
icon_state = "explorer"
item_state = "explorer"
can_adjust = TRUE
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/under/rank/cargo/miner/hazard
desc = "A thick jumpsuit with reflective stripes for hazardous, low-visibility environments. It's coated in a thick layer of asteroid dust."
name = "asteroid miner's jumpsuit"
icon_state = "hazard"
item_state = "hazard"
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/rank/cargo/miner/lavaland/old
icon_state = "explorerold"
diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm
index bf462c7fda4d..183e957d2338 100644
--- a/code/modules/clothing/under/jobs/medical.dm
+++ b/code/modules/clothing/under/jobs/medical.dm
@@ -174,7 +174,7 @@
desc = "A light white gown that allows easy access to any patient who wears this."
icon_state = "gownwhite"
item_state = "gownwhite"
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
can_adjust = FALSE
/obj/item/clothing/under/rank/medical/gown/green
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 29ee1c732399..46a1ff275d15 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -290,18 +290,18 @@
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
-/obj/item/clothing/under/rank/security/officer/frontier
+/obj/item/clothing/under/frontiersmen
name = "\improper Frontiersmen uniform"
desc = "Worn by members of the Frontiersmen pirate fleet. It's very uncomfortable to move around in."
icon_state = "frontier"
item_state = "gy_suit"
-/obj/item/clothing/under/rank/security/officer/frontier/officer
+/obj/item/clothing/under/frontiersmen/officer
name = "\improper Frontiersmen officer's uniform"
desc = "Worn by officers of the Frontiersmen pirate fleet. It's less comfortable than it looks."
icon_state = "frontier_officer"
-/obj/item/clothing/under/rank/security/officer/frontier/admiral
+/obj/item/clothing/under/frontiersmen/admiral
name = "\improper Frontiersmen admiral's uniform"
desc = "Worn by admirals of the Frontiersmen pirate fleet. It's the only Frontiersman uniform that isn't mass produced."
icon_state = "frontier_admiral"
diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm
index 1dabceb6db24..f74748f71fbb 100644
--- a/code/modules/clothing/under/skirt_dress.dm
+++ b/code/modules/clothing/under/skirt_dress.dm
@@ -93,4 +93,4 @@
desc = "A pretty red dress with big pink ribbons attached. Intended to be worn by Kepori cosplayers, but also fits other species."
icon_state = "rilena_dress"
item_state = "rilena_dress"
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm
index 786f2dcd5fa3..a0ec0a4da5e5 100644
--- a/code/modules/clothing/under/suits.dm
+++ b/code/modules/clothing/under/suits.dm
@@ -29,7 +29,6 @@
item_state = "waiter"
/obj/item/clothing/under/suit/waiter/syndicate
- name = "syndicate waiter's outfit"
icon_state = "waiter_s"
item_state = "waiter_s"
@@ -140,12 +139,6 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD
flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR
-/obj/item/clothing/under/suit/roumain
- name = "saint-roumain's worksuit"
- desc = "A simple, hard-wearing suit designed for the hardworking hunters of the Saint-Roumain Militia."
- icon_state = "rouma_work"
- item_state = "rouma_work"
-
/obj/item/clothing/under/suit/dresssuit
name = "navy dress-suit"
desc = "A very strange piece of clothing. Mostly navy, but with a pink undershirt. Who would even wear this?"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 9eb76ee6bf5e..85c9996489e2 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -7,7 +7,7 @@
alt_covers_chest = TRUE
icon = 'icons/obj/clothing/under/syndicate.dmi'
mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi'
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/under/syndicate/skirt
name = "tactical skirtleneck"
@@ -17,7 +17,7 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/syndicate/bloodred
name = "blood-red sneaksuit"
@@ -27,7 +27,7 @@
armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40)
resistance_flags = FIRE_PROOF | ACID_PROOF
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/bloodred/sleepytime
name = "blood-red pajamas"
@@ -35,7 +35,7 @@
icon_state = "bloodred_pajamas"
item_state = "bl_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck"
@@ -43,7 +43,7 @@
icon_state = "tactifool"
item_state = "bl_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/under/syndicate/tacticool/skirt
name = "tacticool skirtleneck"
@@ -52,7 +52,7 @@
item_state = "bl_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
@@ -75,7 +75,7 @@
desc = "With a suit lined with this many pockets, you are ready to operate."
icon_state = "syndicate_combat"
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/rus_army
name = "advanced military tracksuit"
@@ -100,7 +100,7 @@
can_adjust = FALSE
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/cybersun
name = "cybersun jumpsuit"
@@ -115,7 +115,7 @@
icon_state = "cybersun"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 100)
alt_covers_chest = TRUE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/cybersun/officer
name = "cybersun officer's suit"
@@ -130,7 +130,7 @@
icon_state = "cybersun_med"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/syndicate/medic/skirt
name = "Cybersun medical jumpskirt"
@@ -138,7 +138,7 @@
icon_state = "cybersun_med_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/syndicate/donk
name = "Donk! Co. employee uniform"
@@ -148,14 +148,14 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
body_parts_covered = CHEST|GROIN|ARMS
alt_covers_chest = TRUE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/donk/qm
name = "Donk! Co. manager uniform"
desc = "The standard uniform of Donk Co. managers. Direct all complaints here."
icon_state = "donk_qm"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/suit/hazardvest/donk
name = "Donk! Co. employee vest"
diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm
index 64280475664a..4213ae91376b 100644
--- a/code/modules/economy/account.dm
+++ b/code/modules/economy/account.dm
@@ -1,21 +1,23 @@
/datum/bank_account
var/account_holder = "Rusty Venture"
var/account_balance = 0
+ var/holder_age = 18
var/list/bank_cards = list()
var/add_to_accounts = TRUE
var/account_id
-/datum/bank_account/New(newname, job)
+/datum/bank_account/New(newname, age)
if(add_to_accounts)
SSeconomy.bank_accounts += src
account_holder = newname
+ holder_age = age
account_id = rand(111111,999999)
/datum/bank_account/Destroy()
if(add_to_accounts)
SSeconomy.bank_accounts -= src
- for(var/obj/item/card/id/id_card as anything in bank_cards)
- id_card.registered_account = null
+ for(var/obj/item/card/bank/bank_card as anything in bank_cards)
+ bank_card.registered_account = null
SSeconomy.bank_money -= account_balance
return ..()
@@ -49,10 +51,6 @@
return
for(var/obj/A in bank_cards)
var/icon_source = A
- if(istype(A, /obj/item/card/id))
- var/obj/item/card/id/id_card = A
- if(id_card.uses_overlays)
- icon_source = id_card.get_cached_flat_icon()
var/mob/card_holder = recursive_loc_check(A, /mob)
if(ismob(card_holder)) //If on a mob
if(!card_holder.client || (!(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force))
diff --git a/code/modules/economy/pay_stand.dm b/code/modules/economy/pay_stand.dm
index af7d9be4b947..9382a03d062e 100644
--- a/code/modules/economy/pay_stand.dm
+++ b/code/modules/economy/pay_stand.dm
@@ -6,14 +6,14 @@
density = TRUE
anchored = TRUE
var/locked = FALSE
- var/obj/item/card/id/my_card
+ var/obj/item/card/bank/my_card
var/obj/item/assembly/signaler/signaler //attached signaler, let people attach signalers that get activated if the user's transaction limit is achieved.
var/signaler_threshold = 0 //signaler threshold amount
var/amount_deposited = 0 //keep track of the amount deposited over time so you can pay multiple times to reach the signaler threshold
var/force_fee = 0 //replaces the "pay whatever" functionality with a set amount when non-zero.
/obj/machinery/paystand/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/card/id))
+ if(istype(W, /obj/item/card/bank))
if(W == my_card)
if(user.a_intent == INTENT_DISARM)
var/rename_msg = stripped_input(user, "Rename the Paystand:", "Paystand Naming", name)
@@ -31,7 +31,7 @@
to_chat(user, "You [src.locked ? "lock" : "unlock"] the paystand, protecting the bolts from [anchored ? "loosening" : "tightening"].")
return
if(!my_card)
- var/obj/item/card/id/assistant_mains_need_to_die = W
+ var/obj/item/card/bank/assistant_mains_need_to_die = W
if(!assistant_mains_need_to_die.registered_account)
return
var/msg = stripped_input(user, "Name of pay stand:", "Paystand Naming", "[user]'s Awesome Paystand")
@@ -42,7 +42,7 @@
my_card = assistant_mains_need_to_die
to_chat(user, "You link the stand to your account.")
return
- var/obj/item/card/id/vbucks = W
+ var/obj/item/card/bank/vbucks = W
if(vbucks.registered_account)
var/momsdebitcard = 0
if(!force_fee)
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
deleted file mode 100644
index 68a38f0479e1..000000000000
--- a/code/modules/events/wizard/magicarp.dm
+++ /dev/null
@@ -1,75 +0,0 @@
-/datum/round_event_control/wizard/magicarp //these fish is loaded
- name = "Magicarp"
- weight = 1
- typepath = /datum/round_event/wizard/magicarp
- max_occurrences = 1
- earliest_start = 0 MINUTES
-
-/datum/round_event/wizard/magicarp
- announceWhen = 3
- startWhen = 50
-
-/datum/round_event/wizard/magicarp/setup()
- startWhen = rand(40, 60)
-
-/datum/round_event/wizard/magicarp/announce(fake)
- priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
-
-/datum/round_event/wizard/magicarp/start()
- for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
- if(prob(5))
- new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc)
- else
- new /mob/living/simple_animal/hostile/carp/ranged(C.loc)
-
-/mob/living/simple_animal/hostile/carp/ranged
- name = "magicarp"
- desc = "50% magic, 50% carp, 100% horrible."
- icon_state = "magicarp"
- icon_living = "magicarp"
- icon_dead = "magicarp_dead"
- icon_gib = "magicarp_gib"
- ranged = 1
- retreat_distance = 2
- minimum_distance = 0 //Between shots they can and will close in to nash
- projectiletype = /obj/projectile/magic
- projectilesound = 'sound/weapons/emitter.ogg'
- maxHealth = 50
- health = 50
- gold_core_spawnable = NO_SPAWN
- random_color = FALSE
- food_type = list()
- tame_chance = 0
- bonus_tame_chance = 0
- var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
- /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
-
-/mob/living/simple_animal/hostile/carp/ranged/Initialize()
- projectiletype = pick(allowed_projectile_types)
- . = ..()
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos
- name = "chaos magicarp"
- desc = "50% carp, 100% magic, 150% horrible."
- color = "#00FFFF"
- maxHealth = 75
- health = 75
- gold_core_spawnable = NO_SPAWN
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
- projectiletype = pick(allowed_projectile_types)
- ..()
-
-/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool
- gold_core_spawnable = HOSTILE_SPAWN
- allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport,
- /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage,
- /obj/projectile/magic/spell/magic_missile, /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/locker) //thanks Lett1 /finally, we can synthesize the lockerfish
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology
- gold_core_spawnable = HOSTILE_SPAWN
- allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
- /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing,
- /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index aa2830daee92..32c4b1a9a09f 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -39,7 +39,7 @@
else
M.visible_message("[user] attempts to feed [M] the contents of [src].", \
"[user] attempts to feed you the contents of [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
@@ -221,8 +221,8 @@
// Formatting is the same as food.
/obj/item/reagent_containers/food/drinks/coffee
- name = "robust coffee"
- desc = "Careful, the beverage you're about to enjoy is extremely hot."
+ name = "Solar's Best black coffee"
+ desc = "A cup of piping hot black coffee. Made from beans grown across the solar cantons for the caffeine that every spacer needs."
icon_state = "coffee"
list_reagents = list(/datum/reagent/consumable/coffee = 30)
spillable = TRUE
@@ -258,13 +258,13 @@
icon_state = "tea_empty"
/obj/item/reagent_containers/food/drinks/mug/tea
- name = "Duke Purple tea"
- desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
+ name = "Guildmaiden's tea"
+ desc = "Dark tea, made from pressed, fermented tea leaves. Originally from Sol, it became wildly popular among the Rachnid Guilds, and has become a staple."
list_reagents = list(/datum/reagent/consumable/tea = 30)
/obj/item/reagent_containers/food/drinks/mug/coco
- name = "Pearl Hot Chocolate"
- desc = "A rich delicacy from the humid regions of Terra."
+ name = "Solar's Best Hot Cocoa"
+ desc = "A cup of hot water mixed with chocolate and malted milk powder. A classic hot drink from the Solarian Confederation."
list_reagents = list(/datum/reagent/consumable/hot_coco = 15, /datum/reagent/consumable/sugar = 5)
foodtype = SUGAR
resistance_flags = FREEZE_PROOF
@@ -286,7 +286,7 @@
/obj/item/reagent_containers/food/drinks/dry_ramen
name = "cup ramen"
- desc = "Just add 5ml of water, self heats! A taste that reminds you of your school years. Now new with salty flavour!"
+ desc = "A cup full of dried noodles, premixed with a flavor powder. Adding 5 units of water will cause the cup to self-heat, cooking it rapidly. Commonly eaten under dozens of brands, from students to eating on a budget. Always umami!"
icon_state = "ramen"
list_reagents = list(/datum/reagent/consumable/dry_ramen = 15, /datum/reagent/consumable/sodiumchloride = 3)
foodtype = GRAIN
@@ -294,12 +294,12 @@
custom_price = 95
/obj/item/reagent_containers/food/drinks/waterbottle
- name = "bottle of water"
- desc = "A bottle of water filled at an old Earth bottling facility."
+ name = "Ryuunosuke Reserve" //we still have to find a way to make multiple variants as per the plan
+ desc = "Water bottled from a plant somewhere on Ryuunosuke. It has a mild, mineral-y flavor."
icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
- list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard
+ list_reagents = list(/datum/reagent/water = 50)
custom_materials = list(/datum/material/plastic=1000)
volume = 50
amount_per_transfer_from_this = 10
@@ -369,8 +369,8 @@
update_appearance()
/obj/item/reagent_containers/food/drinks/beer
- name = "space beer"
- desc = "Beer. In space."
+ name = "Bizircan Brewery GDM" //ditto the plan for bottled water, need to find a way to make multiple variants
+ desc = "A popular Gezenan drink made of fermented honey and spices, known as Gezenan Dark Mead, or GDM for short."
icon_state = "beer"
list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30)
foodtype = GRAIN | ALCOHOL
@@ -382,8 +382,8 @@
list_reagents = list(/datum/reagent/consumable/ethanol/beer/light = 30)
/obj/item/reagent_containers/food/drinks/ale
- name = "Magm-Ale"
- desc = "A true dorf's drink of choice."
+ name = "RHIMBASA TAP"
+ desc = "An ale that is brewed on Reh'himl, named after the planet that shields it from their sun. Telh'aim Pale Ales are shortened to TAP, with most breweries reducing their names to acronyms alongside it."
icon_state = "alebottle"
item_state = "beer"
list_reagents = list(/datum/reagent/consumable/ethanol/ale = 30)
@@ -454,17 +454,17 @@
if(/datum/reagent/consumable/pineapplejuice)
icon_state = "pineapplebox"
name = "pineapple juice box"
- desc = "Why would you even want this?"
+ desc = "Sweet, tart pineapple juice."
foodtype = FRUIT | PINEAPPLE
if(/datum/reagent/consumable/milk/chocolate_milk)
icon_state = "chocolatebox"
name = "carton of chocolate milk"
- desc = "Milk for cool kids!"
+ desc = "Milk mixed with chocolate, a common childhood favorite!"
foodtype = SUGAR
if(/datum/reagent/consumable/ethanol/eggnog)
icon_state = "nog2"
name = "carton of eggnog"
- desc = "For enjoying the most wonderful time of the year."
+ desc = "A carton of eggnog, a drink of choice for celebrating Winter Solstice."
foodtype = MEAT
else
icon_state = "juicebox"
@@ -511,7 +511,7 @@
/obj/item/reagent_containers/food/drinks/flask
name = "flask"
- desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go."
+ desc = "Every good spacer knows it's a good idea to bring along a couple of pints of whiskey wherever they go."
custom_price = 200
icon_state = "flask"
custom_materials = list(/datum/material/iron=250)
@@ -530,10 +530,10 @@
icon_state = "detflask"
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 30)
-/obj/item/reagent_containers/food/drinks/britcup
+/obj/item/reagent_containers/food/drinks/mug
name = "cup"
- desc = "A cup with the british flag emblazoned on it."
- icon_state = "britcup"
+ desc = "A mug. Stylishly plain."
+ icon_state = "tea_empty"
volume = 30
spillable = TRUE
@@ -643,39 +643,35 @@
. = ..()
/obj/item/reagent_containers/food/drinks/soda_cans/cola
- name = "Space Cola"
- desc = "Cola. in space."
+ name = "Master Cola"
+ desc = "Originally a commission to the Rachnid culinary guilds from Solarian historical reenactors on creating an authentic cola that, at some point, dominated the globe in popularity, this soft drink comes as close to anyone might be able to taste the sodas of yore... But it's still a pretty alright drink."
icon_state = "cola"
list_reagents = list(/datum/reagent/consumable/space_cola = 30)
foodtype = SUGAR
/obj/item/reagent_containers/food/drinks/soda_cans/tonic
- name = "T-Borg's tonic water"
- desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
+ name = "Sixikirtchia's Tonic"
+ desc = "A can of water mixed with quinine, which the label purportedly states that it has more health benefits for the Vox than fending off malaria. Most people use it for mixing drinks, Vox or otherwise."
icon_state = "tonic"
list_reagents = list(/datum/reagent/consumable/tonic = 50)
foodtype = ALCOHOL
/obj/item/reagent_containers/food/drinks/soda_cans/sodawater
- name = "soda water"
- desc = "A can of soda water. Why not make a scotch and soda?"
+ name = "Stitiamix Club"
+ desc = "Mineral-flavored carbonated water, infused on some part of The Shoal. Touts being made out of minerals from embedded asteroids, apparently!"
icon_state = "sodawater"
list_reagents = list(/datum/reagent/consumable/sodawater = 50)
-/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime
- name = "orange soda"
- desc = "You wanted ORANGE. It gave you Lemon Lime."
- icon_state = "lemon-lime"
- list_reagents = list(/datum/reagent/consumable/lemon_lime = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/orange_soda
+ name = "Sol Sparkler: Orange Remembrance"
+ desc = "A line of flavored seltzer water from the Solarian Confederation. Its infamy stems from being flavored sparingly enough to warrant it being referred to as being vague memories of the fruit in question."
+ icon_state = "orange_soda"
+ list_reagents = list(/datum/reagent/consumable/orangejuice = 5, /datum/reagent/consumable/sodawater = 25)
foodtype = FRUIT
-/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize()
- . = ..()
- name = "lemon-lime soda"
-
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry
name = "Sol Dry"
- desc = "Maybe this will help your tummy feel better. Maybe not."
+ desc = "A can of ginger ale, known for helping those with upset stomachs. Popularized due to a widespread belief from Solarians that drinking it will alleviate the nausea from bluespace travel."
icon_state = "sol_dry"
list_reagents = list(/datum/reagent/consumable/sol_dry = 30)
foodtype = SUGAR
@@ -687,86 +683,79 @@
list_reagents = list(/datum/reagent/consumable/space_up = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/starkist
- name = "Star-kist"
- desc = "The taste of a star in liquid form. And, a bit of tuna...?"
- icon_state = "starkist"
- list_reagents = list(/datum/reagent/consumable/space_cola = 15, /datum/reagent/consumable/orangejuice = 15)
+/obj/item/reagent_containers/food/drinks/soda_cans/lunapunch
+ name = "Lunapunch"
+ desc = "A soda with a distinctly herbal sweetness and a bitter aftertaste, popular across the C.L.I.P. colonies. Originally marketed as a health soft-drink for members of the CMM, the herbs used in its recipe claim to have health benefits... to dubious results."
+ icon_state = "lunapunch"
+ list_reagents = list(/datum/reagent/consumable/lunapunch = 30)
foodtype = SUGAR | FRUIT | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind
- name = "Space Mountain Wind"
- desc = "Blows right through you like a space wind."
- icon_state = "space_mountain_wind"
- list_reagents = list(/datum/reagent/consumable/spacemountainwind = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/comet_trail
+ name = "Comet Trail"
+ desc = "A citrusy drink from the Kepori space installation known as The Ring. Known for its sharp flavor and refreshing carbonation -- best served cold."
+ icon_state = "comet_trail"
+ list_reagents = list(/datum/reagent/consumable/comet_trail = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko
- name = "Thirteen Loko"
- desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly."
+/obj/item/reagent_containers/food/drinks/soda_cans/vimukti
+ name = "Vimukti"
+ desc = "A liquor brewed from sweet lichen scraped off the walls of Shoal water condensers. Stamped with the thirteen-spoked wheel of enlightenment. Spiritual Vox consider it to open the mind's boundaries."
icon_state = "thirteen_loko"
- list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 30)
+ list_reagents = list(/datum/reagent/consumable/ethanol/vimukti = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb
- name = "Dr. Gibb"
- desc = "A delicious mixture of 42 different flavors."
- icon_state = "dr_gibb"
- list_reagents = list(/datum/reagent/consumable/dr_gibb = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/tadrixx
+ name = "Tadrixx"
+ desc = "A Kalixcian drink made from a plant that tastes similar to sassafrass, which is used in root beer. A stumpy drake holding a mug of it is on the front."
+ icon_state = "tadrixx"
+ list_reagents = list(/datum/reagent/consumable/tadrixx = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game
- name = "Pwr Game"
- desc = "The only drink with the PWR that true gamers crave. When a gamer talks about gamerfuel, this is what they're literally referring to."
+/obj/item/reagent_containers/food/drinks/soda_cans/pacfuel
+ name = "PAC-Fuel"
+ desc = "A carbonated energy drink themed after the purple coloration, similar to plasma. It seems to have gotten a sponsorship with the the G.E.C., with a special offer for some sort of deal on... gaming gear and industrial equipment?"
icon_state = "purple_can"
- list_reagents = list(/datum/reagent/consumable/pwr_game = 30)
+ list_reagents = list(/datum/reagent/consumable/pacfuel = 30)
-/obj/item/reagent_containers/food/drinks/soda_cans/shamblers
- name = "Shambler's juice"
- desc = "~Shake me up some of that Shambler's Juice!~"
- icon_state = "shamblers"
- list_reagents = list(/datum/reagent/consumable/shamblers = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch
+ name = "Shoal Punch"
+ desc = "Carbonated fruit soda, made from a mix of dozens of fruits collected and grown on The Shoal. There's an extensive list of potential allergens on the back."
+ icon_state = "shoal_punch"
+ list_reagents = list(/datum/reagent/consumable/shoal_punch = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
- name = "Grey Bull"
- desc = "Grey Bull, it gives you gloves!"
+/obj/item/reagent_containers/food/drinks/soda_cans/crosstalk
+ name = "Crosstalk"
+ desc = "Crosstalk! Share the energy with everyone! The can is a little thin to be passing it around to actually share the energy drink around, though."
icon_state = "energy_drink"
- list_reagents = list(/datum/reagent/consumable/grey_bull = 20)
+ list_reagents = list(/datum/reagent/consumable/crosstalk = 20)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy
- name = "Monkey Energy"
- desc = "Unleash the ape!"
- icon_state = "monkey_energy"
- item_state = "monkey_energy"
- list_reagents = list(/datum/reagent/consumable/monkey_energy = 40, /datum/reagent/consumable/electrolytes = 10)
+/obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy
+ name = "Xeno-Energy"
+ desc = "A sickly green energy drink that poses itself as made from the real blood of xenomorphs. Deeply controversial among the BARD ranks."
+ icon_state = "xeno_energy"
+ item_state = "xeno_energy"
+ list_reagents = list(/datum/reagent/consumable/xeno_energy = 40, /datum/reagent/consumable/electrolytes = 10)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/efuel
- name = "E-Fuel"
- desc = "Shocking for the Elzu!"
- icon_state = "monkey_energy"
- item_state = "monkey_energy"
- list_reagents = list(/datum/reagent/consumable/electrolytes = 50)
-
/obj/item/reagent_containers/food/drinks/soda_cans/air
- name = "canned air"
- desc = "There is no air shortage. Do not drink."
+ name = "Tradewind Canned"
+ desc = "Intended to be filled with air from home planets for the sake of nostalgia after it's initial failure as an emergency method of 'canning air'. Tradewind Canned - a breath from home."
icon_state = "air"
list_reagents = list(/datum/reagent/nitrogen = 24, /datum/reagent/oxygen = 6)
/obj/item/reagent_containers/food/drinks/soda_cans/molten
name = "Molten Bubbles"
- desc = "A spicy cola to cool the nerves and burn the soul."
+ desc = "A spicy soft drink made from a coca-like plant from Kalixcis. Popularly served both cold -and- hot, depending on the weather."
icon_state = "molten"
- list_reagents = list(/datum/reagent/medicine/molten_bubbles = 50)
+ list_reagents = list(/datum/reagent/consumable/molten = 50)
/obj/item/reagent_containers/food/drinks/soda_cans/plasma
name = "Plasma Fizz"
- desc = "A dangerous fusion of flavors!"
+ desc = "A spinoff of the popular Molten Bubbles drink from Kalixcis, made to emulate the flavor of spiced grape instead. It's... not exactly convincing or a very good mix."
icon_state = "plasma"
- list_reagents = list(/datum/reagent/medicine/molten_bubbles/plasma = 50)
+ list_reagents = list(/datum/reagent/consumable/molten/plasma_fizz = 50)
/obj/item/reagent_containers/food/drinks/ration
name = "empty ration pouch"
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index c19fd9dd3baa..57d84ee22397 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -124,20 +124,20 @@
AddComponent(/datum/component/butchering, 200, 55)
/obj/item/reagent_containers/food/drinks/bottle/gin
- name = "Griffeater gin"
- desc = "A bottle of high quality gin, produced in the New London Space Station."
+ name = "Neue Wacholder Gin"
+ desc = "A bottle of high quality gin, cultivated from juniper berries grown across the Solar cantons. Brewed in Stuteföhle."
icon_state = "ginbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/gin = 100)
/obj/item/reagent_containers/food/drinks/bottle/whiskey
- name = "Uncle Git's special reserve"
- desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
+ name = "Kadi-Witka Reserve"
+ desc = "An equivalent to single-malt whiskey, commonly enjoyed and brewed in a brewery originally founded Zohil. While different from traditionally used wheat, it can be safely enjoyed by every species."
icon_state = "whiskeybottle"
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 100)
/obj/item/reagent_containers/food/drinks/bottle/kong
name = "Kong"
- desc = "Makes You Go Ape!®"
+ desc = "Makes You Go Ape!"
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey/kong = 100)
/obj/item/reagent_containers/food/drinks/bottle/candycornliquor
@@ -146,8 +146,8 @@
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey/candycorn = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka
- name = "Tunguska triple distilled"
- desc = "Vodka, prime choice of drink and fuel."
+ name = "Triple Horned"
+ desc = "Potato-based liquor commonly known as Vodka, distilled thrice to the standards of the PGF's requirements for their rations."
icon_state = "vodkabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100)
@@ -158,8 +158,8 @@
list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100)
/obj/item/reagent_containers/food/drinks/bottle/tequila
- name = "Caccavo guaranteed quality tequila"
- desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
+ name = "Rimeki Letisa"
+ desc = "Originally made from fermented succulents growing near Teceti's equator-deserts, this brand considers itself equivalent to the original tequila."
icon_state = "tequilabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/tequila = 100)
@@ -173,19 +173,19 @@
/obj/item/reagent_containers/food/drinks/bottle/patron
name = "Wrapp Artiste Patron"
- desc = "Silver laced tequila, served in space night clubs across the galaxy."
+ desc = "Tequila laced with silver, showy enough to impress when ordered in nightclubs across the galaxy."
icon_state = "patronbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/patron = 100)
/obj/item/reagent_containers/food/drinks/bottle/rum
- name = "Captain Pete's Cuban spiced rum"
- desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
+ name = "Ahkskra Spiced"
+ desc = "Ahkskra Spiced - a spiced rum for the vox folkhero in everyone. Features a gallant-looking vox on the front of the bottle."
icon_state = "rumbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/rum = 100)
/obj/item/reagent_containers/food/drinks/bottle/holywater
name = "flask of holy water"
- desc = "A flask of the chaplain's holy water."
+ desc = "A flask of water, sanctified in some way by the supertitious."
icon_state = "holyflask"
list_reagents = list(/datum/reagent/water/holywater = 100)
foodtype = NONE
@@ -195,144 +195,108 @@
list_reagents = list(/datum/reagent/hellwater = 100)
/obj/item/reagent_containers/food/drinks/bottle/vermouth
- name = "Goldeneye vermouth"
- desc = "Sweet, sweet dryness~"
+ name = "Whitespear Dry"
+ desc = "Dry and sweet vermouth, commonly used for mixed drinks. Some Solarians drink it as a digestive before meals."
icon_state = "vermouthbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/vermouth = 100)
/obj/item/reagent_containers/food/drinks/bottle/kahlua
- name = "Robert Robust's coffee liqueur"
- desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
+ name = "Keh'Lu'Tex Liqueur"
+ desc = "An adapted recipe of a caffeine-mixed liqueur originating from Reh'himl, which replaces it's original ingredient with coffee from Terra."
icon_state = "kahluabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 100)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
- name = "College Girl goldschlager"
- desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
+ name = "Student-Union's Gold Standard"
+ desc = "Extremely high-proof cinnamon schnapps, typically found in commemorative bottles by those in the Student-Union Association of Naturalistic Sciences. Nigh-undrinkable and with a tasteless amount of gold flakes floating within."
icon_state = "goldschlagerbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/goldschlager = 100)
/obj/item/reagent_containers/food/drinks/bottle/cognac
- name = "Chateau de Baton premium cognac"
- desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
+ name = "Geheimnis Cognac"
+ desc = "While the origins of the name 'cognac' are lost to time, this type of brandy is reserved as a high-class drink with particular methods of brewing."
icon_state = "cognacbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/cognac = 100)
/obj/item/reagent_containers/food/drinks/bottle/wine
- name = "Doublebeard's bearded special wine"
- desc = "A faint aura of unease and asspainery surrounds the bottle."
+ name = "Waldstätte Sauvignon"
+ desc = "A bottle of wine, brewed from grapes specifically grown in Neue Waldstätte. You've mostly seen these in bottles sold specifically for tourists."
icon_state = "winebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/wine = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/absinthe
- name = "extra-strong absinthe"
- desc = "An strong alcoholic drink brewed and distributed by"
+ name = "Severtail Green"
+ desc = "Strong absinthe brewed in the Pan-Gezenan Federation, with their own transplants of Wormwood gifted to them during the first contact with humankind. If the legend (and label) means anything, the first attempt at brewing this caused some poor sarathi's tail to fall off."
icon_state = "absinthebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 100)
-/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize()
- . = ..()
- redact()
-
-/obj/item/reagent_containers/food/drinks/bottle/absinthe/proc/redact()
- // There was a large fight in the coderbus about a player reference
- // in absinthe. Ergo, this is why the name generation is now so
- // complicated. Judge us kindly.
- var/shortname = pickweight(
- list("T&T" = 1, "A&A" = 1, "Generic" = 1))
- var/fullname
- switch(shortname)
- if("T&T")
- fullname = "Teal and Tealer"
- if("A&A")
- fullname = "Ash and Asher"
- if("Generic")
- fullname = "Nanotrasen Cheap Imitations"
- var/removals = list("\[REDACTED\]", "\[EXPLETIVE DELETED\]",
- "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]",
- "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]")
- var/chance = 50
-
- if(prob(chance))
- shortname = pick_n_take(removals)
-
- var/list/final_fullname = list()
- for(var/word in splittext(fullname, " "))
- if(prob(chance))
- word = pick_n_take(removals)
- final_fullname += word
-
- fullname = jointext(final_fullname, " ")
-
- // Actually finally setting the new name and desc
- name = "[shortname] [name]"
- desc = "[desc] [fullname] Inc."
-
-
/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium
- name = "Gwyn's premium absinthe"
- desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
+ name = "Chacheyi Gold"
+ desc = "A higher shelf absinthe, distributed primarily from The Shoal. Features the folkhero Chacheyi on the label, alongside their goldgrub companions."
icon_state = "absinthepremium"
-/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium/redact()
- return
-
/obj/item/reagent_containers/food/drinks/bottle/lizardwine
- name = "bottle of 'kalixcis' wine"
- desc = "An alcoholic beverage of sarathi origin, now so widespread that knock-offs can be found everywhere. Check the label for point of origin."
+ name = "bottle of Blueflame Pyrecask"
+ desc = "An alcoholic beverage originating from isolated vineyards on Zohil, maintained by the reclusive religious sects of the Blueflame. Now considered so popular and high quality, imitation bottles can be found everywhere. Check the label for point of origin."
icon_state = "lizardwine"
list_reagents = list(/datum/reagent/consumable/ethanol/lizardwine = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/hcider
- name = "Jian Hard Cider"
- desc = "Apple juice for adults."
+ name = "Neue Hamburg Spiced"
+ desc = "One of the main exports of Neue Hamburg - hard, spiced cider. Enjoyed all across the cantons and beyond."
icon_state = "hcider"
volume = 50
list_reagents = list(/datum/reagent/consumable/ethanol/hcider = 50)
/obj/item/reagent_containers/food/drinks/bottle/amaretto
- name = "Luini Amaretto"
- desc = "A gentle and syrup like drink, tastes of almonds and apricots"
+ name = "Lu'Ni'Xer'Nan Amaretto"
+ desc = "A popular Rachnid take on the recipe for Amaretto, which fell to obscurity after only being semi-rediscovered by Solarian historians. Features a semi-reconstructed depiction of a supposed origin story, with the painter Lu'Ni'Xer'Nan and her muse, an innkeeper."
icon_state = "disaronno"
list_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 100)
/obj/item/reagent_containers/food/drinks/bottle/grappa
- name = "Phillipes well-aged Grappa"
- desc = "Bottle of Grappa."
+ name = "Neue Maynila Grappamiel"
+ desc = "A bottle of Grappa, premixed with honey-based spirits. Commonly seen as a drink for recycling grapes after their use in winemaking, and commonly seen as a winter drink."
icon_state = "grappabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/grappa = 100)
/obj/item/reagent_containers/food/drinks/bottle/sake
- name = "Ryo's traditional sake"
- desc = "Sweet as can be, and burns like fire going down."
+ name = "Sakamai Sake"
+ desc = "An alcoholic drink derived from rice, rediscovered by Solarian historians and reintroduced to the best of their ability to reproduce it."
icon_state = "sakebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/sake = 100)
/obj/item/reagent_containers/food/drinks/bottle/sake/Initialize()
. = ..()
if(prob(10))
- name = "Fluffy Tail Sake"
- desc += " On the bottle is a picture of a kitsune with nine touchable tails."
+ name = "Fluffy Tail"
+ desc += "This particular brand's mascot is a human with nine fox tails - which is an impressive amount of genemodding."
icon_state = "sakebottle_k"
else if(prob(10))
name = "Inubashiri's Home Brew"
- desc += " Awoo."
+ desc += "This particular brand's mascot is a human with vaguely canine ears and a tail."
icon_state = "sakebottle_i"
/obj/item/reagent_containers/food/drinks/bottle/fernet
name = "Fernet Bronca"
- desc = "A bottle of pure Fernet Bronca, produced in Cordoba Space Station"
+ desc = "A bitter and aromatic drink, commonly enjoyed in the intersolar cantons due to relaxed alcoholic tariffs from being technically classified as a medicinal beverage. Commonly mixed with cola-based soft drinks."
icon_state = "fernetbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/fernet = 100)
+/obj/item/reagent_containers/food/drinks/bottle/triplesec
+ name = "Teeka-Gih's triple sec liqueur"
+ desc = "A bottle of triple sec originating from Bezuts."
+ icon_state = "triplesecbottle"
+ list_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 100)
+
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
name = "orange juice"
- desc = "Full of vitamins and deliciousness!"
+ desc = "Sweet and tart orange juice. Usually found fortified to make it more nutritious. Full of vitamin C!"
custom_price = 100
icon_state = "orangejuice"
item_state = "carton"
@@ -342,9 +306,21 @@
list_reagents = list(/datum/reagent/consumable/orangejuice = 100)
foodtype = FRUIT | BREAKFAST
+/obj/item/reagent_containers/food/drinks/bottle/lemonjuice
+ name = "lemon juice"
+ desc = "Lemonade for everyone!"
+ custom_price = 100
+ icon_state = "lemonjuice"
+ item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ isGlass = FALSE
+ list_reagents = list(/datum/reagent/consumable/lemonjuice = 100)
+ foodtype = FRUIT
+
/obj/item/reagent_containers/food/drinks/bottle/cream
name = "milk cream"
- desc = "It's cream. Made from milk. What else did you think you'd find in there?"
+ desc = "Cream made from milk. It's thicker than milk, which hopefully prevents any mixups."
custom_price = 100
icon_state = "cream"
item_state = "carton"
@@ -356,7 +332,7 @@
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
name = "tomato juice"
- desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
+ desc = "Juice from tomatoes and salt. You'll often find some technicians soaking in this if they've been working with plasma."
custom_price = 100
icon_state = "tomatojuice"
item_state = "carton"
@@ -368,7 +344,7 @@
/obj/item/reagent_containers/food/drinks/bottle/limejuice
name = "lime juice"
- desc = "Sweet-sour goodness."
+ desc = "Lime juice. You might want to mix something with this instead of drinking it straight..."
custom_price = 100
icon_state = "limejuice"
item_state = "carton"
@@ -380,7 +356,7 @@
/obj/item/reagent_containers/food/drinks/bottle/pineapplejuice
name = "pineapple juice"
- desc = "Extremely tart, yellow juice."
+ desc = "Tart, sweet juice from the tropical pineapple."
custom_price = 100
icon_state = "pineapplejuice"
item_state = "carton"
@@ -403,8 +379,8 @@
list_reagents = list(/datum/reagent/consumable/menthol = 100)
/obj/item/reagent_containers/food/drinks/bottle/grenadine
- name = "Jester Grenadine"
- desc = "Contains 0% real cherries!"
+ name = "Three-Star Grenadine"
+ desc = "A commonly seen bottle of grenadine - or sweet fruit syrup. It might even contain real cherries, as well as some blackcurrant for color."
custom_price = 100
icon_state = "grenadine"
isGlass = TRUE
@@ -413,8 +389,8 @@
/obj/item/reagent_containers/food/drinks/bottle/applejack
- name = "Buckin' Bronco's Applejack"
- desc = "Kicks like a horse, tastes like an apple!"
+ name = "Mars Lightning"
+ desc = "A strong brandy originating from apples, considered the older sibling to hard cider. Mars Lightning is often partnered with anti-gravity racing companies, leading to it often being served straight or for impromptu mixes."
custom_price = 100
icon_state = "applejack_bottle"
isGlass = TRUE
@@ -422,22 +398,22 @@
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/bottle/champagne
- name = "Eau d' Dandy Brut Champagne"
- desc = "Finely sourced from only the most pretentious French vineyards."
+ name = "Treu Champagne"
+ desc = "Finely sourced from entire canton planets dedicated to faithful reproduction of pre-Night Of Fire vineyards. Typically enjoyed for celebrations and the turn of new years."
custom_premium_price = 250
icon_state = "champagne_bottle"
isGlass = TRUE
list_reagents = list(/datum/reagent/consumable/ethanol/champagne = 100)
/obj/item/reagent_containers/food/drinks/bottle/blazaam
- name = "Ginbad's Blazaam"
- desc = "You feel like you should give the bottle a good rub before opening."
+ name = "Hyperspace Highball"
+ desc = "Infamously expensive, infamously contains bluespace 'flakes' for bragging rights, and infamously removed from most shelves due to accidents involving teleportation accidents upon ingestion."
icon_state = "blazaambottle"
list_reagents = list(/datum/reagent/consumable/ethanol/blazaam = 100)
/obj/item/reagent_containers/food/drinks/bottle/trappist
- name = "Mont de Requin Trappistes Bleu"
- desc = "Brewed in space-Belgium. Fancy!"
+ name = "Roumain Trapper's"
+ desc = "Traditionally (and heavily monitored for authenticity) made beer brewed on Illestren. Trapper's beer must be brewed by Saint Roumain Hunters or Shadows, made to fit the needs of their community first, and must never be made for profit... which makes it a common sight in the Frontier."
custom_premium_price = 170
icon_state = "trappistbottle"
volume = 50
@@ -445,27 +421,41 @@
/obj/item/reagent_containers/food/drinks/bottle/hooch
name = "hooch bottle"
- desc = "A bottle of rotgut. Its owner has applied some street wisdom to cleverly disguise it as a brown paper bag."
+ desc = "A bottle of homebrewed, low quality alcohol. The paper wrapping is covered in little signatures and messages - how many hands have passed this bottle before you came around?"
icon_state = "hoochbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/hooch = 100)
/obj/item/reagent_containers/food/drinks/bottle/moonshine
name = "moonshine jug"
- desc = "It is said that the ancient Applalacians used these stoneware jugs to capture lightning in a bottle."
+ desc = "High-proof hard liquor, most likely made in the privacy of a bootlegger's ship. Permanent marker on packaging tape is the most you'll get for a label. Remember: if it doesn't burn blue, don't drink it!"
icon_state = "moonshinebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 100)
/obj/item/reagent_containers/food/drinks/bottle/coconut
- name = "Tali's Pure Coconut Delight"
- desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
+ name = "T4l1's Pure Coconut Delight"
+ desc = "A fanmade, promotional bottle of coconut cream liquor. There's a stylized picture of a synthetic kepori on the side, along with a blurb about whoever she is. You're pretty certain this stuff is synthetic, despite Teceti growing actual coconut trees..." //if i have to recognize rilena here, I'm going to have fun with it
icon_state = "coconutbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 100)
isGlass = TRUE
+/obj/item/reagent_containers/food/drinks/bottle/cacao
+ name = "Sharai's Pure Cacao Delight"
+ desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
+ icon_state = "cacaobottle"
+ list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_cacao = 100)
+ isGlass = TRUE
+
+/obj/item/reagent_containers/food/drinks/bottle/menthe
+ name = "Mora's Pure Mint Delight"
+ desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
+ icon_state = "mintbottle"
+ list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_menthe = 100)
+ isGlass = TRUE
+
////////////////////////// MOLOTOV ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/molotov
name = "molotov cocktail"
- desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss."
+ desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by desperate militias and revolutionaries. Light and toss."
icon_state = "vodkabottle"
list_reagents = list()
var/active = 0
@@ -525,7 +515,7 @@
/obj/item/reagent_containers/food/drinks/bottle/pruno
name = "pruno mix"
- desc = "A trash bag filled with fruit, sugar, yeast, and water, pulped together into a pungent slurry to be fermented in an enclosed space, traditionally the toilet. Security would love to confiscate this, one of the many things wrong with them."
+ desc = "A trash bag filled with fruit, sugar, yeast, and water, pulped together into a pungent slurry to be fermented in an enclosed space, traditionally the toilet."
icon = 'icons/obj/janitor.dmi'
icon_state = "trashbag"
list_reagents = list(/datum/reagent/consumable/prunomix = 50)
@@ -569,7 +559,7 @@
else
reagents.add_reagent(/datum/reagent/consumable/ethanol/pruno, 50)
name = "bag of pruno"
- desc = "Fermented prison wine made from fruit, sugar, and despair. You probably shouldn't drink this around Security."
+ desc = "Fermented prison wine made from fruit, sugar, and despair."
icon_state = "trashbag1" // pruno releases air as it ferments, we don't want to simulate this in atmos, but we can make it look like it did
for (var/mob/living/M in view(2, get_turf(src))) // letting people and/or narcs know when the pruno is done
to_chat(M, "A pungent smell emanates from [src], like fruit puking out its guts.")
@@ -577,7 +567,7 @@
/obj/item/reagent_containers/food/drinks/colocup/lean
name = "lean"
- desc = "A cup of that purple drank, the stuff that makes you go WHEEZY BABY."
+ desc = "Despite this mix of codeine-based cough syrup and a soft drink of choice being popular online, you're not sure anyone talking about ever tried it. First time for everything?"
icon_state = "lean"
list_reagents = list(/datum/reagent/consumable/lean = 50)
random_sprite = FALSE
@@ -587,7 +577,7 @@
desc = "Sealed for a guaranteed fresh taste in every bottle."
icon_state = "sandbottle"
volume = 50
- list_reagents = list(/datum/reagent/medicine/molten_bubbles/sand = 50)
+ list_reagents = list(/datum/reagent/consumable/molten/sand = 50)
reagent_flags = null //Cap's on
/obj/item/reagent_containers/food/drinks/bottle/sarsaparilla/attack_self(mob/user)
@@ -662,7 +652,7 @@
. = ..()
if(sealed)
var/datum/component/storage/S = GetComponent(/datum/component/storage)
- user.visible_message("[user] prys open \the [src].", "You pry open \the [src]")
+ user.visible_message("[user] pries open \the [src].", "You pry open \the [src]")
playsound(src, 'sound/machines/wooden_closet_close.ogg', 20, 1)
sealed = FALSE
S.locked = FALSE
@@ -672,7 +662,7 @@
/obj/item/storage/bottles/sandblast
name = "sarsaparilla bottle crate"
- desc = "Holds six bottles of the finest sarsaparilla this side of the sector."
+ desc = "Holds six bottles of the finest sarsaparilla this side of the Frontier."
sealed = TRUE
/obj/item/storage/bottles/sandblast/PopulateContents()
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 1d7adb7db4f2..2f73f7678e38 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -100,10 +100,6 @@
name = "Space Cola"
list_reagents = list(/datum/reagent/consumable/space_cola = 50)
-/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola
- name = "Nuka Cola"
- list_reagents = list(/datum/reagent/consumable/nuka_cola = 50)
-
/obj/item/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs
var/obj/item/reagent_containers/food/snacks/egg/E = I
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index f6f41b704e81..6a2c721ca433 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -79,7 +79,7 @@
else
M.visible_message("[user] attempts to feed [M] from [src].", \
"[user] attempts to feed you from [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return // The condiment might be empty after the delay.
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index c4daa88869a7..fc3df2f74713 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -24,7 +24,7 @@
/obj/item/reagent_containers/food/snacks/customizable/examine(mob/user)
. = ..()
var/ingredients_listed = ""
- for(var/obj/item/reagent_containers/food/snacks/ING in ingredients)
+ for(var/obj/item/ING in ingredients)
ingredients_listed += "[ING.name], "
var/size = "standard"
if(ingredients.len<2)
@@ -36,8 +36,11 @@
. += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]."
/obj/item/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params)
- if(!istype(I, /obj/item/reagent_containers/food/snacks/customizable) && istype(I, /obj/item/reagent_containers/food/snacks))
- var/obj/item/reagent_containers/food/snacks/S = I
+ if(istype(I, /obj/item/reagent_containers/food/snacks/customizable))
+ return
+ var/datum/component/edible/E = I.GetComponent(/datum/component/edible)
+ var/obj/item/reagent_containers/food/snacks/S = I
+ if(istype(S) || E)
if(I.w_class > WEIGHT_CLASS_SMALL)
to_chat(user, "The ingredient is too big for [src]!")
else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume))
@@ -47,20 +50,25 @@
else
if(!user.transferItemToLoc(I, src))
return
- if(S.trash)
- S.generate_trash(get_turf(user))
- ingredients += S
- mix_filling_color(S)
- S.reagents.trans_to(src,min(S.reagents.total_volume, 15), transfered_by = user) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
- foodtype |= S.foodtype
- update_customizable_overlays(S)
+ ingredients += I
+ I.reagents.trans_to(src,min(S.reagents.total_volume, 15), transfered_by = user) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
+ if(istype(S))
+ if(S.trash)
+ S.generate_trash(get_turf(user))
+ mix_filling_color(S.filling_color)
+ foodtype |= S.foodtype
+ update_customizable_overlays(S.filling_color)
+ else
+ mix_filling_color(E.filling_color)
+ foodtype |= E.foodtypes
+ update_customizable_overlays(E.filling_color)
to_chat(user, "You add the [I.name] to the [name].")
- update_food_name(S)
+ update_food_name(I)
else
. = ..()
-/obj/item/reagent_containers/food/snacks/customizable/proc/update_food_name(obj/item/reagent_containers/food/snacks/S)
+/obj/item/reagent_containers/food/snacks/customizable/proc/update_food_name(obj/item/S)
for(var/obj/item/I in ingredients)
if(!istype(S, I.type))
customname = "custom"
@@ -88,25 +96,25 @@
attackby(I, user)
qdel(BASE)
-/obj/item/reagent_containers/food/snacks/customizable/proc/mix_filling_color(obj/item/reagent_containers/food/snacks/S)
+/obj/item/reagent_containers/food/snacks/customizable/proc/mix_filling_color(newcolor)
if(ingredients.len == 1)
- filling_color = S.filling_color
+ filling_color = newcolor
else
var/list/rgbcolor = list(0,0,0,0)
var/customcolor = GetColors(filling_color)
- var/ingcolor = GetColors(S.filling_color)
+ var/ingcolor = GetColors(newcolor)
rgbcolor[1] = (customcolor[1]+ingcolor[1])/2
rgbcolor[2] = (customcolor[2]+ingcolor[2])/2
rgbcolor[3] = (customcolor[3]+ingcolor[3])/2
rgbcolor[4] = (customcolor[4]+ingcolor[4])/2
filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4])
-/obj/item/reagent_containers/food/snacks/customizable/update_customizable_overlays(obj/item/reagent_containers/food/snacks/S)
+/obj/item/reagent_containers/food/snacks/customizable/update_customizable_overlays(filling_color = "#FFFFFF")
var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling")
- if(S.filling_color == "#FFFFFF")
+ if(filling_color == "#FFFFFF")
filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00")
else
- filling.color = S.filling_color
+ filling.color = filling_color
switch(ingredients_placement)
if(INGREDIENTS_SCATTER)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 2dd04174ba85..61121a3ca950 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -126,7 +126,7 @@ All foods are distributed among various categories. Use common sense.
"[user] cannot force any more of [src] down your throat!")
return FALSE
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
log_combat(user, M, "fed", reagents.log_list())
M.visible_message("[user] forces [M] to eat [src]!", \
@@ -167,26 +167,27 @@ All foods are distributed among various categories. Use common sense.
/obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/storage))
..() // -> item/attackby()
- return 0
- if(istype(W, /obj/item/reagent_containers/food/snacks))
+ return FALSE
+ var/datum/component/edible/E = W.GetComponent(/datum/component/edible)
+ if(istype(W, /obj/item/reagent_containers/food/snacks) || E)
var/obj/item/reagent_containers/food/snacks/S = W
if(custom_food_type && ispath(custom_food_type))
- if(S.w_class > WEIGHT_CLASS_SMALL)
- to_chat(user, "[S] is too big for [src]!")
- return 0
- if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(W, /obj/item/reagent_containers/food/snacks/cakeslice/custom))
- to_chat(user, "[src] can't be filled with [S]!")
- return 0
+ if(W.w_class > WEIGHT_CLASS_SMALL)
+ to_chat(user, span_warning("[S] is too big for [src]!"))
+ return FALSE
+ if(istype(S) && (!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(W, /obj/item/reagent_containers/food/snacks/cakeslice/custom)))
+ to_chat(user, span_warning("[src] can't be filled with [S]!"))
+ return FALSE
if(contents.len >= 20)
- to_chat(user, "You can't add more ingredients to [src]!")
- return 0
+ to_chat(user, span_warning("You can't add more ingredients to [src]!"))
+ return FALSE
var/obj/item/reagent_containers/food/snacks/customizable/C = new custom_food_type(get_turf(src))
- C.initialize_custom_food(src, S, user)
- return 0
+ C.initialize_custom_food(src, W, user)
+ return FALSE
var/sharp = W.get_sharpness()
if(sharp)
if(slice(sharp, W, user))
- return 1
+ return TRUE
else
..()
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index e4ccbd1c8f90..6cc7413cbfdd 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -279,7 +279,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/gondola
name = "gondola meat"
desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/tranquility = 5, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 3)
tastes = list("meat" = 4, "tranquility" = 1)
filling_color = "#9A6750"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/gondola
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index a048fb0e4371..d6f6151d47ac 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -195,7 +195,7 @@
force = 5
hitsound = 'sound/weapons/blade1.ogg'
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy
- list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/pwr_game = 10, /datum/reagent/consumable/liquidelectricity = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/pacfuel = 10, /datum/reagent/consumable/liquidelectricity = 10)
tastes = list("cake" = 3, "a Vlad's Salad" = 1)
/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/proc/energy_bite(mob/living/user)
@@ -220,7 +220,7 @@
force = 2
hitsound = 'sound/weapons/blade1.ogg'
filling_color = "#00FF00"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/pwr_game = 2, /datum/reagent/consumable/liquidelectricity = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/pacfuel = 2, /datum/reagent/consumable/liquidelectricity = 2)
tastes = list("cake" = 3, "a Vlad's Salad" = 1)
/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/proc/energy_bite(mob/living/user)
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index 930fabc31775..e35cb7eeb5fe 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -178,7 +178,7 @@
name = "Space Mountain Wind snowcone"
desc = "Space Mountain Wind drizzled over a snowball in a paper cup."
icon_state = "mountainwind_sc"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/spacemountainwind = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/comet_trail = 5)
tastes = list("ice" = 1, "water" = 1, "mountain wind" = 5)
@@ -186,7 +186,7 @@
name = "pwrgame snowcone"
desc = "Pwrgame soda drizzled over a snowball in a paper cup."
icon_state = "pwrgame_sc"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/pwr_game = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/pacfuel = 5)
tastes = list("ice" = 1, "water" = 1, "valid" = 5, "salt" = 5, "wats" = 5)
/obj/item/reagent_containers/food/snacks/snowcones/honey
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 318de66636e7..ee0dd7ab58de 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -538,7 +538,7 @@
name = "\improper Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." //Only a monster would craft this.
icon_state = "donkpocketgondola"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/tranquility = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/gondola
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
@@ -548,8 +548,8 @@
name = "warm Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least."
icon_state = "donkpocketgondola"
- bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
+ bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1)
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index 4c1a8695d838..f76bdb462539 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -61,10 +61,10 @@
grill_loop.start()
return
else
- if(I.reagents.has_reagent(/datum/reagent/consumable/monkey_energy))
- grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy)))
+ if(I.reagents.has_reagent(/datum/reagent/consumable/xeno_energy))
+ grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/xeno_energy)))
to_chat(user, "You pour the Monkey Energy in [src].")
- I.reagents.remove_reagent(/datum/reagent/consumable/monkey_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy))
+ I.reagents.remove_reagent(/datum/reagent/consumable/xeno_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/xeno_energy))
update_appearance()
return
..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 878bd2b1b722..5852ea34742b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -246,8 +246,8 @@
icon_state = "drying_rack"
use_power = IDLE_POWER_USE
circuit = null
- idle_power_usage = 5
- active_power_usage = 200
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
visible_contents = FALSE
var/drying = FALSE
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index acd768347327..2474d1d53501 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -25,10 +25,6 @@
results = list(/datum/reagent/consumable/hot_ice_coffee = 3)
required_reagents = list(/datum/reagent/toxin/hot_ice = 1, /datum/reagent/consumable/coffee = 2)
-/datum/chemical_reaction/nuka_cola
- results = list(/datum/reagent/consumable/nuka_cola = 6)
- required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6)
-
/datum/chemical_reaction/moonshine
results = list(/datum/reagent/consumable/ethanol/moonshine = 10)
required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5)
@@ -173,16 +169,12 @@
/datum/chemical_reaction/hiveminderaser
results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4)
- required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/vimukti = 1, /datum/reagent/consumable/grenadine = 1)
/datum/chemical_reaction/manhattan
results = list(/datum/reagent/consumable/ethanol/manhattan = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/ethanol/vermouth = 1)
-/datum/chemical_reaction/manhattan_proj
- results = list(/datum/reagent/consumable/ethanol/manhattan_proj = 10)
- required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 10, /datum/reagent/uranium = 1)
-
/datum/chemical_reaction/vodka_tonic
results = list(/datum/reagent/consumable/ethanol/vodkatonic = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/tonic = 1)
@@ -205,7 +197,7 @@
/datum/chemical_reaction/demonsblood
results = list(/datum/reagent/consumable/ethanol/demonsblood = 4)
- required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/dr_gibb = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/comet_trail = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/tadrixx = 1)
/datum/chemical_reaction/booger
results = list(/datum/reagent/consumable/ethanol/booger = 4)
@@ -340,8 +332,8 @@
results = list(/datum/reagent/consumable/ethanol/driestmartini = 2)
required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1)
-/datum/chemical_reaction/thirteenloko
- results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3)
+/datum/chemical_reaction/vimukti
+ results = list(/datum/reagent/consumable/ethanol/vimukti = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1)
/datum/chemical_reaction/chocolatepudding
@@ -368,9 +360,9 @@
results = list(/datum/reagent/consumable/pumpkin_latte = 15)
required_reagents = list(/datum/reagent/consumable/pumpkinjuice = 5, /datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/cream = 5)
-/datum/chemical_reaction/gibbfloats
- results = list(/datum/reagent/consumable/gibbfloats = 15)
- required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5)
+/datum/chemical_reaction/tadrixxfloat
+ results = list(/datum/reagent/consumable/tadrixxfloat = 15)
+ required_reagents = list(/datum/reagent/consumable/tadrixx = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5)
/datum/chemical_reaction/triple_citrus
results = list(/datum/reagent/consumable/triple_citrus = 5)
@@ -390,11 +382,6 @@
required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/sugar = 1)
mix_message = "The mixture darkens to a rich gold hue."
-/datum/chemical_reaction/fetching_fizz
- results = list(/datum/reagent/consumable/ethanol/fetching_fizz = 3)
- required_reagents = list(/datum/reagent/consumable/nuka_cola = 1, /datum/reagent/iron = 1) //Manufacturable from only the mining station
- mix_message = "The mixture slightly vibrates before settling."
-
/datum/chemical_reaction/hearty_punch
results = list(/datum/reagent/consumable/ethanol/hearty_punch = 1) //Very little, for balance reasons
required_reagents = list(/datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5, /datum/reagent/consumable/ethanol/absinthe = 5)
@@ -438,12 +425,6 @@
results = list(/datum/reagent/consumable/ethanol/eggnog = 15)
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 5, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/eggyolk = 5)
-/datum/chemical_reaction/narsour
- results = list(/datum/reagent/consumable/ethanol/narsour = 1)
- required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/demonsblood = 1)
- mix_message = "The mixture develops a sinister glow."
- mix_sound = 'sound/effects/singlebeat.ogg'
-
/datum/chemical_reaction/quadruplesec
results = list(/datum/reagent/consumable/ethanol/quadruple_sec = 15)
required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 5, /datum/reagent/consumable/triple_citrus = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5)
@@ -525,7 +506,6 @@
results = list(/datum/reagent/consumable/ethanol/fernet_cola = 2)
required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/space_cola = 1)
-
/datum/chemical_reaction/fanciulli
results = list(/datum/reagent/consumable/ethanol/fanciulli = 2)
required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 1, /datum/reagent/consumable/ethanol/fernet = 1)
@@ -536,8 +516,7 @@
/datum/chemical_reaction/blank_paper
results = list(/datum/reagent/consumable/ethanol/blank_paper = 3)
- required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1)
-
+ required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1)
/datum/chemical_reaction/wizz_fizz
results = list(/datum/reagent/consumable/ethanol/wizz_fizz = 3)
@@ -545,7 +524,6 @@
mix_message = "The beverage starts to froth with an almost mystical zeal!"
mix_sound = 'sound/effects/bubbles2.ogg'
-
/datum/chemical_reaction/bug_spray
results = list(/datum/reagent/consumable/ethanol/bug_spray = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/lemon_lime = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vodka = 1)
@@ -559,7 +537,7 @@
/datum/chemical_reaction/turbo
results = list(/datum/reagent/consumable/ethanol/turbo = 5)
- required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pacfuel = 1)
/datum/chemical_reaction/old_timer
results = list(/datum/reagent/consumable/ethanol/old_timer = 6)
@@ -567,7 +545,7 @@
/datum/chemical_reaction/rubberneck
results = list(/datum/reagent/consumable/ethanol/rubberneck = 10)
- required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/crosstalk = 5, /datum/reagent/consumable/astrotame = 1)
/datum/chemical_reaction/duplex
results = list(/datum/reagent/consumable/ethanol/duplex = 4)
@@ -629,22 +607,11 @@
required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/creme_de_cacao = 2, /datum/reagent/consumable/ethanol/irishcarbomb = 1)
mix_message = "The area around the glass seems to darken as the mixture forms!"
-/datum/chemical_reaction/archmagus_brew
- results = list(/datum/reagent/consumable/ethanol/archmagus_brew = 4)
- required_reagents = list(/datum/reagent/consumable/ethanol/wizz_fizz = 2, /datum/reagent/consumable/ethanol/crevice_spike = 1, /datum/reagent/consumable/ethanol/stinger = 1)
- mix_message = "The mixture bubbles intensely before settling in the glass."
-
/datum/chemical_reaction/out_of_lime
results = list(/datum/reagent/consumable/ethanol/out_of_lime = 4)
required_reagents = list(/datum/reagent/consumable/lemonade = 1, /datum/reagent/consumable/ethanol/beer/green = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/ethanol/out_of_touch = 1)
mix_message = "The glass cycles through different colors before settling on one."
-/datum/chemical_reaction/cogchamp
- results = list(/datum/reagent/consumable/ethanol/cogchamp = 3)
- required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol/screwdrivercocktail = 1)
- mix_message = "You hear faint sounds of gears turning as it mixes."
- mix_sound = 'sound/effects/clockcult_gateway_closing.ogg'
-
/datum/chemical_reaction/ash_wine
results = list(/datum/reagent/consumable/ethanol/trickwine/ash_wine = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 3, /datum/reagent/ash = 1, /datum/reagent/drug/mushroomhallucinogen = 1)
@@ -671,7 +638,7 @@
/datum/chemical_reaction/force_wine
results = list(/datum/reagent/consumable/ethanol/trickwine/force_wine = 5)
- required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/spacemountainwind = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/comet_trail = 1)
required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/magic/forcewall.ogg'
@@ -680,3 +647,18 @@
required_reagents = list(/datum/reagent/consumable/ethanol/gin = 3, /datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/tinlux = 1)
required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/weapons/laser.ogg'
+
+/datum/chemical_reaction/molten_bubbles
+ results = list(/datum/reagent/consumable/molten = 30)
+ required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/lavaland_extract = 1)
+
+/datum/chemical_reaction/plasma_bubbles
+ results = list(/datum/reagent/consumable/molten/plasma_fizz = 3)
+ required_reagents = list(/datum/reagent/consumable/molten = 3, /datum/reagent/toxin/plasma = 2)
+
+/datum/chemical_reaction/sand_bubbles
+ results = list(/datum/reagent/consumable/molten/sand = 3)
+ required_reagents = list(/datum/reagent/consumable/molten = 3, /datum/reagent/silicon = 2)
+
+/datum/chemical_reaction/sand_bubbles/plasma // Subbing plasma bubbles for reg
+ required_reagents = list(/datum/reagent/consumable/molten/plasma_fizz = 3, /datum/reagent/silicon = 2)
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
index 92647559d9cd..edca42fda076 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
@@ -27,7 +27,7 @@
name ="Space freezy"
reqs = list(
/datum/reagent/consumable/bluecherryjelly = 5,
- /datum/reagent/consumable/spacemountainwind = 15,
+ /datum/reagent/consumable/comet_trail = 15,
/obj/item/reagent_containers/food/snacks/icecream = 1
)
result = /obj/item/reagent_containers/food/snacks/spacefreezy
@@ -217,7 +217,7 @@
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/spacemountainwind = 5
+ /datum/reagent/consumable/comet_trail = 5
)
result = /obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
subcategory = CAT_ICE
@@ -227,7 +227,7 @@
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/pwr_game = 15
+ /datum/reagent/consumable/pacfuel = 15
)
result = /obj/item/reagent_containers/food/snacks/snowcones/pwrgame
subcategory = CAT_ICE
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index ec04dcaa4ec9..cc61c7048fdc 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -396,8 +396,7 @@
name = "Gondola-pocket"
reqs = list(
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/meatball = 1,
- /datum/reagent/tranquility = 5
+ /obj/item/reagent_containers/food/snacks/meatball = 1
)
result = /obj/item/reagent_containers/food/snacks/donkpocket/gondola
subcategory = CAT_PASTRY
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index a8b9d5f8d034..a93d706a99b9 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -39,7 +39,7 @@
/obj/item/seeds/kudzu/attack_self(mob/user)
user.visible_message("[user] begins throwing seeds on the ground...")
- if(do_after(user, 50, needhand = TRUE, target = user.drop_location(), progress = TRUE))
+ if(do_after(user, 50, target = user.drop_location(), progress = TRUE))
plant(user)
to_chat(user, "You plant the kudzu. You monster.")
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index cdd44cab9ae8..550e413f1a59 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -44,6 +44,9 @@
/obj/item/proc/InsertID()
return FALSE
+/obj/item/proc/GetBankCard()
+ return null
+
/obj/proc/text2access(access_text)
. = list()
if(!access_text)
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 20ad6e089730..f850eded96d4 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -122,7 +122,7 @@
if(!H)
return FALSE
if(!visualsOnly)
- var/datum/bank_account/bank_account = new(H.real_name, src)
+ var/datum/bank_account/bank_account = new(H.real_name, H.age)
bank_account.adjust_money(officer ? 250 : 100, "starting_money") //just a little bit of money for you
H.account_id = bank_account.account_id
@@ -179,7 +179,9 @@
var/jobtype = null
uniform = /obj/item/clothing/under/color/grey
+ wallet = /obj/item/storage/wallet
id = /obj/item/card/id
+ bank_card = /obj/item/card/bank
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/sneakers/black
box = /obj/item/storage/box/survival
@@ -268,7 +270,7 @@
if(!J)
J = GLOB.name_occupations[H.job]
- var/obj/item/card/id/C = H.wear_id
+ var/obj/item/card/id/C = H.get_idcard(TRUE)
if(istype(C))
C.access = J.get_access()
shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
@@ -285,14 +287,17 @@
if(id_assignment)
C.assignment = id_assignment
C.update_label()
- for(var/A in SSeconomy.bank_accounts)
- var/datum/bank_account/B = A
- if(B.account_id == H.account_id)
- C.registered_account = B
- B.bank_cards += C
- break
H.sec_hud_set_ID()
+ var/obj/item/card/bank/bank_card = H.get_bankcard()
+ if(istype(bank_card))
+ for(var/account in SSeconomy.bank_accounts)
+ var/datum/bank_account/bank_account = account
+ if(bank_account.account_id == H.account_id)
+ bank_card.registered_account = bank_account
+ bank_account.bank_cards += bank_card
+ break
+
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
if(istype(PDA))
PDA.owner = H.real_name
diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm
index 9c5d28e693e8..994f34404efc 100644
--- a/code/modules/jobs/job_types/bartender.dm
+++ b/code/modules/jobs/job_types/bartender.dm
@@ -27,7 +27,7 @@
/datum/outfit/job/bartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/card/id/W = H.wear_id
+ var/obj/item/card/id/W = H.get_idcard()
if(H.age < AGE_MINOR)
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm
index 3fa729969013..7e84efd98de7 100644
--- a/code/modules/jobs/job_types/cargo_technician.dm
+++ b/code/modules/jobs/job_types/cargo_technician.dm
@@ -4,7 +4,7 @@
outfit = /datum/outfit/job/cargo_tech
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
+ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 2cf67b9bbf70..1469e592b4de 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -4,7 +4,7 @@
outfit = /datum/outfit/job/miner
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
+ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm
index 707f7a7647b7..69155c9230d8 100644
--- a/code/modules/library/lib_codex_gigas.dm
+++ b/code/modules/library/lib_codex_gigas.dm
@@ -48,7 +48,7 @@
correctness = 100
correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) * 0.5 //Brain damage makes researching hard.
speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3
- if(do_after(user, speed, 0, user))
+ if(do_after(user, speed, user, timed_action_flags = IGNORE_HELD_ITEM))
var/usedName = devilName
if(!prob(correctness))
usedName += "x"
diff --git a/code/modules/mining/drill.dm b/code/modules/mining/drill.dm
index 281097be7842..9a35c2b4bf11 100644
--- a/code/modules/mining/drill.dm
+++ b/code/modules/mining/drill.dm
@@ -218,7 +218,7 @@
/obj/machinery/drill/AltClick(mob/user)
if(active)
to_chat(user, "You begin the manual shutoff process.")
- if(do_after(user,10))
+ if(do_after(user, 10, src))
active = FALSE
soundloop.stop()
deltimer(current_timerid)
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index dbe659581568..491d9b4e1a6a 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -24,7 +24,6 @@
light_range = 5
light_on = FALSE
custom_price = 800
- var/list/trophies = list()
var/charged = TRUE
var/charge_time = 15
var/detonation_damage = 20
@@ -41,10 +40,6 @@
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15)
-/obj/item/kinetic_crusher/Destroy()
- QDEL_LIST(trophies)
- return ..()
-
/// triggered on wield of two handed item
/obj/item/kinetic_crusher/proc/on_wield(obj/item/source, mob/user)
wielded = TRUE
@@ -57,30 +52,6 @@
. = ..()
. += "Induce magnetism in an enemy by striking them with a magnetospheric wave, then hit them in melee to force a waveform collapse for [force + detonation_damage] damage."
. += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]."
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- . += "It has \a [T] attached, which causes [T.effect_desc()]."
-
-/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user)
- if(I.tool_behaviour == TOOL_CROWBAR)
- if(LAZYLEN(trophies))
- var/list/choose_options = list()
- for(var/obj/item/crusher_trophy/T in trophies)
- choose_options += list(T.name = image(icon = T.icon, icon_state = T.icon_state))
- var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
- if(picked_option)
- to_chat(user, "You remove [picked_option].")
- I.play_tool_sound(src)
- for(var/obj/item/crusher_trophy/T in trophies)
- if(T.name == picked_option)
- T.remove_from(src, user)
- else
- to_chat(user, "There are no trophies on [src].")
- else if(istype(I, /obj/item/crusher_trophy))
- var/obj/item/crusher_trophy/T = I
- T.add_to(src, user)
- else
- return ..()
/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
if(!wielded)
@@ -90,10 +61,6 @@
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = target.health
..()
- for(var/t in trophies)
- if(!QDELETED(target))
- var/obj/item/crusher_trophy/T = t
- T.on_melee_hit(target, user)
if(!QDELETED(C) && !QDELETED(target))
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
@@ -106,9 +73,6 @@
if(!isturf(proj_turf))
return
var/obj/projectile/destabilizer/D = new /obj/projectile/destabilizer(proj_turf)
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- T.on_projectile_fire(D, user)
D.preparePixelProjectile(target, user, clickparams)
D.firer = user
D.hammer_synced = src
@@ -125,9 +89,6 @@
return
var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = L.health
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- T.on_mark_detonation(target, user)
if(!QDELETED(L))
if(!QDELETED(C))
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
@@ -186,12 +147,7 @@
/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
if(isliving(target))
var/mob/living/L = target
- var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean
- var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced)
- if(hammer_synced)
- for(var/t in hammer_synced.trophies)
- var/obj/item/crusher_trophy/T = t
- T.on_mark_application(target, CM, had_effect)
+ L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced)
var/target_turf = get_turf(target)
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
@@ -199,535 +155,6 @@
M.gets_drilled(firer, TRUE)
..()
-//trophies
-/obj/item/crusher_trophy
- name = "tail spike"
- desc = "A strange spike with no usage."
- icon = 'icons/obj/lavaland/artefacts.dmi'
- icon_state = "tail_spike"
- var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is
- var/denied_type = /obj/item/crusher_trophy
-
-/obj/item/crusher_trophy/examine(mob/living/user)
- . = ..()
- . += "Causes [effect_desc()] when attached to a kinetic crusher."
-
-/obj/item/crusher_trophy/proc/effect_desc()
- return "errors"
-
-/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
- if(istype(A, /obj/item/kinetic_crusher))
- add_to(A, user)
- else
- ..()
-
-/obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- for(var/t in H.trophies)
- var/obj/item/crusher_trophy/T = t
- if(istype(T, denied_type) || istype(src, T.denied_type))
- to_chat(user, "You can't seem to attach [src] to [H]. Maybe remove a few trophies?")
- return FALSE
- if(!user.transferItemToLoc(src, H))
- return
- H.trophies += src
- to_chat(user, "You attach [src] to [H].")
- return TRUE
-
-/obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- forceMove(get_turf(H))
- H.trophies -= src
- return TRUE
-
-/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user
-/obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
-/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
-/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user
-
-//goliath
-/obj/item/crusher_trophy/goliath_tentacle
- name = "goliath tentacle"
- desc = "A sliced-off goliath tentacle."
- icon_state = "goliath_tentacle"
- denied_type = /obj/item/crusher_trophy/goliath_tentacle
- bonus_value = 5
- var/missing_health_ratio = 0.1
- var/missing_health_desc = 10
-
-/obj/item/crusher_trophy/goliath_tentacle/effect_desc()
- return "waveform collapse to do [bonus_value] more damage for every [missing_health_desc] health you are missing"
-
-/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
- var/missing_health = user.maxHealth - user.health
- missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
- missing_health *= bonus_value //multiply the remaining amount by bonus_value
- if(missing_health > 0)
- target.adjustBruteLoss(missing_health) //and do that much damage
-
-//ancient goliath
-/obj/item/crusher_trophy/elder_tentacle
- name = "elder tentacle"
- desc = "The barbed tip of a tentacle sliced from an incredibly ancient goliath."
- icon_state = "elder_tentacle"
- denied_type = /obj/item/crusher_trophy/elder_tentacle
- bonus_value = 3
- var/missing_health_ratio = 0.1
- var/missing_health_desc = 5
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
-
-/obj/item/crusher_trophy/elder_tentacle/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/elder_tentacle/effect_desc()
- return "waveform collapse to do [bonus_value] more damage for every [missing_health_desc] health you are missing"
-
-/obj/item/crusher_trophy/elder_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
- var/missing_health = user.maxHealth - user.health
- missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
- missing_health *= bonus_value //multiply the remaining amount by bonus_value
- if(missing_health > 0)
- target.adjustBruteLoss(missing_health) //and do that much damage
-
-//crystal goliath
-/obj/item/crusher_trophy/goliath_crystal
- name = "goliath crystal"
- desc = "A crystal ripped off from a goliath infected by the strange crystals. You can see the original skin of the goliath deeply embeded in it."
- icon_state = "goliath_crystal"
- denied_type = /obj/item/crusher_trophy/elder_tentacle
- bonus_value = 4
- var/missing_health_ratio = 0.1
- var/missing_health_desc = 5
-
-/obj/item/crusher_trophy/goliath_crystal/effect_desc()
- return "waveform collapse to stun creatures for [bonus_value*0.1] second\s"
-
-/obj/item/crusher_trophy/goliath_crystal/on_mark_detonation(mob/living/simple_animal/target, mob/living/user)
- if(!ishostile(target))
- return
- var/mob/living/simple_animal/hostile/hostile_target = target
- var/hostile_ai_status = hostile_target.AIStatus
- hostile_target.AIStatus = AI_OFF
- addtimer(VARSET_CALLBACK(hostile_target, AIStatus, hostile_ai_status), bonus_value*0.1 SECONDS)
-
-//watcher
-/obj/item/crusher_trophy/watcher_wing
- name = "watcher wing"
- desc = "A wing ripped from a watcher."
- icon_state = "watcher_wing"
- denied_type = /obj/item/crusher_trophy/watcher_wing
- bonus_value = 5
-
-/obj/item/crusher_trophy/watcher_wing/effect_desc()
- return "waveform collapse to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s"
-
-/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user)
- if(ishostile(target))
- var/mob/living/simple_animal/hostile/H = target
- if(H.ranged) //briefly delay ranged attacks
- if(H.ranged_cooldown >= world.time)
- H.ranged_cooldown += bonus_value
- else
- H.ranged_cooldown = bonus_value + world.time
-
-//magmawing watcher
-/obj/item/crusher_trophy/magma_wing
- name = "magmatic sinew"
- desc = "A fuming organ, dropped by beings hotter then lava."
- icon_state = "magma_wing"
- denied_type = /obj/item/crusher_trophy/magma_wing
- gender = NEUTER
- bonus_value = 5
- var/deadly_shot = FALSE
-
-/obj/item/crusher_trophy/magma_wing/effect_desc()
- return "waveform collapse to make the next magnetic pulse deal [bonus_value] damage"
-
-/obj/item/crusher_trophy/magma_wing/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/magma_wing/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "superheated [marker.name]"
- marker.icon_state = "lava"
- marker.damage = bonus_value
- marker.nodamage = FALSE
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/magma_wing/on_mark_detonation(mob/living/target, mob/living/user)
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
-
-/obj/item/crusher_trophy/magma_wing/proc/reset_deadly_shot()
- deadly_shot = FALSE
-
-//icewing watcher
-/obj/item/crusher_trophy/ice_wing
- name = "frigid sinew"
- desc = "A carefully-preserved freezing organ, dropped by chilling beings."
- icon_state = "ice_wing"
- bonus_value = 8
- denied_type = /obj/item/crusher_trophy/ice_wing
-
-/obj/item/crusher_trophy/ice_wing/effect_desc()
- return "waveform collapse to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s"
-
-/obj/item/crusher_trophy/ice_wing/on_mark_detonation(mob/living/target, mob/living/user)
- if(ishostile(target))
- var/mob/living/simple_animal/hostile/H = target
- if(H.ranged) //briefly delay ranged attacks
- if(H.ranged_cooldown >= world.time)
- H.ranged_cooldown += bonus_value
- else
- H.ranged_cooldown = bonus_value + world.time
-
-//forgotten watcher
-/obj/item/crusher_trophy/watcher_wing_forgotten
- name = "forgotten watcher wing"
- desc = "A wing with a terminal infection of the strange crystals."
- icon_state = "watcher_wing_crystal"
- denied_type = /obj/item/crusher_trophy/watcher_wing_forgotten
- gender = NEUTER
- bonus_value = 20
- var/deadly_shot = FALSE
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/effect_desc()
- return "waveform collapse to make the next magnetic pulse deal [bonus_value] damage"
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "crystal [marker.name]"
- marker.icon_state = "crystal_shard"
- marker.damage = bonus_value
- marker.nodamage = FALSE
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/on_mark_detonation(mob/living/target, mob/living/user)
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/proc/reset_deadly_shot()
- deadly_shot = FALSE
-
-//legion
-/obj/item/crusher_trophy/legion_skull
- name = "legion skull"
- desc = "A dead and lifeless legion skull. Could be used in crafting."
- icon_state = "legion_skull"
- denied_type = /obj/item/crusher_trophy/legion_skull
- bonus_value = 3
-
-/obj/item/crusher_trophy/legion_skull/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/legion_skull/effect_desc()
- return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
-
-/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time -= bonus_value
-
-/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time += bonus_value
-
-//dwarf legion
-/obj/item/crusher_trophy/dwarf_skull
- name = "shrunken skull"
- desc = "Looks like someone hasn't been drinking their milk. Could be used in crafting."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "shrunk_skull"
- denied_type = /obj/item/crusher_trophy/dwarf_skull
- bonus_value = 6
-
-/obj/item/crusher_trophy/dwarf_skull/effect_desc()
- return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
-
-/obj/item/crusher_trophy/dwarf_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time -= bonus_value
-
-/obj/item/crusher_trophy/dwarf_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time += bonus_value
-
-
-//disfigured legion
-/obj/item/crusher_trophy/legion_skull_crystal
- name = "disfigured legion skull"
- desc = "A dead and lifeless legion skull. The crystals keep it alive, even in agony."
- icon_state = "legion_skull_crystal"
- denied_type = /obj/item/crusher_trophy/legion_skull_crystal
- bonus_value = 1
-
-/obj/item/crusher_trophy/legion_skull_crystal/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/legion_skull_crystal/effect_desc()
- return "waveform collapse to shoot 3 projectiles that only hits hostile fauna"
-
-/obj/item/crusher_trophy/legion_skull_crystal/on_mark_detonation(mob/living/target, mob/living/user)
- for(var/i in 0 to 5)
- var/obj/projectile/projectile_to_shoot = new /obj/projectile/crystalline_crusher(get_turf(src))
- projectile_to_shoot.preparePixelProjectile(get_step(src, pick(GLOB.alldirs)), get_turf(src))
- projectile_to_shoot.firer = user
- projectile_to_shoot.fire(i*(360/5))
- return ..()
-
-/obj/projectile/crystalline_crusher
- name = "Crystalline Shard"
- icon_state = "crystal_shard"
- damage = 25
- damage_type = BRUTE
- speed = 3
-
-/obj/projectile/crystalline_crusher/on_hit(atom/target, blocked)
- . = ..()
- var/turf/turf_hit = get_turf(target)
- new /obj/effect/temp_visual/goliath_tentacle/crystal/visual_only(turf_hit,firer)
-
-/obj/projectile/crystalline_crusher/can_hit_target(atom/target, list/passthrough, direct_target, ignore_loc)
- if(!(istype(target,/mob/living/simple_animal/hostile/asteroid)))
- if(isturf(target))
- return ..()
- return FALSE
- return ..()
-
-//blood-drunk hunter
-/obj/item/crusher_trophy/miner_eye
- name = "eye of a blood-drunk hunter"
- desc = "Its pupil is collapsed and turned to mush."
- icon_state = "hunter_eye"
- denied_type = /obj/item/crusher_trophy/miner_eye
-
-/obj/item/crusher_trophy/miner_eye/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/miner_eye/effect_desc()
- return "waveform collapse to grant stun immunity and 90% damage reduction for 1 second"
-
-/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user)
- user.apply_status_effect(STATUS_EFFECT_BLOODDRUNK)
-
-//whelp
-/obj/item/crusher_trophy/tail_spike
- desc = "A spike taken from a young dragon's tail. Sharp enough to stab someone with."
- denied_type = /obj/item/crusher_trophy/tail_spike
- bonus_value = 5
- force = 10
- throwforce = 15
- throw_speed = 4
- sharpness = IS_SHARP
- attack_verb = list("cut", "sliced", "diced")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/crusher_trophy/tail_spike/effect_desc()
- return "waveform collapse to do [bonus_value] damage to nearby creatures and push them back"
-
-/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user)
- for(var/mob/living/L in oview(2, user))
- if(L.stat == DEAD)
- continue
- playsound(L, 'sound/magic/fireball.ogg', 20, TRUE)
- new /obj/effect/temp_visual/fire(L.loc)
- addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done
- L.adjustFireLoss(bonus_value, forced = TRUE)
-
-/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
- if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
- step(target, get_dir(user, target))
-
-//ash drake
-/obj/item/crusher_trophy/ash_spike
- desc = "A molten spike taken from an ash drake's tail. Hot to the touch and extremely sharp."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "ash_spike"
- denied_type = /obj/item/crusher_trophy/ash_spike
- bonus_value = 15
- force = 15
- throwforce = 20
- throw_speed = 4
- sharpness = IS_SHARP
- attack_verb = list("cut", "braised", "singed")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/crusher_trophy/ash_spike/effect_desc()
- return "waveform collapse to do [bonus_value] damage to nearby creatures and push them back"
-
-/obj/item/crusher_trophy/ash_spike/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/ash_spike/on_mark_detonation(mob/living/target, mob/living/user)
- for(var/mob/living/L in oview(2, user))
- if(L.stat == DEAD)
- continue
- playsound(L, 'sound/magic/fireball.ogg', 20, TRUE)
- new /obj/effect/temp_visual/fire(L.loc)
- addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done
- L.adjustFireLoss(bonus_value, forced = TRUE)
-
-/obj/item/crusher_trophy/ash_spike/proc/pushback(mob/living/target, mob/living/user)
- if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
- step(target, get_dir(user, target))
-
-//bubblegum
-/obj/item/crusher_trophy/demon_claws
- name = "demon claws"
- desc = "A set of blood-drenched claws from a massive demon's hand."
- icon_state = "demon_claws"
- gender = PLURAL
- denied_type = /obj/item/crusher_trophy/demon_claws
- bonus_value = 10
- var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
-
-/obj/item/crusher_trophy/demon_claws/effect_desc()
- return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on waveform collapse"
-
-/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.force += bonus_value * 0.2
- H.detonation_damage += bonus_value * 0.8
- AddComponent(/datum/component/two_handed, force_wielded=(20 + bonus_value * 0.2))
-
-/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.force -= bonus_value * 0.2
- H.detonation_damage -= bonus_value * 0.8
- AddComponent(/datum/component/two_handed, force_wielded=20)
-
-/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
- user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
-
-/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user)
- user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
-
-//colossus
-/obj/item/crusher_trophy/blaster_tubes
- name = "blaster tubes"
- desc = "The blaster tubes from a colossus's arm."
- icon_state = "blaster_tubes"
- gender = PLURAL
- denied_type = /obj/item/crusher_trophy/blaster_tubes
- bonus_value = 15
- var/deadly_shot = FALSE
-
-/obj/item/crusher_trophy/blaster_tubes/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/blaster_tubes/effect_desc()
- return "waveform collapse to make the next magnetic pulse deal [bonus_value] damage but move slower"
-
-/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "ominous [marker.name]"
- marker.icon_state = "chronobolt"
- marker.damage = bonus_value
- marker.nodamage = FALSE
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user)
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
-
-/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot()
- deadly_shot = FALSE
-
-//hierophant
-/obj/item/crusher_trophy/vortex_talisman
- name = "vortex talisman"
- desc = "A glowing trinket that was originally the Hierophant's beacon."
- icon_state = "vortex_talisman"
- denied_type = /obj/item/crusher_trophy/vortex_talisman
-
-/obj/item/crusher_trophy/vortex_talisman/effect_desc()
- return "waveform collapse to create a barrier you can pass"
-
-/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user)
- var/turf/current_location = get_turf(user)
- var/area/current_area = current_location.loc
- if(current_area.area_flags & NOTELEPORT)
- to_chat(user, "[src] fizzles uselessly.")
- return
- var/turf/T = get_turf(user)
- new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass!
- var/turf/otherT = get_step(T, turn(user.dir, 90))
- if(otherT)
- new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
- otherT = get_step(T, turn(user.dir, -90))
- if(otherT)
- new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
-
-/obj/effect/temp_visual/hierophant/wall/crusher
- duration = 75
-
-//I am afraid of this code. It also does not function(in terms of doing damage to enemies) as of my last test.
-/obj/item/crusher_trophy/king_goat
- name = "king goat hoof"
- desc = "A hoof from the king of all goats, it still glows with a fraction of its original power..."
- icon_state = "goat_hoof" //needs a better sprite but I cant sprite .
- denied_type = /obj/item/crusher_trophy/king_goat
-
-/obj/item/crusher_trophy/king_goat/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/king_goat/effect_desc()
- return "you also passively recharge pulses 5x as fast while this is equipped and do a decent amount of damage at the cost of dulling the blade"
-
-/obj/item/crusher_trophy/king_goat/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- marker.damage = 10 //in my testing only does damage to simple mobs so should be fine to have it high //it does damage to nobody. Please fix -M
-
-/obj/item/crusher_trophy/king_goat/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time = 3
- H.AddComponent(/datum/component/two_handed, force_wielded=5)
-
-/obj/item/crusher_trophy/king_goat/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time = 15
- H.AddComponent(/datum/component/two_handed, force_wielded=20)
-
-/obj/item/crusher_trophy/shiny
- name = "shiny nugget"
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- desc = "A glimmering nugget of dull metal. As it turns out, the fools were right- pyrite is a far rarer substance than gold in the space age. You could probably sell this for a fair price."
- icon_state = "nugget"
- gender = PLURAL
- denied_type = /obj/item/crusher_trophy/shiny
-
-/obj/item/crusher_trophy/shiny/effect_desc()
- return "empowered butchering chances"
-
-/obj/item/crusher_trophy/shiny/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.AddComponent(/datum/component/butchering, 60, 210)
-
-/obj/item/crusher_trophy/shiny/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.AddComponent(/datum/component/butchering, 60, 110)
-
//outdated Nanotrasen prototype of the crusher. Incredibly heavy, but the blade was made at a premium. //to alter this I had to duplicate some code, big moment.
/obj/item/kinetic_crusher/old
icon_state = "crusherold"
@@ -830,16 +257,3 @@
. = ..()
if(wielded)
. += "[icon_state]_lit"
-
-/obj/item/crusher_trophy/lobster_claw
- name = "lobster claw"
- icon_state = "lobster_claw"
- desc = "A lobster claw."
- denied_type = /obj/item/crusher_trophy/lobster_claw
- bonus_value = 1
-
-/obj/item/crusher_trophy/lobster_claw/effect_desc()
- return "mark detonation to briefly stagger the target for [bonus_value] seconds"
-
-/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/stagger, bonus_value SECONDS)
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 817970a00602..7ba30d327444 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -315,10 +315,6 @@
/obj/item/hierophant_club,
/obj/item/gun/energy/minigun,
/obj/item/gun/ballistic/automatic/hmg/l6_saw,
- /obj/item/gun/magic/staff/chaos,
- /obj/item/gun/magic/staff/spellblade,
- /obj/item/gun/magic/wand/death,
- /obj/item/gun/magic/wand/fireball,
/obj/item/stack/telecrystal/twenty,
/obj/item/nuke_core,
/obj/item/phylactery,
diff --git a/code/modules/mining/equipment/trophies.dm b/code/modules/mining/equipment/trophies.dm
new file mode 100644
index 000000000000..a9631c7ffc15
--- /dev/null
+++ b/code/modules/mining/equipment/trophies.dm
@@ -0,0 +1,184 @@
+//trophies
+/obj/item/mob_trophy
+ name = "tail spike"
+ desc = "A strange spike with no usage."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "tail_spike"
+
+//legion
+/obj/item/mob_trophy/legion_skull
+ name = "legion skull"
+ desc = "A dead and lifeless legion skull. Could be used in crafting."
+ icon_state = "legion_skull"
+
+/obj/item/mob_trophy/wolf_ear
+ name = "wolf ear"
+ desc = "The battered remains of a wolf's ear. You could attach it to a crusher, or use the fur to craft a trophy."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "torn_ear"
+
+/obj/item/mob_trophy/fang
+ name = "battle-stained fang"
+ desc = "A wolf fang, displaying the wear and tear associated with a long and colorful life. Could be attached to a kinetic crusher or used to make a trophy."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "fang"
+
+/*
+//goliath
+/obj/item/mob_trophy/goliath_tentacle
+ name = "goliath tentacle"
+ desc = "A sliced-off goliath tentacle."
+ icon_state = "goliath_tentacle"
+
+//ancient goliath0
+/obj/item/mob_trophy/elder_tentacle
+ name = "elder tentacle"
+ desc = "The barbed tip of a tentacle sliced from an incredibly ancient goliath."
+ icon_state = "elder_tentacle"
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+
+//crystal goliath
+/obj/item/mob_trophy/goliath_crystal
+ name = "goliath crystal"
+ desc = "A crystal ripped off from a goliath infected by the strange crystals. You can see the original skin of the goliath deeply embeded in it."
+ icon_state = "goliath_crystal"
+
+//watcher
+/obj/item/mob_trophy/watcher_wing
+ name = "watcher wing"
+ desc = "A wing ripped from a watcher."
+ icon_state = "watcher_wing"
+
+//magmawing watcher
+/obj/item/mob_trophy/magma_wing
+ name = "magmatic sinew"
+ desc = "A fuming organ, dropped by beings hotter then lava."
+ icon_state = "magma_wing"
+ gender = NEUTER
+
+//icewing watcher
+/obj/item/mob_trophy/ice_wing
+ name = "frigid sinew"
+ desc = "A carefully-preserved freezing organ, dropped by chilling beings."
+ icon_state = "ice_wing"
+
+//forgotten watcher
+/obj/item/mob_trophy/watcher_wing_forgotten
+ name = "forgotten watcher wing"
+ desc = "A wing with a terminal infection of the strange crystals."
+ icon_state = "watcher_wing_crystal"
+ gender = NEUTER
+
+//dwarf legion
+/obj/item/mob_trophy/dwarf_skull
+ name = "shrunken skull"
+ desc = "Looks like someone hasn't been drinking their milk. Could be used in crafting."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "shrunk_skull"
+
+//disfigured legion
+/obj/item/mob_trophy/legion_skull_crystal
+ name = "disfigured legion skull"
+ desc = "A dead and lifeless legion skull. The crystals keep it alive, even in agony."
+ icon_state = "legion_skull_crystal"
+
+//blood-drunk hunter
+/obj/item/mob_trophy/miner_eye
+ name = "eye of a blood-drunk hunter"
+ desc = "Its pupil is collapsed and turned to mush."
+ icon_state = "hunter_eye"
+
+//whelp
+/obj/item/mob_trophy/tail_spike
+ desc = "A spike taken from a young dragon's tail. Sharp enough to stab someone with."
+ force = 10
+ throwforce = 15
+ throw_speed = 4
+ sharpness = IS_SHARP
+ attack_verb = list("cut", "sliced", "diced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+//ash drake
+/obj/item/mob_trophy/ash_spike
+ desc = "A molten spike taken from an ash drake's tail. Hot to the touch and extremely sharp."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "ash_spike"
+ force = 15
+ throwforce = 20
+ throw_speed = 4
+ sharpness = IS_SHARP
+ attack_verb = list("cut", "braised", "singed")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+//bubblegum
+/obj/item/mob_trophy/demon_claws
+ name = "demon claws"
+ desc = "A set of blood-drenched claws from a massive demon's hand."
+ icon_state = "demon_claws"
+ gender = PLURAL
+
+//colossus
+/obj/item/mob_trophy/blaster_tubes
+ name = "blaster tubes"
+ desc = "The blaster tubes from a colossus's arm."
+ icon_state = "blaster_tubes"
+ gender = PLURAL
+
+//hierophant
+/obj/item/mob_trophy/vortex_talisman
+ name = "vortex talisman"
+ desc = "A glowing trinket that was originally the Hierophant's beacon."
+ icon_state = "vortex_talisman"
+
+// Broodmother's loot: Broodmother Tongue
+/obj/item/mob_trophy/broodmother_tongue
+ name = "broodmother tongue"
+ desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "broodmother_tongue"
+
+/obj/item/mob_trophy/shiny
+ name = "shiny nugget"
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ desc = "A glimmering nugget of dull metal. As it turns out, the fools were right- pyrite is a far rarer substance than gold in the space age. You could probably sell this for a fair price."
+ icon_state = "nugget"
+ gender = PLURAL
+
+/obj/item/mob_trophy/lobster_claw
+ name = "lobster claw"
+ icon_state = "lobster_claw"
+ desc = "A lobster claw."
+
+/obj/item/mob_trophy/ice_block_talisman
+ name = "ice block talisman"
+ desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason."
+ icon_state = "freeze_cube"
+
+/obj/item/mob_trophy/brimdemon_fang
+ name = "brimdemon's fang"
+ icon_state = "brimdemon_fang"
+ desc = "A fang from a brimdemon's corpse."
+
+/obj/item/mob_trophy/ice_crystal
+ name = "frost gem"
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ desc = "The glowing remnant of an ancient ice demon- so cold that it hurts to touch."
+ icon_state = "ice_crystal"
+
+/obj/item/mob_trophy/lobster_claw
+ name = "lobster claw"
+ icon_state = "lobster_claw"
+ desc = "A lobster claw."
+
+/obj/item/mob_trophy/bear_paw
+ name = "polar bear paw"
+ desc = "It's a polar bear paw."
+ icon_state = "bear_paw"
+ icon ='icons/obj/lavaland/elite_trophies.dmi'
+
+/obj/item/mob_trophy/war_paw
+ name = "Armored bear paw"
+ desc = "It's a paw from a true warrior. Still remembers the basics of CQB."
+ icon_state = "armor_paw"
+ icon ='icons/obj/lavaland/elite_trophies.dmi'
+*/
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index b2a7cf2dd5ca..268413ef203c 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -66,8 +66,6 @@
new /obj/item/wisp_lantern(src)
if(20)
new /obj/item/immortality_talisman(src)
- if(21)
- new /obj/item/gun/magic/hook(src)
if(22)
new /obj/item/voodoo(src)
if(23)
@@ -143,8 +141,6 @@
new /obj/item/wisp_lantern(src)
if(20)
new /obj/item/immortality_talisman(src)
- if(21)
- new /obj/item/gun/magic/hook(src)
if(22)
new /obj/item/voodoo(src)
if(23)
@@ -481,91 +477,6 @@
/obj/effect/warp_cube/ex_act(severity, target)
return
-//Meat Hook
-/obj/item/gun/magic/hook
- name = "meat hook"
- desc = "A light hooked blade, attached by the handle to a long chain. Can be used to make quick strikes in hand, or thrown at enemies, magically dragging them to the user. Get over here!"
- ammo_type = /obj/item/ammo_casing/magic/hook
- icon_state = "hook"
- item_state = "hook"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- fire_sound = 'sound/weapons/batonextend.ogg'
- max_charges = 1
- item_flags = NEEDS_PERMIT
- force = 15
- sharpness = IS_SHARP
- block_chance = 5//A pittance, but might be worth something in a scuffle
- hitsound = 'sound/weapons/chainhit.ogg'
-
-/obj/item/gun/magic/hook/melee_attack_chain(mob/user, atom/target, params)
- ..()
- user.changeNext_move(CLICK_CD_MELEE * 0.5)//quick to swing. 15 force can be quite something with this attack frequency.
-
-/obj/item/gun/magic/hook/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 15, 130, 0, hitsound)
-
-/obj/item/ammo_casing/magic/hook
- name = "hook"
- desc = "A hook."
- projectile_type = /obj/projectile/hook
- caliber = "hook"
- icon_state = "arrow"
-
-/obj/projectile/hook
- name = "hook"
- icon_state = "hook"
- icon = 'icons/obj/lavaland/artefacts.dmi'
- pass_flags = PASSTABLE
- damage = 20
- stamina = 20
- armour_penetration = 60
- damage_type = BRUTE
- hitsound = 'sound/effects/splat.ogg'
- var/chain
- var/knockdown_time = (0.5 SECONDS)
-
-/obj/projectile/hook/fire(setAngle)
- if(firer)
- chain = firer.Beam(src, icon_state = "chain", emissive = FALSE)
- ..()
- //TODO: root the firer until the chain returns
-
-/obj/projectile/hook/on_hit(atom/target)
- . = ..()
- if(ismovable(target))
- var/atom/movable/A = target
- if(A.anchored)
- return
- A.visible_message("[A] is snagged by [firer]'s hook!")
- new /datum/forced_movement(A, get_turf(firer), 5, TRUE)
- if (isliving(target))
- var/mob/living/fresh_meat = target
- fresh_meat.Knockdown(knockdown_time)
- return
- //TODO: keep the chain beamed to A
- //TODO: needs a callback to delete the chain
-
-/obj/projectile/hook/Destroy()
- qdel(chain)
- return ..()
-
-//just a nerfed version of the real thing for the bounty hunters.
-/obj/item/gun/magic/hook/bounty
- name = "hook"
- ammo_type = /obj/item/ammo_casing/magic/hook/bounty
-
-/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user)
- to_chat(user, "The [src] isn't ready to fire yet!")
-
-/obj/item/ammo_casing/magic/hook/bounty
- projectile_type = /obj/projectile/hook/bounty
-
-/obj/projectile/hook/bounty
- damage = 0
- stamina = 40
-
//Immortality Talisman: Now with state-of-the-art panic button technology
/obj/item/immortality_talisman
name = "\improper Immortality Talisman"
@@ -878,6 +789,39 @@
walk(hit_mob, 0) //stops them mid pathing even if they're stunimmune
hit_mob.apply_status_effect(/datum/status_effect/ice_block_talisman, 5 SECONDS)
+/datum/status_effect/ice_block_talisman
+ id = "ice_block_talisman"
+ duration = 40
+ status_type = STATUS_EFFECT_REFRESH
+ alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman
+ /// Stored icon overlay for the hit mob, removed when effect is removed
+ var/icon/cube
+
+/atom/movable/screen/alert/status_effect/ice_block_talisman
+ name = "Frozen Solid"
+ desc = "You're frozen inside an ice cube, and cannot move!"
+ icon_state = "frozen"
+
+/datum/status_effect/ice_block_talisman/on_apply()
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
+ if(!owner.stat)
+ to_chat(owner, "You become frozen in a cube!")
+ cube = icon('icons/effects/freeze.dmi', "ice_cube")
+ var/icon/size_check = icon(owner.icon, owner.icon_state)
+ cube.Scale(size_check.Width(), size_check.Height())
+ owner.add_overlay(cube)
+ return ..()
+
+/// Blocks movement from the status effect owner
+/datum/status_effect/ice_block_talisman/proc/owner_moved()
+ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
+
+/datum/status_effect/ice_block_talisman/on_remove()
+ if(!owner.stat)
+ to_chat(owner, "The cube melts!")
+ owner.cut_overlay(cube)
+ UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
+
//earthquake gauntlets
/obj/item/clothing/gloves/gauntlets
name = "concussive gauntlets"
@@ -920,6 +864,7 @@
return COMPONENT_NO_ATTACK_OBJ
//A version of the Cave Story refrence that a deranged scientist got their hands on. Better? Not really. Different? Definitely.
+//TODO: replace with a proper polar star and spur, not to mention a proper sprite
/obj/item/gun/energy/spur
name = "Slowpoke"
desc = "The work of a truly genius gunsmith, altered and \"improved\" by a truly deranged Nanotrasen scientist, using components from a kinetic accelerator and beam rifle. Draw, partner!"
@@ -928,11 +873,10 @@
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
icon_state = "spur"
item_state = "spur"
- fire_delay = 0.5 //BRATATAT! This is a cowboy's six-shooter after all.
selfcharge = 1
charge_delay = 1
slot_flags = ITEM_SLOT_BELT
- fire_delay = 1
+ fire_delay = 0.1 SECONDS
recoil = 1
cell_type = /obj/item/stock_parts/cell/gun
ammo_type = list(/obj/item/ammo_casing/energy/spur)
@@ -1266,17 +1210,9 @@
new /obj/item/lava_staff(src)
if(3)
new /obj/item/book/granter/spell/sacredflame(src)
- new /obj/item/gun/magic/wand/fireball(src)
if(4)
new /obj/item/dragons_blood(src)
-/obj/structure/closet/crate/necropolis/dragon/crusher
- name = "firey dragon chest"
-
-/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents()
- ..()
- new /obj/item/crusher_trophy/ash_spike(src)
-
/obj/item/melee/ghost_sword
name = "\improper spectral blade"
desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
@@ -1489,21 +1425,12 @@
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
new /obj/item/clothing/suit/space/hostile_environment(src)
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
- var/loot = rand(1,3)
+ var/loot = rand(1,2)
switch(loot)
if(1)
new /obj/item/mayhem(src)
if(2)
new /obj/item/blood_contract(src)
- if(3)
- new /obj/item/gun/magic/staff/spellblade(src)
-
-/obj/structure/closet/crate/necropolis/bubblegum/crusher
- name = "bloody bubblegum chest"
-
-/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents()
- ..()
- new /obj/item/crusher_trophy/demon_claws(src)
/obj/item/mayhem
name = "mayhem in a bottle"
@@ -1580,13 +1507,6 @@
new random_crystal(src)
new /obj/item/organ/vocal_cords/colossus(src)
-/obj/structure/closet/crate/necropolis/colossus/crusher
- name = "angelic colossus chest"
-
-/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents()
- ..()
- new /obj/item/crusher_trophy/blaster_tubes(src)
-
//Hierophant
/obj/item/hierophant_club
name = "hierophant club"
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index d0704887b4ea..2b3e379691c9 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -249,7 +249,7 @@
switch(action)
if("Claim")
var/mob/M = usr
- var/obj/item/card/id/I = M.get_idcard(TRUE)
+ var/obj/item/card/bank/I = M.get_bankcard()
if(points)
if(I)
I.mining_points += points
diff --git a/code/modules/mining/ore_veins.dm b/code/modules/mining/ore_veins.dm
index 0df6cd187d03..cfd908c23cbb 100644
--- a/code/modules/mining/ore_veins.dm
+++ b/code/modules/mining/ore_veins.dm
@@ -176,6 +176,7 @@ GLOBAL_LIST_EMPTY(ore_veins)
/obj/item/stack/ore/titanium = 2,
/obj/item/stack/ore/gold = 1,
/obj/item/stack/ore/diamond = 1,
+ /obj/item/stack/ore/ice = 7,
)
/obj/structure/vein/ice/classtwo
@@ -190,6 +191,7 @@ GLOBAL_LIST_EMPTY(ore_veins)
/obj/item/stack/ore/diamond = 2,
/obj/item/stack/ore/gold = 3,
/obj/item/stack/ore/bluespace_crystal = 1,
+ /obj/item/stack/ore/ice = 8,
)
max_mobs = 6
spawn_time = 100
@@ -206,6 +208,7 @@ GLOBAL_LIST_EMPTY(ore_veins)
/obj/item/stack/ore/diamond = 4,
/obj/item/stack/ore/gold = 6,
/obj/item/stack/ore/bluespace_crystal = 4,
+ /obj/item/stack/ore/ice = 8,
)
max_mobs = 6
spawn_time = 80
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 1dfe590cac0a..55130b0a20d7 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -247,6 +247,17 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
item_state = "slag"
singular_name = "slag chunk"
+/obj/item/stack/ore/ice
+ name = "ice crystals"
+ desc = "Used in an electrolyzer to produce hydrogen and oxygen."
+ icon_state = "Ice ore"
+ item_state = "Ice ore"
+ singular_name = "ice chunk"
+ scan_state = "rock_Ice"
+ mine_experience = 2
+ grind_results = list(/datum/reagent/consumable/ice = 10)
+ spreadChance = 10
+
/obj/item/gibtonite
name = "gibtonite ore"
desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law."
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 25722dd28e5f..8fbf9c32a38e 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -335,8 +335,6 @@
if(GLOB.summon_guns_triggered)
give_guns(humanc)
- if(GLOB.summon_magic_triggered)
- give_magic(humanc)
if(GLOB.curse_of_madness_triggered)
give_madness(humanc, GLOB.curse_of_madness_triggered)
if(CONFIG_GET(flag/roundstart_traits))
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm
index 4ed949c63ef8..9fd4579e46f8 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm
@@ -1,10 +1,9 @@
-//Kepori mutant parts
-
-//Start head feathers
+// "Hair" feathers
/datum/sprite_accessory/kepori_feathers
color_src = HAIR
- icon = 'icons/mob/kepori_parts.dmi'
+ body_zone = BODY_ZONE_HEAD
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
/datum/sprite_accessory/kepori_feathers/none
name = "None"
@@ -37,10 +36,6 @@
name = "Spikey"
icon_state = "spikey"
-/datum/sprite_accessory/kepori_feathers/soap
- name = "Soap"
- icon_state = "soap"
-
/datum/sprite_accessory/kepori_feathers/crowned
name = "Crowned"
icon_state = "crowned"
@@ -57,40 +52,60 @@
name = "Bun"
icon_state = "bun"
-//Start body feathers
+// Head/Face feathers
+
+/datum/sprite_accessory/kepori_head_feathers
+ color_src = MUTCOLORS_SECONDARY
+ body_zone = BODY_ZONE_HEAD
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
+
+/datum/sprite_accessory/kepori_head_feathers/none
+ name = "None"
+
+/datum/sprite_accessory/kepori_head_feathers/full
+ name = "Full"
+ icon_state = "full"
+
+/datum/sprite_accessory/kepori_head_feathers/half
+ name = "Half"
+ icon_state = "half"
+
+// Body feathers
/datum/sprite_accessory/kepori_body_feathers
color_src = MUTCOLORS_SECONDARY
- icon = 'icons/mob/kepori_parts.dmi'
+ body_zone = BODY_ZONE_CHEST
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
/datum/sprite_accessory/kepori_body_feathers/none
name = "None"
-/datum/sprite_accessory/kepori_body_feathers/aftik
- name = "Aftik"
- icon_state = "aftik"
-
/datum/sprite_accessory/kepori_body_feathers/belly
name = "Belly"
icon_state = "belly"
-/datum/sprite_accessory/kepori_body_feathers/shirt
- name = "Shirt"
- icon_state = "shirt"
+/datum/sprite_accessory/kepori_body_feathers/belly_wings
+ name = "Belly + Wings"
+ icon_state = "bwings"
/datum/sprite_accessory/kepori_body_feathers/soap
name = "Soap"
icon_state = "soap"
+/datum/sprite_accessory/kepori_body_feathers/soap_wings
+ name = "Soap + Wings"
+ icon_state = "swings"
+
/datum/sprite_accessory/kepori_body_feathers/wings
name = "Wings"
icon_state = "wings"
-//Start tail feathers
+// Tail feathers
/datum/sprite_accessory/kepori_tail_feathers
color_src = MUTCOLORS_SECONDARY
- icon = 'icons/mob/kepori_parts.dmi'
+ body_zone = BODY_ZONE_CHEST
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
/datum/sprite_accessory/kepori_tail_feathers/none
name = "None"
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index a70520462f39..8629d01650d4 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -113,7 +113,7 @@
return
user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].")
- if(!do_after(user, 60, TRUE, src))
+ if(!do_after(user, 60, src))
to_chat(user, "You failed to pour [O] onto [src]!")
return
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 11eeef8b4a8e..d692e36345cb 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -21,7 +21,6 @@
bubble_icon = "alien"
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
- var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie
var/has_fine_manipulation = FALSE
status_flags = CANUNCONSCIOUS|CANPUSH
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 651ea4c6d0ee..dcb44af19cca 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -63,7 +63,7 @@
if(href_list["pouches"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
visible_message("[usr] tries to empty [src]'s pouches.", \
"[usr] tries to empty your pouches.")
- if(do_mob(usr, src, POCKET_STRIP_DELAY * 0.5))
+ if(do_after(usr, POCKET_STRIP_DELAY * 0.5, src))
dropItemToGround(r_store)
dropItemToGround(l_store)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 36fd8e1e6704..dd5b29059085 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -202,7 +202,7 @@
visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \
"[usr] tries to [internal ? "close" : "open"] the valve on your [ITEM.name].", null, null, usr)
to_chat(usr, "You try to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name]...")
- if(do_mob(usr, src, POCKET_STRIP_DELAY))
+ if(do_after(usr, POCKET_STRIP_DELAY, src))
if(internal)
internal = null
update_internals_hud_icon(0)
@@ -255,7 +255,7 @@
buckle_cd = O.breakouttime
visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")
- if(do_after(src, buckle_cd, 0, target = src, hidden = TRUE))
+ if(do_after(src, buckle_cd, target = src, timed_action_flags = IGNORE_HELD_ITEM))
if(!buckled)
return
buckled.user_unbuckle_mob(src,src)
@@ -306,7 +306,7 @@
if(!cuff_break)
visible_message("[src] attempts to remove [I]!")
to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)")
- if(do_after(src, breakouttime, 0, target = src))
+ if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM))
. = clear_cuffs(I, cuff_break)
else
to_chat(src, "You fail to remove [I]!")
@@ -315,7 +315,7 @@
breakouttime = 50
visible_message("[src] is trying to break [I]!")
to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)")
- if(do_after(src, breakouttime, 0, target = src))
+ if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM))
. = clear_cuffs(I, cuff_break)
else
to_chat(src, "You fail to break [I]!")
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 916095ed266e..43cefa251e34 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/attackby(obj/item/W, mob/user, params)
var/obj/item/bodypart/BP = get_bodypart(check_zone(user.zone_selected))
- var/has_painkillers = user.reagents.has_reagent(/datum/reagent/medicine/morphine, needs_metabolizing = TRUE)
- if(W.tool_behaviour == TOOL_WELDER && IS_ROBOTIC_LIMB(BP) && BP.brute_dam > 5) //prioritize healing if we're synthetic
+ var/has_painkillers = reagents.has_reagent(/datum/reagent/medicine/morphine, needs_metabolizing = TRUE)
+ if(W.tool_behaviour == TOOL_WELDER && IS_ROBOTIC_LIMB(BP) && BP.brute_dam) //prioritize healing if we're synthetic
return ..()
if(user.a_intent != INTENT_HELP || !W.get_temperature() || !BP.can_bandage()) //this will also catch low damage synthetic welding
return ..()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index a7dc41b307c4..8743fe33289e 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -27,6 +27,7 @@
var/obj/item/tank/internal = null
var/obj/item/clothing/head = null
+ var/obj/item/wear_id = null //only used by humans
var/obj/item/clothing/gloves = null ///only used by humans
var/obj/item/clothing/shoes/shoes = null ///only used by humans.
var/obj/item/clothing/glasses/glasses = null ///only used by humans.
diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm
index 4832792dc04a..4ee9a3b089da 100644
--- a/code/modules/mob/living/carbon/human/consistent_human.dm
+++ b/code/modules/mob/living/carbon/human/consistent_human.dm
@@ -31,6 +31,7 @@
dna.features["spider_spinneret"] = GLOB.spider_spinneret_list[hex2num(copytext(seed, 11, 12)) % length(GLOB.spider_spinneret_list) + 1]
dna.features["kepori_feathers"] = GLOB.kepori_feathers_list[hex2num(copytext(seed, 12, 13)) % length(GLOB.kepori_feathers_list) + 1]
dna.features["kepori_body_feathers"] = GLOB.kepori_body_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_body_feathers_list) + 1]
+ dna.features["kepori_head_feathers"] = GLOB.kepori_head_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_head_feathers_list) + 1]
dna.features["vox_head_quills"] = GLOB.vox_head_quills_list[hex2num(copytext(seed, 14, 15)) % length(GLOB.vox_head_quills_list) + 1]
dna.features["vox_neck_quills"] = GLOB.vox_neck_quills_list[hex2num(copytext(seed, 15, 16)) % length(GLOB.vox_neck_quills_list) + 1]
dna.features["elzu_horns"] = GLOB.elzu_horns_list[hex2num(copytext(seed, 16, 17)) % length(GLOB.elzu_horns_list) + 1]
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index e706110c3a8d..0d899e86f696 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -128,7 +128,7 @@
/datum/emote/living/carbon/human/tailthump/get_sound(mob/living/user)
if(!ishuman(user))
return
- if(islizard(user) || (isvox(user)))
+ if(!isnull(user.getorgan(/obj/item/organ/tail)) || (isvox(user)))
return 'sound/voice/lizard/tailthump.ogg' //https://freesound.org/people/TylerAM/sounds/389665/
/datum/emote/living/carbon/human/weh //lizard
@@ -384,6 +384,7 @@
key_third_person = "whistles"
message = "whistles!"
emote_type = EMOTE_AUDIBLE
+ vary = TRUE
/datum/emote/living/carbon/human/kepiwhistle/get_sound(mob/living/user)
if(!ishuman(user))
@@ -395,3 +396,4 @@
key = "woop"
key_third_person = "woops"
message = "woops!"
+ emote_type = EMOTE_AUDIBLE
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index dec0a211fbea..f92e8d762f2d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -431,6 +431,5 @@
if ((wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)))
return
-
if(get_age())
. += list(span_notice("[p_they(TRUE)] appear[p_s()] to be [get_age()]."))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 4e146080f6f3..cf6efccb898c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -245,7 +245,7 @@
else
return
- if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator, hidden = TRUE)) //placing an item into the pocket is 4 times faster
+ if(do_after(usr, POCKET_STRIP_DELAY/delay_denominator, src, hidden = TRUE)) //placing an item into the pocket is 4 times faster
if(pocket_item)
if(pocket_item == (pocket_id == ITEM_SLOT_RPOCKET ? r_store : l_store)) //item still in the pocket we search
dropItemToGround(pocket_item)
@@ -263,7 +263,7 @@
if(href_list["toggle_uniform"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING)
to_chat(src, "[usr.name] is trying to adjust your [U].")
- if(do_mob(usr, src, U.strip_delay/2))
+ if(do_after(usr, U.strip_delay/2, src))
to_chat(src, "[usr.name] successfully adjusted your [U].")
U.toggle_jumpsuit_adjust()
update_inv_w_uniform()
@@ -612,10 +612,13 @@
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/target)
var/panicking = FALSE
+ if(target == src) //Sanity check, in case spacetime crumbles and allows us to perform cpr on ourselves
+ return
+
do
CHECK_DNA_AND_SPECIES(target)
- if (INTERACTING_WITH(src, target))
+ if (DOING_INTERACTION_WITH_TARGET(src,target))
return FALSE
if (target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))
@@ -641,7 +644,7 @@
visible_message("[src] is trying to perform CPR on [target.name]!", \
"You try to perform CPR on [target.name]... Hold still!")
- if (!do_mob(src, target, time = panicking ? CPR_PANIC_SPEED : (3 SECONDS)))
+ if (!do_after(src, delay = panicking ? CPR_PANIC_SPEED : (3 SECONDS), target = target))
to_chat(src, "You fail to perform CPR on [target]!")
return FALSE
@@ -1063,7 +1066,7 @@
if(!src.is_busy && (src.zone_selected == BODY_ZONE_HEAD || src.zone_selected == BODY_ZONE_PRECISE_GROIN) && get_turf(src) == get_turf(T) && !(T.mobility_flags & MOBILITY_STAND) && src.a_intent != INTENT_HELP) //all the stars align, time to curbstomp
src.is_busy = TRUE
- if (!do_mob(src,T,25) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958)
+ if (!do_after(src, 2.5 SECONDS, T) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958)
src.is_busy = FALSE
return
@@ -1151,7 +1154,7 @@
//Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
"[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]")
//(Using your gloves' nanochips, you/You) (/quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
- if(do_after(src, carrydelay, TRUE, target))
+ if(do_after(src, carrydelay, target))
//Second check to make sure they're still valid to be carried
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE) && !target.buckled)
buckle_mob(target, TRUE, TRUE, 90, 1, 0)
@@ -1174,7 +1177,7 @@
//Joe Medic starts quickly/expertly scooping Grey Tider into their arms..
"[carrydelay < 11 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to scoop [target] into your arms[carrydelay == 15 ? ", while assisted by the nanochips in your gloves.." : "..."]")
//(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to scoop Grey Tider into your arms(, while assisted by the nanochips in your gloves../...)
- if(do_after(src, carrydelay, TRUE, target))
+ if(do_after(src, carrydelay, target))
//Second check to make sure they're still valid to be carried
if(!incapacitated(FALSE, TRUE) && !target.buckled)
buckle_mob(target, TRUE, TRUE, 90, 1, 0)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 6556335c2bdb..567523c11d79 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -54,7 +54,6 @@
var/obj/item/clothing/wear_suit = null
var/obj/item/clothing/w_uniform = null
var/obj/item/belt = null
- var/obj/item/wear_id = null
var/obj/item/r_store = null
var/obj/item/l_store = null
var/obj/item/s_store = null
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 5d8264c14ac3..9e2cfe4f1556 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -101,6 +101,22 @@
if(id_card)
return id_card
+/mob/living/carbon/human/get_bankcard()
+ //Check hands
+ var/list/items_to_check = list()
+ if(get_active_held_item())
+ items_to_check += get_active_held_item()
+ if(get_inactive_held_item())
+ items_to_check += get_inactive_held_item()
+ if(wear_id)
+ items_to_check += wear_id
+ if(belt)
+ items_to_check += belt
+ for(var/obj/item/i in items_to_check)
+ var/obj/item/card/bank/bank_card = i.GetBankCard()
+ if(bank_card)
+ return bank_card
+
/mob/living/carbon/human/get_id_in_hand()
var/obj/item/held_item = get_active_held_item()
if(!held_item)
@@ -137,10 +153,10 @@
to_chat(src, "You can't bring yourself to use a ranged weapon!")
return FALSE
-/mob/living/carbon/human/proc/get_bank_account()
+/mob/living/carbon/proc/get_bank_account()
RETURN_TYPE(/datum/bank_account)
var/datum/bank_account/account
- var/obj/item/card/id/I = get_idcard()
+ var/obj/item/card/bank/I = get_bankcard()
if(I && I.registered_account)
account = I.registered_account
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index b757fe6820b0..75fc1759fa7d 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -694,16 +694,27 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
var/mutable_appearance/eye_overlay
var/mutable_appearance/sclera_overlay
+
if(eyes)
if(!HAS_TRAIT(H, TRAIT_EYESCLOSED) && !(H.stat == DEAD))
- eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER)
- sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER)
+
+ if(iskepori(H)) // Kepori need sclera but don't fit the normal silhouette, so this needs changing. Make better later.
+ eye_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER)
+ sclera_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER)
+
+ else
+ eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER)
+ sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER)
+
if((EYECOLOR in species_traits) && eyes)
eye_overlay.color = "#" + H.eye_color
+
if((SCLERA in species_traits) && eyes)
sclera_overlay.color = "#" + H.sclera_color
standing += sclera_overlay
+
standing += eye_overlay
+
if(EMOTE_OVERLAY in species_traits)
// blush
if (HAS_TRAIT(H, TRAIT_BLUSHING)) // Caused by either the *blush emote or the "drunk" mood event
@@ -983,6 +994,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.spider_spinneret_list[H.dna.features["spider_spinneret"]]
if("kepori_body_feathers")
S = GLOB.kepori_body_feathers_list[H.dna.features["kepori_body_feathers"]]
+ if("kepori_head_feathers")
+ S = GLOB.kepori_head_feathers_list[H.dna.features["kepori_head_feathers"]]
if("kepori_tail_feathers")
S = GLOB.kepori_tail_feathers_list[H.dna.features["kepori_tail_feathers"]]
if("kepori_feathers")
@@ -1247,7 +1260,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(ITEM_SLOT_ID)
- if(H.wear_id && !swap)
+ if(H.wear_id)
+ if(SEND_SIGNAL(H.wear_id, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE))
+ return TRUE
return FALSE
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
@@ -1526,7 +1541,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
user.visible_message("[user] starts stealing [target]'s [I.name]!",
"You start stealing [target]'s [I.name]...", null, null, target)
to_chat(target, "[user] starts stealing your [I.name]!")
- if(do_after(user, I.strip_delay, TRUE, target, TRUE))
+ if(do_after(user, I.strip_delay, target))
target.dropItemToGround(I, TRUE)
user.put_in_hands(I)
user.visible_message("[user] stole [target]'s [I.name]!",
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 44396246a146..726690d3c32f 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -274,7 +274,7 @@
var/static/mutable_appearance/overcharge //shameless copycode from lightning spell
overcharge = overcharge || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER)
_human.add_overlay(overcharge)
- if(do_mob(_human, _human, 50, 1))
+ if(do_after(_human, 50, _human, TRUE))
_human.flash_lighting_fx(5, 7, current_color)
var/obj/item/organ/stomach/ethereal/stomach = _human.getorganslot(ORGAN_SLOT_STOMACH)
playsound(_human, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index eb78ef131644..14526059354d 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -313,7 +313,7 @@
H.notransform = TRUE
- if(do_after(owner, delay=60, needhand=FALSE, target=owner, progress=TRUE))
+ if(do_after(owner, delay = 60, target = owner, progress = TRUE, timed_action_flags = IGNORE_HELD_ITEM))
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
make_dupe()
else
diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm
index 5693c646cf3f..3278d3d77c1e 100644
--- a/code/modules/mob/living/carbon/human/species_types/kepori.dm
+++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm
@@ -2,10 +2,10 @@
name = "\improper Kepori"
id = SPECIES_KEPORI
default_color = "6060FF"
- species_traits = list(MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY)
+ species_traits = list(SCLERA, MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY)
inherent_traits = list(TRAIT_SCOOPABLE)
- mutant_bodyparts = list("kepori_body_feathers", "kepori_tail_feathers", "kepori_feathers")
- default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "Plain", "kepori_body_feathers" = "Plain", "kepori_tail_feathers" = "Fan", "body_size" = "Normal")
+ mutant_bodyparts = list("kepori_body_feathers", "kepori_head_feathers", "kepori_tail_feathers", "kepori_feathers")
+ default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "None", "kepori_head_feathers" = "None", "kepori_body_feathers" = "None", "kepori_tail_feathers" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken
disliked_food = FRIED | GROSS | CLOTH
liked_food = MEAT | GORE
@@ -15,7 +15,7 @@
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
species_clothing_path = 'icons/mob/clothing/species/kepori.dmi'
- species_eye_path = 'icons/mob/kepori_parts.dmi'
+ species_eye_path = 'icons/mob/species/kepori/kepori_eyes.dmi'
heatmod = 0.67
coldmod = 1.5
brutemod = 1.5
@@ -57,17 +57,64 @@
species_robotic_l_leg = /obj/item/bodypart/leg/left/robot/surplus/kepori
species_robotic_r_leg = /obj/item/bodypart/leg/right/robot/surplus/kepori
+ robotic_eyes = /obj/item/organ/eyes/robotic/kepori
+
/datum/species/kepori/New()
. = ..()
// This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason.
// Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes,
// BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly.
offset_clothing = list(
- "[HEAD_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)),
- "[GLASSES_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)),
- "[FACEMASK_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -5), "[EAST]" = list("x" = 4, "y" = -5), "[SOUTH]" = list("x" = 0, "y" = -5), "[WEST]" = list("x" = -4, "y" = -5)),
+ "[HEAD_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3), //ISSUE: The head sprites seem to be cut off when given an offset this large, combined with kepori offset
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[GLASSES_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3),
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[FACEMASK_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3),
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[BELT_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -1),
+ "[EAST]" = list("x" = 8, "y" = -1),
+ "[SOUTH]" = list("x" = 8, "y" = -1),
+ "[WEST]" = list("x" = 9, "y" = -1)
+ ),
+ "[EARS_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3),
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[SUIT_STORE_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -1),
+ "[EAST]" = list("x" = 8, "y" = -1),
+ "[SOUTH]" = list("x" = 8, "y" = -1),
+ "[WEST]" = list("x" = -8, "y" = -1)
+ ),
)
+// First list is left hand, second list is right hand. This is used for inhand offsets.
+/datum/species/kepori/get_item_offsets_for_dir(dir, hand)
+ //LEFT/RIGHT
+ if(dir & NORTH)
+ return list(list("x" = 9, "y" = -1), list("x" = 7, "y" = -1))
+ if(dir & SOUTH)
+ return list(list("x" = 7, "y" = -1), list("x" = 9, "y" = -1))
+ if(dir & EAST)
+ return list(list("x" = 18, "y" = -2), list("x" = 21, "y" = -2)) //("x" = 18, "y" = 2), list("x" = 21, "y" = -1))
+ if(dir & WEST)
+ return list(list("x" = -4, "y" = -2), list("x" = -1, "y" = -2)) //("x" = -5, "y" = -1), list("x" = -1, "y" = 2))
+
/datum/species/kepori/random_name(gender,unique,lastname)
if(unique)
return random_unique_kepori_name()
@@ -86,17 +133,27 @@
return equip_delay_self_check(I, H, bypass_equip_delay_self)
/datum/species/kepori/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
- ..()
+ . = ..()
+
+ C.base_pixel_x -= 8
+ C.pixel_x = C.base_pixel_x
+ C.update_hands_on_rotate()
+
if(ishuman(C))
keptackle = new
keptackle.Grant(C)
/datum/species/kepori/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
+ . = ..()
+
+ C.base_pixel_x += 8
+ C.pixel_x = C.base_pixel_x
+ C.stop_updating_hands()
+
if(keptackle)
keptackle.Remove(C)
- qdel(C.GetComponent(/datum/component/tackler))
- ..()
+ qdel(C.GetComponent(/datum/component/tackler))
/datum/action/innate/keptackle
name = "Pounce"
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 6cb15357cc64..c34a70b3afde 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -21,7 +21,6 @@
exotic_bloodtype = "L"
disliked_food = GRAIN | DAIRY | CLOTH | GROSS
liked_food = GORE | MEAT
- inert_mutation = FIREBREATH
deathsound = 'sound/voice/lizard/deathsound.ogg'
wings_icons = list("Dragon")
species_language_holder = /datum/language_holder/lizard
diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm
index 9c0f58dc8312..764a7166ff2d 100644
--- a/code/modules/mob/living/carbon/human/species_types/spider.dm
+++ b/code/modules/mob/living/carbon/human/species_types/spider.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
var/nutrition_threshold = NUTRITION_LEVEL_FED
if (H.nutrition >= nutrition_threshold)
to_chat(H, "You begin spinning some web...")
- if(!do_after(H, 10 SECONDS, 1, T))
+ if(!do_after(H, 10 SECONDS, T, hidden = TRUE))
to_chat(H, "Your web spinning was interrupted!")
return
if(prob(75))
@@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
to_chat(H, "You cannot wrap this.")
return
H.visible_message("[H] starts to wrap [A] into a cocoon!","You start to wrap [A] into a cocoon.")
- if(!do_after(H, 10 SECONDS, 1, A))
+ if(!do_after(H, 10 SECONDS, A, hidden = TRUE))
to_chat(H, "Your web spinning was interrupted!")
return
H.adjust_nutrition(E.spinner_rate * -3.5)
diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm
index fd03e184b9ba..b9cc8306762e 100644
--- a/code/modules/mob/living/carbon/human/species_types/vox.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vox.dm
@@ -67,14 +67,29 @@
/datum/species/vox/New()
. = ..()
+ // This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason.
+ // Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes,
+ // BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly.
+ offset_clothing = list(
+ "[SUIT_STORE_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = 0),
+ "[EAST]" = list("x" = 8, "y" = 0),
+ "[SOUTH]" = list("x" = 8, "y" = 0),
+ "[WEST]" = list("x" = -8, "y" = 0)
+ ),
+ "[EARS_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = 0),
+ "[EAST]" = list("x" = 8, "y" = 0),
+ "[SOUTH]" = list("x" = 8, "y" = 0),
+ "[WEST]" = list("x" = -8, "y" = 0)
+ ),
+ )
/datum/species/vox/random_name(gender,unique,lastname)
if(unique)
return random_unique_vox_name()
return vox_name()
-
-
/datum/species/vox/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
. = ..()
C.base_pixel_x -= 9
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index ecab0660abc6..f5c9f6114837 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1,5 +1,4 @@
#define RESOLVE_ICON_STATE(I) (I.mob_overlay_state || I.icon_state)
-#define CHECK_USE_AUTOGEN (handled_by_bodytype ? null : dna.species) //Is this gross overuse of macros? Yes. Fuck you.
///////////////////////
//UPDATE_ICONS SYSTEM//
@@ -111,9 +110,6 @@ There are several things that need to be remembered:
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
return
- var/target_overlay = U.icon_state
- if(U.adjusted == ALT_STYLE)
- target_overlay = "[target_overlay]_d"
var/t_color = U.item_color
@@ -122,10 +118,18 @@ There are several things that need to be remembered:
if(U.adjusted == ALT_STYLE)
t_color = "[t_color]_d"
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/uniform_overlay
+ ///icon file of the clothing
var/icon_file = U.mob_overlay_icon
- var/handled_by_bodytype = TRUE
+ ///The icon state to overlay
+ var/target_overlay = U.icon_state
+ if(U.adjusted == ALT_STYLE)
+ target_overlay = "[target_overlay]_d"
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
if(!uniform_overlay)
//Kapu's autistic attempt at digitigrade handling
//Hi Kapu
@@ -135,21 +139,29 @@ There are several things that need to be remembered:
icon_file = U.mob_overlay_icon
target_overlay = "[target_overlay]_digi"
- else if((dna.species.bodytype & BODYTYPE_VOX) && (U.supports_variations & VOX_VARIATION))
- icon_file = VOX_UNIFORM_PATH
- if(U.vox_override_icon)
- icon_file = U.vox_override_icon
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(U.supports_variations & VOX_VARIATION)
+ icon_file = VOX_UNIFORM_PATH
+ if(U.vox_override_icon)
+ icon_file = U.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(U.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_UNIFORM_PATH
+ if(U.kepoi_override_icon)
+ icon_file = U.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
- else if((dna.species.bodytype & BODYTYPE_KEPORI) && (U.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_UNIFORM_PATH
- if(U.kepoi_override_icon)
- icon_file = U.kepoi_override_icon
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(U))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = U.mob_overlay_icon || DEFAULT_UNIFORM_PATH
- uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = use_autogen)
if(!uniform_overlay)
return
@@ -176,7 +188,8 @@ There are several things that need to be remembered:
var/handled_by_bodytype
//TODO: add an icon file for ID slot stuff, so it's less snowflakey
- id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = use_autogen)
if(!id_overlay)
return
@@ -206,29 +219,41 @@ There are several things that need to be remembered:
//Bloody hands end
- var/mutable_appearance/gloves_overlay
+
if(gloves)
var/obj/item/I = gloves
update_hud_gloves(I)
- var/handled_by_bodytype = TRUE
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/gloves_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_GLOVES_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_GLOVES_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_GLOVES_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_GLOVES_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_GLOVES_PATH
- gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen)
if(!gloves_overlay)
return
@@ -250,25 +275,37 @@ There are several things that need to be remembered:
var/obj/item/I = glasses
update_hud_glasses(I)
if(!(head?.flags_inv & HIDEEYES) && !(wear_mask?.flags_inv & HIDEEYES))
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/glasses_overlay
- var/handled_by_bodytype = TRUE
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_GLASSES_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
-/*uncomment post kepori resprite
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_GLASSES_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
-*/
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_GLASSES_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_GLASSES_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
+
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_GLASSES_PATH
- glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen)
if(!glasses_overlay)
return
@@ -288,27 +325,38 @@ There are several things that need to be remembered:
if(ears)
var/obj/item/I = ears
- var/mutable_appearance/ears_overlay
update_hud_ears(I)
- var/handled_by_bodytype = TRUE
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/ears_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_EARS_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_EARS_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_EARS_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
-/*uncomment post kepori resprite
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_EARS_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
-*/
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_EARS_PATH
- ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = use_autogen)
if(!ears_overlay)
return
@@ -328,11 +376,17 @@ There are several things that need to be remembered:
if(shoes)
var/obj/item/I = shoes
+ update_hud_shoes(I)
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/shoes_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
var/target_overlay = I.icon_state
- update_hud_shoes(I)
- var/handled_by_bodytype = TRUE
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)))
var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG)
@@ -342,21 +396,28 @@ There are several things that need to be remembered:
icon_file = I.mob_overlay_icon
target_overlay = "[target_overlay]_digi"
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_SHOES_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_SHOES_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_SHOES_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_SHOES_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_SHOES_PATH
- shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay)
if(!shoes_overlay)
return
@@ -394,25 +455,37 @@ There are several things that need to be remembered:
inv.update_appearance()
if(head)
var/obj/item/I = head
- var/mutable_appearance/head_overlay
update_hud_head(I)
- var/handled_by_bodytype = TRUE
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/head_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
var/target_overlay = I.icon_state
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD)
if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION))
target_overlay = "[target_overlay]_snouted"
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_HEAD_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_HEAD_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_HEAD_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_HEAD_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
// [CELADON-ADD] - TAJARA
if((I.supports_variations & TAJARA_VARIATION) && (dna.species.bodytype & BODYTYPE_TAJARA))
@@ -420,10 +493,11 @@ There are several things that need to be remembered:
// [/CELADON-ADD]
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_HEAD_PATH
- head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay)
if(!head_overlay)
return
@@ -441,26 +515,39 @@ There are several things that need to be remembered:
if(belt)
var/obj/item/I = belt
- var/mutable_appearance/belt_overlay
update_hud_belt(I)
- var/handled_by_bodytype
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/belt_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
- if((I.supports_variations & VOX_VARIATION) && (dna.species.bodytype & BODYTYPE_VOX))
- icon_file = VOX_BELT_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_BELT_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- //if((I.supports_variations & KEPORI_VARIATION) && (dna.species.bodytype & BODYTYPE_KEPORI))
- //icon_file = KEPORI_BELT_PATH
- //if(I.kepoi_override_icon)
-// icon_file = I.kepoi_override_icon
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_BELT_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_BELT_PATH
- belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen)
if(!belt_overlay)
return
@@ -479,27 +566,39 @@ There are several things that need to be remembered:
if(wear_suit)
var/obj/item/I = wear_suit
- var/mutable_appearance/suit_overlay
update_hud_wear_suit(I)
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/suit_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
var/target_overlay = I.icon_state
- var/handled_by_bodytype = TRUE
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)))
icon_file = DIGITIGRADE_SUIT_PATH
if((I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))
icon_file = I.mob_overlay_icon
target_overlay = "[target_overlay]_digi"
- else if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_SUIT_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_SUIT_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- else if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_SUIT_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_SUIT_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
// [CELADON-ADD] - TAJARA
else if((dna.species.bodytype & BODYTYPE_TAJARA) && (I.supports_variations & TAJARA_VARIATION))
@@ -507,10 +606,11 @@ There are several things that need to be remembered:
// [/CELADON-ADD]
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = I.mob_overlay_icon
- suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay)
if(!suit_overlay)
return
@@ -556,36 +656,50 @@ There are several things that need to be remembered:
if(wear_mask)
var/obj/item/I = wear_mask
update_hud_wear_mask(I)
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/mask_overlay
+
+ ///icon file of the clothing
var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
var/target_overlay = I.icon_state
- var/handled_by_bodytype = TRUE
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
if(!(ITEM_SLOT_MASK in check_obscured_slots()))
var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD)
if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION))
target_overlay = "[target_overlay]_snouted"
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_MASK_PATH
- if(I.vox_override_icon)
- icon_file = I.vox_override_icon
-
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_MASK_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_MASK_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_MASK_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
// [CELADON-ADD] - TAJARA
if((dna.species.bodytype & BODYTYPE_TAJARA) && (I.supports_variations & TAJARA_VARIATION))
icon_file = TAJARA_MASK_PATH
// [/CELADON-ADD]
+
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
icon_file = DEFAULT_MASK_PATH
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
- mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay)
if(!mask_overlay)
return
@@ -603,17 +717,48 @@ There are several things that need to be remembered:
if(wear_neck)
var/obj/item/I = wear_neck
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/neck_overlay
+
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = I.icon_state
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+
update_hud_neck(I)
if(!(ITEM_SLOT_NECK in check_obscured_slots()))
- var/icon_file = I.mob_overlay_icon
- var/handled_by_bodytype = TRUE
+
+ if(dna.species.bodytype & BODYTYPE_VOX) // there is neither a vox or kepori neck path, we just tell it to greyscale no matter what
+// if(I.supports_variations & VOX_VARIATION)
+// icon_file = VOX_NECK_PATH
+// if(I.vox_override_icon)
+// icon_file = I.vox_override_icon
+// else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+// if(I.supports_variations & KEPORI_VARIATION)
+// icon_file = KEPORI_NECK_PATH
+// if(I.kepoi_override_icon)
+// icon_file = I.kepoi_override_icon
+// else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_NECK_PATH
- overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ neck_overlay = I.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay)
+ if(!neck_overlay)
+ return
+
+ overlays_standing[NECK_LAYER] = neck_overlay
apply_overlay(NECK_LAYER)
@@ -626,23 +771,42 @@ There are several things that need to be remembered:
if(back)
var/obj/item/I = back
- var/mutable_appearance/back_overlay
update_hud_back(I)
- var/icon_file = I.mob_overlay_icon
- var/handled_by_bodytype = TRUE
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_BACK_PATH
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/back_overlay
- if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
- icon_file = DEFAULT_BACK_PATH
- handled_by_bodytype = FALSE
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
- back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ /// Does this clothing need to be generated via greyscale
+ var/handled_by_bodytype = FALSE
if(!back_overlay)
- return
- overlays_standing[BACK_LAYER] = back_overlay
- apply_overlay(BACK_LAYER)
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_BACK_PATH
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+// if(I.supports_variations & KEPORI_VARIATION)
+// icon_file = KEPORI_BACK_PATH
+// else
+ handled_by_bodytype = TRUE
+
+ if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
+ icon_file = DEFAULT_BACK_PATH
+ handled_by_bodytype = TRUE
+
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = use_autogen)
+
+ if(!back_overlay)
+ return
+ overlays_standing[BACK_LAYER] = back_overlay
+
+ if(back_overlay) //This is faster fuck you
+ apply_overlay(BACK_LAYER)
/mob/living/carbon/human/update_inv_legcuffed()
remove_overlay(LEGCUFF_LAYER)
@@ -783,6 +947,7 @@ in this situation default_icon_file is expected to match either the lefthand_ or
^this female part sucks and will be fully ripped out ideally
*/
+// Note: if handled_by_bodytype is TRUE before calling this, it makes species use greyscale
/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, override_state = null, override_file = null, datum/species/mob_species = null, direction = null)
// WS Edit Start - Worn Icon State
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 7a995dea28da..d5b97a942da2 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -84,6 +84,9 @@
if(ITEM_SLOT_BACKPACK)
if(!back || !SEND_SIGNAL(back, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE))
not_handled = TRUE
+ if(ITEM_SLOT_ID)
+ if(!wear_id || !SEND_SIGNAL(wear_id, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE))
+ not_handled = TRUE
else
not_handled = TRUE
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 1f730de799d0..8fd4e89566c7 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -296,7 +296,7 @@
return IsStandingStill()
/mob/living/carbon/monkey/proc/pickpocket(mob/M)
- if(do_mob(src, M, MONKEY_ITEM_SNATCH_DELAY) && pickupTarget)
+ if(do_after(src, MONKEY_ITEM_SNATCH_DELAY, M) && pickupTarget)
for(var/obj/item/I in M.held_items)
if(I == pickupTarget)
M.visible_message("[src] snatches [pickupTarget] from [M].", "[src] snatched [pickupTarget]!")
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 6a66c0546f6e..755c674a107d 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -75,8 +75,6 @@
var/amount
if(reagents.has_reagent(/datum/reagent/medicine/morphine))
amount = -1
- if(reagents.has_reagent(/datum/reagent/consumable/nuka_cola))
- amount = -1
if(amount)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_reagent_speedmod, TRUE, amount)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 30005533d720..0c8abce5741b 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -507,7 +507,7 @@
/mob/living/proc/get_up(instant = FALSE)
set waitfor = FALSE
- if(!instant && !do_mob(src, src, 2 SECONDS, uninterruptible = TRUE, extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback))))
+ if(!instant && !do_after(src, 1 SECONDS, src, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM), extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback)), interaction_key = DOAFTER_SOURCE_GETTING_UP))
return
if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED))
return
@@ -977,7 +977,7 @@
"[src] tries to remove your [what.name].", null, null, src)
to_chat(src, "You try to remove [who]'s [what.name]...")
what.add_fingerprint(src)
- if(do_mob(src, who, what.strip_delay))
+ if(do_after(src, what.strip_delay, who, interaction_key = what))
if(what && Adjacent(who))
if(islist(where))
var/list/L = where
@@ -1024,7 +1024,7 @@
who.visible_message("[src] tries to put [what] on [who].", \
"[src] tries to put [what] on you.", null, null, src)
to_chat(src, "You try to put [what] on [who]...")
- if(do_mob(src, who, what.equip_delay_other))
+ if(do_after(src, what.equip_delay_other, who))
if(what && Adjacent(who) && what.mob_can_equip(who, src, final_where, TRUE, TRUE))
if(temporarilyRemoveItemFromInventory(what))
if(where_list)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index b5b0b7e29c4e..2ed00efe2e4b 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -182,7 +182,7 @@
log_combat(user, src, "attempted to neck grab", addition="neck grab")
if(GRAB_NECK)
log_combat(user, src, "attempted to strangle", addition="kill grab")
- if(!do_mob(user, src, grab_upgrade_time))
+ if(!do_after(user, grab_upgrade_time, src))
return 0
if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state)
return 0
@@ -407,15 +407,13 @@
if(client)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE)
else
- switch(rand(1, 4))
+ switch(rand(1, 3))
if(1)
new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src))
if(2)
new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src))
if(3)
new /mob/living/simple_animal/hostile/construct/artificer/hostile(get_turf(src))
- if(4)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(get_turf(src))
spawn_dust()
gib()
return TRUE
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 1f574f08a450..9f3b85fd4a92 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -74,7 +74,7 @@
var/emitterregen = 0.25
var/emittercd = 50
var/emitteroverloadcd = 100
- var/emittersemicd = FALSE
+ var/emittercurrent_cooldown = FALSE
var/overload_ventcrawl = 0
var/overload_bulletblock = 0 //Why is this a good idea?
@@ -125,7 +125,7 @@
. = ..()
- emittersemicd = TRUE
+ emittercurrent_cooldown = TRUE
addtimer(CALLBACK(src, PROC_REF(emittercool)), 600)
if(!holoform)
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index ec49e59ecace..4a3e284addd6 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -50,7 +50,7 @@
user.do_attack_animation(src)
if (user.name == master)
visible_message("Responding to its master's touch, [src] disengages its holochassis emitter, rapidly losing coherence.")
- if(do_after(user, 1 SECONDS, TRUE, src))
+ if(do_after(user, 1 SECONDS, src, hidden = TRUE))
fold_in()
if(user.put_in_hands(card))
user.visible_message("[user] promptly scoops up [user.p_their()] pAI's card.")
diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm
index 31a807b319b2..8d50f4a389f4 100644
--- a/code/modules/mob/living/silicon/pai/pai_shell.dm
+++ b/code/modules/mob/living/silicon/pai/pai_shell.dm
@@ -12,11 +12,11 @@
. = fold_in(force)
return
- if(emittersemicd)
+ if(emittercurrent_cooldown)
to_chat(src, "Error: Holochassis emitters recycling. Please try again later.")
return FALSE
- emittersemicd = TRUE
+ emittercurrent_cooldown = TRUE
addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED)
REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED)
@@ -42,10 +42,10 @@
holoform = TRUE
/mob/living/silicon/pai/proc/emittercool()
- emittersemicd = FALSE
+ emittercurrent_cooldown = FALSE
/mob/living/silicon/pai/proc/fold_in(force = FALSE)
- emittersemicd = TRUE
+ emittercurrent_cooldown = TRUE
if(!force)
addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd)
else
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index d15c20f1aa1d..980f12897e70 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -280,7 +280,7 @@
/mob/living/simple_animal/bot/floorbot/proc/is_hull_breach(turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas.
var/area/t_area = get_area(t)
- if(istype(t_area, /area/space) || istype(t_area, /area/solar) || istype(t_area, /area/asteroid))
+ if(istype(t_area, /area/space) || istype(t_area, /area/asteroid))
return FALSE
else
return TRUE
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 3a07ffc4cb8d..22d68c8a6190 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -488,6 +488,9 @@
return TRUE
/mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H)
+ if(DOING_INTERACTION_WITH_TARGET(H, src))
+ to_chat(H, "You're already interacting with [src].")
+ return
if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED)
H.visible_message("[H] begins tipping over [src].", "You begin tipping over [src]...")
@@ -574,7 +577,7 @@
C.visible_message("[src] is trying to tend the wounds of [patient]!", \
"[src] is trying to tend your wounds!")
- if(do_mob(src, patient, 20)) //Slightly faster than default tend wounds, but does less HPS
+ if(do_after(src, 2 SECONDS, patient)) //Slightly faster than default tend wounds, but does less HPS
if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient))
var/healies = heal_amount
var/obj/item/storage/firstaid/FA = firstaid
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index a1b10b897db6..1b8004cbd5b5 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -125,7 +125,7 @@
/datum/outfit/frontier
name = "Frontiersman Corpse"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/sec/frontier
gloves = /obj/item/clothing/gloves/color/black
@@ -151,11 +151,11 @@
/datum/outfit/frontier/officer
name = "Frontiersman Officer Corpse"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
suit = /obj/item/clothing/suit/armor/frontier
shoes = /obj/item/clothing/shoes/combat
ears = /obj/item/radio/headset
- head = /obj/item/clothing/head/caphat/frontier
+ head = /obj/item/clothing/head/frontier/peaked
/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy
outfit = /datum/outfit/frontier/trooper/heavy
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index 8aeb3b64a8cd..16f377cb1b01 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -17,7 +17,7 @@
if("Cannibalize")
if(D.health < D.maxHealth)
D.visible_message("[D] begins to cannibalize parts from [src].", "You begin to cannibalize parts from [src]...")
- if(do_after(D, 60, 0, target = src))
+ if(do_after(D, 60, src, FALSE))
D.visible_message("[D] repairs itself using [src]'s remains!", "You repair yourself using [src]'s remains.")
D.adjustBruteLoss(-src.maxHealth)
new /obj/effect/decal/cleanable/oil/streak(get_turf(src))
@@ -79,7 +79,7 @@
to_chat(user, "You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)].")
return
user.visible_message("[user] begins to reactivate [src].", "You begin to reactivate [src]...")
- if(do_after(user, 30, 1, target = src))
+ if(do_after(user, 30, target = src))
revive(full_heal = TRUE, admin_revive = FALSE)
user.visible_message("[user] reactivates [src]!", "You reactivate [src].")
alert_drones(DRONE_NET_CONNECT)
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index cf1b0de8ae70..f2fbf6e5b262 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -165,7 +165,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
visible_message(
"[src] starts eating away [A]...",
"You start eating the [A]...")
- if(do_after(src, 30, FALSE, A))
+ if(do_after(src, 30, A, hidden = TRUE))
if(QDELETED(A))
return
visible_message(
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index 1e02c89c81f7..57f1b1892f9d 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -134,7 +134,7 @@
"You start to faintly glow, and you feel strangely weightless!")
do_attack_animation(A)
- if(!do_mob(src, A, 60)) //now start the channel
+ if(!do_after(src, 6 SECONDS, A)) //now start the channel
to_chat(src, "You need to hold still!")
return
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
deleted file mode 100644
index 57d6f2fc325f..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ /dev/null
@@ -1,171 +0,0 @@
-//Paper Wizard Boss
-/mob/living/simple_animal/hostile/boss/paper_wizard
- name = "Mjor the Creative"
- desc = "A wizard with a taste for the arts."
- mob_biotypes = MOB_HUMANOID
- boss_abilities = list(/datum/action/boss/wizard_summon_minions, /datum/action/boss/wizard_mimic)
- faction = list("hostile","stickman")
- del_on_death = TRUE
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "paperwizard"
- ranged = 1
- environment_smash = ENVIRONMENT_SMASH_NONE
- minimum_distance = 3
- retreat_distance = 3
- obj_damage = 0
- melee_damage_lower = 10
- melee_damage_upper = 20
- health = 1000
- maxHealth = 1000
- loot = list(/obj/effect/temp_visual/paperwiz_dying)
- projectiletype = /obj/projectile/temp
- projectilesound = 'sound/weapons/emitter.ogg'
- attack_sound = 'sound/hallucinations/growl1.ogg'
- var/list/copies = list()
-
- footstep_type = FOOTSTEP_MOB_SHOE
-
-
-//Summon Ability
-//Lets the wizard summon his art to fight for him
-/datum/action/boss/wizard_summon_minions
- name = "Summon Minions"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "art_summon"
- usage_probability = 40
- boss_cost = 30
- boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
- needs_target = FALSE
- say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!"
- var/static/summoned_minions = 0
-
-/datum/action/boss/wizard_summon_minions/Trigger()
- if(summoned_minions <= 6 && ..())
- var/list/minions = list(
- /mob/living/simple_animal/hostile/stickman,
- /mob/living/simple_animal/hostile/stickman/ranged,
- /mob/living/simple_animal/hostile/stickman/dog)
- var/list/directions = GLOB.cardinals.Copy()
- for(var/i in 1 to 3)
- var/minions_chosen = pick_n_take(minions)
- new minions_chosen (get_step(boss,pick_n_take(directions)), 1)
- summoned_minions += 3;
-
-
-//Mimic Ability
-//Summons mimics of himself with magical papercraft
-//Hitting a decoy hurts nearby people excluding the wizard himself
-//Hitting the wizard himself destroys all decoys
-/datum/action/boss/wizard_mimic
- name = "Craft Mimicry"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "mimic_summon"
- usage_probability = 30
- boss_cost = 40
- boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
- say_when_triggered = ""
-
-/datum/action/boss/wizard_mimic/Trigger()
- if(..())
- var/mob/living/target
- if(!boss.client) //AI's target
- target = boss.target
- else //random mob
- var/list/threats = boss.PossibleThreats()
- if(threats.len)
- target = pick(threats)
- if(target)
- var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss
- var/directions = GLOB.cardinals.Copy()
- for(var/i in 1 to 3)
- var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions)))
- wiz.copies += C
- C.original = wiz
- C.say("My craft defines me, you could even say it IS me!")
- wiz.say("My craft defines me, you could even say it IS me!")
- wiz.forceMove(get_step(target,pick_n_take(directions)))
- wiz.minimum_distance = 1 //so he doesn't run away and ruin everything
- wiz.retreat_distance = 0
- else
- boss.atb.refund(boss_cost)
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy
- desc = "'Tis a ruse!"
- health = 1
- maxHealth = 1
- alpha = 200
- boss_abilities = list()
- melee_damage_lower = 1
- melee_damage_upper = 5
- minimum_distance = 0
- retreat_distance = 0
- ranged = 0
- loot = list()
- var/mob/living/simple_animal/hostile/boss/paper_wizard/original
-
-//Hit a fake? eat pain!
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(amount > 0) //damage
- if(original)
- original.minimum_distance = 3
- original.retreat_distance = 3
- original.copies -= src
- for(var/c in original.copies)
- qdel(c)
- for(var/mob/living/L in range(5,src))
- if(L == original || istype(L, type))
- continue
- L.adjustBruteLoss(50)
- qdel(src)
- else
- . = ..()
-
-//Hit the real guy? copies go bai-bai
-/mob/living/simple_animal/hostile/boss/paper_wizard/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0)//damage
- minimum_distance = 3
- retreat_distance = 3
- for(var/copy in copies)
- qdel(copy)
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user)
- . = ..()
- qdel(src) //I see through your ruse!
-
-//fancy effects
-/obj/effect/temp_visual/paper_scatter
- name = "scattering paper"
- desc = "Pieces of paper scattering to the wind."
- layer = ABOVE_OPEN_TURF_LAYER
- icon = 'icons/effects/effects.dmi'
- icon_state = "paper_scatter"
- anchored = TRUE
- duration = 5
- randomdir = FALSE
-
-/obj/effect/temp_visual/paperwiz_dying
- name = "craft portal"
- desc = "A wormhole sucking the wizard into the void. Neat."
- layer = ABOVE_OPEN_TURF_LAYER
- icon = 'icons/effects/effects.dmi'
- icon_state = "paperwiz_poof"
- anchored = TRUE
- duration = 18
- randomdir = FALSE
-
-/obj/effect/temp_visual/paperwiz_dying/Initialize()
- . = ..()
- visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!")
- playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, TRUE, TRUE)
- playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, TRUE, TRUE)
-
-/obj/effect/temp_visual/paperwiz_dying/Destroy()
- for(var/mob/M in range(7,src))
- shake_camera(M, 7, 1)
- var/turf/T = get_turf(src)
- playsound(T,'sound/magic/summon_magic.ogg', 50, TRUE, TRUE)
- new /obj/effect/temp_visual/paper_scatter(T)
- new /obj/item/clothing/suit/wizrobe/paper(T)
- new /obj/item/clothing/head/collectable/paper(T)
- return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
deleted file mode 100644
index 5c3e60c8377b..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-/mob/living/simple_animal/hostile/dark_wizard
- name = "Dark Wizard"
- desc = "Killing amateurs since the dawn of times."
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "dark_wizard"
- icon_living = "dark_wizard"
- move_to_delay = 10
- projectiletype = /obj/projectile/temp/earth_bolt
- projectilesound = 'sound/magic/ethereal_enter.ogg'
- ranged = TRUE
- ranged_message = "earth bolts"
- ranged_cooldown_time = 20
- maxHealth = 50
- health = 50
- harm_intent_damage = 5
- obj_damage = 20
- melee_damage_lower = 5
- melee_damage_upper = 5
- attack_verb_continuous = "staves"
- a_intent = INTENT_HARM
- speak_emote = list("chants")
- attack_sound = 'sound/weapons/bladeslice.ogg'
- aggro_vision_range = 9
- turns_per_move = 5
- gold_core_spawnable = HOSTILE_SPAWN
- faction = list(ROLE_WIZARD)
- footstep_type = FOOTSTEP_MOB_SHOE
- weather_immunities = list("lava","ash")
- minbodytemp = 0
- maxbodytemp = INFINITY
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- loot = list(/obj/effect/decal/remains/human)
- del_on_death = TRUE
-
-/obj/projectile/temp/earth_bolt
- name = "earth bolt"
- icon_state = "declone"
- damage = 4
- damage_type = BURN
- flag = "energy"
- temperature = -100 // closer to the old temp loss
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 526763e875b7..70ce3f665bab 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -30,7 +30,7 @@
var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time
var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is
var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash
- var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
+ var/check_friendly_fire = FALSE // Should the ranged mob check for friendlies when shooting
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
similarity index 88%
rename from code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
rename to code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
index 67d7d3e00040..0f14f615e5b6 100644
--- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
@@ -1,41 +1,27 @@
-/mob/living/simple_animal/hostile/cat_butcherer
+/mob/living/simple_animal/hostile/human/cat_butcherer
name = "Cat Surgeon"
desc = "Feline genemod physiological modification surgery is outlawed in Nanotrasen-controlled sectors. This doctor doesn't seem to care, and thus, is wanted for several warcrimes."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "cat_butcher"
icon_living = "cat_butcher"
- icon_dead = "syndicate_dead"
- icon_gib = "syndicate_gib"
projectiletype = /obj/projectile/bullet/dart/tranq
projectilesound = 'sound/items/syringeproj.ogg'
- ranged = 1
+ ranged = TRUE
ranged_message = "fires the syringe gun at"
ranged_cooldown_time = 30
speak_chance = 0
- turns_per_move = 5
- speed = 0
stat_attack = HARD_CRIT
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
attack_verb_continuous = "slashes at"
attack_verb_simple = "slash at"
attack_sound = 'sound/weapons/circsawhit.ogg'
- a_intent = INTENT_HARM
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
loot = list(/obj/effect/mob_spawn/human/corpse/cat_butcher, /obj/item/circular_saw, /obj/item/gun/syringe)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
faction = list("hostile")
- check_friendly_fire = 1
- status_flags = CANPUSH
- del_on_death = 1
+ check_friendly_fire = TRUE
var/impatience = 0
-/mob/living/simple_animal/hostile/cat_butcherer/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/human/cat_butcherer/CanAttack(atom/the_target)
if(iscarbon(target))
var/mob/living/carbon/human/C = target
if(C.getorgan(/obj/item/organ/ears/cat) && C.getorgan(/obj/item/organ/tail/cat) && C.has_trauma_type(/datum/brain_trauma/severe/pacifism))//he wont attack his creations
@@ -45,7 +31,7 @@
return FALSE
return ..()
-/mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget()
+/mob/living/simple_animal/hostile/human/cat_butcherer/AttackingTarget()
if(iscarbon(target))
var/mob/living/carbon/human/L = target
if(!L.getorgan(/obj/item/organ/ears/cat) && L.stat >= UNCONSCIOUS) //target doesnt have cat ears
diff --git a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
similarity index 70%
rename from code/modules/mob/living/simple_animal/hostile/frontiersman.dm
rename to code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
index 213cd8c2b822..040b6b26ae2a 100644
--- a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
@@ -1,36 +1,18 @@
-/mob/living/simple_animal/hostile/frontier
+/mob/living/simple_animal/hostile/human/frontier
name = "Frontiersman"
desc = "A frontiersman! A terrorist that would probably kill everyone without mercy."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "frontiersmanmelee"
icon_living = "frontiersmanmelee"
icon_dead = "frontiersmanmelee_dead"
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
- turns_per_move = 5
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
loot = list(/obj/effect/mob_spawn/human/corpse/frontier,
/obj/item/kitchen/knife)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
faction = list(FACTION_ANTAG_FRONTIERSMEN)
- status_flags = CANPUSH
- del_on_death = 1
- footstep_type = FOOTSTEP_MOB_SHOE
-
-
-/mob/living/simple_animal/hostile/frontier/ranged
+/mob/living/simple_animal/hostile/human/frontier/ranged
icon_state = "frontiersmanranged"
icon_living = "frontiersmanranged"
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
@@ -41,10 +23,10 @@
projectilesound = 'sound/weapons/gun/revolver/shot.ogg'
casingtype = /obj/item/ammo_casing/a357
-/mob/living/simple_animal/hostile/frontier/ranged/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
-/mob/living/simple_animal/hostile/frontier/ranged/mosin
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin
icon_state = "frontiersmanrangedrifle"
icon_living = "frontiersmanrangedrifle"
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
@@ -52,10 +34,10 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
-/mob/living/simple_animal/hostile/frontier/ranged/mosin/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper
icon_state = "frontiersmanrangedelite"
icon_living = "frontiersmanrangedelite"
maxHealth = 170
@@ -65,10 +47,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/shotgun/brimstone)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm
icon_state = "frontiersmanrangedak47"
icon_living = "frontiersmanrangedak47"
projectilesound = 'sound/weapons/gun/rifle/skm.ogg'
@@ -78,10 +60,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/automatic/assault/skm)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm/neutured
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle
icon_state = "frontiersmanrangedmosin"
icon_living = "frontiersmanrangedmosin"
@@ -90,10 +72,10 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy
icon_state = "frontiersmanrangedminigun"
icon_living = "frontiersmanrangedminigun"
projectilesound = 'sound/weapons/laser4.ogg'
@@ -105,10 +87,10 @@
projectiletype = /obj/projectile/beam/weak/penetrator
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless)
-/mob/living/simple_animal/hostile/frontier/ranged/officer
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer
name = "Frontiersman Officer"
icon_state = "frontiersmanofficer"
icon_living = "frontiersmanofficer"
@@ -119,10 +101,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
/obj/item/gun/ballistic/automatic/pistol/APS)
-/mob/living/simple_animal/hostile/frontier/ranged/officer/neutured
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer)
-/mob/living/simple_animal/hostile/frontier/ranged/officer/Aggro()
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/Aggro()
..()
summon_backup(15)
say(pick("Help!!", "They're right here!!", "Don't let me die!!"))
diff --git a/code/modules/mob/living/simple_animal/hostile/human/human.dm b/code/modules/mob/living/simple_animal/hostile/human/human.dm
new file mode 100644
index 000000000000..633bd40090e8
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/human/human.dm
@@ -0,0 +1,41 @@
+/mob/living/simple_animal/hostile/human
+ name = "crazed human"
+ desc = "A crazed human, they cannot be reasoned with"
+ icon = 'icons/mob/simple_human.dmi'
+ icon_state = "survivor_base"
+ icon_living = "survivor_base"
+ icon_dead = null
+ icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
+
+ speak_chance = 20
+ speak_emote = list("groans")
+
+ turns_per_move = 5
+ speed = 0
+ maxHealth = 100
+ health = 100
+
+ robust_searching = TRUE
+ harm_intent_damage = 5
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attack_verb_continuous = "punches"
+ attack_verb_simple = "punch"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ a_intent = INTENT_HARM
+ response_help_continuous = "pushes"
+ response_help_simple = "push"
+
+ loot = list(/obj/effect/mob_spawn/human/corpse/damaged)
+ del_on_death = TRUE
+
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 15
+ minbodytemp = 180
+ status_flags = CANPUSH
+ del_on_death = TRUE
+
+ footstep_type = FOOTSTEP_MOB_SHOE
+
+ faction = list("hermit")
diff --git a/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm
new file mode 100644
index 000000000000..6c1676d202ab
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm
@@ -0,0 +1,80 @@
+/mob/living/simple_animal/hostile/human/nanotrasen
+ name = "\improper Nanotrasen Private Security Officer"
+ desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you."
+ icon_state = "nanotrasen"
+ icon_living = "nanotrasen"
+ speak_chance = 0
+ stat_attack = HARD_CRIT
+ melee_damage_upper = 15
+ loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ faction = list(ROLE_DEATHSQUAD)
+ check_friendly_fire = TRUE
+ dodging = TRUE
+
+/mob/living/simple_animal/hostile/human/nanotrasen/screaming
+ icon_state = "nanotrasen"
+ icon_living = "nanotrasen"
+
+/mob/living/simple_animal/hostile/human/nanotrasen/screaming/Aggro()
+ ..()
+ summon_backup(15)
+ say("411 in progress, requesting backup!")
+
+
+/mob/living/simple_animal/hostile/human/nanotrasen/ranged
+ icon_state = "nanotrasenranged"
+ icon_living = "nanotrasenranged"
+ ranged = 1
+ retreat_distance = 3
+ minimum_distance = 5
+ casingtype = /obj/item/ammo_casing/c45
+ projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg'
+
+
+/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg
+ icon_state = "nanotrasenrangedsmg"
+ icon_living = "nanotrasenrangedsmg"
+ rapid = 3
+ casingtype = /obj/item/ammo_casing/c46x30mm
+ projectilesound = 'sound/weapons/gun/smg/shot.ogg'
+
+/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault
+ name = "Nanotrasen Assault Officer"
+ desc = "A Nanotrasen Assault Officer. Prepare to die, if you've been found near Syndicate property."
+ icon_state = "nanotrasenrangedassault"
+ icon_living = "nanotrasenrangedassault"
+ icon_dead = null
+ icon_gib = "syndicate_gib"
+ ranged = TRUE
+ rapid = 4
+ rapid_fire_delay = 1
+ rapid_melee = 1
+ retreat_distance = 2
+ minimum_distance = 4
+ casingtype = /obj/item/ammo_casing/c46x30mm
+ projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
+ loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier)
+
+/mob/living/simple_animal/hostile/human/nanotrasen/elite
+ name = "Nanotrasen Elite Assault Officer"
+ desc = "Pray for your life, syndicate. Run while you can."
+ icon = 'icons/mob/simple_human.dmi'
+ icon_state = "nanotrasen_ert"
+ icon_living = "nanotrasen_ert"
+ maxHealth = 150
+ health = 150
+ melee_damage_lower = 13
+ melee_damage_upper = 18
+ ranged = TRUE
+ rapid = 3
+ rapid_fire_delay = 5
+ rapid_melee = 3
+ retreat_distance = 0
+ minimum_distance = 1
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ projectiletype = /obj/projectile/beam/laser
+ projectilesound = 'sound/weapons/laser.ogg'
+ loot = list(/obj/effect/gibspawner/human)
+ faction = list(ROLE_DEATHSQUAD)
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/human/pirate.dm
similarity index 67%
rename from code/modules/mob/living/simple_animal/hostile/pirate.dm
rename to code/modules/mob/living/simple_animal/hostile/human/pirate.dm
index b0bc7941fd69..df10cfa6a2b4 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/pirate.dm
@@ -1,35 +1,17 @@
-/mob/living/simple_animal/hostile/pirate
+/mob/living/simple_animal/hostile/human/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "pirate_dead"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
- turns_per_move = 5
- response_help_continuous = "pushes"
- response_help_simple = "push"
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
speak_emote = list("yarrs")
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
/obj/item/melee/transforming/energy/sword/saber/pirate)
- del_on_death = 1
faction = list("pirate")
-
-/mob/living/simple_animal/hostile/pirate/melee
+/mob/living/simple_animal/hostile/human/pirate/melee
name = "Pirate Swashbuckler"
icon_state = "piratemelee"
icon_living = "piratemelee"
@@ -44,7 +26,7 @@
footstep_type = FOOTSTEP_MOB_SHOE
-/mob/living/simple_animal/hostile/pirate/melee/space
+/mob/living/simple_animal/hostile/human/pirate/melee/space
name = "Space Pirate Swashbuckler"
icon_state = "piratespace"
icon_living = "piratespace"
@@ -53,23 +35,23 @@
minbodytemp = 0
speed = 1
-/mob/living/simple_animal/hostile/pirate/melee/space/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/melee/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
-/mob/living/simple_animal/hostile/pirate/melee/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/melee/Initialize()
. = ..()
sord = new(src)
-/mob/living/simple_animal/hostile/pirate/melee/Destroy()
+/mob/living/simple_animal/hostile/human/pirate/melee/Destroy()
QDEL_NULL(sord)
return ..()
-/mob/living/simple_animal/hostile/pirate/melee/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/melee/Initialize()
. = ..()
set_light(2)
-/mob/living/simple_animal/hostile/pirate/ranged
+/mob/living/simple_animal/hostile/human/pirate/ranged
name = "Pirate Gunner"
icon_state = "pirateranged"
icon_living = "pirateranged"
@@ -84,7 +66,7 @@
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
-/mob/living/simple_animal/hostile/pirate/ranged/space
+/mob/living/simple_animal/hostile/human/pirate/ranged/space
name = "Space Pirate Gunner"
icon_state = "piratespaceranged"
icon_living = "piratespaceranged"
@@ -93,6 +75,6 @@
minbodytemp = 0
speed = 1
-/mob/living/simple_animal/hostile/pirate/ranged/space/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/ranged/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
similarity index 87%
rename from code/modules/mob/living/simple_animal/hostile/skeleton.dm
rename to code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
index 0f05b34a2506..b251dda91e48 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
@@ -1,20 +1,16 @@
-/mob/living/simple_animal/hostile/skeleton
+/mob/living/simple_animal/hostile/human/skeleton
name = "reanimated skeleton"
desc = "A real bonefied skeleton, doesn't seem like it wants to socialize."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "skeleton"
icon_living = "skeleton"
icon_dead = "skeleton"
gender = NEUTER
mob_biotypes = MOB_UNDEAD|MOB_HUMANOID
- turns_per_move = 5
speak_emote = list("rattles")
emote_see = list("rattles")
- a_intent = INTENT_HARM
maxHealth = 40
health = 40
speed = 1
- harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
minbodytemp = 0
@@ -25,18 +21,15 @@
attack_sound = 'sound/hallucinations/growl1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
- robust_searching = 1
stat_attack = HARD_CRIT
faction = list("skeleton")
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
deathmessage = "collapses into a pile of bones!"
- del_on_death = 1
loot = list(/obj/effect/decal/remains/human)
-
footstep_type = FOOTSTEP_MOB_SHOE
-/mob/living/simple_animal/hostile/skeleton/templar
+/mob/living/simple_animal/hostile/human/skeleton/templar
name = "undead templar"
desc = "The reanimated remains of a holy templar knight."
icon_state = "templar"
@@ -58,7 +51,7 @@
/obj/item/clothing/head/witchunter,
/obj/item/claymore/weak{name = "holy sword"})
-/mob/living/simple_animal/hostile/skeleton/ice
+/mob/living/simple_animal/hostile/human/skeleton/ice
name = "ice skeleton"
desc = "A reanimated skeleton protected by a thick sheet of natural ice armor. Looks slow, though."
speed = 5
@@ -68,7 +61,7 @@
color = rgb(114,228,250)
loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)})
-/mob/living/simple_animal/hostile/skeleton/plasmaminer
+/mob/living/simple_animal/hostile/human/skeleton/plasmaminer
name = "shambling miner"
desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma."
icon_state = "plasma_miner"
@@ -86,7 +79,7 @@
deathmessage = "collapses into a pile of bones, their suit dissolving among the plasma!"
loot = list(/obj/effect/decal/remains/plasma)
-/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer
+/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/jackhammer
desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma. They seem to still have their mining tool in their hand, gripping tightly."
icon_state = "plasma_miner_tool"
icon_living = "plasma_miner_tool"
@@ -101,6 +94,6 @@
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer)
-/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize()
+/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/Initialize()
. = ..()
set_light(2)
diff --git a/code/modules/mob/living/simple_animal/hostile/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
similarity index 88%
rename from code/modules/mob/living/simple_animal/hostile/survivors.dm
rename to code/modules/mob/living/simple_animal/hostile/human/survivors.dm
index 2c350ab5ca55..f7abea96b222 100644
--- a/code/modules/mob/living/simple_animal/hostile/survivors.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
@@ -1,63 +1,41 @@
-/mob/living/simple_animal/hostile/asteroid/whitesands
+/mob/living/simple_animal/hostile/human/hermit
name = "Whitesands Inhabitant"
desc = "If you can read this, yell at a coder!"
- icon = 'icons/mob/simple_human.dmi'
icon_state = "survivor_base"
icon_living = "survivor_base"
- icon_dead = null
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC
- minbodytemp = 180
- unsuitable_atmos_damage = 15
atmos_requirements = list("min_oxy" = 1, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 999, "min_n2" = 0, "max_n2" = 0)
- speak_chance = 20
- turns_per_move = 5
- response_help_continuous = "pushes"
- response_help_simple = "push"
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- unsuitable_atmos_damage = 15
- speak_emote = list("groans")
loot = list(
/obj/effect/mob_spawn/human/corpse/damaged/whitesands
)
- del_on_death = 1
- faction = list("hermit")
-/mob/living/simple_animal/hostile/asteroid/whitesands/survivor/death(gibbed)
+/mob/living/simple_animal/hostile/human/hermit/survivor/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
+ ..()
+ /*
if(prob(15))
- new /obj/item/crusher_trophy/shiny(loc)
+ new /obj/item/mob_trophy/shiny(loc)
visible_message("You notice a glimmering nugget of shiny metal.")
- ..()
+ */
-/mob/living/simple_animal/hostile/asteroid/whitesands/survivor
+/mob/living/simple_animal/hostile/human/hermit/survivor
name = "Hermit Wanderer"
desc =" A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body, twisted by the heavy metals and high background radiation of the sandworlds."
loot = list(
/obj/effect/mob_spawn/human/corpse/damaged/whitesands/survivor
)
-/mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random/Initialize()
+/mob/living/simple_animal/hostile/human/hermit/survivor/random/Initialize()
. = ..()
if(prob(35))
- new /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter(loc)
+ new /mob/living/simple_animal/hostile/human/hermit/ranged/hunter(loc)
return INITIALIZE_HINT_QDEL
if(prob(10))
- new /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger(loc)
+ new /mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger(loc)
return INITIALIZE_HINT_QDEL
-/mob/living/simple_animal/hostile/asteroid/whitesands/ranged
+/mob/living/simple_animal/hostile/human/hermit/ranged
icon_state = "survivor_hunter"
icon_living = "survivor_hunter"
projectiletype = null
@@ -68,14 +46,14 @@
retreat_distance = 5
minimum_distance = 5
-/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter
+/mob/living/simple_animal/hostile/human/hermit/ranged/hunter
name = "Hermit Hunter"
desc ="A wild-eyed figure. Watch out- he has a gun, and he remembers just enough of his old life to use it!"
loot = list(
/obj/effect/mob_spawn/human/corpse/damaged/whitesands/hunter,
)
-/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger
+/mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger
name = "Hermit Soldier"
desc = "The miner's rebellion, though mostly underground, recieved a few good weapon shipments from an off-sector source. You should probably start running."
icon_state = "survivor_gunslinger"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
similarity index 72%
rename from code/modules/mob/living/simple_animal/hostile/syndicate.dm
rename to code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
index a05f79e473c8..a88a79610b60 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
@@ -1,12 +1,3 @@
-/*
- CONTENTS
- LINE 10 - BASE MOB
- LINE 52 - SWORD AND SHIELD
- LINE 164 - GUNS
- LINE 267 - MISC
-*/
-
-
///////////////Base mob////////////
/obj/effect/light_emitter/red_energy_sword //used so there's a combination of both their head light and light coming off the energy sword
set_luminosity = 2
@@ -14,44 +5,25 @@
light_color = COLOR_SOFT_RED
-/mob/living/simple_animal/hostile/syndicate
+/mob/living/simple_animal/hostile/human/syndicate
name = "Ramzi Clique Operative"
desc = "An ex-Syndicate pirate of the Ramzi Clique."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "syndicate"
icon_living = "syndicate"
- icon_dead = "syndicate_dead"
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
- turns_per_move = 5
- speed = 0
stat_attack = HARD_CRIT
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
maxbodytemp = 400
unsuitable_atmos_damage = 15
faction = list(FACTION_ANTAG_SYNDICATE)
- check_friendly_fire = 1
- status_flags = CANPUSH
- del_on_death = 1
+ check_friendly_fire = TRUE
dodging = TRUE
rapid_melee = 2
- footstep_type = FOOTSTEP_MOB_SHOE
///////////////Melee////////////
-/mob/living/simple_animal/hostile/syndicate/space
+/mob/living/simple_animal/hostile/human/syndicate/space
icon_state = "syndicate_space"
icon_living = "syndicate_space"
name = "Ramzi Clique Commando"
@@ -62,19 +34,19 @@
maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/space/stormtrooper
icon_state = "syndicate_stormtrooper"
icon_living = "syndicate_stormtrooper"
name = "Ramzi Clique Assault Trooper"
maxHealth = 250
health = 250
-/mob/living/simple_animal/hostile/syndicate/melee //dude with a knife and no shields
+/mob/living/simple_animal/hostile/human/syndicate/melee //dude with a knife and no shields
melee_damage_lower = 15
melee_damage_upper = 15
icon_state = "syndicate_knife"
@@ -86,7 +58,7 @@
status_flags = 0
var/projectile_deflect_chance = 0
-/mob/living/simple_animal/hostile/syndicate/melee/space
+/mob/living/simple_animal/hostile/human/syndicate/melee/space
icon_state = "syndicate_space_knife"
icon_living = "syndicate_space_knife"
name = "Ramzi Clique Commando"
@@ -98,12 +70,12 @@
speed = 1
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/melee/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/melee/space/stormtrooper
icon_state = "syndicate_stormtrooper_knife"
icon_living = "syndicate_stormtrooper_knife"
name = "Ramzi Clique Stormtrooper"
@@ -111,7 +83,7 @@
health = 250
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/sword
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword
melee_damage_lower = 30
melee_damage_upper = 30
icon_state = "syndicate_sword"
@@ -125,21 +97,21 @@
var/obj/effect/light_emitter/red_energy_sword/sord
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/sword/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/Initialize()
. = ..()
set_light(2)
-/mob/living/simple_animal/hostile/syndicate/melee/sword/Destroy()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/Destroy()
QDEL_NULL(sord)
return ..()
-/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/projectile/Proj)
+/mob/living/simple_animal/hostile/human/syndicate/melee/bullet_act(obj/projectile/Proj)
if(prob(projectile_deflect_chance))
visible_message("[src] blocks [Proj] with its shield!")
return BULLET_ACT_BLOCK
return ..()
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space
icon_state = "syndicate_space_sword"
icon_living = "syndicate_space_sword"
name = "Ramzi Clique Commando"
@@ -151,17 +123,17 @@
speed = 1
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
sord = new(src)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Destroy()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/Destroy()
QDEL_NULL(sord)
return ..()
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/stormtrooper
icon_state = "syndicate_stormtrooper_sword"
icon_living = "syndicate_stormtrooper_sword"
name = "Ramzi Clique Stormtrooper"
@@ -171,7 +143,7 @@
///////////////Guns////////////
-/mob/living/simple_animal/hostile/syndicate/ranged
+/mob/living/simple_animal/hostile/human/syndicate/ranged
ranged = 1
retreat_distance = 5
minimum_distance = 5
@@ -183,11 +155,11 @@
dodging = FALSE
rapid_melee = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator //shuttle loan event
+/mob/living/simple_animal/hostile/human/syndicate/ranged/infiltrator //shuttle loan event
projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg'
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
-/mob/living/simple_animal/hostile/syndicate/ranged/space
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space
icon_state = "syndicate_space_pistol"
icon_living = "syndicate_space_pistol"
name = "Ramzi Clique Commando"
@@ -198,30 +170,26 @@
maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space/stormtrooper
icon_state = "syndicate_stormtrooper_pistol"
icon_living = "syndicate_stormtrooper_pistol"
name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
-/mob/living/simple_animal/hostile/syndicate/ranged/smg
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg
rapid = 2
icon_state = "syndicate_smg"
icon_living = "syndicate_smg"
casingtype = /obj/item/ammo_casing/c45
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot //caravan ambush ruin
- name = "Ramzi Clique Salvage Pilot"
- loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
-
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/space
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space
icon_state = "syndicate_space_smg"
icon_living = "syndicate_space_smg"
name = "Ramzi Clique Commando"
@@ -232,19 +200,19 @@
maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space/stormtrooper
icon_state = "syndicate_stormtrooper_smg"
icon_living = "syndicate_stormtrooper_smg"
name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun
rapid = 2
rapid_fire_delay = 6
minimum_distance = 3
@@ -252,7 +220,7 @@
icon_living = "syndicate_shotgun"
casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot fired in a two-round burst. This will two-tap unarmored players.
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space
icon_state = "syndicate_space_shotgun"
icon_living = "syndicate_space_shotgun"
name = "Ramzi Clique Commando"
@@ -263,12 +231,12 @@
maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space/stormtrooper
icon_state = "syndicate_stormtrooper_shotgun"
icon_living = "syndicate_stormtrooper_shotgun"
name = "Ramzi Clique Stormtrooper"
@@ -277,13 +245,13 @@
///////////////Misc////////////
-/mob/living/simple_animal/hostile/syndicate/civilian
+/mob/living/simple_animal/hostile/human/syndicate/civilian
minimum_distance = 10
retreat_distance = 10
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
-/mob/living/simple_animal/hostile/syndicate/civilian/Aggro()
+/mob/living/simple_animal/hostile/human/syndicate/civilian/Aggro()
..()
summon_backup(15)
say("GUARDS!!")
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/human/zombie.dm
similarity index 83%
rename from code/modules/mob/living/simple_animal/hostile/zombie.dm
rename to code/modules/mob/living/simple_animal/hostile/human/zombie.dm
index 6f1db7aaf996..7a12465b98bb 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/zombie.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/hostile/zombie
+/mob/living/simple_animal/hostile/human/zombie
name = "Shambling Corpse"
desc = "When there is no more room in hell, the dead will walk in outer space."
icon = 'icons/mob/simple_human.dmi'
@@ -19,16 +19,17 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
status_flags = CANPUSH
+ loot = list()
del_on_death = 1
var/zombiejob = "Medical Doctor"
var/infection_chance = 0
var/obj/effect/mob_spawn/human/corpse/delayed/corpse
-/mob/living/simple_animal/hostile/zombie/Initialize(mapload)
+/mob/living/simple_animal/hostile/human/zombie/Initialize(mapload)
. = ..()
INVOKE_ASYNC(src, PROC_REF(setup_visuals))
-/mob/living/simple_animal/hostile/zombie/proc/setup_visuals()
+/mob/living/simple_animal/hostile/human/zombie/proc/setup_visuals()
var/datum/preferences/dummy_prefs = new
dummy_prefs.pref_species = new /datum/species/zombie
dummy_prefs.randomise[RANDOM_BODY] = TRUE
@@ -48,17 +49,17 @@
corpse.mob_species = /datum/species/zombie
corpse.mob_name = name
-/mob/living/simple_animal/hostile/zombie/AttackingTarget()
+/mob/living/simple_animal/hostile/human/zombie/AttackingTarget()
. = ..()
if(. && ishuman(target) && prob(infection_chance))
try_to_zombie_infect(target)
-/mob/living/simple_animal/hostile/zombie/drop_loot()
+/mob/living/simple_animal/hostile/human/zombie/drop_loot()
. = ..()
corpse.forceMove(drop_location())
corpse.create()
-/mob/living/simple_animal/hostile/zombie/kudzu
+/mob/living/simple_animal/hostile/human/zombie/kudzu
name = "shambling bramble"
desc = "A shambling mass of vibrant vines and rotting flesh. "
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index cf8a32af157c..2a60b3c52fc2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -18,7 +18,7 @@ Featuring:
*/
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot
name = "Syndicate Mecha Pilot"
desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour."
wanted_objects = list()
@@ -36,15 +36,15 @@ Featuring:
var/smoke_chance = 20 //Chance to deploy smoke for crowd control
var/retreat_chance = 40 //Chance to run away
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech
spawn_mecha_type = null
search_objects = 2
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/Initialize()
. = ..()
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
name = "\improper Nanotrasen Mecha Pilot"
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
icon_living = "nanotrasen"
@@ -52,7 +52,7 @@ Featuring:
faction = list("nanotrasen")
spawn_mecha_type = /obj/mecha/combat/marauder/loaded
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/nanotrasen
name = "\improper Nanotrasen Mecha Pilot"
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
icon_living = "nanotrasen"
@@ -60,7 +60,7 @@ Featuring:
faction = list("nanotrasen")
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Initialize()
. = ..()
if(spawn_mecha_type)
var/obj/mecha/M = new spawn_mecha_type (get_turf(src))
@@ -68,7 +68,7 @@ Featuring:
INVOKE_ASYNC(src, PROC_REF(enter_mecha), M)
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
if(!M)
return 0
LoseTarget() //Target was our mecha, so null it out
@@ -93,7 +93,7 @@ Featuring:
mecha.lights_action.Activate()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M)
if(!M)
return 0
@@ -116,7 +116,7 @@ Featuring:
walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug
//Checks if a mecha is valid for theft
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M)
if(!M)
return 0
if(M.occupant)
@@ -128,7 +128,7 @@ Featuring:
return 1
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
if(mecha)
var/dirto = get_dir(mecha,A)
if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises
@@ -136,7 +136,7 @@ Featuring:
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_reload()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/mecha_reload()
if(mecha)
for(var/equip in mecha.equipment)
var/obj/item/mecha_parts/mecha_equipment/ME = equip
@@ -144,7 +144,7 @@ Featuring:
ME.rearm()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
. = list()
if(mecha)
for(var/equip in mecha.equipment)
@@ -156,7 +156,7 @@ Featuring:
//Pick a ranged weapon/tool
//Fire it
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/OpenFire(atom/A)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/OpenFire(atom/A)
if(mecha)
mecha_reload()
mecha_face_target(A)
@@ -171,7 +171,7 @@ Featuring:
..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/AttackingTarget()
if(mecha)
var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE)
if(possible_weapons.len)
@@ -198,7 +198,7 @@ Featuring:
return target.attack_animal(src)
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/handle_automated_action()
if(..())
if(!mecha)
for(var/obj/mecha/combat/C in range(src,vision_range))
@@ -245,12 +245,12 @@ Featuring:
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/death(gibbed)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/death(gibbed)
if(mecha)
mecha.aimob_exit_mech(src)
..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/gib()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/gib()
if(mecha)
mecha.aimob_exit_mech(src)
..()
@@ -258,7 +258,7 @@ Featuring:
//Yes they actually try and pull this shit
//~simple animals~
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/CanAttack(atom/the_target)
if(ismecha(the_target))
var/obj/mecha/M = the_target
if(mecha)
@@ -275,19 +275,19 @@ Featuring:
. = ..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/EscapeConfinement()
if(mecha && loc == mecha)
return 0
..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0)
if(mecha && loc == mecha)
return mecha.relaymove(src, Dir)
return ..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
if(mecha)
walk_to(mecha, target, minimum_distance, mecha.step_in)
else
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 5bdc5c882214..63519d29c7cd 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -41,7 +41,7 @@ Difficulty: Medium
ranged_cooldown_time = 16
pixel_x = -16
base_pixel_x = -16
- crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
+ //mob_trophy = /obj/item/mob_trophy/miner_eye
loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
wander = FALSE
del_on_death = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index d62d695e1be7..1a0bbc10fac4 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -56,7 +56,7 @@ Difficulty: Hard
pixel_x = -32
base_pixel_x = -32
del_on_death = TRUE
- crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
+ //mob_trophy = /obj/item/mob_trophy/demon_claws
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME
var/charging = FALSE
@@ -504,7 +504,7 @@ Difficulty: Hard
health = 1
maxHealth = 1
alpha = 127.5
- crusher_loot = null
+ mob_trophy = null
loot = null
achievement_type = null
crusher_achievement_type = null
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
index cca8a649353f..3a4506b62562 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
@@ -21,7 +21,6 @@
ranged = TRUE
speed = 4
move_to_delay = 4
- crusher_loot = list(/obj/item/card/id/ert/deathsquad, /obj/item/documents/nanotrasen)
loot = list(/obj/item/card/id/ert/deathsquad, /obj/item/documents/nanotrasen)
wander = FALSE
blood_volume = BLOOD_VOLUME_NORMAL
@@ -59,8 +58,8 @@
speed = 5
move_to_delay = 5
speak_emote = list("verbalizes")
- crusher_loot = list(/obj/effect/spawner/clawloot)
- loot = list(/obj/effect/spawner/clawloot/crusher)
+ mob_trophy = /obj/item/nullrod/armblade/tentacle
+ loot = list(/obj/effect/spawner/clawloot)
health = 2250
maxHealth = 2250
shouldnt_move = TRUE //we want to show the transforming animation
@@ -76,9 +75,6 @@
new /obj/item/gun/energy/pulse/pistol(get_turf(src))
qdel(src)
-/obj/effect/spawner/clawloot/crusher/spawn_loot()
- new /obj/item/nullrod/armblade/tentacle(get_turf(src)) //idk what to put here, memed is the loot person
- return ..()
///LOOT END
//PHASE ONE
@@ -319,3 +315,102 @@
empulse(src, 5, 8)
new /obj/effect/gibspawner/human(get_turf(src))
qdel(src)
+
+/obj/projectile/tentacle
+ name = "tentacle"
+ icon_state = "tentacle_end"
+ pass_flags = PASSTABLE
+ damage = 0
+ damage_type = BRUTE
+ range = 8
+ hitsound = 'sound/weapons/thudswoosh.ogg'
+ var/chain
+
+/obj/projectile/tentacle/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE)
+ ..()
+
+/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H)
+ if(H.throw_mode)
+ H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item
+
+/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C)
+ if(H.Adjacent(C))
+ if(H.get_active_held_item() && !H.get_inactive_held_item())
+ H.swap_hand()
+ if(H.get_active_held_item())
+ return
+ C.grabbedby(H)
+ C.grippedby(H, instant = TRUE) //instant aggro grab
+
+/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C)
+ if(H.Adjacent(C))
+ for(var/obj/item/I in H.held_items)
+ if(I.get_sharpness())
+ C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!")
+ C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
+ H.do_item_attack_animation(C, used_item = I)
+ H.add_mob_blood(C)
+ playsound(get_turf(H),I.hitsound,75,TRUE)
+ return
+
+/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE)
+ var/mob/living/carbon/human/H = firer
+ if(blocked >= 100)
+ return BULLET_ACT_BLOCK
+ if(isitem(target))
+ var/obj/item/I = target
+ if(!I.anchored)
+ to_chat(firer, "You pull [I] towards yourself.")
+ H.throw_mode_on()
+ I.throw_at(H, 10, 2)
+ . = BULLET_ACT_HIT
+
+ else if(isliving(target))
+ var/mob/living/L = target
+ if(!L.anchored && !L.throwing)//avoid double hits
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ var/firer_intent = INTENT_HARM
+ var/mob/M = firer
+ if(istype(M))
+ firer_intent = M.a_intent
+ switch(firer_intent)
+ if(INTENT_HELP)
+ C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
+ C.throw_at(get_step_towards(H,C), 8, 2)
+ return BULLET_ACT_HIT
+
+ if(INTENT_DISARM)
+ var/obj/item/I = C.get_active_held_item()
+ if(I)
+ if(C.dropItemToGround(I))
+ C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!")
+ on_hit(I) //grab the item as if you had hit it directly with the tentacle
+ return BULLET_ACT_HIT
+ else
+ to_chat(firer, "You can't seem to pry [I] off [C]'s hands!")
+ return BULLET_ACT_BLOCK
+ else
+ to_chat(firer, "[C] has nothing in hand to disarm!")
+ return BULLET_ACT_HIT
+
+ if(INTENT_GRAB)
+ C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
+ C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C))
+ return BULLET_ACT_HIT
+
+ if(INTENT_HARM)
+ C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!")
+ C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C))
+ return BULLET_ACT_HIT
+ else
+ L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
+ L.throw_at(get_step_towards(H,L), 8, 2)
+ . = BULLET_ACT_HIT
+
+/obj/projectile/tentacle/Destroy()
+ qdel(chain)
+ return ..()
+
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index bd09f06f3521..863abf56dad1 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -50,7 +50,7 @@ Difficulty: Very Hard
achievement_type = /datum/award/achievement/boss/colossus_kill
crusher_achievement_type = /datum/award/achievement/boss/colossus_crusher
score_achievement_type = /datum/award/score/colussus_score
- crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
+ //mob_trophy = /obj/item/mob_trophy/blaster_tubes
loot = list(/obj/structure/closet/crate/necropolis/colossus)
deathmessage = "disintegrates, leaving a glowing core in its wake."
deathsound = 'sound/magic/demon_dies.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
index 96fbc8b5c4ec..08ef1a7b21cb 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
@@ -24,7 +24,7 @@
vision_range = 10
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
loot = list(/obj/item/claymore/cursed, /obj/item/clothing/suit/space/hardsuit/cult/enchanted)
- crusher_loot = list(/obj/item/claymore/cursed, /obj/item/clothing/suit/space/hardsuit/cult/enchanted, /obj/item/upgradescroll)
+ mob_trophy = list(/obj/item/claymore/cursed, /obj/item/clothing/suit/space/hardsuit/cult/enchanted, /obj/item/upgradescroll)
wander = FALSE
del_on_death = TRUE
blood_volume = BLOOD_VOLUME_NORMAL
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
index 550c78532cd6..00a32a8dc449 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -28,7 +28,7 @@ Difficulty: Extremely Hard
speed = 20
move_to_delay = 20
ranged = TRUE
- crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman)
+ //mob_trophy = /obj/item/mob_trophy/ice_block_talisman
loot = list(/obj/effect/decal/remains/plasma)
wander = FALSE
del_on_death = TRUE
@@ -323,47 +323,3 @@ Difficulty: Extremely Hard
mineral_scan_pulse(T, world.view + 1)
. = ..()
-/obj/item/crusher_trophy/ice_block_talisman
- name = "ice block talisman"
- desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason."
- icon_state = "freeze_cube"
- denied_type = /obj/item/crusher_trophy/ice_block_talisman
-
-/obj/item/crusher_trophy/ice_block_talisman/effect_desc()
- return "waveform collapse to freeze a creature in a block of ice for a period, preventing them from moving"
-
-/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/ice_block_talisman)
-
-/datum/status_effect/ice_block_talisman
- id = "ice_block_talisman"
- duration = 40
- status_type = STATUS_EFFECT_REFRESH
- alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman
- /// Stored icon overlay for the hit mob, removed when effect is removed
- var/icon/cube
-
-/atom/movable/screen/alert/status_effect/ice_block_talisman
- name = "Frozen Solid"
- desc = "You're frozen inside an ice cube, and cannot move!"
- icon_state = "frozen"
-
-/datum/status_effect/ice_block_talisman/on_apply()
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
- if(!owner.stat)
- to_chat(owner, "You become frozen in a cube!")
- cube = icon('icons/effects/freeze.dmi', "ice_cube")
- var/icon/size_check = icon(owner.icon, owner.icon_state)
- cube.Scale(size_check.Width(), size_check.Height())
- owner.add_overlay(cube)
- return ..()
-
-/// Blocks movement from the status effect owner
-/datum/status_effect/ice_block_talisman/proc/owner_moved()
- return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
-
-/datum/status_effect/ice_block_talisman/on_remove()
- if(!owner.stat)
- to_chat(owner, "The cube melts!")
- owner.cut_overlay(cube)
- UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 6fcf5ada7f4a..b7a2f0912653 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -54,10 +54,10 @@ Difficulty: Medium
ranged = TRUE
pixel_x = -32
base_pixel_x = -32
- crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
+ //mob_trophy = /obj/item/mob_trophy/ash_spike
loot = list(/obj/structure/closet/crate/necropolis/dragon)
butcher_results = list(/obj/item/gem/amber = 1, /obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
- guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/crusher_trophy/ash_spike = 1)
+ guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10)
var/swooping = NONE
var/player_cooldown = 0
var/dungeon = FALSE //if true, on death will spawn a ghost role at a lank mark and open blast doors with a certain id
@@ -583,7 +583,7 @@ Difficulty: Medium
mouse_opacity = MOUSE_OPACITY_ICON
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
loot = list()
- crusher_loot = list()
+ mob_trophy = list()
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
attack_action_types = list()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 4df97bac4a6f..ba112bbf5e72 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -59,7 +59,7 @@ Difficulty: Hard
ranged_cooldown_time = 40
aggro_vision_range = 21 //so it can see to one side of the arena to the other
loot = list(/obj/item/hierophant_club)
- crusher_loot = list(/obj/item/hierophant_club, /obj/item/crusher_trophy/vortex_talisman)
+ //mob_trophy = /obj/item/mob_trophy/vortex_talisman
wander = FALSE
gps_name = "Zealous Signal"
achievement_type = /datum/award/achievement/boss/hierophant_kill
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 120b850cf428..37934c0367e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -28,7 +28,7 @@
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
- var/list/crusher_loot
+ var/mob_trophy
var/achievement_type
var/crusher_achievement_type
var/score_achievement_type
@@ -71,10 +71,10 @@
if(health > 0)
return
else
- var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ spawn_mob_trophy()
+ var/datum/status_effect/crusher_damage/crusher = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/crusher_kill = FALSE
- if(C && crusher_loot && C.total_damage >= maxHealth * 0.6)
- spawn_crusher_loot()
+ if(crusher && mob_trophy && crusher.total_damage >= maxHealth * 0.6)
crusher_kill = TRUE
if(true_spawn && !(flags_1 & ADMIN_SPAWNED_1))
var/tab = "megafauna_kills"
@@ -85,8 +85,8 @@
SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]")
..()
-/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
- loot = crusher_loot
+/mob/living/simple_animal/hostile/megafauna/proc/spawn_mob_trophy()
+ loot += mob_trophy
/mob/living/simple_animal/hostile/megafauna/gib()
if(health > 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index a2cceb5a3aaa..0c13b9d67f16 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
for(var/t in swarmerTypes)
. += GLOB.AISwarmerCapsByType[t]
-
+//this should. not be a simple mob i think
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon
name = "swarmer beacon"
desc = "That name is a bit of a mouthful, but stop paying attention to your mouth they're eating everything!"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
index 59a58bd48d16..095ad0f8fca2 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
@@ -32,7 +32,7 @@ Difficulty: Hard
loot = list()
butcher_results = list()
guaranteed_butcher_results = list(/obj/item/wendigo_blood = 1)
- crusher_loot = list(/obj/item/crusher_trophy/demon_claws)
+ //mob_trophy = /obj/item/mob_trophy/demon_claws
wander = FALSE
del_on_death = FALSE
blood_volume = BLOOD_VOLUME_NORMAL
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index ca595d4d682f..0568533c1e0c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -205,7 +205,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged
var/obj/item/gun/TrueGun = null
- var/obj/item/gun/magic/Zapstick
var/obj/item/gun/ballistic/Pewgun
var/obj/item/gun/energy/Zapgun
@@ -223,10 +222,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
move_to_delay = 2 * G.w_class + 1
projectilesound = G.fire_sound
TrueGun = G
- if(istype(G, /obj/item/gun/magic))
- Zapstick = G
- var/obj/item/ammo_casing/magic/M = Zapstick.ammo_type
- projectiletype = initial(M.projectile_type)
if(istype(G, /obj/item/gun/ballistic))
Pewgun = G
var/obj/item/ammo_box/magazine/M = Pewgun.mag_type
@@ -245,11 +240,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
Zapgun.cell.use(shot.e_cost)
Zapgun.update_appearance()
..()
- else if(Zapstick)
- if(Zapstick.charges)
- Zapstick.charges--
- Zapstick.update_appearance()
- ..()
else if(Pewgun)
if(Pewgun.chambered)
if(Pewgun.chambered.BB)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index eb8302536e50..d10b9b86fb9b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -230,7 +230,7 @@
movement_type = FLYING
robust_searching = 1
attack_same = TRUE // So we'll fight basilisks
- crusher_loot = /obj/item/crusher_trophy/watcher_wing
+ //mob_trophy = /obj/item/mob_trophy/watcher_wing
gold_core_spawnable = NO_SPAWN
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
@@ -294,8 +294,8 @@
light_power = 2.5
light_color = LIGHT_COLOR_LAVA
projectiletype = /obj/projectile/temp/basilisk/magmawing
- crusher_loot = /obj/item/crusher_trophy/magma_wing
- crusher_drop_mod = 75
+ //mob_trophy = /obj/item/mob_trophy/magma_wing
+ trophy_drop_mod = 75
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing
name = "icewing watcher"
@@ -309,8 +309,8 @@
ranged_cooldown_time = 20
projectiletype = /obj/projectile/temp/basilisk/icewing
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
- crusher_loot = /obj/item/crusher_trophy/ice_wing
- crusher_drop_mod = 75
+ //mob_trophy = /obj/item/mob_trophy/ice_wing
+ trophy_drop_mod = 75
/obj/projectile/temp/basilisk/magmawing
name = "scorching blast"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
index 1d9f6e174660..769f6ce3d5fa 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
@@ -14,7 +14,7 @@
emote_hear = list("cackles","screeches")
stat_attack = CONSCIOUS
ranged_cooldown_time = 5 SECONDS
- vision_range = 9
+ vision_range = 6
retreat_distance = 2
speed = 3
move_to_delay = 5
@@ -37,7 +37,7 @@
light_color = LIGHT_COLOR_BLOOD_MAGIC
light_power = 5
light_range = 1.4
- crusher_loot = /obj/item/crusher_trophy/brimdemon_fang
+ //mob_trophy = /obj/item/mob_trophy/brimdemon_fang
/// Are we charging/firing? If yes stops our movement.
var/firing = FALSE
/// A list of all the beam parts.
@@ -98,7 +98,7 @@
visible_message(span_danger("[src] starts charging!"))
balloon_alert(src, "charging...")
to_chat(src, "You begin to charge up...")
- addtimer(CALLBACK(src, PROC_REF(fire_laser)), 1 SECONDS)
+ fire_laser()
COOLDOWN_START(src, ranged_cooldown, ranged_cooldown_time)
/mob/living/simple_animal/hostile/asteroid/brimdemon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
@@ -115,10 +115,6 @@
/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/fire_laser()
if(stat == DEAD)
return
- visible_message(span_danger("[src] fires a brimbeam!"))
- balloon_alert(src, "brimbeam fired")
- playsound(src, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3)
- cut_overlay("brimdemon_telegraph_dir")
var/turf/target_turf = get_ranged_target_turf(src, dir, BRIMBEAM_RANGE)
var/turf/origin_turf = get_turf(src)
var/list/affected_turfs = get_line(origin_turf, target_turf) - origin_turf
@@ -135,15 +131,30 @@
var/atom/new_brimbeam = new /obj/effect/brimbeam(affected_turf)
new_brimbeam.dir = dir
beamparts += new_brimbeam
- for(var/mob/living/hit_mob in affected_turf.contents)
- hit_mob.adjustFireLoss(35)
- to_chat(hit_mob, span_userdanger("You're hit by [src]'s brimbeam!"))
+ animate(new_brimbeam, 1 SECONDS, alpha = 255)
if(length(beamparts))
var/atom/last_brimbeam = beamparts[length(beamparts)]
last_brimbeam.icon_state = "brimbeam_end"
var/atom/first_brimbeam = beamparts[1]
first_brimbeam.icon_state = "brimbeam_start"
- addtimer(CALLBACK(src, PROC_REF(end_laser)), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(kill_people)), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(end_laser)), 3 SECONDS)
+
+/// Tells the lasers to start murdering people
+/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/kill_people()
+ if(stat == DEAD)
+ end_laser()
+ return
+ playsound(src, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3)
+ visible_message(span_danger("[src] fires a brimbeam!"))
+ balloon_alert(src, "brimbeam fired")
+ cut_overlay("brimdemon_telegraph_dir")
+ for(var/obj/effect/brimbeam/beam in beamparts)
+ var/turf/affected_turf = get_turf(beam)
+ START_PROCESSING(SSfastprocess, beam)
+ for(var/mob/living/hit_mob in affected_turf.contents)
+ hit_mob.adjustFireLoss(35)
+ to_chat(hit_mob, span_userdanger("You're hit by [src]'s brimbeam!"))
/// Deletes all the brimbeam parts and sets variables back to their initial ones.
/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/end_laser()
@@ -163,15 +174,12 @@
icon_state = "brimbeam_mid"
layer = ABOVE_MOB_LAYER
plane = -2
+ alpha = 150
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
light_color = LIGHT_COLOR_BLOOD_MAGIC
light_power = 3
light_range = 2
-/obj/effect/brimbeam/Initialize()
- . = ..()
- START_PROCESSING(SSfastprocess, src)
-
/obj/effect/brimbeam/Destroy()
STOP_PROCESSING(SSfastprocess, src)
return ..()
@@ -184,22 +192,6 @@
hit_mob.adjustFireLoss(5)
to_chat(hit_mob, span_danger("You're damaged by [src]!"))
-/obj/item/crusher_trophy/brimdemon_fang
- name = "brimdemon's fang"
- icon_state = "brimdemon_fang"
- desc = "A fang from a brimdemon's corpse."
- denied_type = /obj/item/crusher_trophy/brimdemon_fang
- var/static/list/comic_phrases = list("BOOM", "BANG", "KABLOW", "KAPOW", "OUCH", "BAM", "KAPOW", "WHAM", "POW", "KABOOM")
- var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
-
-/obj/item/crusher_trophy/brimdemon_fang/effect_desc()
- return "mark detonation creates audiosensory effects on the target and slightly heals the wielder"
-
-/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user)
- target.balloon_alert_to_viewers("[pick(comic_phrases)]!")
- playsound(target, 'sound/creatures/brimdemon_crush.ogg', 100)
- user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
-
/obj/effect/decal/cleanable/brimdust
name = "brimdust"
desc = "Dust from a brimdemon. It is considered valuable for botanical and heating purposes."
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 7e2b1c3d990c..cb7eaad0e988 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -43,7 +43,7 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
deathmessage = "explodes into gore!"
- loot_drop = /obj/item/crusher_trophy/broodmother_tongue
+ //loot_drop = /obj/item/mob_trophy/broodmother_tongue
attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch,
/datum/action/innate/elite_attack/spawn_children,
@@ -246,22 +246,6 @@
T = get_step(T, i)
new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner)
-// Broodmother's loot: Broodmother Tongue
-/obj/item/crusher_trophy/broodmother_tongue
- name = "broodmother tongue"
- desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "broodmother_tongue"
- denied_type = /obj/item/crusher_trophy/broodmother_tongue
- bonus_value = 35
-
-/obj/item/crusher_trophy/broodmother_tongue/effect_desc()
- return "waveform collapse to have a [bonus_value]% chance to summon a patch of goliath tentacles at the target's location"
-
-/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user)
- if(rand(1, 100) <= bonus_value && target.stat != DEAD)
- new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user)
-
/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/rockplanet
name = "baby gruboid"
desc = "A young gruboid recently born. As a defense mechanism, they violently explode if killed."
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index f0b6dc3e8d54..e6ea404aca09 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -38,7 +38,7 @@
mouse_opacity = MOUSE_OPACITY_ICON
deathsound = 'sound/magic/curse.ogg'
deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless."
- loot_drop = /obj/item/crusher_trophy/legionnaire_spine
+ loot_drop = /obj/item/mob_trophy/legionnaire_spine
attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge,
/datum/action/innate/elite_attack/head_detach,
@@ -278,23 +278,8 @@
transform *= 0.33
// Legionnaire's loot: Legionnaire Spine
-
-/obj/item/crusher_trophy/legionnaire_spine
+/obj/item/mob_trophy/legionnaire_spine
name = "legionnaire spine"
desc = "The spine of a legionnaire. It almost feels like it's moving..."
icon = 'icons/obj/lavaland/elite_trophies.dmi'
icon_state = "legionnaire_spine"
- denied_type = /obj/item/crusher_trophy/legionnaire_spine
- bonus_value = 50//These skulls are a joke, so this bonus value had to be put on steroidal emergency treatment
-
-/obj/item/crusher_trophy/legionnaire_spine/effect_desc()
- return "waveform collapse to have a [bonus_value]% chance to summon a loyal legion skull"
-
-/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user)
- if(!rand(1, 100) <= bonus_value || target.stat == DEAD)
- return
- var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc)
- A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1)
- A.GiveTarget(target)
- A.friends = user
- A.faction = user.faction.Copy()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index ce3850d22f01..bf8552ba5cb0 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -147,7 +147,7 @@
icon_dead = "goliath_dead"
throw_message = "does nothing to the tough hide of the"
pre_attack_icon = "goliath_preattack"
- crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
+ //mob_trophy = /obj/item/mob_trophy/goliath_tentacle
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/ore/silver = 10)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 2)
loot = list()
@@ -213,7 +213,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/saddle) && !saddled)
- if(tame && do_after(user,55,target=src))
+ if(tame && do_after(user, 55, target=src))
user.visible_message("You manage to put [O] on [src], you can now ride [p_them()].")
qdel(O)
saddled = TRUE
@@ -249,11 +249,11 @@
maxHealth = 180
health = 180
speed = 4
- crusher_loot = /obj/item/crusher_trophy/elder_tentacle
+ //mob_trophy = /obj/item/mob_trophy/elder_tentacle
pre_attack_icon = "ancient_goliath_preattack"
throw_message = "does nothing to the rocky hide of the"
guaranteed_butcher_results = list()
- crusher_drop_mod = 75
+ trophy_drop_mod = 75
wander = FALSE
bonus_tame_chance = 10
var/list/cached_tentacle_turfs
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 6e6c521fe445..5158c80d056a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -50,8 +50,8 @@
OpenFire()
return TRUE
-/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot()
- loot += crusher_loot //we don't butcher
+/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_mob_trophy()
+ loot += mob_trophy //we don't butcher
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
mouse_opacity = MOUSE_OPACITY_ICON
@@ -119,7 +119,7 @@
throw_message = "bounces harmlessly off of"
loot = list(/obj/item/organ/regenerative_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
- crusher_loot = /obj/item/crusher_trophy/legion_skull
+ mob_trophy = /obj/item/mob_trophy/legion_skull
del_on_death = 1
stat_attack = HARD_CRIT
robust_searching = 1
@@ -131,7 +131,7 @@
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
if(prob(15))
- new /obj/item/crusher_trophy/legion_skull(loc)
+ new /obj/item/mob_trophy/legion_skull(loc)
visible_message("One of the [src]'s skulls looks intact.")
..()
@@ -150,7 +150,7 @@
icon_living = "dwarf_legion"
icon_aggro = "dwarf_legion"
icon_dead = "dwarf_legion"
- crusher_loot = /obj/item/crusher_trophy/dwarf_skull
+ //mob_trophy = /obj/item/mob_trophy/dwarf_skull
maxHealth = 150
health = 150
move_to_delay = 2
@@ -182,9 +182,6 @@
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
- if(prob(75))
- new /obj/item/crusher_trophy/dwarf_skull(loc)
- visible_message("One of the [src]'s skulls looks like it survived.")
..()
//Legion skull
@@ -334,7 +331,7 @@
icon_living = "snowlegion"
icon_aggro = "snowlegion_alive"
icon_dead = "snowlegion"
- crusher_loot = /obj/item/crusher_trophy/legion_skull
+ mob_trophy = /obj/item/mob_trophy/legion_skull
loot = list(/obj/item/organ/regenerative_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow
@@ -358,7 +355,6 @@
icon_living = "disfigured_legion"
icon_aggro = "disfigured_legion"
icon_dead = "disfigured_legion"
- difficulty = 2
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal
loot = list(/obj/item/organ/regenerative_core/legion/crystal)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
index 2315f6e61a4f..786cdaa80966 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
@@ -74,8 +74,6 @@
new /obj/item/assembly/signaler/anomaly/bluespace(loc)
if(prob(5))
new /obj/item/gem/fdiamond(loc)
- if(prob(10))
- new /obj/item/crusher_trophy/ice_wing(loc)
return ..()
/mob/living/simple_animal/hostile/asteroid/old_demon
@@ -122,7 +120,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/// Distance the demon will teleport from the target
var/teleport_distance = 3
- crusher_drop_mod = 75
+ trophy_drop_mod = 75
/obj/projectile/temp/basilisk/ice
name = "ice blast"
@@ -157,8 +155,6 @@
new /obj/item/assembly/signaler/anomaly/bluespace(loc)
if(prob(20))
new /obj/item/gem/fdiamond(loc)
- if(prob(50))
- new /obj/item/crusher_trophy/ice_crystal(loc)
return ..()
/mob/living/simple_animal/hostile/asteroid/ice_demon/random/Initialize()
@@ -166,49 +162,3 @@
if(prob(15))
new /mob/living/simple_animal/hostile/asteroid/old_demon(loc)
return INITIALIZE_HINT_QDEL
-
-/obj/item/crusher_trophy/ice_crystal
- name = "frost gem"
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- desc = "The glowing remnant of an ancient ice demon- so cold that it hurts to touch."
- icon_state = "ice_crystal"
- denied_type = /obj/item/crusher_trophy/ice_crystal
-
-/obj/item/crusher_trophy/ice_crystal/effect_desc()
- return "waveform collapse to freeze a creature in a block of ice for a period, preventing them from moving"
-
-/obj/item/crusher_trophy/ice_crystal/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/ice_crystal)
-
-/datum/status_effect/ice_crystal
- id = "ice_crystal"
- duration = 20
- status_type = STATUS_EFFECT_REFRESH
- alert_type = /atom/movable/screen/alert/status_effect/ice_crystal
- /// Stored icon overlay for the hit mob, removed when effect is removed
- var/icon/cube
-
-/atom/movable/screen/alert/status_effect/ice_crystal
- name = "Frozen Solid"
- desc = "You're frozen inside an ice cube, and cannot move!"
- icon_state = "frozen"
-
-/datum/status_effect/ice_crystal/on_apply()
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
- if(!owner.stat)
- to_chat(owner, "You become frozen in a cube!")
- cube = icon('icons/effects/freeze.dmi', "ice_cube")
- var/icon/size_check = icon(owner.icon, owner.icon_state)
- cube.Scale(size_check.Width(), size_check.Height())
- owner.add_overlay(cube)
- return ..()
-
-/// Blocks movement from the status effect owner
-/datum/status_effect/ice_crystal/proc/owner_moved()
- return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
-
-/datum/status_effect/ice_crystal/on_remove()
- if(!owner.stat)
- to_chat(owner, "The cube melts!")
- owner.cut_overlay(cube)
- UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
index ceef301b2349..7a4d8cb234c2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
@@ -28,7 +28,7 @@
move_resist = MOVE_FORCE_VERY_STRONG
butcher_results = list(/obj/item/stack/ore/diamond = 3, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 10, /obj/item/stack/sheet/animalhide/ashdrake = 1)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/tail_spike
+ //mob_trophy = /obj/item/mob_trophy/tail_spike
deathmessage = "collapses on its side."
deathsound = 'sound/magic/demon_dies.ogg'
stat_attack = HARD_CRIT
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm
index d95c21ec9bbb..074bda5cf91a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm
@@ -33,7 +33,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 2, /obj/item/stack/sheet/bone = 2)
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
- crusher_loot = /obj/item/crusher_trophy/lobster_claw
+ //mob_trophy = /obj/item/mob_trophy/lobster_claw
/mob/living/simple_animal/hostile/asteroid/lobstrosity/beach
name = "tropical lobstrosity"
@@ -42,15 +42,3 @@
icon_living = "lobstrosity"
icon_dead = "lobstrosity_dead"
-/obj/item/crusher_trophy/lobster_claw
- name = "lobster claw"
- icon_state = "lobster_claw"
- desc = "A lobster claw."
- denied_type = /obj/item/crusher_trophy/lobster_claw
- bonus_value = 1
-
-/obj/item/crusher_trophy/lobster_claw/effect_desc()
- return "mark detonation to briefly stagger the target for [bonus_value] seconds"
-
-/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/stagger, bonus_value SECONDS)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
index b66c71fd58b2..19334bc84fcd 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
@@ -12,7 +12,7 @@
response_harm_simple = "strike"
status_flags = 0
a_intent = INTENT_HARM
- var/crusher_loot
+ var/mob_trophy
var/throw_message = "bounces off of"
var/throw_deflection = 20 //WS edit - Whitesands
var/fromtendril = FALSE
@@ -20,7 +20,7 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
mob_size = MOB_SIZE_LARGE
var/icon_aggro = null
- var/crusher_drop_mod = 25
+ var/trophy_drop_mod = 25
var/datum/armor/armor //WS edit - Whitesands
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
@@ -70,13 +70,13 @@
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
- var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
- if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
- spawn_crusher_loot()
+ if(prob(trophy_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
+ spawn_mob_trophy()
..(gibbed)
-/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot()
- butcher_results[crusher_loot] = 1
+/mob/living/simple_animal/hostile/asteroid/proc/spawn_mob_trophy()
+ if(mob_trophy)
+ butcher_results[mob_trophy] = 1
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
if(bodytemperature < minbodytemp)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
index f9d15892f75d..2bcb3fe06f9a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
@@ -27,7 +27,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/bear_paw
+ //mob_trophy = /obj/item/mob_trophy/bear_paw
stat_attack = HARD_CRIT
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
@@ -57,24 +57,6 @@
desc = "It seems sentient somehow."
faction = list("neutral")
-/obj/item/crusher_trophy/bear_paw
- name = "polar bear paw"
- desc = "It's a polar bear paw."
- icon_state = "bear_paw"
- icon ='icons/obj/lavaland/elite_trophies.dmi'
- denied_type = /obj/item/crusher_trophy/bear_paw
-
-/obj/item/crusher_trophy/bear_paw/effect_desc()
- return "doubled strikes when below 50% health"
-
-/obj/item/crusher_trophy/bear_paw/on_mark_detonation(mob/living/target, mob/living/user)
- if(user.health / user.maxHealth > 0.5)
- return
- var/obj/item/I = user.get_active_held_item()
- if(!I)
- return
- I.melee_attack_chain(user, target, null)
-
//elite bear
/mob/living/simple_animal/hostile/asteroid/polarbear/warrior
name = "polar warbear"
@@ -91,29 +73,11 @@
icon_state = "warbear"
icon_living = "warbear"
icon_dead = "warbear_dead"
- crusher_loot = /obj/item/crusher_trophy/war_paw
- crusher_drop_mod = 75
+ //mob_trophy = /obj/item/mob_trophy/war_paw
+ trophy_drop_mod = 75
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 3)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 3, /obj/item/bear_armor = 1)
-/obj/item/crusher_trophy/war_paw
- name = "Armored bear paw"
- desc = "It's a paw from a true warrior. Still remembers the basics of CQB."
- icon_state = "armor_paw"
- icon ='icons/obj/lavaland/elite_trophies.dmi'
- denied_type = /obj/item/crusher_trophy/war_paw
-
-/obj/item/crusher_trophy/war_paw/effect_desc()
- return "doubled strikes when below 70% health"
-
-/obj/item/crusher_trophy/war_paw/on_mark_detonation(mob/living/target, mob/living/user)
- if(user.health / user.maxHealth > 0.7)
- return
- var/obj/item/I = user.get_active_held_item()
- if(!I)
- return
- I.melee_attack_chain(user, target, null)
-
/mob/living/simple_animal/hostile/asteroid/polarbear/random/Initialize()
. = ..()
if(prob(15))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
index 7df8c04f0cf4..336616dfe110 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
@@ -30,9 +30,9 @@
move_force = MOVE_FORCE_WEAK
move_resist = MOVE_FORCE_WEAK
pull_force = MOVE_FORCE_WEAK
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2, /obj/item/crusher_trophy/wolf_ear = 0.5)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2, /obj/item/mob_trophy/wolf_ear = 0.5)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/wolf_ear
+ mob_trophy = /obj/item/mob_trophy/wolf_ear
stat_attack = HARD_CRIT
knockdown_time = 1 SECONDS
robust_searching = TRUE
@@ -108,23 +108,10 @@
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
if(prob(15))
- new /obj/item/crusher_trophy/wolf_ear(loc)
+ new /obj/item/mob_trophy/wolf_ear(loc)
visible_message("You notice a damaged ear that might be salvagable.")
..()
-/obj/item/crusher_trophy/wolf_ear
- name = "wolf ear"
- desc = "The battered remains of a wolf's ear. You could attach it to a crusher, or use the fur to craft a trophy."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "torn_ear"
- denied_type = /obj/item/crusher_trophy/wolf_ear
-
-/obj/item/crusher_trophy/wolf_ear/effect_desc()
- return "waveform collapse to give the user a slight speed boost"
-
-/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user)
- user.apply_status_effect(/datum/status_effect/speed_boost, 3 SECONDS)
-
//alpha wolf- smaller chance to spawn, practically a miniboss. Has the ability to do a short, untelegraphed lunge with a stun. Be careful!
/mob/living/simple_animal/hostile/asteroid/wolf/alpha
name = "alpha wolf"
@@ -149,35 +136,12 @@
charge_frequency = 20 SECONDS
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 4, /obj/item/stack/sheet/sinew/wolf = 4, /obj/item/stack/sheet/bone = 5)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/fang
+ mob_trophy = /obj/item/mob_trophy/fang
/mob/living/simple_animal/hostile/asteroid/wolf/alpha/gib()
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
- if(prob(75))
- new /obj/item/crusher_trophy/fang(loc)
- visible_message("You find an intact fang that looks salvagable.")
- ..()
-
-/obj/item/crusher_trophy/fang
- name = "battle-stained fang"
- desc = "A wolf fang, displaying the wear and tear associated with a long and colorful life. Could be attached to a kinetic crusher or used to make a trophy."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "fang"
- denied_type = /obj/item/crusher_trophy/fang
- var/bleed_stacks_per_hit = 5
-
-/obj/item/crusher_trophy/fang/effect_desc()
- return "waveform collapse to build up a small stack of bleeding, causing a burst of damage if applied repeatedly."
-
-/obj/item/crusher_trophy/fang/on_mark_detonation(mob/living/M, mob/living/user)
- if(istype(M) && (M.mob_biotypes & MOB_ORGANIC))
- var/datum/status_effect/stacking/saw_bleed/bloodletting/B = M.has_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting)
- if(!B)
- M.apply_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting, bleed_stacks_per_hit)
- else
- B.add_stacks(bleed_stacks_per_hit)
/mob/living/simple_animal/hostile/asteroid/wolf/random/Initialize()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
deleted file mode 100644
index 4417e68e2ec1..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/mob/living/simple_animal/hostile/nanotrasen
- name = "\improper Nanotrasen Private Security Officer"
- desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you."
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "nanotrasen"
- icon_living = "nanotrasen"
- icon_dead = null
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- speak_chance = 0
- turns_per_move = 5
- speed = 0
- stat_attack = HARD_CRIT
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 15
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list(ROLE_DEATHSQUAD)
- check_friendly_fire = TRUE
- status_flags = CANPUSH
- del_on_death = TRUE
- dodging = TRUE
- footstep_type = FOOTSTEP_MOB_SHOE
-
-/mob/living/simple_animal/hostile/nanotrasen/screaming
- icon_state = "nanotrasen"
- icon_living = "nanotrasen"
-
-/mob/living/simple_animal/hostile/nanotrasen/screaming/Aggro()
- ..()
- summon_backup(15)
- say("411 in progress, requesting backup!")
-
-
-/mob/living/simple_animal/hostile/nanotrasen/ranged
- icon_state = "nanotrasenranged"
- icon_living = "nanotrasenranged"
- ranged = 1
- retreat_distance = 3
- minimum_distance = 5
- casingtype = /obj/item/ammo_casing/c45
- projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg'
-
-
-/mob/living/simple_animal/hostile/nanotrasen/ranged/smg
- icon_state = "nanotrasenrangedsmg"
- icon_living = "nanotrasenrangedsmg"
- rapid = 3
- casingtype = /obj/item/ammo_casing/c46x30mm
- projectilesound = 'sound/weapons/gun/smg/shot.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
deleted file mode 100644
index 1eb03b07650c..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ /dev/null
@@ -1,61 +0,0 @@
-/mob/living/simple_animal/hostile/stickman
- name = "Angry Stick Man"
- desc = "A being from a realm with only 2 dimensions. At least it's trying to stay faced towards you."
- icon_state = "stickman"
- icon_living = "stickman"
- icon_dead = "stickman_dead"
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_HUMANOID
- gender = MALE
- speak_chance = 0
- turns_per_move = 5
- speed = 0
- stat_attack = HARD_CRIT
- robust_searching = 1
- environment_smash = ENVIRONMENT_SMASH_NONE
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- obj_damage = 0
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list("hostile","stickman")
- check_friendly_fire = 1
- status_flags = CANPUSH
- var/datum/action/boss/wizard_summon_minions/changesummons = /datum/action/boss/wizard_summon_minions
- var/summoned_by_wizard = 0
-
-/mob/living/simple_animal/hostile/stickman/ranged
- ranged = 1
- retreat_distance = 5
- minimum_distance = 5
- icon_state = "stickmanranged"
- icon_living = "stickmanranged"
- casingtype = /obj/item/ammo_casing/c45
- projectilesound = 'sound/misc/bang.ogg'
- loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman)
-
-
-/mob/living/simple_animal/hostile/stickman/dog
- name = "Angry Stick Dog"
- desc = "Stickman's best friend, if he could see him at least."
- icon_state = "stickdog"
- icon_living = "stickdog"
- icon_dead = "stickdog_dead"
- mob_biotypes = MOB_BEAST
-
-/mob/living/simple_animal/hostile/stickman/Initialize(mapload, wizard_summoned)
- . = ..()
- new /obj/effect/temp_visual/paper_scatter(src)
- summoned_by_wizard = wizard_summoned
-
-/mob/living/simple_animal/hostile/stickman/death()
- ..()
- if(summoned_by_wizard == 1)
- changesummons.summoned_minions --
diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm
deleted file mode 100644
index 0d97a1f18869..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/wizard.dm
+++ /dev/null
@@ -1,82 +0,0 @@
-/mob/living/simple_animal/hostile/wizard
- name = "Space Wizard"
- desc = "EI NATH?"
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "wizard"
- icon_living = "wizard"
- icon_dead = "wizard_dead"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- speak_chance = 0
- turns_per_move = 3
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 5
- melee_damage_upper = 5
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list(ROLE_WIZARD)
- status_flags = CANPUSH
-
- retreat_distance = 3 //out of fireball range
- minimum_distance = 3
- del_on_death = 1
- loot = list(/obj/effect/mob_spawn/human/corpse/wizard,
- /obj/item/staff)
-
- var/obj/effect/proc_holder/spell/aimed/fireball/fireball = null
- var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null
- var/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/mm = null
-
- var/next_cast = 0
-
- footstep_type = FOOTSTEP_MOB_SHOE
-
-/mob/living/simple_animal/hostile/wizard/Initialize()
- . = ..()
- fireball = new /obj/effect/proc_holder/spell/aimed/fireball
- fireball.clothes_req = 0
- fireball.human_req = 0
- fireball.player_lock = 0
- AddSpell(fireball)
- implants += new /obj/item/implant/exile(src)
-
- mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
- mm.clothes_req = 0
- mm.human_req = 0
- mm.player_lock = 0
- AddSpell(mm)
-
- blink = new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink
- blink.clothes_req = 0
- blink.human_req = 0
- blink.player_lock = 0
- blink.outer_tele_radius = 3
- AddSpell(blink)
-
-/mob/living/simple_animal/hostile/wizard/handle_automated_action()
- . = ..()
- if(target && next_cast < world.time)
- if((get_dir(src,target) in list(SOUTH,EAST,WEST,NORTH)) && fireball.cast_check(0,src)) //Lined up for fireball
- src.setDir(get_dir(src,target))
- fireball.perform(list(target), user = src)
- next_cast = world.time + 10 //One spell per second
- return .
- if(mm.cast_check(0,src))
- mm.choose_targets(src)
- next_cast = world.time + 10
- return .
- if(blink.cast_check(0,src)) //Spam Blink when you can
- blink.choose_targets(src)
- next_cast = world.time + 10
- return .
-
-/mob/living/simple_animal/hostile/wizard/planet
- weather_immunities = list("lava","ash")
- minbodytemp = 0
- maxbodytemp = INFINITY
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 2f79b2a13d69..06c7a9af52d8 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -522,7 +522,7 @@
to_chat(src, "You don't have a free hand to examine this!")
return FALSE
//can only queue up one examine on something at a time
- if(examined_thing in do_afters)
+ if(DOING_INTERACTION_WITH_TARGET(src, examined_thing))
return FALSE
to_chat(src, "You start feeling around for something...")
@@ -1202,6 +1202,7 @@
var/list/searching = GetAllContents()
var/search_id = 1
var/search_pda = 1
+ var/search_bankcard = 1
for(var/A in searching)
if(search_id && istype(A, /obj/item/card/id))
@@ -1209,18 +1210,24 @@
if(ID.registered_name == oldname)
ID.registered_name = newname
ID.update_label()
- if(ID.registered_account?.account_holder == oldname)
- ID.registered_account.account_holder = newname
- if(!search_pda)
+ if(!search_pda || !search_bankcard)
break
search_id = 0
+ if(search_bankcard && istype(A, /obj/item/card/bank))
+ var/obj/item/card/bank/bank_card = A
+ if(bank_card.registered_account?.account_holder == oldname)
+ bank_card.registered_account.account_holder = newname
+ if(!search_id || !search_pda)
+ break
+ search_bankcard = 0
+
else if(search_pda && istype(A, /obj/item/pda))
var/obj/item/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
PDA.update_label()
- if(!search_id)
+ if(!search_id || !search_bankcard)
break
search_pda = 0
@@ -1303,6 +1310,9 @@
/mob/proc/get_idcard(hand_first)
return
+/mob/proc/get_bankcard()
+ return
+
/mob/proc/get_id_in_hand()
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 6873ee602dac..def2bde930e0 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -191,7 +191,7 @@
///List of progress bars this mob is currently seeing for actions
var/list/progressbars = null //for stacking do_after bars
- ///For storing what do_after's someone has, in case we want to restrict them to only one of a certain do_after at a time
+ ///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening.
var/list/do_afters
///Allows a datum to intercept all click calls this mob is the source of
diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm
index 496011cfdddd..b3b9051e5b8f 100644
--- a/code/modules/modular_computers/file_system/programs/bounty_board.dm
+++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm
@@ -25,8 +25,8 @@
if(!networked)
GLOB.allbountyboards += computer
networked = TRUE
- if(card_slot && card_slot.stored_card && card_slot.stored_card.registered_account)
- current_user = card_slot.stored_card.registered_account
+ if(card_slot && card_slot.bank_card && card_slot.bank_card.registered_account)
+ current_user = card_slot.bank_card.registered_account
for(var/i in GLOB.request_list)
if(!i)
continue
diff --git a/code/modules/modular_computers/file_system/programs/cargoship.dm b/code/modules/modular_computers/file_system/programs/cargoship.dm
index 1bfe53b215f2..2aa9b68565ca 100644
--- a/code/modules/modular_computers/file_system/programs/cargoship.dm
+++ b/code/modules/modular_computers/file_system/programs/cargoship.dm
@@ -35,21 +35,21 @@
// Get components
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
- var/obj/item/card/id/id_card = card_slot ? card_slot.stored_card : null
+ var/obj/item/card/bank/bank_card = card_slot ? card_slot.stored_card : null
if(!card_slot || !printer) //We need both to successfully use this app.
return
switch(action)
if("ejectid")
- if(id_card)
+ if(bank_card)
card_slot.try_eject(TRUE, usr)
if("selectid")
- if(!id_card)
+ if(!bank_card)
return
- if(!id_card.registered_account)
+ if(!bank_card.registered_account)
playsound(get_turf(ui_host()), 'sound/machines/buzz-sigh.ogg', 50, TRUE, -1)
return
- payments_acc = id_card.registered_account
+ payments_acc = bank_card.registered_account
playsound(get_turf(ui_host()), 'sound/machines/ping.ogg', 50, TRUE, -1)
if("resetid")
payments_acc = null
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
index 1acdb72f400e..1ef62b7617f3 100644
--- a/code/modules/modular_computers/hardware/card_slot.dm
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -8,6 +8,7 @@
var/obj/item/card/id/stored_card
var/obj/item/card/id/stored_card2
+ var/obj/item/card/bank/bank_card
/obj/item/computer_hardware/card_slot/Exited(atom/ejected, atom/newloc)
if(!(ejected == stored_card || ejected == stored_card2))
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index eb363de15792..b1ec3d3edc16 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -248,10 +248,10 @@
visible_message("[user] inserts a [HC.credits] cr holocredit chip into [src].")
qdel(HC)
return
- else if(istype(I, /obj/item/card/id))
+ else if(istype(I, /obj/item/card/bank))
if(state != 2)
return
- var/obj/item/card/id/ID = I
+ var/obj/item/card/bank/ID = I
var/datum/bank_account/account = ID.registered_account
var/target_credits = total_price - credits
if(!account.adjust_money(-target_credits, "laptop_vendor"))
diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm
index d6b0703ccb59..ecf91d0760fa 100644
--- a/code/modules/movespeed/modifiers/reagent.dm
+++ b/code/modules/movespeed/modifiers/reagent.dm
@@ -13,7 +13,7 @@
/datum/movespeed_modifier/reagent/badstims
multiplicative_slowdown = -0.45
-/datum/movespeed_modifier/reagent/monkey_energy
+/datum/movespeed_modifier/reagent/xeno_energy
multiplicative_slowdown = -0.35
/datum/movespeed_modifier/reagent/changelinghaste
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 4939686ee9fd..f45c231c7098 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -85,7 +85,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H,10, target = src, hidden = TRUE))
+ if (do_after(H, 10, target = src, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
charge -= drain
@@ -235,7 +235,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
if(S.cell.charge+drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H,10, hidden = TRUE))
+ if (do_after(H, 10, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
cell.use(drain)
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index f9641a7a63ff..b700e22156fa 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -21,7 +21,7 @@
var/obj/item/stock_parts/cell/CELL = I
if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
to_chat(U, "Higher maximum capacity detected.\nUpgrading...")
- if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = src))
+ if (n_gloves && n_gloves.candrain && do_after(U, s_delay, target = src))
U.transferItemToLoc(CELL, src)
CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
var/obj/item/stock_parts/cell/old_cell = cell
diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm
index 59fdee827907..5b1f27fa2cb9 100644
--- a/code/modules/overmap/helm.dm
+++ b/code/modules/overmap/helm.dm
@@ -388,11 +388,11 @@
return
to_chat(user, "You begin to manually override the local database...")
- if(!do_after_mob(user, list(src), 2 SECONDS))
+ if(!do_after(user, 2 SECONDS, list(src)))
return COMPONENT_BLOCK_TOOL_ATTACK
priority_announce("Illegal access to local ship database detected.", sender_override="[src.name]", zlevel=virtual_z())
- if(!do_after_mob(user, list(src), 10 SECONDS))
+ if(!do_after(user, 10 SECONDS, list(src)))
return COMPONENT_BLOCK_TOOL_ATTACK
say("Warning, database corruption present, resetting local database state.")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 3f85acdddfe6..283d41524f79 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -542,7 +542,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list(new/datum/stack_recipe("cable restrain
if(affecting && (!IS_ORGANIC_LIMB(affecting)))
if(user == H)
user.visible_message("[user] starts to fix some of the wires in [H]'s [parse_zone(affecting.body_zone)].", "You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].")
- if(!do_mob(user, H, 50))
+ if(!do_after(user, 0.5 SECONDS, H))
return
if(item_heal_robotic(H, user, 0, 15))
use(1)
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 9986578b3c5d..13e43233b1ec 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -2,8 +2,10 @@
// [CELADON-EDIT] - CELADON_BALANCE - Трогаем рад коллекторы
// #define RAD_COLLECTOR_EFFICIENCY 80 // radiation needs to be over this amount to get power // CELADON-EDIT - ORIGINAL
// #define RAD_COLLECTOR_COEFFICIENT 10 // CELADON-EDIT - ORIGINAL
-#define RAD_COLLECTOR_EFFICIENCY 1 // radiation needs to be over this amount to get power
-#define RAD_COLLECTOR_COEFFICIENT 400
+// #define RAD_COLLECTOR_EFFICIENCY 1 // radiation needs to be over this amount to get power
+// #define RAD_COLLECTOR_COEFFICIENT 400 // CELADON-EDIT - OLD_MY
+#define RAD_COLLECTOR_EFFICIENCY 300 // radiation needs to be over this amount to get power
+#define RAD_COLLECTOR_COEFFICIENT 100
// [/CELADON-EDIT]
#define RAD_COLLECTOR_STORED_OUT 0.001 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process()
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index 4b19282bab3d..105f22aefec5 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -90,7 +90,6 @@
boolets++
// [CELADON-ADD] - CELADON_BALANCE
playsound(loc, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
- do_after_mob(user, list(loc), 1 SECONDS)
break
// [/CELADON-ADD]
else
diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm
index ee155db4e719..93fa4208d571 100644
--- a/code/modules/projectiles/ammunition/_firing.dm
+++ b/code/modules/projectiles/ammunition/_firing.dm
@@ -18,8 +18,6 @@
if(click_cooldown_override)
user.changeNext_move(click_cooldown_override)
- else
- user.changeNext_move(CLICK_CD_RANGE)
user.newtonian_move(get_dir(target, user))
update_appearance()
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index fa77095de9b9..e235e00b98f6 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -98,3 +98,24 @@
desc = "A .38 iceblox bullet casing."
bullet_skin = "surplus"
projectile_type = /obj/projectile/bullet/c38/iceblox
+
+//44 Roumain (Montagne & Shadow)
+
+/obj/item/ammo_casing/a44roum
+ name = ".44 roumain bullet casing"
+ desc = "A .44 roumain bullet casing."
+ caliber = ".44 Roumain"
+ icon_state = "pistol-steel"
+ projectile_type = /obj/projectile/bullet/a44roum
+
+/obj/item/ammo_casing/a44roum/rubber
+ name = ".44 roumain rubber bullet casing"
+ desc = "A .44 roumain rubber bullet casing."
+ bullet_skin = "rubber"
+ projectile_type = /obj/projectile/bullet/a44roum/rubber
+
+/obj/item/ammo_casing/a44roum/hp
+ name = ".44 roumain hollow point bullet casing"
+ desc = "A .44 roumain holow point bullet casing."
+ bullet_skin = "hollow"
+ projectile_type = /obj/projectile/bullet/a44roum/hp
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
index 12e5cfa6b23c..9168e3409465 100644
--- a/code/modules/projectiles/ammunition/ballistic/rifle.dm
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -100,6 +100,8 @@
//.308 (M514 EBR & CM-GAL-S)
+//[СELADON-REMOVE] - CELADON_WEAPONS - хватит это терпеть! Теперь эти патроны только в модпаке - mod_celadon\weapons\code\modules\projectiles\ammunition\ballistic\rifle.dm
+/*
/obj/item/ammo_casing/a308
name = ".308 bullet casing"
desc = "A .308 bullet casing."
@@ -107,6 +109,8 @@
caliber = ".308"
projectile_type = /obj/projectile/bullet/a308
bullet_per_box = 20
+*/
+//[/СELADON-REMOVE]
/obj/item/ammo_casing/caseless/c299
name = ".229 Eoehoma caseless bullet casing"
@@ -114,4 +118,4 @@
icon_state = "caseless"
caliber = ".299 caseless"
projectile_type = /obj/projectile/bullet/c299
- bullet_per_box = 80
+ bullet_per_box = 100
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 6320cb24b0c6..d0334e8d8acc 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -31,7 +31,7 @@
projectile_type = /obj/projectile/beam/laser/weak/negative_ap
e_cost = 799 //12 shots with a normal power cell, 25 with an upgraded
select_name = "kill"
- delay = 0.1 SECONDS
+ delay = 0.13 SECONDS
/obj/item/ammo_casing/energy/lasergun/old
projectile_type = /obj/projectile/beam/laser
diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm
index 917e1c8c8189..1f74196eb83b 100644
--- a/code/modules/projectiles/ammunition/energy/stun.dm
+++ b/code/modules/projectiles/ammunition/energy/stun.dm
@@ -46,4 +46,4 @@
/obj/item/ammo_casing/energy/disabler/smg
projectile_type = /obj/projectile/beam/disabler/weak/negative_ap
e_cost = 330
- delay = 0.1 SECONDS
+ delay = 0.13 SECONDS
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index e38df896bed1..046ae7dbc078 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -4,68 +4,3 @@
projectile_type = /obj/projectile/magic
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
heavy_metal = FALSE
-
-/obj/item/ammo_casing/magic/change
- projectile_type = /obj/projectile/magic/change
-
-/obj/item/ammo_casing/magic/animate
- projectile_type = /obj/projectile/magic/animate
-
-/obj/item/ammo_casing/magic/heal
- projectile_type = /obj/projectile/magic/resurrection
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/death
- projectile_type = /obj/projectile/magic/death
-
-/obj/item/ammo_casing/magic/teleport
- projectile_type = /obj/projectile/magic/teleport
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/safety
- projectile_type = /obj/projectile/magic/safety
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/door
- projectile_type = /obj/projectile/magic/door
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/fireball
- projectile_type = /obj/projectile/magic/aoe/fireball
-
-/obj/item/ammo_casing/magic/chaos
- projectile_type = /obj/projectile/magic
-
-/obj/item/ammo_casing/magic/spellblade
- projectile_type = /obj/projectile/magic/spellblade
-
-/obj/item/ammo_casing/magic/arcane_barrage
- projectile_type = /obj/projectile/magic/arcane_barrage
-
-/obj/item/ammo_casing/magic/honk
- projectile_type = /obj/projectile/bullet/honker
-
-/obj/item/ammo_casing/magic/locker
- projectile_type = /obj/projectile/magic/locker
-
-/obj/item/ammo_casing/magic/flying
- projectile_type = /obj/projectile/magic/flying
-
-/obj/item/ammo_casing/magic/bounty
- projectile_type = /obj/projectile/magic/bounty
-
-/obj/item/ammo_casing/magic/antimagic
- projectile_type = /obj/projectile/magic/antimagic
-
-/obj/item/ammo_casing/magic/sapping
- projectile_type = /obj/projectile/magic/sapping
-
-/obj/item/ammo_casing/magic/necropotence
- projectile_type = /obj/projectile/magic/necropotence
-
-/obj/item/ammo_casing/magic/wipe
- projectile_type = /obj/projectile/magic/wipe
-
-/obj/item/ammo_casing/magic/nothing
- projectile_type = /obj/projectile/magic/nothing
- harmful = FALSE
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 9a73e8a6230a..41246b58c300 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -99,8 +99,8 @@
var/obj/item/ammo_box/attacking_box = attacking_obj
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
// [CELADON-EDIT] - CELADON_QOL
- // if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after_mob(user, list(attacking_box), 1 SECONDS))) // CELADON-EDIT - ORIGINAL
- if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after_mob(user, list(attacking_box), 0.6 SECONDS)))
+ // if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box))) // CELADON-EDIT - ORIGINAL
+ if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 0.6 SECONDS, attacking_box)))
// [/CELADON-EDIT]
break
var/did_load = give_round(casing_to_insert, replace_spent)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 0b5a7f80a837..4fa15baaea87 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -382,14 +382,22 @@
/obj/item/ammo_box/a762_40/inteq
icon_state = "a762_40box_big_inteq"
+//[СELADON-REMOVE] - CELADON_WEAPONS - хватит это терпеть! Теперь эти патроны только в модпаке - mod_celadon\weapons\code\modules\projectiles\boxes_magazines\ammo_boxes.dm
+/*
/obj/item/ammo_box/a308
name = "ammo box (.308)"
icon_state = "a308box"
ammo_type = /obj/item/ammo_casing/a308
max_ammo = 30
+*/
+//[/СELADON-REMOVE]
-/obj/item/ammo_box/a308/hunterspride //just an alternative graphic for srm ships
+//[СELADON-REMOVE] - CELADON_WEAPONS - хватит это терпеть! Теперь эти патроны только в модпаке - полностью удален из билда
+/*
+/obj/item/ammo_box/a308/hunterspride //just an alternative graphic for srm ships - зачем отдельные , у них что патроны из дерева или что ?
icon_state = "a308box-HP"
+*/
+//[/СELADON-REMOVE]
/obj/item/ammo_box/foambox
name = "ammo box (Foam Darts)"
@@ -411,13 +419,13 @@
ammo_type = /obj/item/ammo_casing/c22lr
max_ammo = 75
-/obj/item/ammo_box/c45_speedloader
- name = "speed loader (.45)"
+/obj/item/ammo_box/a44roum_speedloader
+ name = "speed loader (.44)"
desc = "Designed to quickly reload revolvers."
icon_state = "speedloader_38-6"
base_icon_state = "speedloader_38"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
+ ammo_type = /obj/item/ammo_casing/a44roum
+ caliber = ".44 Roumain"
max_ammo = 6
multiple_sprites = AMMO_BOX_PER_BULLET
custom_materials = list(/datum/material/iron = 15000)
@@ -472,3 +480,24 @@
icon_state = "300box"
ammo_type = /obj/item/ammo_casing/a300
max_ammo = 20
+
+/obj/item/ammo_box/a44roum
+ name = "ammo box (.44 roumain)"
+ desc = "A box of standard .44 roumain ammo."
+ icon_state = "a44roum"
+ ammo_type = /obj/item/ammo_casing/a44roum
+ max_ammo = 50
+
+/obj/item/ammo_box/a44roum/rubber
+ name = "ammo box (.44 roumain rubber)"
+ desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "a44roum-rubber"
+ ammo_type = /obj/item/ammo_casing/a44roum/rubber
+ max_ammo = 50
+
+/obj/item/ammo_box/a44roum/hp
+ name = "ammo box (.44 roumain hollow point)"
+ desc = "A box of .44 roumain hollow point ammo, designed to cause massive damage at the cost of armor penetration."
+ icon_state = "a44roum-hp"
+ ammo_type = /obj/item/ammo_casing/a44roum/hp
+ max_ammo = 50
diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
index 160e1bd5066d..658eef2d781c 100644
--- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
@@ -66,7 +66,7 @@
var/list/ammo_list_no_empty = ammo_list(FALSE)
listclearnulls(ammo_list_no_empty)
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after_mob(user, list(attacking_box), 1 SECONDS))) //stupid work around for revolvers
+ if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box))) //stupid work around for revolvers
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm
index 1d4316560e92..55b749ac3333 100644
--- a/code/modules/projectiles/boxes_magazines/internal/misc.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm
@@ -1,9 +1,3 @@
-/obj/item/ammo_box/magazine/internal/hook
- name = "hook internal tube"
- ammo_type = /obj/item/ammo_casing/magic/hook
- caliber = "hook"
- max_ammo = 1
-
/obj/item/ammo_box/magazine/internal/bow
name = "bowstring"
ammo_type = /obj/item/ammo_casing/caseless/arrow
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index d757ddf03047..1198970c5146 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -33,13 +33,13 @@
max_ammo = 5
instant_load = FALSE
-/obj/item/ammo_box/magazine/internal/cylinder/rev45
+/obj/item/ammo_box/magazine/internal/cylinder/rev44
name = "cattleman revolver cylinder"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
+ ammo_type = /obj/item/ammo_casing/a44roum
+ caliber = ".44 Roumain"
max_ammo = 6
instant_load = FALSE
-/obj/item/ammo_box/magazine/internal/cylinder/rev45/montagne
+/obj/item/ammo_box/magazine/internal/cylinder/rev44/montagne
name = "montagne revolver cylinder"
instant_load = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
index 921ff98293a1..4f2f8c537958 100644
--- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -6,13 +6,6 @@
max_ammo = 5
instant_load = TRUE
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted
- max_ammo = 1
- ammo_type = /obj/item/ammo_casing/a8_50r
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
- ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
-
/obj/item/ammo_box/magazine/internal/boltaction/solgov
name = "SSG-669C internal magazine"
ammo_type = /obj/item/ammo_casing/caseless/a858
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
index 38c99aec9372..29717fd9408b 100644
--- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -27,6 +27,9 @@
max_ammo = 2
instant_load = TRUE
+/obj/item/ammo_box/magazine/internal/shot/dual/lethal
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
/obj/item/ammo_box/magazine/internal/shot/improvised
name = "improvised shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/improvised
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index ca4d0217b380..3edfd1382cf4 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -1,6 +1,3 @@
-
-#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
-
/obj/item/gun
name = "gun"
desc = "It's a gun. It's pretty terrible, though."
@@ -27,25 +24,55 @@
var/vary_fire_sound = TRUE
var/fire_sound_volume = 50
var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg'
- var/dry_fire_text = "click" //change this on non-gun things
- var/suppressed = null //whether or not a message is displayed when fired
+ ///Text showed when attempting to fire with no round or empty round.
+ var/dry_fire_text = "click"
+ ///whether or not a message is displayed when fired
+ var/suppressed = null
var/can_suppress = FALSE
var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/suppressed_volume = 60
var/can_unsuppress = TRUE
var/obj/item/ammo_casing/chambered = null
- trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
- var/sawn_desc = null //description change if weapon is sawn-off
+ ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it
+ trigger_guard = TRIGGER_GUARD_NORMAL
+ ///Set the description of the gun to this when sawed off
+ var/sawn_desc = null
+ ///This triggers some sprite behavior in shotguns and prevents further sawoff, note that can_be_sawn_off is on gun/ballistic and not here, wtf.
var/sawn_off = FALSE
- var/burst_size = 1 //how large a burst is
- var/fire_delay = 0 //rate of fire for burst firing and semi auto
- var/firing_burst = 0 //Prevent the weapon from firing again while already firing
- var/semicd = 0 //cooldown handler
+
+ /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst.
+ var/burst_size = 3
+ ///The rate of fire when firing in a burst. Not the delay between bursts
+ var/burst_delay = 0.15 SECONDS
+ ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst
+ var/fire_delay = 0.2 SECONDS
+
+ /// after initializing, we set the firemode to this
+ var/default_firemode = FIREMODE_SEMIAUTO
+ ///Firemode index, due to code shit this is the currently selected firemode
+ var/firemode_index
+ /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here.
+ var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO)
+ /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example.
+ var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire")
+ ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on.
+ var/fire_select_icon_state_prefix = ""
+ ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single"
+ var/adjust_fire_select_icon_state_on_safety = FALSE
+
+ ///Are we firing a burst? If so, dont fire again until burst is done
+ var/currently_firing_burst = FALSE
+ ///This prevents gun from firing until the coodown is done, affected by lag
+ var/current_cooldown = 0
+ ///affects if you can fire it unwielded or even dual wield it. LIGHT means dual wield allowed, HEAVY and higher means you have to wield to fire
var/weapon_weight = WEAPON_LIGHT
- var/dual_wield_spread = 24 //additional spread when dual wielding
- var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ ///If dual wielding, add this to the spread
+ var/dual_wield_spread = 24
+ /// ???, no clue what this is. Original desc: //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ var/randomspread = 1
- var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
+ ///Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
+ var/projectile_damage_multiplier = 1
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
@@ -127,6 +154,7 @@
alight = new(src)
muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
+ build_firemodes()
/obj/item/gun/ComponentInitialize()
. = ..()
@@ -141,10 +169,21 @@
user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown)
wield_time = world.time + wield_delay
if(wield_time > 0)
- if(do_mob(user, user, wield_delay, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded)), ignore_loc_change = TRUE))
+ if(do_after(
+ user,
+ wield_delay,
+ user,
+ FALSE,
+ TRUE,
+ CALLBACK(src, PROC_REF(is_wielded)),
+ timed_action_flags = IGNORE_USER_LOC_CHANGE
+ )
+ )
wielded_fully = TRUE
+ return TRUE
else
wielded_fully = TRUE
+ return TRUE
/obj/item/gun/proc/is_wielded()
return wielded
@@ -208,6 +247,51 @@
if(zoomed && user.get_active_held_item() != src)
zoom(user, user.dir, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!!
+/obj/item/gun/attack(mob/M as mob, mob/user)
+ if(user.a_intent == INTENT_HARM) //Flogging
+ if(bayonet)
+ M.attackby(bayonet, user)
+ return
+ else
+ return ..()
+ return
+
+/obj/item/gun/attack_obj(obj/O, mob/user)
+ if(user.a_intent == INTENT_HARM)
+ if(bayonet)
+ O.attackby(bayonet, user)
+ return
+ return ..()
+
+/obj/item/gun/attackby(obj/item/I, mob/user, params)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+ else if(istype(I, /obj/item/flashlight/seclite))
+ if(!can_flashlight)
+ return ..()
+ var/obj/item/flashlight/seclite/S = I
+ if(!gun_light)
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You click [S] into place on [src].")
+ set_gun_light(S)
+ update_gunlight()
+ alight = new(src)
+ if(loc == user)
+ alight.Grant(user)
+ else if(istype(I, /obj/item/kitchen/knife))
+ var/obj/item/kitchen/knife/K = I
+ if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
+ return ..()
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You attach [K] to [src]'s bayonet lug.")
+ bayonet = K
+ update_appearance()
+
+ else
+ return ..()
+
//called after the gun has successfully fired its chambered ammo.
/obj/item/gun/proc/process_chamber(atom/shooter)
SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED)
@@ -220,252 +304,277 @@
return FALSE
return TRUE
-/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
- if(!safety)
- to_chat(user, "*[dry_fire_text]*")
- playsound(src, dry_fire_sound, 30, TRUE)
- return
- to_chat(user, "Safeties are active on the [src]! Turn them off to fire!")
-
-
-/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
- var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180)
- var/muzzle_angle = Get_Angle(get_turf(src), pbtarget)
- if(muzzle_flash && !muzzle_flash.applied)
- handle_muzzle_flash(user, muzzle_angle)
-
- if(wielded_fully)
- simulate_recoil(user, recoil, actual_angle)
- else if(!wielded_fully)
- simulate_recoil(user, recoil_unwielded, actual_angle)
-
- if(suppressed)
- playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
- else
- playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
- if(message)
- if(pointblank)
- user.visible_message(
- span_danger("[user] fires [src] point blank at [pbtarget]!"),
- span_danger("You fire [src] point blank at [pbtarget]!"),
- span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget
- )
- to_chat(pbtarget, "[user] fires [src] point blank at you!")
- if(pb_knockback > 0 && ismob(pbtarget))
- var/mob/PBT = pbtarget
- var/atom/throw_target = get_edge_target_turf(PBT, user.dir)
- PBT.throw_at(throw_target, pb_knockback, 2)
- else
- user.visible_message(
- span_danger("[user] fires [src]!"),
- blind_message = span_hear("You hear a gunshot!"),
- vision_distance = COMBAT_MESSAGE_RANGE,
- ignored_mobs = user
- )
-
/obj/item/gun/emp_act(severity)
. = ..()
if(!(. & EMP_PROTECT_CONTENTS))
for(var/obj/O in contents)
O.emp_act(severity)
+
+/obj/item/gun/proc/recharge_newshot()
+ return
+
/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params)
. = ..()
+ //No target? Why are we even firing anyways...
if(!target)
return
- if(firing_burst)
+ //If we are burst firing, don't fire, obviously
+ if(currently_firing_burst)
return
- if(flag) //It's adjacent, is the user, or is on the user's person
+ //This var happens when we are either clicking someone next to us or ourselves. Check if we don't want to fire...
+ if(flag)
if(target in user.contents) //can't shoot stuff inside us.
return
if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
return
if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected)
return
+/* TODO: gunpointing is very broken, port the old skyrat gunpointing? its much better, usablity wise and rp wise?
if(ismob(target) && user.a_intent == INTENT_GRAB)
if(user.GetComponent(/datum/component/gunpoint))
to_chat(user, "You are already holding someone up!")
return
user.AddComponent(/datum/component/gunpoint, target, src)
return
+*/
+ // Good job, but we have exta checks to do...
+ return pre_fire(target, user, TRUE, flag, params, null)
+
+/obj/item/gun/proc/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE)
+ add_fingerprint(user)
+
+ // If we have a cooldown, don't do anything, obviously
+ if(current_cooldown)
+ return
- if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can.
- var/mob/living/L = user
- if(!can_trigger_gun(L))
+ //We check if the user can even use the gun, if not, we assume the user isn't alive(turrets) so we go ahead.
+ if(istype(user))
+ var/mob/living/living_user = user
+ if(!can_trigger_gun(living_user))
return
+ //If targetting the mouth, we do suicide instead.
if(flag)
if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
handle_suicide(user, target, params)
return
- if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot.
+ //Just because we can pull the trigger doesn't mean it can fire. Mostly for safties.
+ if(!can_shoot())
shoot_with_empty_chamber(user)
return
+ //we then check our weapon weight vs if we are being wielded...
+ if(weapon_weight == WEAPON_VERY_HEAVY && (!wielded_fully))
+ to_chat(user, "You need a fully secure grip to fire [src]!")
+ return
+
if(weapon_weight == WEAPON_HEAVY && (!wielded))
to_chat(user, "You need a more secure grip to fire [src]!")
return
- //DUAL (or more!) WIELDING
- var/bonus_spread = 0
+ //If we have the pacifist trait and a chambered round, don't fire. Honestly, pacifism quirk is pretty stupid, and as such we check again in process_fire() anyways
+ if(chambered)
+ if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
+ if(chambered.harmful) // Is the bullet chambered harmful?
+ to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...")
+ return
+
+ //Dual wielding handling. Not the biggest fan of this, but it's here. Dual berettas not included
var/loop_counter = 0
- if(ishuman(user) && user.a_intent == INTENT_HARM)
- var/mob/living/carbon/human/H = user
- for(var/obj/item/gun/G in H.held_items)
- if(G == src || G.weapon_weight >= WEAPON_MEDIUM)
+ if(ishuman(user) && user.a_intent == INTENT_HARM && !dual_wielded_gun)
+ var/mob/living/carbon/human/our_cowboy = user
+ for(var/obj/item/gun/found_gun in our_cowboy.held_items)
+ if(found_gun == src || found_gun.weapon_weight >= WEAPON_MEDIUM)
continue
- else if(G.can_trigger_gun(user))
+ else if(found_gun.can_trigger_gun(user))
bonus_spread += dual_wield_spread
loop_counter++
- addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter)
+ addtimer(CALLBACK(found_gun, TYPE_PROC_REF(/obj/item/gun, pre_fire), target, user, TRUE, params, null, bonus_spread), loop_counter)
+
+ //get current firemode
+ var/current_firemode = gun_firemodes[firemode_index]
+ //FIREMODE_OTHER and its sister directs you to another proc for special handling
+ if(current_firemode == FIREMODE_OTHER)
+ return process_other(target, user, message, flag, params, zone_override, bonus_spread)
+ if(current_firemode == FIREMODE_OTHER_TWO)
+ return process_other_two(target, user, message, flag, params, zone_override, bonus_spread)
+ //if all of that succeded, we finally get to process firing
return process_fire(target, user, TRUE, params, null, bonus_spread)
-/obj/item/gun/proc/recharge_newshot()
- return
+/obj/item/gun/proc/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ return //use this for 'underbarrels!!
+
+/obj/item/gun/proc/process_other_two(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ return //reserved in case another fire mode is needed, if you need special behavior, put it here then call process_fire, or call process_fire and have the special behavior there
+
+/**
+ * Handles everything involving firing.
+ * * gun.dm is still a fucking mess, and I will document everything next time i get to it... for now this will suffice.
+ *
+ * Returns TRUE or FALSE depending on if it actually fired a shot.
+ * Arguments:
+ * * target - The atom we are trying to hit.
+ * * user - The living mob firing the gun, if any.
+ * * message - Do we show the usual messages? eg. "x fires the y!"
+ * * params - Is the params string from byond [/atom/proc/Click] code, see that documentation.
+ * * zone_override - The bodypart we attempt to hit, sometimes hits another.
+ * * bonus_spread - Adds this value to spread, in this case used by dual wielding.
+ * * burst_firing - Not to be confused with currently_firing_burst. This var is TRUE when we are doing a burst except for the first shot in a burst, as to override the spam burst checks.
+ * * spread_override - Bullet spread is forcibly set to this. This is usually because of bursts attempting to share the same burst trajectory.
+ * * iteration - Which shot in a burst are we in.
+ */
+/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0)
+ //OKAY, this prevents us from firing until our cooldown is done
+ if(!burst_firing) //if we're firing a burst, dont interfere to avoid issues
+ if(current_cooldown)
+ return FALSE
-/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0)
- if(!user || !firing_burst)
- firing_burst = FALSE
+ //Check one last time for safeties...
+ if(!can_shoot())
+ shoot_with_empty_chamber(user)
+ currently_firing_burst = FALSE
return FALSE
- if(!issilicon(user))
- if(iteration > 1 && !(user.is_holding(src))) //for burst firing
- firing_burst = FALSE
+
+ //special hahnding for burst firing
+ if(burst_firing)
+ if(!user || !currently_firing_burst)
+ currently_firing_burst = FALSE
return FALSE
- if(chambered && chambered.BB)
+ if(!issilicon(user))
+ //If we aren't holding the gun, what are we doing, stop firing!
+ if(iteration > 1 && !(user.is_holding(src)))
+ currently_firing_burst = FALSE
+ return FALSE
+
+ //Do we have a round? If not, stop the whole chain, and if we do, check if the gun is chambered. Pacisim is pretty lame anyways.
+ if(chambered)
if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
if(chambered.harmful) // Is the bullet chambered harmful?
to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...")
- return
- if(randomspread)
- sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
- else //Smart spread
- sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
- before_firing(target,user)
- if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src))
- shoot_with_empty_chamber(user)
- firing_burst = FALSE
- return FALSE
- else
- if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
- shoot_live_shot(user, 1, target, message)
- else
- shoot_live_shot(user, 0, target, message)
- if (iteration >= burst_size)
- firing_burst = FALSE
+ currently_firing_burst = FALSE //no burst 4 u
+ return FALSE
+ else
+ shoot_with_empty_chamber(user)
+ currently_firing_burst = FALSE
+ return FALSE
+
+ // we hold the total spread in this var
+ var/sprd
+ // if we ARE burst firing and don't have "randomspread", we add the burst's penalty on top of it.
+ if(burst_firing && !randomspread)
+ bonus_spread += burst_size * iteration
+
+ //override spread? usually happens only in bursts
+ if(spread_override && !randomspread)
+ sprd = spread_override
else
+ //Calculate spread
+ sprd = calculate_spread(user, bonus_spread)
+
+ before_firing(target,user)
+ //If we cant fire the round, just end the proc here. Otherwise, continue
+ if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
shoot_with_empty_chamber(user)
- firing_burst = FALSE
+ currently_firing_burst = FALSE
return FALSE
+ //Are we PBing someone? If so, set pointblank to TRUE
+ shoot_live_shot(user, (get_dist(user, target) <= 1), target, message) //Making sure whether the target is in vicinity for the pointblank shot
+
+ //process the chamber...
process_chamber(shooter = user)
update_appearance()
- return TRUE
-
-/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ //get our current firemode...
+ var/current_firemode = gun_firemodes[firemode_index]
+
+ //If we are set to burst fire, then we burst fire!
+ if(burst_size > 1 && (current_firemode == FIREMODE_BURST) && !burst_firing)
+ currently_firing_burst = TRUE
+ for(var/i = 2 to burst_size) //we fire the first burst normally, hence why its 2
+ addtimer(CALLBACK(src, PROC_REF(process_fire), target, user, message, params, zone_override, 0, TRUE, sprd, i), burst_delay * (i - 1))
+
+ //if we have a fire delay, set up a cooldown
+ if(fire_delay && (!burst_firing && !currently_firing_burst))
+ current_cooldown = TRUE
+ addtimer(CALLBACK(src, PROC_REF(reset_current_cooldown)), fire_delay)
+ if(burst_firing && iteration >= burst_size)
+ current_cooldown = TRUE
+ addtimer(CALLBACK(src, PROC_REF(reset_current_cooldown)), fire_delay+burst_delay)
+ currently_firing_burst = FALSE
+
+ // update our inhands...
if(user)
- SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, user, target, params, zone_override)
+ user.update_inv_hands()
- add_fingerprint(user)
+ SSblackbox.record_feedback("tally", "gun_fired", 1, type)
+ return TRUE
- if(semicd)
+/obj/item/gun/proc/reset_current_cooldown()
+ current_cooldown = FALSE
+/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
+ if(!safety)
+ to_chat(user, "*[dry_fire_text]*")
+ playsound(src, dry_fire_sound, 30, TRUE)
return
+ to_chat(user, "Safeties are active on the [src]! Turn them off to fire!")
- var/sprd = 0
- var/randomized_gun_spread = 0
- var/rand_spr = rand()
- if(wielded_fully && spread)
- randomized_gun_spread = rand(0,spread)
- else if(!wielded_fully && spread_unwielded)
- randomized_gun_spread = rand(0,spread_unwielded)
+/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, atom/pbtarget = null, message = TRUE)
+ var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180)
+ var/muzzle_angle = Get_Angle(get_turf(src), pbtarget)
- if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex
- bonus_spread += 25
- var/randomized_bonus_spread = rand(0, bonus_spread)
+ user.changeNext_move(clamp(fire_delay, 0, CLICK_CD_RANGE))
+
+ if(muzzle_flash && !muzzle_flash.applied)
+ handle_muzzle_flash(user, muzzle_angle)
+
+ if(wielded_fully)
+ simulate_recoil(user, recoil, actual_angle)
+ else if(!wielded_fully)
+ simulate_recoil(user, recoil_unwielded, actual_angle)
- if(burst_size > 1)
- firing_burst = TRUE
- for(var/i = 1 to burst_size)
- addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1))
+ if(suppressed)
+ playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
else
- if(chambered)
- if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
- if(chambered.harmful) // Is the bullet chambered harmful?
- to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...")
- return
- sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
- sprd = calculate_spread(user, sprd)
-
- before_firing(target,user)
- if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
- shoot_with_empty_chamber(user)
- return
+ playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
+ if(message)
+ if(pointblank)
+ user.visible_message(
+ span_danger("[user] fires [src] point blank at [pbtarget]!"),
+ span_danger("You fire [src] point blank at [pbtarget]!"),
+ span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget
+ )
+ to_chat(pbtarget, "[user] fires [src] point blank at you!")
+ if(pb_knockback > 0 && ismob(pbtarget))
+ var/mob/PBT = pbtarget
+ var/atom/throw_target = get_edge_target_turf(PBT, user.dir)
+ PBT.throw_at(throw_target, pb_knockback, 2)
else
- if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
- shoot_live_shot(user, TRUE, target, message)
- else
- shoot_live_shot(user, FALSE, target, message)
- else
- shoot_with_empty_chamber(user)
- return
- process_chamber(shooter = user)
- update_appearance()
- if(fire_delay)
- semicd = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_semicd)), fire_delay)
+ user.visible_message(
+ span_danger("[user] fires [src]!"),
+ blind_message = span_hear("You hear a gunshot!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
- if(user)
- user.update_inv_hands()
- SSblackbox.record_feedback("tally", "gun_fired", 1, type)
- return TRUE
+ //cloudy sent a meme in the discord. i dont know if its true, but i made this piece of code in honor of it
+ var/mob/living/carbon/human/living_human = user
+ if(istype(living_human))
+ if(!living_human.wear_neck)
+ return //if nothing on the neck, don't do anything
+ var/current_month = text2num(time2text(world.timeofday, "MM"))
+ var/static/regex/bian = regex("(?:^\\W*lesbian)", "i")
-/obj/item/gun/proc/reset_semicd()
- semicd = FALSE
+ if(current_month == JUNE)
+ return //if it isn't june, don't do this easter egg
-/obj/item/gun/attack(mob/M as mob, mob/user)
- if(user.a_intent == INTENT_HARM) //Flogging
- if(bayonet)
- M.attackby(bayonet, user)
- return
- else
- return ..()
- return
+ if(!findtext(bian, living_human.generic_adjective))
+ return //dont bother if we already are affected by it
-/obj/item/gun/attack_obj(obj/O, mob/user)
- if(user.a_intent == INTENT_HARM)
- if(bayonet)
- O.attackby(bayonet, user)
- return
- return ..()
-
-/obj/item/gun/attackby(obj/item/I, mob/user, params)
- if(user.a_intent == INTENT_HARM)
- return ..()
- else if(istype(I, /obj/item/flashlight/seclite))
- if(!can_flashlight)
- return ..()
- var/obj/item/flashlight/seclite/S = I
- if(!gun_light)
- if(!user.transferItemToLoc(I, src))
- return
- to_chat(user, "You click [S] into place on [src].")
- set_gun_light(S)
- update_gunlight()
- alight = new(src)
- if(loc == user)
- alight.Grant(user)
- else if(istype(I, /obj/item/kitchen/knife))
- var/obj/item/kitchen/knife/K = I
- if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
- return ..()
- if(!user.transferItemToLoc(I, src))
- return
- to_chat(user, "You attach [K] to [src]'s bayonet lug.")
- bayonet = K
- update_appearance()
-
- else
- return ..()
+ if(istype(living_human.wear_neck, /obj/item/clothing/neck/tie/lesbian) || living_human.wear_neck.icon_state == "lesbian")
+ var/use_space = "[living_human.generic_adjective ? " " : ""]"
+ living_human.generic_adjective = "lesbian[use_space][living_human.generic_adjective]" //i actually don't remember the meme. it was something like lesbians will stop working if they see another with a gun. or something.
/obj/item/gun/CtrlClick(mob/user)
. = ..()
@@ -657,7 +766,7 @@
if(!ishuman(user) || !ishuman(target))
return
- if(semicd)
+ if(current_cooldown)
return
if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot.
@@ -671,25 +780,26 @@
target.visible_message(span_warning("[user] points [src] at [target]'s head, ready to pull the trigger..."), \
span_userdanger("[user] points [src] at your head, ready to pull the trigger..."))
- semicd = TRUE
+ current_cooldown = TRUE
- if(!bypass_timer && (!do_mob(user, target, 100) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
+ if(!bypass_timer && (!do_after(user, 100, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
if(user)
if(user == target)
user.visible_message(span_notice("[user] decided not to shoot."))
else if(target && target.Adjacent(user))
target.visible_message(span_notice("[user] has decided to spare [target]."), span_notice("[user] has decided to spare your life!"))
- semicd = FALSE
+ current_cooldown = FALSE
return
- semicd = FALSE
+ current_cooldown = FALSE
target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!"))
if(chambered && chambered.BB && can_trigger_gun(user))
chambered.BB.damage *= 3
//Check is here for safeties and such, brain will be removed after
- process_fire(target, user, TRUE, params, BODY_ZONE_HEAD)
+ if(!pre_fire(target, user, TRUE, params, BODY_ZONE_HEAD))
+ return
var/obj/item/organ/brain/brain_to_blast = target.getorganslot(ORGAN_SLOT_BRAIN)
if(brain_to_blast)
@@ -723,10 +833,55 @@
// We do it like this in case theres some specific gun behavior for adjusting spread, like bipods or folded stocks
/obj/item/gun/proc/calculate_spread(mob/user, bonus_spread)
- return bonus_spread
+ ///our final spread value
+ var/sprd = 0
+ ///our randomized value after checking if we are wielded or not
+ var/randomized_gun_spread = 0
+ ///bonus
+ var/randomized_bonus_spread
+ // do we have poor aim
+ var/poor_aim = FALSE
+
+ //do we have bonus_spread ? If so, set sprd to it because it means a subtype's proc messed with it
+ sprd += bonus_spread
+
+ //reset bonus_spread for poor aim...
+ bonus_spread = 0
+
+ // if we have poor aim, we fuck the shooter over
+ if(HAS_TRAIT(user, TRAIT_POOR_AIM))
+ bonus_spread += 25
+ poor_aim = TRUE
+ // then we randomize the bonus spread
+ randomized_bonus_spread = rand(poor_aim ? 10 : 0, bonus_spread) //poor aim is no longer just a nusiance
+
+ //then, we mutiply previous bonus spread as it means dual wielding usually, it also means poor aim is also even more severe
+ randomized_bonus_spread *= DUALWIELD_PENALTY_EXTRA_MULTIPLIER
+
+ // we will then calculate gun spread depending on if we are fully wielding (after do_after) the gun or not
+ randomized_gun_spread = rand(0, wielded_fully ? spread : spread_unwielded)
+
+ //finally, we put it all together including if sprd has a value
+ sprd += randomized_gun_spread + randomized_bonus_spread
+
+ //clamp it down to avoid guns with negative spread to have worse recoil...
+ sprd = clamp(sprd, 0, INFINITY)
+
+ // im not sure what this does, i beleive its meant to make it so bullet spread goes in the opposite direction? get back to me on this - update,i have commented it out, however it appears be dapening spread. weird.
+ //sprd *= (rand() - 0.5)
+
+ //coin flip if we mutiply output by -1 so spread isn't JUST to the right
+ if(prob(50))
+ sprd *= -1
+
+ // then we round it up and send it!
+ sprd = round(sprd)
+
+ return sprd
/obj/item/gun/proc/simulate_recoil(mob/living/user, recoil_bonus = 0, firing_angle)
var/total_recoil = calculate_recoil(user, recoil_bonus)
+ total_recoil = clamp(total_recoil, 0 , INFINITY)
var/actual_angle = firing_angle + rand(-recoil_deviation, recoil_deviation) + 180
if(actual_angle > 360)
@@ -738,6 +893,7 @@
/obj/item/gun/proc/handle_muzzle_flash(mob/living/user, firing_angle)
var/atom/movable/flash_loc = user
var/prev_light = light_range
+
if(!light_on && (light_range <= muzzle_flash_lum))
set_light_range(muzzle_flash_lum)
set_light_color(muzzle_flash_color)
@@ -886,4 +1042,58 @@
azoom = new()
azoom.gun = src
-#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER
+/obj/item/gun/proc/build_firemodes()
+ if(FIREMODE_FULLAUTO in gun_firemodes)
+ AddComponent(/datum/component/automatic_fire, fire_delay)
+ SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE)
+ var/datum/action/item_action/our_action
+
+ if(gun_firemodes.len > 1)
+ our_action = new /datum/action/item_action/toggle_firemode(src)
+
+ for(var/i=1, i <= gun_firemodes.len+1, i++)
+ if(default_firemode == gun_firemodes[i])
+ firemode_index = i
+ if(gun_firemodes[i] == FIREMODE_FULLAUTO)
+ SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
+ if(our_action)
+ our_action.UpdateButtonIcon()
+ return
+
+ firemode_index = 1
+ CRASH("default_firemode isn't in the gun_firemodes list of [src.type]!! Defaulting to 1!!")
+
+/obj/item/gun/ui_action_click(mob/user, actiontype)
+ if(istype(actiontype, /datum/action/item_action/toggle_firemode))
+ fire_select(user)
+ else
+ ..()
+
+/obj/item/gun/proc/fire_select(mob/living/carbon/human/user)
+
+ //gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER)
+
+ firemode_index++
+ if(firemode_index > gun_firemodes.len)
+ firemode_index = 1 //reset to the first index if it's over the limit. Byond arrays start at 1 instead of 0, hence why its set to 1.
+
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode == FIREMODE_FULLAUTO)
+ SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
+ else
+ SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE)
+//wawa
+ to_chat(user, "Switched to [gun_firenames[current_firemode]].")
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
+ update_appearance()
+ for(var/datum/action/current_action as anything in actions)
+ current_action.UpdateButtonIcon()
+
+/datum/action/item_action/toggle_firemode/UpdateButtonIcon(status_only = FALSE, force = FALSE)
+ var/obj/item/gun/our_gun = target
+
+ var/current_firemode = our_gun.gun_firemodes[our_gun.firemode_index]
+ //tldr; if we have adjust_fire_select_icon_state_on_safety as true, we append "safety_" to the prefix, otherwise nothing.
+ var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]"
+ button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]"
+ return ..()
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 559b7daa643a..71a291f301de 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -1,3 +1,8 @@
+#define EMPTY_GUN_HELPER(gun_type) \
+ /obj/item/gun/ballistic/##gun_type/no_mag { \
+ spawnwithmagazine = FALSE; \
+ }
+
///Subtype for any kind of ballistic gun
///This has a shitload of vars on it, and I'm sorry for that, but it does make making new subtypes really easy
/obj/item/gun/ballistic
@@ -53,9 +58,9 @@
///Compatible magazines with the gun
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
///Whether the sprite has a visible magazine or not
- var/mag_display = FALSE
+ var/show_magazine_on_sprite = FALSE
///Whether the sprite has a visible ammo display or not
- var/mag_display_ammo = FALSE
+ var/show_magazine_on_sprite_ammo = FALSE
///Whether the sprite has a visible indicator for being empty or not.
var/empty_indicator = FALSE
///Whether the gun alarms when empty or not.
@@ -63,7 +68,7 @@
///Do we eject the magazine upon runing out of ammo?
var/empty_autoeject = FALSE
///Whether the gun supports multiple special mag types
- var/special_mags = FALSE
+ var/unique_mag_sprites_for_variants = FALSE
///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
var/bolt_type = BOLT_TYPE_STANDARD
///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both.
@@ -121,7 +126,7 @@
if (suppressed)
. += "[icon_state]_suppressor"
if (magazine)
- if (special_mags)
+ if (unique_mag_sprites_for_variants)
. += "[icon_state]_mag_[magazine.base_icon_state]"
if (!magazine.ammo_count())
. += "[icon_state]_mag_empty"
@@ -186,6 +191,7 @@
else
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
///Drops the bolt from a locked position
/obj/item/gun/ballistic/proc/drop_bolt(mob/user = null)
@@ -212,6 +218,7 @@
if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked)
chamber_round(TRUE)
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
return TRUE
else
to_chat(user, "You cannot seem to get \the [src] out of your hands!")
@@ -232,8 +239,9 @@
if (display_message)
to_chat(user, "You pull the [magazine_wording] out of \the [src].")
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
if (tac_load)
- if(do_after(user, tactical_reload_delay, TRUE, src))
+ if(do_after(user, tactical_reload_delay, src, hidden = TRUE))
if (insert_magazine(user, tac_load, FALSE))
to_chat(user, "You perform a tactical reload on \the [src].")
else
@@ -244,6 +252,7 @@
if(user)
user.put_in_hands(old_mag)
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
/obj/item/gun/ballistic/can_shoot()
if(safety)
@@ -298,11 +307,6 @@
return
return FALSE
-/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- if (sawn_off)
- bonus_spread += SAWN_OFF_ACC_PENALTY
- . = ..()
-
///Installs a new suppressor, assumes that the suppressor is already in the contents of src
/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S)
suppressed = S
@@ -346,8 +350,11 @@
bolt_locked = TRUE
update_appearance()
-/obj/item/gun/ballistic/afterattack()
+/obj/item/gun/ballistic/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE)
prefire_empty_checks()
+ return ..()
+
+/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0)
. = ..() //The gun actually firing
postfire_empty_checks(.)
diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm
index d0b69480a106..9d97dc627bd4 100644
--- a/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/code/modules/projectiles/guns/ballistic/assault.dm
@@ -1,10 +1,10 @@
/obj/item/gun/ballistic/automatic/assault
- burst_size = 1
- actions_types = list()
- wield_delay = 0.7 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+ wield_delay = 0.8 SECONDS
wield_slowdown = 0.6
- fire_delay = 1
+ fire_delay = 0.2 SECONDS
load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
@@ -17,18 +17,20 @@
/obj/item/gun/ballistic/automatic/assault/calculate_recoil(mob/user, recoil_bonus = 0)
var/gunslinger_bonus = 2
var/total_recoil = recoil_bonus
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/automatic/assault/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 8
+ var/gunslinger_bonus = 16
var/total_spread = bonus_spread
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+
+ return ..(user, total_spread)
/obj/item/gun/ballistic/automatic/assault/skm
name = "\improper SKM-24"
@@ -44,8 +46,8 @@
icon_state = "skm"
item_state = "skm"
- mag_display = TRUE
- special_mags = TRUE
+ show_magazine_on_sprite = TRUE
+ unique_mag_sprites_for_variants = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
@@ -55,9 +57,7 @@
spread = 1
wield_delay = 0.7 SECONDS
-/obj/item/gun/ballistic/automatic/assault/skm/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ fire_delay = 0.2 SECONDS
/obj/item/gun/ballistic/automatic/assault/skm/pirate
name = "\improper Chopper"
@@ -82,22 +82,21 @@
fire_sound = 'sound/weapons/gun/rifle/m16.ogg'
icon_state = "p16"
item_state = "p16"
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/p16
spread = 2
wield_delay = 0.5 SECONDS
+
+ fire_delay = 0.18 SECONDS
+
rack_sound = 'sound/weapons/gun/rifle/m16_cocked.ogg'
load_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
load_empty_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
eject_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
-/obj/item/gun/ballistic/automatic/assault/p16/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-
/obj/item/gun/ballistic/automatic/assault/p16/minutemen
name = "\improper CM-16"
desc = "The standard-issue rifle of CLIP and an extensively modified reproduction of the P-16. Chambered in 5.56mm."
@@ -106,72 +105,56 @@
/obj/item/gun/ballistic/automatic/assault/swiss_cheese
name = "\improper Swiss Cheese"
- desc = "An ancient longarm famous for its boxy, modular design. The DMA on this unit is, sadly, broken. Uses 5.56mm ammunition for Matter mode."
+ desc = "An ancient longarm famous for its boxy, modular design. Mass produced by the Terran Confederation in ages past, these often mutiple century old designs have survied due to their sheer ruggedness. The DMA on this unit is sadly broken, but these rifles are known for their excellent burst fire. Uses 5.56mm ammunition for Matter mode."
icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/swiss.ogg'
icon_state = "swiss"
item_state = "swiss"
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
burst_size = 3
- fire_delay = 1.5
+ burst_delay = 0.08 SECONDS
+ fire_delay = 0.25 SECONDS
spread = 8
weapon_weight = WEAPON_MEDIUM
+ gun_firenames = list(FIREMODE_SEMIAUTO = "matter semi-auto", FIREMODE_BURST = "matter burst fire", FIREMODE_FULLAUTO = "matter full auto", FIREMODE_OTHER = "hybrid")
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER)
+
+ fire_select_icon_state_prefix = "swisschesse_"
+
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/swiss
- actions_types = list(/datum/action/item_action/toggle_firemode)
manufacturer = MANUFACTURER_SOLARARMORIES
spread = 8
spread_unwielded = 15
-/obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.65 SECONDS)
-
-/obj/item/gun/ballistic/automatic/assault/swiss_cheese/afterattack(atom/target, mob/living/user, flag, params)
- if(select == 2)
- to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.")
- return
- else
- return ..()
-
-/obj/item/gun/ballistic/automatic/assault/swiss_cheese/burst_select()
- var/mob/living/carbon/human/user = usr
- switch(select)
- if(1)
- select = 2
- to_chat(user, "You switch to Hybrid.")
- if(2)
- select = 1
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
- to_chat(user, "You switch to [burst_size]-rnd Matter.")
-
- playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
- update_appearance()
- for(var/datum/action/action as anything in actions)
- action.UpdateButtonIcon()
-
-#define E40_BALLISTIC_MODE 1
-#define E40_LASER_MODE 2
+/obj/item/gun/ballistic/automatic/assault/swiss_cheese/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.")
/obj/item/gun/ballistic/automatic/assault/e40
name = "\improper E-40 Hybrid Rifle"
- desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic and laser system. Chambered in .229 Eoehoma caseless, and uses energy for lasers."
+ desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic/laser system along with an advanced ammo counter. Once an icon for bounty hunters, age has broken most down, so these end up in collector's hands or as shoddy Frontiersmen laser SMG conversions when in their inheritted stockpiles. But if one were to find one in working condition, it would be just as formidable as back then. Chambered in .229 Eoehoma caseless, and uses energy for lasers."
icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "e40"
item_state = "e40"
mag_type = /obj/item/ammo_box/magazine/e40
can_suppress = FALSE
- actions_types = list(/datum/action/item_action/toggle_firemode)
var/obj/item/gun/energy/laser/e40_laser_secondary/secondary
+ fire_select_icon_state_prefix = "e40_"
+
+ fire_delay = 0.18 SECONDS
+ recoil_unwielded = 3
+
+ gun_firenames = list(FIREMODE_FULLAUTO = "full auto ballistic", FIREMODE_OTHER = "full auto laser")
+ gun_firemodes = list(FIREMODE_FULLAUTO, FIREMODE_OTHER)
+ default_firemode = FIREMODE_OTHER
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/laser/e40_bal.ogg'
manufacturer = MANUFACTURER_EOEHOMA
@@ -179,56 +162,84 @@
/obj/item/gun/ballistic/automatic/assault/e40/Initialize()
. = ..()
secondary = new /obj/item/gun/energy/laser/e40_laser_secondary(src)
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
RegisterSignal(secondary, COMSIG_ATOM_UPDATE_ICON, PROC_REF(secondary_update_icon))
SEND_SIGNAL(secondary, COMSIG_GUN_DISABLE_AUTOFIRE)
update_appearance()
+/obj/item/gun/ballistic/automatic/assault/e40/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/ammo_hud/eoehoma) // at long last... the ammo counter on the side of the sprite is functional...
+
/obj/item/gun/ballistic/automatic/assault/e40/do_autofire(datum/source, atom/target, mob/living/shooter, params)
- if(select == E40_LASER_MODE)
- secondary.do_autofire(source, target, shooter, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.do_autofire(source, target, shooter, params)
/obj/item/gun/ballistic/automatic/assault/e40/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params)
- if(select == E40_LASER_MODE)
- secondary.do_autofire_shot(source, target, shooter, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.do_autofire_shot(source, target, shooter, params)
/obj/item/gun/ballistic/automatic/assault/e40/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
- if(select == E40_LASER_MODE)
- secondary.process_fire(target, user, message, params, zone_override, bonus_spread)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.process_fire(target, user, message, params, zone_override, bonus_spread)
/obj/item/gun/ballistic/automatic/assault/e40/can_shoot()
- if(select == E40_LASER_MODE)
- return secondary.can_shoot()
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.can_shoot()
/obj/item/gun/ballistic/automatic/assault/e40/afterattack(atom/target, mob/living/user, flag, params)
- if(select == E40_LASER_MODE)
- secondary.afterattack(target, user, flag, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.afterattack(target, user, flag, params)
/obj/item/gun/ballistic/automatic/assault/e40/attackby(obj/item/attack_obj, mob/user, params)
if(istype(attack_obj, /obj/item/stock_parts/cell/gun))
- secondary.attackby(attack_obj, user, params)
+ return secondary.attackby(attack_obj, user, params)
if(istype(attack_obj, /obj/item/screwdriver))
- secondary.screwdriver_act(user, attack_obj,)
- else
- ..()
+ return secondary.screwdriver_act(user, attack_obj,)
+ return ..()
+
/obj/item/gun/ballistic/automatic/assault/e40/can_shoot()
- if(select == E40_LASER_MODE)
- return secondary.can_shoot()
- return ..()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
+ return ..()
+ return secondary.can_shoot()
+
+/obj/item/gun/ballistic/automatic/assault/e40/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+ secondary.wielded = TRUE
+ INVOKE_ASYNC(src, .proc.do_wield, user)
+
+/obj/item/gun/ballistic/automatic/assault/e40/do_wield(mob/user)
+ . = ..()
+ secondary.wielded_fully = wielded_fully
+
+/// triggered on unwield of two handed item
+/obj/item/gun/ballistic/automatic/assault/e40/on_unwield(obj/item/source, mob/user)
+ . = ..()
+ secondary.wielded_fully = FALSE
+ secondary.wielded = FALSE
+
/obj/item/gun/ballistic/automatic/assault/e40/proc/secondary_update_icon()
- update_icon()
+ update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
+
+/obj/item/gun/ballistic/automatic/assault/e40/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ secondary.pre_fire(target, user, message, flag, params, zone_override, bonus_spread)
+
+
+/obj/item/gun/ballistic/automatic/powered/get_cell()
+ return cell
/obj/item/gun/ballistic/automatic/assault/e40/update_overlays()
. = ..()
@@ -244,41 +255,33 @@
. += "[icon_state]_cell"
-/obj/item/gun/ballistic/automatic/assault/e40/burst_select()
- var/mob/living/carbon/human/user = usr
- switch(select)
- if(NONE)
- select = E40_BALLISTIC_MODE
- to_chat(user, "You switch to full automatic ballistic.")
- if(E40_BALLISTIC_MODE)
- select = E40_LASER_MODE
- to_chat(user, "You switch to full auto laser.")
- SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE)
- SEND_SIGNAL(secondary, COMSIG_GUN_ENABLE_AUTOFIRE)
- if(E40_LASER_MODE)
- select = E40_BALLISTIC_MODE
- to_chat(user, "You switch to full automatic ballistic.")
- SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
- SEND_SIGNAL(secondary, COMSIG_GUN_DISABLE_AUTOFIRE)
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
- update_icon()
- return
-
-
-
/obj/item/gun/ballistic/automatic/assault/e40/toggle_safety(mob/user, silent=FALSE)
. = ..()
secondary.toggle_safety(user, silent=TRUE)
+/obj/item/gun/ballistic/automatic/assault/e40/fire_select(mob/living/carbon/human/user)
+ . = ..()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode == FIREMODE_OTHER)
+ SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
+ SEND_SIGNAL(src, COMSIG_GUN_SET_AUTOFIRE_SPEED, secondary.fire_delay)
+ else
+ SEND_SIGNAL(src, COMSIG_GUN_SET_AUTOFIRE_SPEED, fire_delay)
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
+
//laser
/obj/item/gun/energy/laser/e40_laser_secondary
name = "secondary e40 laser gun"
- desc = "The laser component of a E-40 Hybrid Rifle. You probably shouldn't see this."
+ desc = "The laser component of a E-40 Hybrid Rifle. You probably shouldn't see this. If you can though, you should probably know lorewise, this is primary, the ballistic compontent in universe is secondary. Unfortunately, we cannot simulate this, So codewise this is secondary."
fire_sound = 'sound/weapons/gun/laser/e40_las.ogg'
w_class = WEIGHT_CLASS_NORMAL
ammo_type = list(/obj/item/ammo_casing/energy/laser/assault)
- fire_delay = 2
+ fire_delay = 0.2 SECONDS
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
+ spread_unwielded = 20
//techinically a battle rifle, i'm putting it here for organisation sake
@@ -294,12 +297,13 @@
internal_magazine = TRUE
mag_type = /obj/item/ammo_box/magazine/internal/vickland
fire_sound = 'sound/weapons/gun/rifle/vickland.ogg'
- burst_size = 0
actions_types = list()
manufacturer = MANUFACTURER_HUNTERSPRIDE
rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+ fire_delay = 0.4 SECONDS
+
spread_unwielded = 25
recoil = 0
recoil_unwielded = 4
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 094ea753af10..c0ccf71d513e 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -1,10 +1,10 @@
+
/obj/item/gun/ballistic/automatic
w_class = WEIGHT_CLASS_NORMAL
- var/select = 1
can_suppress = TRUE
- burst_size = 3
- fire_delay = 2
- actions_types = list(/datum/action/item_action/toggle_firemode)
+
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
semi_auto = TRUE
fire_sound = 'sound/weapons/gun/smg/shot.ogg'
fire_sound_volume = 90
@@ -14,6 +14,7 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ fire_delay = 0.4 SECONDS
wield_delay = 1 SECONDS
spread = 0
spread_unwielded = 13
@@ -21,36 +22,6 @@
recoil_unwielded = 4
wield_slowdown = 0.35
-/obj/item/gun/ballistic/automatic/update_overlays()
- . = ..()
- if(!select)
- . += "[initial(icon_state)]_semi"
- if(select == 1)
- . += "[initial(icon_state)]_burst"
-
-/obj/item/gun/ballistic/automatic/ui_action_click(mob/user, actiontype)
- if(istype(actiontype, /datum/action/item_action/toggle_firemode))
- burst_select()
- else
- ..()
-
-/obj/item/gun/ballistic/automatic/proc/burst_select()
- var/mob/living/carbon/human/user = usr
- select = !select
- if(!select)
- burst_size = 1
- fire_delay = 0
- to_chat(user, "You switch to semi-automatic.")
- else
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
- to_chat(user, "You switch to [burst_size]-rnd burst.")
-
- playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
- update_appearance()
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
// SNIPER //
@@ -68,7 +39,6 @@
recoil = 2
weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
- fire_delay = 40
burst_size = 1
w_class = WEIGHT_CLASS_NORMAL
zoomable = TRUE
@@ -76,13 +46,13 @@
zoom_out_amt = 5
slot_flags = ITEM_SLOT_BACK
actions_types = list()
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
manufacturer = MANUFACTURER_SCARBOROUGH
spread = -5
spread_unwielded = 20
- recoil = 0
- recoil_unwielded = 4
+ recoil = 5
+ recoil_unwielded = 50
wield_slowdown = 1
wield_delay = 1.3 SECONDS
@@ -92,40 +62,40 @@
can_suppress = TRUE
can_unsuppress = TRUE
+EMPTY_GUN_HELPER(automatic/sniper_rifle/syndicate)
+
// Old Semi-Auto Rifle //
-/obj/item/gun/ballistic/automatic/surplus
+/obj/item/gun/ballistic/automatic/surplus //TODO: NEEDS TO BE REPLACED WITH PISTOL CARBINES OR LOWCAL SEMI-AUTO RIFLES
name = "surplus rifle"
desc = "One of countless cheap, obsolete rifles found throughout the Frontier. Its lack of lethality renders it mostly a deterrent. Chambered in 10mm."
icon_state = "surplus"
item_state = "moistnugget"
weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
- fire_delay = 10
+ fire_delay = 0.5 SECONDS
burst_size = 1
can_unsuppress = TRUE
can_suppress = TRUE
w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BACK
- actions_types = list()
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
// Laser rifle (rechargeable magazine) //
-/obj/item/gun/ballistic/automatic/laser
+/obj/item/gun/ballistic/automatic/laser //TODO: REMOVE
name = "laser rifle"
desc = "Though sometimes mocked for the relatively weak firepower of their energy weapons, the logistic miracle of rechargeable ammunition has given Nanotrasen a decisive edge over many a foe."
icon_state = "oldrifle"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/recharge
- fire_delay = 2
+ fire_delay = 0.2 SECONDS
can_suppress = FALSE
burst_size = 0
- actions_types = list()
fire_sound = 'sound/weapons/laser.ogg'
casing_ejector = FALSE
-/obj/item/gun/ballistic/automatic/ebr
+/obj/item/gun/ballistic/automatic/ebr //fuck this gun, its getting wiped soon enough
name = "\improper M514 EBR"
desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308. Effective against personnel and armor alike."
icon = 'icons/obj/guns/48x32guns.dmi'
@@ -134,18 +104,19 @@
icon_state = "ebr"
item_state = "ebr"
zoomable = TRUE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
mag_type = /obj/item/ammo_box/magazine/ebr
fire_sound = 'sound/weapons/gun/rifle/shot_alt2.ogg'
burst_size = 0
- actions_types = list()
manufacturer = MANUFACTURER_SCARBOROUGH
wield_slowdown = 2
spread = -4
+EMPTY_GUN_HELPER(automatic/ebr)
+
/obj/item/gun/ballistic/automatic/gal
name = "\improper CM-GAL-S"
desc = "The standard issue DMR of CLIP. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
@@ -154,7 +125,7 @@
icon_state = "gal"
item_state = "gal"
zoomable = TRUE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
mag_type = /obj/item/ammo_box/magazine/gal
@@ -165,6 +136,8 @@
wield_slowdown = 2
spread = -4
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
/obj/item/gun/ballistic/automatic/gal/inteq
name = "\improper SsG-04"
@@ -181,5 +154,5 @@
can_suppress = FALSE
actions_types = list()
can_bayonet = FALSE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_LIGHT
diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm
index 8fce353d8b22..c50f906e4eba 100644
--- a/code/modules/projectiles/guns/ballistic/gauss.dm
+++ b/code/modules/projectiles/guns/ballistic/gauss.dm
@@ -9,9 +9,9 @@
load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg'
can_suppress = FALSE
burst_size = 1
- fire_delay = 3
+ fire_delay = 0.3 SECONDS
spread = 0
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
@@ -25,6 +25,7 @@
recoil_unwielded = 4
wield_slowdown = 0.75
wield_delay = 1 SECONDS
+ fire_select_icon_state_prefix = "pellet_"
/obj/item/gun/ballistic/automatic/powered/gauss/modelh
name = "Model H"
@@ -37,14 +38,15 @@
cell_type = /obj/item/stock_parts/cell/gun/solgov
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
- fire_delay = 0 //pistol
- mag_display = FALSE
+ fire_delay = 0.6 SECONDS //pistol, but heavy caliber.
+ show_magazine_on_sprite = FALSE
empty_indicator = FALSE
manufacturer = MANUFACTURER_SOLARARMORIES
- recoil = 1
+ recoil = 2
recoil_unwielded = 4
- spread = 3
+ spread = 6
spread_unwielded = 12
+ fire_select_icon_state_prefix = "slug_"
/obj/item/gun/ballistic/automatic/powered/gauss/modelh/suns
desc = "A standard-issue pistol exported from the Solarian Confederation. It fires slow flesh-rending ferromagnetic slugs at a high energy cost, however they are ineffective on any armor. It is painted in the colors of SUNS."
@@ -62,13 +64,13 @@
fire_sound = 'sound/weapons/gun/gauss/claris.ogg'
load_sound = 'sound/weapons/gun/gauss/sniper_reload.ogg'
cell_type = /obj/item/stock_parts/cell/gun/solgov
- fire_delay = 2
+ fire_delay = 0.4 SECONDS
bolt_type = BOLT_TYPE_NO_BOLT
internal_magazine = TRUE
- casing_ejector = FALSE
- mag_display = FALSE
+ show_magazine_on_sprite = FALSE
empty_indicator = FALSE
manufacturer = MANUFACTURER_SOLARARMORIES
+ fire_select_icon_state_prefix = "pellet_"
/obj/item/gun/ballistic/automatic/powered/gauss/claris/suns
desc = "An antiquated Solarian rifle. Chambered in ferromagnetic pellets, just as the founding Solarians intended. Evidently, SUNS' founders echo the sentiment, as it appears to be painted in their colors."
@@ -85,17 +87,19 @@
fire_sound = 'sound/weapons/gun/gauss/gar.ogg'
load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg'
cell_type = /obj/item/stock_parts/cell/gun/solgov
- burst_size = 2
- fire_delay = 1
+ burst_size = 1
+
+ fire_delay = 0.2 SECONDS
+
actions_types = list()
empty_indicator = FALSE
manufacturer = MANUFACTURER_SOLARARMORIES
- wield_delay = 0.7 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/automatic/powered/gauss/gar/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ wield_delay = 0.7 SECONDS
+ fire_select_icon_state_prefix = "lance_"
/obj/item/gun/ballistic/automatic/powered/gauss/gar/suns
desc = "A Solarian carbine, unusually modern for its producers. It's just modern enough for SUNS, however, who have painted the weapon in their colors. Launches ferromagnetic lances at alarming speeds."
diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm
index 3bd143e98b43..afa111c6bbf8 100644
--- a/code/modules/projectiles/guns/ballistic/hmg.dm
+++ b/code/modules/projectiles/guns/ballistic/hmg.dm
@@ -7,7 +7,10 @@
burst_size = 1
actions_types = list(/datum/action/item_action/deploy_bipod) //this is on hmg, as I need the same mechanics for a future gun. ideally, this would be an attachment, but that's still pending
drag_slowdown = 1.5
- fire_delay = 1
+ fire_delay = 0.1 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
spread = 4
spread_unwielded = 80
@@ -85,7 +88,7 @@
if(!can_deploy)
to_chat(user, "You need to brace against something to deploy [src]'s bipod! Either lie on the floor or stand next to a waist high object like a table!")
return
- if(!do_mob(user, src, deploy_time, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded))))
+ if(!do_after(user, deploy_time, src, NONE, TRUE, CALLBACK(src, PROC_REF(is_wielded))))
to_chat(user, "You need to hold still to deploy [src]'s bipod!")
return
playsound(src, 'sound/machines/click.ogg', 75, TRUE)
@@ -114,24 +117,26 @@
retract_bipod(user=user)
/obj/item/gun/ballistic/automatic/hmg/calculate_recoil(mob/user, recoil_bonus = 0)
- var/gunslinger_bonus = 1
+ var/gunslinger_bonus = 2
var/total_recoil = recoil_bonus
+
if(bipod_deployed)
total_recoil += deploy_recoil_bonus
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/automatic/hmg/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 4
+ var/gunslinger_bonus = 20
var/total_spread = bonus_spread
+
if(bipod_deployed)
total_spread += deploy_spread_bonus
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+
+ return ..(user, total_spread)
/obj/item/gun/ballistic/automatic/hmg/update_icon_state()
@@ -155,9 +160,12 @@
mag_type = /obj/item/ammo_box/magazine/mm712x82
can_suppress = FALSE
spread = 7
+
+ fire_delay = 0.1 SECONDS
+
bolt_type = BOLT_TYPE_OPEN
- mag_display = TRUE
- mag_display_ammo = TRUE
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
tac_reloads = FALSE
fire_sound = 'sound/weapons/gun/l6/shot.ogg'
rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg'
@@ -165,10 +173,6 @@
manufacturer = MANUFACTURER_SCARBOROUGH
var/cover_open = FALSE
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
-
/obj/item/gun/ballistic/automatic/hmg/l6_saw/examine(mob/user)
. = ..()
. += "alt + click to [cover_open ? "close" : "open"] the dust cover."
@@ -217,16 +221,17 @@
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/rifle47x33mm
spread = 7
+
+ fire_delay = 0.1 SECONDS
+
+ fire_select_icon_state_prefix = "caseless_"
+
can_suppress = FALSE
can_bayonet = FALSE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
w_class = WEIGHT_CLASS_BULKY
manufacturer = MANUFACTURER_SOLARARMORIES
-/obj/item/gun/ballistic/automatic/hmg/solar/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
-
/obj/item/gun/ballistic/automatic/hmg/skm_lmg
name = "\improper SKM-24u"
desc = "What appears to be a standard SKM-24 at first glance is actually a light machine gun conversion, with an extended, heavy barrel and overhauled internals. Its weight, bulk, and robust fire rate make it difficult to handle without using the bipod in a prone position or against appropriate cover such as a table. Chambered in 7.62x40mm CLIP."
@@ -242,15 +247,18 @@
eject_sound = 'sound/weapons/gun/rifle/skm_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/rifle/skm_unload.ogg'
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
- mag_display = TRUE
- special_mags = TRUE
+ show_magazine_on_sprite = TRUE
+ unique_mag_sprites_for_variants = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
manufacturer = MANUFACTURER_IMPORT
mag_type = /obj/item/ammo_box/magazine/skm_762_40
+ fire_delay = 0.13 SECONDS
spread = 7 //you can hipfire, but why?
spread_unwielded = 25
@@ -265,7 +273,6 @@
/obj/item/gun/ballistic/automatic/hmg/skm_lmg/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) //slower than other lmgs but faster than skm and most smgs
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended //spawns with the proper extended magazine, for erts
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 01644cd6e9bb..5619b039d488 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -11,7 +11,11 @@
fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
w_class = WEIGHT_CLASS_NORMAL
bolt_type = BOLT_TYPE_NO_BOLT
- fire_delay = 10
+ fire_delay = 1 SECONDS
+ semi_auto = TRUE
+ has_safety = FALSE
+ safety = FALSE
+ gate_offset = 0
/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params)
..()
@@ -35,7 +39,7 @@
fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
mag_type = /obj/item/ammo_box/magazine/m75
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.4 SECONDS
actions_types = list()
casing_ejector = FALSE
@@ -50,7 +54,7 @@
w_class = WEIGHT_CLASS_BULKY
can_suppress = FALSE
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.4 SECONDS
casing_ejector = FALSE
weapon_weight = WEAPON_HEAVY
bolt_type = BOLT_TYPE_NO_BOLT
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 4c3aafad7ce3..c4d505bcb10c 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -5,8 +5,6 @@
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = TRUE
- burst_size = 1
- fire_delay = 0 //spam it as fast as you can
actions_types = list()
bolt_type = BOLT_TYPE_LOCKING
fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
@@ -24,18 +22,21 @@
bolt_wording = "slide"
weapon_weight = WEAPON_LIGHT
pickup_sound = 'sound/items/handling/gun_pickup.ogg'
- fire_delay = 1
manufacturer = MANUFACTURER_SCARBOROUGH
+ recoil = 0.5 // apogee wants bloom, this is a placeholder until then to simulate the same concept.
+ recoil_unwielded = 3
+ recoil_backtime_multiplier = 1
+
wield_delay = 0.2 SECONDS
- spread = 2
- spread_unwielded = 5
+ fire_delay = 0.2 SECONDS
+ spread = 5
+ spread_unwielded = 7
wield_slowdown = 0.15
muzzleflash_iconstate = "muzzle_flash_light"
-/obj/item/gun/ballistic/automatic/pistol/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol)
/obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload)
. = ..()
@@ -63,22 +64,19 @@
load_empty_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
eject_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
- recoil = -2
-/obj/item/gun/ballistic/automatic/pistol/candor/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol/candor)
/obj/item/gun/ballistic/automatic/pistol/candor/factory //also give this to the srm, their candors should probably look factory fresh from how well taken care of they are
desc = "A classic semi-automatic handgun, widely popular throughout the Frontier. An engraving on the slide marks it as a product of Hunter's Pride. This example has been kept in especially good shape, and may as well be fresh out of the workshop. Chambered in .45."
item_state = "hp_generic_fresh"
+EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
+
/obj/item/gun/ballistic/automatic/pistol/candor/factory/update_overlays()
. = ..()
. += "[initial(icon_state)]_factory"
-/obj/item/gun/ballistic/automatic/pistol/candor/factory/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/pistol/candor/phenex
name = "\improper HP Phenex"
desc = "A uniquely modified version of the Candor, famously created by Hunter's Pride. Named after the daemonic Phoenix of legend that the Ashen Huntsman had once slain, this hell-kissed weapon is more visually intimidating than its original counterpart, but mechanically acts the same. Chambered in .45."
@@ -92,7 +90,7 @@
force = 14
mag_type = /obj/item/ammo_box/magazine/m50
can_suppress = FALSE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
fire_sound = 'sound/weapons/gun/pistol/deagle.ogg'
rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
@@ -102,11 +100,13 @@
load_empty_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg'
eject_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
- fire_delay = 0.7 SECONDS
- recoil = 1
- recoil_unwielded = 2
- spread = 4
- spread_unwielded = 7
+ fire_delay = 0.6 SECONDS
+ recoil = 2
+ recoil_unwielded = 5
+ recoil_backtime_multiplier = 2
+
+ spread = 7
+ spread_unwielded = 14
/obj/item/gun/ballistic/automatic/pistol/deagle/gold
desc = "A gold-plated Desert Eagle folded over a million times by superior Martian gunsmiths. Uses .50 AE ammo."
@@ -126,25 +126,11 @@
mag_type = /obj/item/ammo_box/magazine/pistolm9mm
can_suppress = FALSE
burst_size = 3
- fire_delay = 2
- actions_types = list(/datum/action/item_action/toggle_firemode)
-
-/obj/item/gun/ballistic/automatic/pistol/stickman
- name = "flat gun"
- desc = "A 2 dimensional gun.. what?"
- icon_state = "flatgun"
- manufacturer = MANUFACTURER_NONE
+ burst_delay = 0.1 SECONDS
+ fire_delay = 0.4 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST)
+ default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user)
- SHOULD_CALL_PARENT(0)
- to_chat(user, "As you try to pick up [src], it slips out of your grip..")
- if(prob(50))
- to_chat(user, "..and vanishes from your vision! Where the hell did it go?")
- qdel(src)
- user.update_icons()
- else
- to_chat(user, "..and falls into view. Whew, that was a close one.")
- user.dropItemToGround(src)
/obj/item/gun/ballistic/automatic/pistol/commander
name = "\improper Commander"
@@ -160,8 +146,7 @@
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
-/obj/item/gun/ballistic/automatic/pistol/commander/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol/commander)
/obj/item/gun/ballistic/automatic/pistol/commander/inteq
name = "\improper Commissioner"
@@ -170,8 +155,7 @@
item_state = "commander-inteq"
manufacturer = MANUFACTURER_INTEQ
-/obj/item/gun/ballistic/automatic/pistol/commander/inteq/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
/obj/item/gun/ballistic/automatic/pistol/commissar
name = "\improper Commissar"
@@ -241,6 +225,8 @@
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ fire_select_icon_state_prefix = "caseless_"
+
/obj/item/gun/ballistic/automatic/pistol/solgov/old
icon_state = "pistole-c-old"
@@ -251,7 +237,7 @@
weapon_weight = WEAPON_LIGHT
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/tec9
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
@@ -278,12 +264,6 @@
to_chat(user, "Theres no magazine to replace!")
return
-/obj/item/gun/ballistic/automatic/pistol/disposable/pizza
- name = "pizza disposable gun"
- desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT
- icon_state = "disposable_pizza"
- custom_materials = list(/datum/material/pizza=2000)
-
//not technically a pistol but whatever
/obj/item/gun/ballistic/derringer
name = ".38 Derringer"
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 0ba1792be28e..a7a47ba22a40 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -25,7 +25,7 @@
var/spin_delay = 10
var/recent_spin = 0
manufacturer = MANUFACTURER_SCARBOROUGH
- fire_delay = 2
+ fire_delay = 0.4 SECONDS
spread_unwielded = 15
recoil = 0.5
recoil_unwielded = 2
@@ -35,6 +35,9 @@
dry_fire_text = "snap"
wield_slowdown = 0.3
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
safety_wording = "hammer"
var/gate_loaded = FALSE //for stupid wild west shit
@@ -98,13 +101,13 @@
for(var/i in 1 to num_to_unload)
var/doafter_time = 0.4 SECONDS
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
if(!eject_casing(user))
doafter_time = 0 SECONDS
else
num_unloaded++
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
chamber_round(TRUE, TRUE)
@@ -170,7 +173,7 @@
else
if(slot)
if(!slot.BB && allow_ejection)
- if(do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
eject_casing(user)
rounds = magazine.ammo_list()
@@ -214,7 +217,7 @@
var/doafter_time = 0.8 SECONDS
if(magazine.instant_load && attacking_box.instant_load)
doafter_time = 0 SECONDS
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
if(!insert_casing(user, casing_to_insert, FALSE))
break
@@ -231,7 +234,7 @@
if(!casing_to_insert || (magazine.caliber && casing_to_insert.caliber != magazine.caliber) || (!magazine.caliber && casing_to_insert.type != magazine.ammo_type))
break
var/doafter_time = 0.4 SECONDS
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
if(!insert_casing(null, casing_to_insert, FALSE))
doafter_time = 0 SECONDS
@@ -239,7 +242,7 @@
num_loaded++
attacking_box.update_appearance()
attacking_box.stored_ammo -= casing_to_insert
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
switch(gate_load_direction)
if(REVOLVER_AUTO_ROTATE_RIGHT_LOADING)
@@ -279,7 +282,8 @@
to_chat(user, "You rack the [bolt_wording] of \the [src].")
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
- chamber_round(TRUE)
+ if(!safety && !semi_auto)
+ chamber_round(TRUE)
SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
update_appearance()
@@ -411,11 +415,14 @@
var/fan = FALSE
if(HAS_TRAIT(user, TRAIT_GUNSLINGER) && !semi_auto && !wielded && loc == user && !safety && !user.get_inactive_held_item())
fan = TRUE
+ fire_delay = 0 SECONDS
. = ..()
+ fire_delay = src::fire_delay
if(fan)
rack()
to_chat(user, "You fan the [bolt_wording] of \the [src]!")
- user.changeNext_move(CLICK_CD_RAPID)
+ balloon_alert_to_viewers("fans revolver!")
+ fire_delay = 0 SECONDS
/obj/item/gun/ballistic/revolver/shoot_live_shot(mob/living/user, pointblank, atom/pbtarget, message)
. = ..()
@@ -434,14 +441,17 @@
/obj/item/gun/ballistic/revolver/calculate_recoil(mob/user, recoil_bonus = 0)
var/gunslinger_bonus = -1
var/total_recoil = recoil_bonus
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_recoil += gunslinger_bonus
total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/revolver/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = -4
+ var/gunslinger_bonus = -8
var/total_spread = bonus_spread
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_spread += gunslinger_bonus
@@ -454,17 +464,12 @@
/obj/item/gun/ballistic/revolver/proc/tryflip(mob/living/user)
if(HAS_TRAIT(user, TRAIT_GUNSLINGER))
if(COOLDOWN_FINISHED(src, flip_cooldown))
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
- to_chat(user, "While trying to flip the [src] you pull the trigger and accidently shoot yourself!")
- var/flip_mistake = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST)
- process_fire(user, user, FALSE, flip_mistake)
- user.dropItemToGround(src, TRUE)
- return
COOLDOWN_START(src, flip_cooldown, 0.3 SECONDS)
SpinAnimation(5,1)
user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.")
playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
return
+
/obj/item/gun/ballistic/revolver/detective
name = "\improper HP Detective Special"
desc = "A small law enforcement firearm. Originally commissioned by Nanotrasen for their Private Investigation division, it has become extremely popular among independent civilians as a cheap, compact sidearm. Uses .38 Special rounds."
@@ -485,12 +490,15 @@
manufacturer = MANUFACTURER_HUNTERSPRIDE
recoil = 0 //weaker than normal revolver, no recoil
+ fire_delay = 0.2 SECONDS
+
+EMPTY_GUN_HELPER(revolver/detective)
/obj/item/gun/ballistic/revolver/detective/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ammo_hud/revolver) //note that the hud at the moment only supports 6 round revolvers, 7 or 5 isn't supported rn
-
-/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+//...why...?
+/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0)
if(magazine.caliber != initial(magazine.caliber))
if(prob(100 - (magazine.ammo_count() * 5))) //minimum probability of 70, maximum of 95
playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
@@ -555,14 +563,14 @@
/obj/item/gun/ballistic/revolver/montagne
name = "\improper HP Montagne"
- desc = "An ornate break-open revolver issued to high-ranking members of the Saint-Roumain Militia. Chambered in .45."
+ desc = "An ornate break-open revolver issued to high-ranking members of the Saint-Roumain Militia. Chambered in .44."
icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "montagne"
manufacturer = MANUFACTURER_HUNTERSPRIDE
spread_unwielded = 15
recoil = 0
- mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45/montagne
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev44/montagne
/obj/item/gun/ballistic/revolver/montagne/ComponentInitialize()
. = ..()
@@ -577,19 +585,22 @@
fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
manufacturer = MANUFACTURER_HUNTERSPRIDE
gate_loaded = TRUE
+ fire_delay = 0.6 SECONDS
wield_slowdown = 0.5
- spread_unwielded = 5
- spread = 2
+ spread_unwielded = 20
+ spread = 6
recoil = 2
recoil_unwielded = 4
-// A gun to play Russian Roulette!
-// You can spin the chamber to randomize the position of the bullet.
-
/obj/item/gun/ballistic/revolver/ashhand/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ammo_hud/revolver)
+// A gun to play Russian Roulette!
+// You can spin the chamber to randomize the position of the bullet.
+
+//TODO: this is stupid, but used in ONE fucking ruin. Remember to remove when you aren't afraid to do a ton of path changes.
+
/obj/item/gun/ballistic/revolver/russian
name = "\improper Russian revolver"
desc = "A Solarian revolver for particularly lethal drinking games. It has a mechanism requiring you to spin the chamber before each trigger pull. Uses .357 ammo."
@@ -667,18 +678,6 @@
user.apply_damage(300, BRUTE, affecting)
user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!")
-/obj/item/gun/ballistic/revolver/russian/soul
- name = "cursed Russian revolver"
- desc = "To play with this revolver requires wagering your very soul."
-
-/obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user)
- ..()
- var/obj/item/soulstone/anybody/revolver/SS = new /obj/item/soulstone/anybody/revolver(get_turf(src))
- if(!SS.transfer_soul("FORCE", user)) //Something went wrong
- qdel(SS)
- return
- user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!")
-
/obj/item/gun/ballistic/revolver/firebrand
name = "\improper HP Firebrand"
desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. While fast to fire, it is extremely inaccurate. Uses .357 ammo."
@@ -688,18 +687,18 @@
spread = 20
manufacturer = MANUFACTURER_HUNTERSPRIDE
spread_unwielded = 50
- fire_delay = 0
+ fire_delay = 0 SECONDS
gate_offset = 4
semi_auto = TRUE
safety_wording = "safety"
/obj/item/gun/ballistic/revolver/shadow
name = "\improper HP Shadow"
- desc = "A mid-size revolver. Despite the antiquated design, it is cheap, reliable, and stylish, making it a favorite among fast-drawing spacers and the officers of various militaries, as well as small-time police units. Chambered in .45."
+ desc = "A mid-size revolver. Despite the antiquated design, it is cheap, reliable, and stylish, making it a favorite among fast-drawing spacers and the officers of various militaries, as well as small-time police units. Chambered in .44."
fire_sound = 'sound/weapons/gun/revolver/cattleman.ogg'
icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "shadow"
- mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev44
manufacturer = MANUFACTURER_HUNTERSPRIDE
obj_flags = UNIQUE_RENAME
gate_loaded = TRUE
@@ -714,14 +713,8 @@
)
recoil = 0 //weaker than normal revolver, no recoil
+ spread_unwielded = 10
/obj/item/gun/ballistic/revolver/shadow/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ammo_hud/revolver)
-
-/obj/item/gun/ballistic/revolver/shadow/before_firing(atom/target, mob/user)
- . = ..()
- // if you go through the pain of not only using this shitty gun, but also with the fucking gunslinger quirk, you deserve this bonus. not a BIG bonus, but enough as an incentive to make people actually take the quirk.
- if(chambered.BB && (HAS_TRAIT(user, TRAIT_GUNSLINGER)))
- chambered.BB.damage += 5
- chambered.BB.armour_penetration += 5
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 24cf3323048a..336c8a07dce6 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -22,8 +22,11 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
spread = -1
- spread_unwielded = 12
+ spread_unwielded = 48
recoil = -3
recoil_unwielded = 4
wield_slowdown = 1
@@ -67,10 +70,6 @@
. = ..()
. += "The bolt is [bolt_locked ? "open" : "closed"]."
-///////////////////////
-// BOLT ACTION RIFLE //
-///////////////////////
-
/obj/item/gun/ballistic/rifle/illestren
name = "\improper HP Illestren"
desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, the Illestren is popular among colonists, pirates, snipers, and countless others. Chambered in 8x50mmR."
@@ -89,18 +88,18 @@
/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
. = ..()
if(.)
- spread = 36
- spread_unwielded = 108
+ spread = 24
+ spread_unwielded = 30
can_bayonet = FALSE
item_state = "illestren_sawn"
mob_overlay_state = item_state
weapon_weight = WEAPON_MEDIUM //you can fire it onehanded, makes it worse than worse than useless onehanded, but you can
/obj/item/gun/ballistic/rifle/illestren/blow_up(mob/user)
- . = 0
+ . = FALSE
if(chambered && chambered.BB)
process_fire(user, user, FALSE)
- . = 1
+ . = TRUE
/obj/item/gun/ballistic/rifle/illestren/factory
desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, this example has been kept in excellent shape and may as well be fresh out of the workshop. Chambered in 8x50mmR."
@@ -119,7 +118,8 @@
item_state = "illestren_sawn"
sawn_off = TRUE
weapon_weight = WEAPON_MEDIUM
-
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BELT
/obj/item/gun/ballistic/rifle/solgov
name = "SSG-669C"
@@ -160,57 +160,6 @@
manufacturer = MANUFACTURER_HUNTERSPRIDE
-/obj/item/gun/ballistic/rifle/illestren/enchanted
- name = "enchanted bolt-action rifle"
- desc = "Careful not to lose your head."
- var/guns_left = 30
- mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
- can_be_sawn_off = FALSE
- manufacturer = MANUFACTURER_NONE
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage
- name = "arcane barrage"
- desc = "Pew Pew Pew."
- fire_sound = 'sound/weapons/emitter.ogg'
- icon = 'icons/obj/guns/projectile.dmi'
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- icon_state = "arcane_barrage"
- item_state = "arcane_barrage"
- slot_flags = null
- can_bayonet = FALSE
- item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON
- flags_1 = NONE
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-
- mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/dropped()
- . = ..()
- guns_left = 0
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/proc/discard_gun(mob/living/user)
- user.throw_item(pick(oview(7,get_turf(user))))
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/discard_gun(mob/living/user)
- qdel(src)
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/attack_self()
- return
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- . = ..()
- if(!.)
- return
- if(guns_left)
- var/obj/item/gun/ballistic/rifle/illestren/enchanted/gun = new type
- gun.guns_left = guns_left - 1
- discard_gun(user)
- user.swap_hand()
- user.put_in_hands(gun)
- else
- user.dropItemToGround(src, TRUE)
-
/obj/item/gun/ballistic/rifle/polymer
name = "polymer survivor rifle"
desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout."
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 9d257821344b..d34bd25e254e 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -19,10 +19,14 @@
cartridge_wording = "shell"
tac_reloads = FALSE
pickup_sound = 'sound/items/handling/shotgun_pickup.ogg'
- fire_delay = 7
+ fire_delay = 0.7 SECONDS
pb_knockback = 2
manufacturer = MANUFACTURER_HUNTERSPRIDE
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+ fire_select_icon_state_prefix = "sg_"
+
wield_slowdown = 0.45
wield_delay = 0.8 SECONDS
@@ -48,7 +52,8 @@
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_recoil += gunslinger_bonus
total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
// BRIMSTONE SHOTGUN //
@@ -61,18 +66,17 @@
icon_state = "brimstone"
item_state = "brimstone"
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal
manufacturer = MANUFACTURER_HUNTERSPRIDE
- fire_delay = 1
- rack_delay = 2
+ fire_delay = 0.05 SECONDS //slamfire
+ rack_delay = 0.2 SECONDS
can_be_sawn_off = TRUE
-/obj/item/gun/ballistic/shotgun/brimstone/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
-
/obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user)
. = ..()
if(.)
@@ -99,7 +103,7 @@
sawn_desc = "Come with me if you want to live."
can_be_sawn_off = TRUE
rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
- fire_delay = 1
+ fire_delay = 0.1 SECONDS
/obj/item/gun/ballistic/shotgun/hellfire/sawoff(mob/user)
. = ..()
@@ -140,7 +144,7 @@
desc = "A semi-automatic shotgun with tactical furniture and six-shell capacity underneath."
icon_state = "cshotgun"
item_state = "shotgun_combat"
- fire_delay = 5
+ fire_delay = 0.5 SECONDS
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
@@ -197,7 +201,7 @@
// Bulldog shotgun //
-/obj/item/gun/ballistic/shotgun/bulldog
+/obj/item/gun/ballistic/shotgun/bulldog //TODO: REPATH TO LIKE /obj/item/gun/ballistic/shotgun/automatic/bulldog
name = "\improper Bulldog Shotgun"
desc = "A semi-automatic, magazine-fed shotgun designed for combat in tight quarters, manufactured by Scarborough Arms. A historical favorite of various Syndicate factions, especially the Gorlex Marauders."
icon = 'icons/obj/guns/48x32guns.dmi'
@@ -211,13 +215,12 @@
mag_type = /obj/item/ammo_box/magazine/m12g
can_suppress = FALSE
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.4 SECONDS // this NEEDS the old delay.
fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg'
- actions_types = list()
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
empty_alarm = TRUE
- special_mags = TRUE
+ unique_mag_sprites_for_variants = TRUE
semi_auto = TRUE
internal_magazine = FALSE
casing_ejector = TRUE
@@ -225,6 +228,13 @@
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
manufacturer = MANUFACTURER_SCARBOROUGH
+ load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+
spread = 4
spread_unwielded = 16
recoil = 1
@@ -232,6 +242,8 @@
wield_slowdown = 0.6
wield_delay = 0.65 SECONDS
+EMPTY_GUN_HELPER(shotgun/bulldog)
+
/obj/item/gun/ballistic/shotgun/bulldog/inteq
name = "\improper Mastiff Shotgun"
desc = "A variation of the Bulldog, seized from Syndicate armories by deserting troopers then modified to IRMG's standards."
@@ -240,6 +252,8 @@
mag_type = /obj/item/ammo_box/magazine/m12g
manufacturer = MANUFACTURER_INTEQ
+EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
+
/obj/item/gun/ballistic/shotgun/bulldog/suns
name = "\improper Bulldog-C Shotgun"
desc = "A variation of the Bulldog manufactured by Scarborough Arms for SUNS. Its shorter barrel is intended to provide additional maneuverability in personal defense scenarios."
@@ -255,8 +269,10 @@
item_state = "cm15"
empty_alarm = FALSE
empty_indicator = FALSE
- special_mags = FALSE
+ unique_mag_sprites_for_variants = FALSE
manufacturer = MANUFACTURER_MINUTEMAN
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
@@ -363,6 +379,25 @@
item_state = "dshotgun_sawn"
mob_overlay_state = item_state
+// sawn off beforehand
+/obj/item/gun/ballistic/shotgun/doublebarrel/presawn
+ name = "sawn-off double-barreled shotgun"
+ desc = "A break action shotgun cut down to the size of a sidearm. While the recoil is even harsher, it offers a lot of power in a very small package. Chambered in 12g."
+ sawn_off = TRUE
+ weapon_weight = WEAPON_MEDIUM
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BELT
+
+ wield_slowdown = 0.25
+ wield_delay = 0.3 SECONDS //OP? maybe
+
+ spread = 8
+ spread_unwielded = 15
+ recoil = 3 //or not
+ recoil_unwielded = 5
+ item_state = "dshotgun_sawn"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/dual/lethal
+
/obj/item/gun/ballistic/shotgun/doublebarrel/roumain
name = "HP antique double-barreled shotgun"
desc = "A special-edition shotgun hand-made by Hunter's Pride with a high-quality walnut stock inlaid with brass scrollwork. Shotguns like this are very rare outside of the Saint-Roumain Militia's ranks. Otherwise functionally identical to a common double-barreled shotgun. Chambered in 12g."
@@ -436,52 +471,6 @@
sawn_off = TRUE
slot_flags = ITEM_SLOT_BELT
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook
- name = "hook modified sawn-off shotgun"
- desc = "Range isn't an issue when you can bring your victim to you."
- icon_state = "hookshotgun"
- icon = 'icons/obj/guns/projectile.dmi'
- item_state = "shotgun"
- load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg'
- mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty
- w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_MEDIUM
- can_be_sawn_off = FALSE
- force = 16 //it has a hook on it
- attack_verb = list("slashed", "hooked", "stabbed")
- hitsound = 'sound/weapons/bladeslice.ogg'
- //our hook gun!
- var/obj/item/gun/magic/hook/bounty/hook
- var/toggled = FALSE
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize()
- . = ..()
- hook = new /obj/item/gun/magic/hook/bounty(src)
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user)
- if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
- if(toggled)
- to_chat(user,"You switch to the shotgun.")
- fire_sound = initial(fire_sound)
- else
- to_chat(user,"You switch to the hook.")
- fire_sound = 'sound/weapons/batonextend.ogg'
- toggled = !toggled
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user)
- . = ..()
- if(toggled)
- . += "Alt-click to switch to the shotgun."
- else
- . += "Alt-click to switch to the hook."
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params)
- if(toggled)
- hook.afterattack(target, user, flag, params)
- else
- return ..()
-
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact
name = "compact compact combat shotgun"
desc = "A compact version of the compact version of the semi automatic combat shotgun. For when you want a gun the same size as your brain."
@@ -544,7 +533,7 @@
attack_verb = list("bludgeoned", "smashed")
mag_type = /obj/item/ammo_box/magazine/internal/shot/sex
burst_size = 6
- fire_delay = 0.8
+ fire_delay = 0.08 SECONDS //?? very weird number
pb_knockback = 12
unique_reskin = null
recoil = 10
@@ -577,7 +566,7 @@
base_icon_state = "shotgun_e"
icon_state = "shotgun_e"
burst_size = 100
- fire_delay = 0.1
+ fire_delay = 0.01 SECONDS
pb_knockback = 40
recoil = 100
recoil_unwielded = 200
@@ -627,6 +616,18 @@
if(!wielded)
SpinAnimation(7,1)
+/obj/item/gun/ballistic/shotgun/flamingarrow/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ var/fan = FALSE
+ if(HAS_TRAIT(user, TRAIT_GUNSLINGER) && !semi_auto && wielded_fully && loc == user && !safety)
+ fan = TRUE
+ fire_delay = 0.35 SECONDS
+ . = ..()
+ fire_delay = src::fire_delay
+ if(fan)
+ rack()
+ to_chat(user, "You quickly rack the [bolt_wording] of \the [src]!")
+ balloon_alert_to_viewers("quickly racks!")
+ fire_delay = 0 SECONDS
/obj/item/gun/ballistic/shotgun/flamingarrow/sawoff(mob/user)
. = ..()
@@ -739,10 +740,10 @@
wield_slowdown = 0.5
wield_delay = 0.5 SECONDS
- spread_unwielded = 5 //mostly the hunting revolver stats
- spread = 2
+ spread_unwielded = 20 //mostly the hunting revolver stats
+ spread = 6
recoil = 2
- recoil_unwielded = 3
+ recoil_unwielded = 4
/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory
desc = "A single-shot break-action rifle made by Hunter's Pride and sold to civilian hunters. This example has been kept in excellent shape and may as well be fresh out of the workshop. Uses .45-70 ammo."
@@ -756,3 +757,23 @@
if(.)
item_state = "beacon_factory_sawn"
mob_overlay_state = item_state
+
+//pre sawn off beacon
+/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn
+ name = "sawn-off HP Beacon"
+ sawn_desc= "A single-shot break-action pistol chambered in .45-70. A bit difficult to aim."
+ sawn_off = TRUE
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BELT
+
+ weapon_weight = WEAPON_MEDIUM
+
+ item_state = "beacon_sawn"
+ mob_overlay_state = "beacon_sawn"
+ wield_slowdown = 0.5
+ wield_delay = 0.5 SECONDS
+
+ spread_unwielded = 20 //mostly the hunting revolver stats
+ spread = 6
+ recoil = 2
+ recoil_unwielded = 4
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 23ec4247a5da..5e8896ab10ec 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -1,14 +1,18 @@
/obj/item/gun/ballistic/automatic/smg
- burst_size = 1
+ burst_size = 2
actions_types = list()
- fire_delay = 1
- spread = 4
+ fire_delay = 0.13 SECONDS
+
+ spread = 6
spread_unwielded = 10
wield_slowdown = 0.35
recoil_unwielded = 4
w_class = WEIGHT_CLASS_BULKY
- wield_delay = 0.4 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ wield_delay = 0.5 SECONDS
load_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
load_empty_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
@@ -16,20 +20,24 @@
eject_empty_sound = 'sound/weapons/gun/smg/smg_unload.ogg'
/obj/item/gun/ballistic/automatic/smg/calculate_recoil(mob/user, recoil_bonus = 0)
- var/gunslinger_bonus = 1
- var/total_recoil = recoil_bonus
+ var/gunslinger_bonus = 2
+ var/total_recoil
+ if(.)
+ total_recoil += .
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+ . = total_recoil
+ return ..()
/obj/item/gun/ballistic/automatic/smg/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 4
+ var/gunslinger_bonus = 16
var/total_spread = bonus_spread
+ if(.)
+ total_spread += .
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+ . = total_spread
+ return ..()
/obj/item/gun/ballistic/automatic/smg/proto
name = "\improper Nanotrasen Saber SMG"
@@ -37,14 +45,11 @@
icon_state = "saber"
actions_types = list()
mag_type = /obj/item/ammo_box/magazine/smgm9mm
+
bolt_type = BOLT_TYPE_LOCKING
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
manufacturer = MANUFACTURER_NANOTRASEN_OLD
-/obj/item/gun/ballistic/automatic/smg/proto/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/c20r
name = "\improper C-20r SMG"
desc = "A bullpup .45 SMG designated 'C-20r.' Its buttstamp reads 'Scarborough Arms - Per falcis, per pravitas.'"
@@ -55,14 +60,12 @@
can_suppress = FALSE
knife_x_offset = 26
knife_y_offset = 12
- mag_display = TRUE
- mag_display_ammo = TRUE
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
empty_indicator = TRUE
manufacturer = MANUFACTURER_SCARBOROUGH
-/obj/item/gun/ballistic/automatic/smg/c20r/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
+EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/c20r/Initialize()
. = ..()
@@ -87,28 +90,23 @@
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
can_suppress = FALSE
- burst_size = 1
actions_types = list()
can_bayonet = TRUE
knife_x_offset = 25
knife_y_offset = 12
- mag_display = TRUE
- mag_display_ammo = TRUE
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
empty_indicator = TRUE
manufacturer = MANUFACTURER_NANOTRASEN_OLD
fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
-/obj/item/gun/ballistic/automatic/smg/wt550/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/mini_uzi
name = "\improper Type U3 Uzi"
desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds."
icon_state = "uzi"
mag_type = /obj/item/ammo_box/magazine/uzim9mm
bolt_type = BOLT_TYPE_OPEN
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
fire_sound = 'sound/weapons/gun/smg/uzi.ogg'
rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
@@ -122,10 +120,7 @@
spread_unwielded = 8
wield_slowdown = 0.25
wield_delay = 0.2 SECONDS
-
-/obj/item/gun/ballistic/automatic/smg/mini_uzi/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
+ fire_delay = 0.1 SECONDS
/obj/item/gun/ballistic/automatic/smg/vector
name = "\improper Vector carbine"
@@ -134,14 +129,10 @@
item_state = "vector"
mag_type = /obj/item/ammo_box/magazine/smgm9mm //you guys remember when the autorifle was chambered in 9mm
bolt_type = BOLT_TYPE_LOCKING
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_LIGHT
fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg'
-/obj/item/gun/ballistic/automatic/smg/vector/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/m90
name = "\improper M-90gl Carbine"
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
@@ -149,67 +140,76 @@
item_state = "m90"
mag_type = /obj/item/ammo_box/magazine/m556
can_suppress = FALSE
- actions_types = list(/datum/action/item_action/toggle_firemode)
- var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel
- burst_size = 3
- fire_delay = 2
- mag_display = TRUE
+ gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "underbarrel grenade launcher")
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_OTHER)
+ default_firemode = FIREMODE_SEMIAUTO
+ var/obj/item/gun/ballistic/revolver/grenadelauncher/secondary
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
manufacturer = MANUFACTURER_SCARBOROUGH
+ burst_size = 3
+ burst_delay = 0.1 SECONDS
+ fire_delay = 0.2 SECONDS
spread = 1
spread_unwielded = 8
wield_slowdown = 0.4
/obj/item/gun/ballistic/automatic/smg/m90/Initialize()
. = ..()
- underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
+ secondary = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
+ RegisterSignal(secondary, COMSIG_ATOM_UPDATE_ICON, PROC_REF(secondary_update_icon))
update_appearance()
+/obj/item/gun/ballistic/automatic/smg/m90/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ return secondary.pre_fire(target, user, message, params, zone_override, bonus_spread)
+
+/obj/item/gun/ballistic/automatic/smg/m90/can_shoot()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
+ return ..()
+ return secondary.can_shoot()
+
/obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params)
- if(select == 2)
- underbarrel.afterattack(target, user, flag, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.afterattack(target, user, flag, params)
+
+/obj/item/gun/ballistic/automatic/smg/m90/attackby(obj/item/attack_obj, mob/user, params)
+ if(istype(attack_obj, secondary.magazine.ammo_type))
+ secondary.unique_action()
+ return secondary.attackby(attack_obj, user, params)
+ return ..()
-/obj/item/gun/ballistic/automatic/smg/m90/attackby(obj/item/A, mob/user, params)
- if(istype(A, /obj/item/ammo_casing))
- if(istype(A, underbarrel.magazine.ammo_type))
- underbarrel.attack_self()
- underbarrel.attackby(A, user, params)
- else
- ..()
-/obj/item/gun/ballistic/automatic/smg/m90/update_overlays()
+/obj/item/gun/ballistic/automatic/smg/m90/can_shoot()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
+ return ..()
+ return secondary.can_shoot()
+
+/obj/item/gun/ballistic/automatic/smg/m90/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+ secondary.wielded = TRUE
+ INVOKE_ASYNC(src, .proc.do_wield, user)
+
+/obj/item/gun/ballistic/automatic/smg/m90/do_wield(mob/user)
. = ..()
- switch(select)
- if(0)
- . += "[initial(icon_state)]_semi"
- if(1)
- . += "[initial(icon_state)]_burst"
- if(2)
- . += "[initial(icon_state)]_gren"
-
-/obj/item/gun/ballistic/automatic/smg/m90/burst_select()
- var/mob/living/carbon/human/user = usr
- switch(select)
- if(0)
- select = 1
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
- to_chat(user, "You switch to [burst_size]-rnd burst.")
- if(1)
- select = 2
- to_chat(user, "You switch to grenades.")
- if(2)
- select = 0
- burst_size = 1
- fire_delay = 0
- to_chat(user, "You switch to semi-auto.")
- playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
+ secondary.wielded_fully = wielded_fully
+
+/// triggered on unwield of two handed item
+/obj/item/gun/ballistic/automatic/smg/m90/on_unwield(obj/item/source, mob/user)
+ . = ..()
+ secondary.wielded_fully = FALSE
+ secondary.wielded = FALSE
+
+
+/obj/item/gun/ballistic/automatic/smg/m90/proc/secondary_update_icon()
update_appearance()
- return
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
+
/obj/item/gun/ballistic/automatic/smg/firestorm //weapon designed by Apogee-dev
name = "HP Firestorm"
@@ -219,20 +219,18 @@
item_state = "firestorm"
mag_type = /obj/item/ammo_box/magazine/c45_firestorm_mag
can_suppress = FALSE
- special_mags = TRUE
+ unique_mag_sprites_for_variants = TRUE
burst_size = 1
actions_types = list()
- fire_delay = 1
+ fire_delay = 0.13 SECONDS
+ bolt_type = BOLT_TYPE_OPEN
rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
fire_sound = 'sound/weapons/gun/smg/firestorm.ogg'
+
manufacturer = MANUFACTURER_HUNTERSPRIDE
wield_slowdown = 0.4
-/obj/item/gun/ballistic/automatic/smg/firestorm/Initialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/firestorm/pan //spawns with pan magazine, can take sticks instead of just drums, not sure where this would be used, maybe erts?
spawnwithmagazine = FALSE
@@ -251,12 +249,10 @@
fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
manufacturer = MANUFACTURER_MINUTEMAN
-/obj/item/gun/ballistic/automatic/smg/cm5/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
-/obj/item/gun/ballistic/automatic/smg/cm5/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/smg/cm5)
/obj/item/gun/ballistic/automatic/smg/cm5/compact
name = "\improper CM-5c"
@@ -265,15 +261,13 @@
spread = 25
spread_unwielded = 40
+ fire_delay = 0.08 SECONDS
+
recoil = 1
recoil_unwielded = 2
wield_delay = 0.2 SECONDS
wield_slowdown = 0.15
-/obj/item/gun/ballistic/automatic/smg/cm5/compact/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.8 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/skm_carbine
name = "\improper SKM-24v"
desc = "The SKM-24v was a carbine modification of the SKM-24 during the Frontiersmen War. This, however, is just a shoddy imitation of that carbine, effectively an SKM-24 with a sawed down barrel and a folding wire stock. Can be fired with the stock folded, though accuracy suffers. Chambered in 4.6x30mm."
@@ -321,7 +315,6 @@
/obj/item/gun/ballistic/automatic/smg/skm_carbine/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
AddElement(/datum/element/update_icon_updates_onmob)
/datum/action/item_action/fold_stock
@@ -355,26 +348,19 @@
/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_recoil(mob/user, recoil_bonus = 0)
- var/gunslinger_bonus = 1
var/total_recoil = recoil_bonus
if(!stock_folded)
total_recoil += stock_recoil_bonus
- if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
- total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 4
var/total_spread = bonus_spread
+
if(!stock_folded)
total_spread += stock_spread_bonus
- if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
- total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+ return ..(user, total_spread)
/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_icon_state()
. = ..()
@@ -417,8 +403,3 @@
unfolded_slowdown = 0.35
unfolded_wield_delay = 0.4 SECONDS
-
-
-/obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 5f62b8c7ca78..796a62dd9427 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -29,7 +29,7 @@
mag_type = /obj/item/ammo_box/magazine/toy/pistol
fire_sound = 'sound/items/syringeproj.ogg'
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.2 SECONDS
actions_types = list()
recoil = -10 //its a toy...
recoil_unwielded = -10
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 705789b3484a..fb0970321308 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -10,6 +10,11 @@
has_safety = TRUE
safety = TRUE
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ fire_select_icon_state_prefix = "laser_"
+
var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses
var/cell_type = /obj/item/stock_parts/cell/gun
var/modifystate = 0
@@ -129,19 +134,19 @@
/obj/item/gun/energy/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C)
if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini))
- to_chat(user, "\The [C] doesn't seem to fit into \the [src]...")
+ to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]..."))
return FALSE
if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large))
- to_chat(user, "\The [C] doesn't seem to fit into \the [src]...")
+ to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]..."))
return FALSE
if(user.transferItemToLoc(C, src))
cell = C
- to_chat(user, "You load the [C] into \the [src].")
+ to_chat(user, span_notice("You load the [C] into \the [src]."))
playsound(src, load_sound, sound_volume, load_sound_vary)
update_appearance()
return TRUE
else
- to_chat(user, "You cannot seem to get \the [src] out of your hands!")
+ to_chat(user, span_warning("You cannot seem to get \the [src] out of your hands!"))
return FALSE
/obj/item/gun/energy/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null)
@@ -150,16 +155,16 @@
var/obj/item/stock_parts/cell/gun/old_cell = cell
old_cell.update_appearance()
cell = null
- to_chat(user, "You pull the cell out of \the [src].")
+ to_chat(user, span_notice("You pull the cell out of \the [src]."))
update_appearance()
if(tac_load && tac_reloads)
- if(do_after(user, tactical_reload_delay, TRUE, src))
+ if(do_after(user, tactical_reload_delay, src, hidden = TRUE))
if(insert_cell(user, tac_load))
- to_chat(user, "You perform a tactical reload on \the [src].")
+ to_chat(user, span_notice("You perform a tactical reload on \the [src]."))
else
- to_chat(user, "You dropped the old cell, but the new one doesn't fit. How embarassing.")
+ to_chat(user, span_warning("You dropped the old cell, but the new one doesn't fit. How embarassing."))
else
- to_chat(user, "Your reload was interupted!")
+ to_chat(user, span_warning("Your reload was interupted!"))
return
user.put_in_hands(old_cell)
@@ -217,11 +222,6 @@
process_chamber() // If the gun was drained and then recharged, load a new shot.
return ..()
-/obj/item/gun/energy/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0)
- if(!chambered && can_shoot())
- process_chamber() // Ditto.
- return ..()
-
/obj/item/gun/energy/proc/select_fire(mob/living/user)
select++
if (select > ammo_type.len)
@@ -230,7 +230,7 @@
fire_sound = shot.fire_sound
fire_delay = shot.delay
if (shot.select_name)
- to_chat(user, "[src] is now set to [shot.select_name].")
+ to_chat(user, span_notice("[src] is now set to [shot.select_name]."))
chambered = null
playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
recharge_newshot(TRUE)
@@ -308,13 +308,13 @@
if(!BB)
. = ""
else if(BB.nodamage || !BB.damage || BB.damage_type == STAMINA)
- user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but it doesn't do anything. Dumbass.")
+ user.visible_message(span_danger("[user] tries to light [user.p_their()] [A.name] with [src], but it doesn't do anything. Dumbass."))
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
. = ""
else if(BB.damage_type != BURN)
- user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but only succeeds in utterly destroying it. Dumbass.")
+ user.visible_message(span_danger("[user] tries to light [user.p_their()] [A.name] with [src], but only succeeds in utterly destroying it. Dumbass."))
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
@@ -324,10 +324,16 @@
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
- . = "[user] casually lights their [A.name] with [src]. Damn."
+ . = span_danger("[user] casually lights their [A.name] with [src]. Damn.")
/obj/item/gun/energy/examine(mob/user)
. = ..()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(ammo_type.len > 1)
. += "You can switch firemodes by pressing the unqiue action key. By default, this is space"
+ if(cell)
+ . += "\The [name]'s cell has [cell.percent()]% charge remaining."
+ . += "\The [name] has [round(cell.charge/shot.e_cost)] shots remaining on [shot.select_name] mode."
+ else
+ . += span_notice("\The [name] doesn't seem to have a cell!")
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index f2c504f07f84..f1188f76701f 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -52,14 +52,15 @@
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ fire_delay = 0.2 SECONDS
+
wield_delay = 0.7 SECONDS
wield_slowdown = 0.6
spread_unwielded = 20
-/obj/item/gun/energy/e_gun/hades/Initialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-
/obj/item/gun/energy/e_gun/old
name = "prototype energy gun"
desc = "NT-P:01 Prototype Energy Gun. Early stage development of a unique laser rifle that has a multifaceted energy lens, allowing the gun to alter the form of projectile it fires on command. The project was a dud, and Nanotrasen later acquired Sharplite to suit its laser weapon needs."
@@ -224,9 +225,10 @@
charge_sections = 3
weapon_weight = WEAPON_LIGHT
-/obj/item/gun/energy/e_gun/smg/Initialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
+ fire_delay = 0.13 SECONDS
+
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
/obj/item/gun/energy/e_gun/iot
name = "\improper E-SG 500 Second Edition"
diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm
index b21e176b92e8..22e6e57d8817 100644
--- a/code/modules/projectiles/guns/energy/laser_gatling.dm
+++ b/code/modules/projectiles/guns/energy/laser_gatling.dm
@@ -105,6 +105,12 @@
icon_state = "minigun_spin"
item_state = "minigun"
slowdown = 1
+
+ fire_delay = 0.1 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
custom_materials = null
@@ -121,7 +127,6 @@
ammo_pack = loc
AddElement(/datum/element/update_icon_blocker)
- AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
return ..()
/obj/item/gun/energy/minigun/Destroy()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index d84655fb5813..73d9104833fb 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -277,10 +277,14 @@
can_charge = FALSE
use_cyborg_cell = TRUE
+ fire_delay = 0.3 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
/obj/item/gun/energy/printer/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
- AddComponent(/datum/component/automatic_fire, 0.3 SECONDS)
/obj/item/gun/energy/printer/emp_act()
return
@@ -391,9 +395,9 @@
shaded_charge = TRUE
weapon_weight = WEAPON_HEAVY
-/obj/item/gun/energy/tesla_cannon/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
+ fire_delay = 0.1 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
/obj/item/gun/energy/buster
name = "replica buster cannon"
diff --git a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
index aea05fb8fe51..20a301a1396c 100644
--- a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
+++ b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
@@ -11,6 +11,8 @@
modifystate = TRUE
+ fire_delay = 0.16 SECONDS
+
wield_delay = 0.7 SECONDS
wield_slowdown = 0.35
@@ -50,10 +52,6 @@
cell_type = /obj/item/stock_parts/cell/gun/pgf
ammo_type = list(/obj/item/ammo_casing/energy/pgf , /obj/item/ammo_casing/energy/disabler/hitscan)
-/obj/item/gun/energy/kalix/pgf/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.16 SECONDS)
-
/obj/projectile/beam/hitscan/kalix/pgf
name = "concentrated energy"
tracer_type = /obj/effect/projectile/tracer/pgf
@@ -105,6 +103,11 @@
modifystate = FALSE
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ fire_delay = 0.2 SECONDS
+
wield_delay = 0.7 SECONDS
wield_slowdown = 0.6
@@ -113,10 +116,6 @@
ammo_type = list(/obj/item/ammo_casing/energy/pgf/assault, /obj/item/ammo_casing/energy/pgf/sniper)
-/obj/item/gun/energy/kalix/pgf/heavy/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-
/obj/item/ammo_casing/energy/pgf/assault
select_name = "AR"
projectile_type = /obj/projectile/beam/hitscan/kalix/pgf/assault
diff --git a/code/modules/projectiles/guns/gunhud.dm b/code/modules/projectiles/guns/gunhud.dm
index 9d1a40db8bb6..3dad98f54219 100644
--- a/code/modules/projectiles/guns/gunhud.dm
+++ b/code/modules/projectiles/guns/gunhud.dm
@@ -18,9 +18,6 @@
// Ammo counter
#define ui_ammocounter "EAST-1:28,CENTER+1:25"
-///The gun needs to update the gun hud!
-#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud"
-
/datum/hud
var/atom/movable/screen/ammo_counter
@@ -233,6 +230,7 @@
/datum/component/ammo_hud/laser/cybersun
prefix = "cybersun_"
+//please be aware, this only supports 6 round revolvers. It is comically easy to support more or less rounds,like in game there are 7 round and 5 round revolvers, but that requires sprites, and i'm lasy
/datum/component/ammo_hud/revolver
prefix = "revolver_"
@@ -285,3 +283,55 @@
round_images += current_bullet_image
hud.update_overlays(round_images)
+
+/datum/component/ammo_hud/eoehoma
+ backing_color = "#cb001a"
+
+/datum/component/ammo_hud/eoehoma/update_hud()
+ var/obj/item/gun/ballistic/automatic/assault/e40/pew = parent
+ var/obj/item/gun/energy/laser/e40_laser_secondary/pew_secondary = pew.secondary
+ hud.maptext = null
+ hud.icon_state = "[prefix]backing"
+
+ var/indicator
+ var/rounds = num2text(get_accurate_ammo_count(pew))
+ var/oth_o
+ var/oth_t
+ var/oth_h
+
+ var/current_firemode = pew.gun_firemodes[pew.firemode_index]
+ if(current_firemode == FIREMODE_FULLAUTO)
+ if(!pew.magazine)
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]no_mag")
+ return
+ if(!pew.get_ammo())
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]empty_flash")
+ return
+ rounds = num2text(get_accurate_ammo_count(pew))
+ indicator = "bullet"
+ else
+ if(!pew_secondary.cell)
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]no_mag")
+ return
+ if(!get_accurate_laser_count(pew_secondary))
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]empty_flash_laser")
+ return
+ rounds = num2text(get_accurate_laser_count(pew_secondary))
+ indicator = "laser"
+
+
+ switch(length(rounds))
+ if(1)
+ oth_o = "[prefix]o[rounds[1]]"
+ if(2)
+ oth_o = "[prefix]o[rounds[2]]"
+ oth_t = "[prefix]t[rounds[1]]"
+ if(3)
+ oth_o = "[prefix]o[rounds[3]]"
+ oth_t = "[prefix]t[rounds[2]]"
+ oth_h = "[prefix]h[rounds[1]]"
+ else
+ oth_o = "[prefix]o9"
+ oth_t = "[prefix]t9"
+ oth_h = "[prefix]h9"
+ hud.set_hud(backing_color, oth_o, oth_t, oth_h, indicator)
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
deleted file mode 100644
index 1f8be937b645..000000000000
--- a/code/modules/projectiles/guns/magic.dm
+++ /dev/null
@@ -1,85 +0,0 @@
-/obj/item/gun/magic
- name = "staff of nothing"
- desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years."
- icon = 'icons/obj/guns/magic.dmi'
- icon_state = "staffofnothing"
- item_state = "staff"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- fire_sound = 'sound/weapons/emitter.ogg'
- flags_1 = CONDUCT_1
- w_class = WEIGHT_CLASS_HUGE
- var/checks_antimagic = TRUE
- var/max_charges = 6
- var/charges = 0
- var/recharge_rate = 4
- var/charge_tick = 0
- var/can_charge = TRUE
- var/ammo_type
- var/no_den_usage
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead
-
-/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
- if(no_den_usage)
- var/area/A = get_area(user)
- if(istype(A, /area/wizard_station))
- add_fingerprint(user)
- to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
- return
- else
- no_den_usage = 0
- if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE))
- add_fingerprint(user)
- to_chat(user, "Something is interfering with [src].")
- return
- . = ..()
-
-/obj/item/gun/magic/can_shoot()
- return charges
-
-/obj/item/gun/magic/recharge_newshot()
- if (charges && chambered && !chambered.BB)
- chambered.newshot()
-
-/obj/item/gun/magic/process_chamber(atom/shooter)
- if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
- charges--//... drain a charge
- recharge_newshot()
-
-/obj/item/gun/magic/Initialize()
- . = ..()
- charges = max_charges
- if(ammo_type)
- chambered = new ammo_type(src)
- if(can_charge)
- START_PROCESSING(SSobj, src)
-
-
-/obj/item/gun/magic/Destroy()
- if(can_charge)
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-
-/obj/item/gun/magic/process()
- if (charges >= max_charges)
- charge_tick = 0
- return
- charge_tick++
- if(charge_tick < recharge_rate)
- return 0
- charge_tick = 0
- charges++
- if(charges == 1)
- recharge_newshot()
- return 1
-
-
-/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
- to_chat(user, "The [name] whizzles quietly.")
-
-/obj/item/gun/magic/vv_edit_var(var_name, var_value)
- . = ..()
- switch(var_name)
- if(NAMEOF(src, charges))
- recharge_newshot()
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
deleted file mode 100644
index e8f1683d21a1..000000000000
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/obj/item/gun/magic/staff
- slot_flags = ITEM_SLOT_BACK
- lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
- item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION
-
-/obj/item/gun/magic/staff/change
- name = "staff of change"
- desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/change
- icon_state = "staffofchange"
- item_state = "staffofchange"
-
-/obj/item/gun/magic/staff/animate
- name = "staff of animation"
- desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
- fire_sound = 'sound/magic/staff_animation.ogg'
- ammo_type = /obj/item/ammo_casing/magic/animate
- icon_state = "staffofanimation"
- item_state = "staffofanimation"
-
-/obj/item/gun/magic/staff/healing
- name = "staff of healing"
- desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead."
- fire_sound = 'sound/magic/staff_healing.ogg'
- ammo_type = /obj/item/ammo_casing/magic/heal
- icon_state = "staffofhealing"
- item_state = "staffofhealing"
-
-/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves
- return
-
-/obj/item/gun/magic/staff/chaos
- name = "staff of chaos"
- desc = "An artefact that spits bolts of chaotic magic that can potentially do anything."
- fire_sound = 'sound/magic/staff_chaos.ogg'
- ammo_type = /obj/item/ammo_casing/magic/chaos
- icon_state = "staffofchaos"
- item_state = "staffofchaos"
- max_charges = 10
- recharge_rate = 2
- no_den_usage = 1
- var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
- /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying,
- /obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping,
- /obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe)
-
-/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- chambered.projectile_type = pick(allowed_projectile_types)
- . = ..()
-
-/obj/item/gun/magic/staff/door
- name = "staff of door creation"
- desc = "An artefact that spits bolts of transformative magic that can create doors in walls."
- fire_sound = 'sound/magic/staff_door.ogg'
- ammo_type = /obj/item/ammo_casing/magic/door
- icon_state = "staffofdoor"
- item_state = "staffofdoor"
- max_charges = 10
- recharge_rate = 2
- no_den_usage = 1
-
-/obj/item/gun/magic/staff/honk
- name = "staff of the honkmother"
- desc = "Honk."
- fire_sound = 'sound/items/airhorn.ogg'
- ammo_type = /obj/item/ammo_casing/magic/honk
- icon_state = "honker"
- item_state = "honker"
- max_charges = 4
- recharge_rate = 8
-
-/obj/item/gun/magic/staff/spellblade
- name = "spellblade"
- desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword."
- fire_sound = 'sound/magic/fireball.ogg'
- ammo_type = /obj/item/ammo_casing/magic/spellblade
- icon_state = "spellblade"
- item_state = "spellblade"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- hitsound = 'sound/weapons/rapierhit.ogg'
- force = 20
- armour_penetration = 75
- block_chance = 50
- sharpness = IS_SHARP
- max_charges = 4
-
-/obj/item/gun/magic/staff/spellblade/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 15, 125, 0, hitsound)
-
-/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == PROJECTILE_ATTACK)
- final_block_chance = 0
- return ..()
-
-/obj/item/gun/magic/staff/locker
- name = "staff of the locker"
- desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/locker
- icon_state = "locker"
- item_state = "locker"
- max_charges = 6
- recharge_rate = 4
-
-//yes, they don't have sounds. they're admin staves, and their projectiles will play the chaos bolt sound anyway so why bother?
-
-/obj/item/gun/magic/staff/flying
- name = "staff of flying"
- desc = "An artefact that spits bolts of graceful magic that can make something fly."
- fire_sound = 'sound/magic/staff_healing.ogg'
- ammo_type = /obj/item/ammo_casing/magic/flying
- icon_state = "staffofflight"
- item_state = "staffofflight"
-
-/obj/item/gun/magic/staff/sapping
- name = "staff of sapping"
- desc = "An artefact that spits bolts of sapping magic that can make something sad."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/sapping
- icon_state = "staffofsapping"
- item_state = "staffofsapping"
-
-/obj/item/gun/magic/staff/necropotence
- name = "staff of necropotence"
- desc = "An artefact that spits bolts of death magic that can repurpose the soul."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/necropotence
- icon_state = "staffofnecropotence"
- item_state = "staffofnecropotence"
-
-/obj/item/gun/magic/staff/wipe
- name = "staff of possession"
- desc = "An artefact that spits bolts of mind-unlocking magic that can let ghosts invade the victim's mind."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/wipe
- icon_state = "staffofwipe"
- item_state = "staffofwipe"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
deleted file mode 100644
index c6a25127878a..000000000000
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ /dev/null
@@ -1,266 +0,0 @@
-//For use in prob() to determine if an empty wand will shoot once then break.
-#define WAND_WREST_CHANCE (1/121)
-
-/obj/item/gun/magic/wand
- name = "wand"
- desc = "You shouldn't have this."
- ammo_type = /obj/item/ammo_casing/magic
- icon_state = "nothingwand"
- item_state = "wand"
- base_icon_state = "nothingwand"
- w_class = WEIGHT_CLASS_SMALL
- can_charge = FALSE
- max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
- var/variable_charges = TRUE
-
-/obj/item/gun/magic/wand/Initialize()
- if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
- if(prob(33))
- max_charges = CEILING(max_charges / 3, 1)
- else
- max_charges = CEILING(max_charges / 2, 1)
- return ..()
-
-/obj/item/gun/magic/wand/examine(mob/user)
- . = ..()
- . += "Has [charges] charge\s remaining."
-
-/obj/item/gun/magic/wand/update_icon_state()
- icon_state = "[base_icon_state][charges ? null : "-drained"]"
- return ..()
-
-/obj/item/gun/magic/wand/attack(atom/target, mob/living/user)
- if(target == user)
- return
- ..()
-
-/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user)
- var/wrested = FALSE
- if(!charges)
- wrested = shoot_with_empty_chamber(user)
- if(!wrested)
- return
- if(target == user)
- if(no_den_usage)
- var/area/A = get_area(user)
- if(istype(A, /area/wizard_station))
- to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
- return
- else
- no_den_usage = 0
- zap_self(user)
- else
- . = ..()
- if(wrested)
- to_chat(user,"[src] overloads and disintegrates.")
- qdel(src)
- return
- update_appearance()
-
-/obj/item/gun/magic/wand/shoot_with_empty_chamber(mob/living/user)
- if(prob(100*WAND_WREST_CHANCE))
- to_chat(user,"You manage to activate [src] one last time.")
- charges++
- recharge_newshot()
- return TRUE
- return ..()
-
-/obj/item/gun/magic/wand/proc/zap_self(mob/living/user)
- user.visible_message("[user] zaps [user.p_them()]self with [src].")
- playsound(user, fire_sound, 50, TRUE)
- user.log_message("zapped [user.p_them()]self with a [src]", LOG_ATTACK)
-
-
-/////////////////////////////////////
-//WAND OF DEATH
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/death
- name = "wand of death"
- desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
- fire_sound = 'sound/magic/wandodeath.ogg'
- ammo_type = /obj/item/ammo_casing/magic/death
- icon_state = "deathwand"
- base_icon_state = "deathwand"
- max_charges = 3 //3, 2, 2, 1
-
-/obj/item/gun/magic/wand/death/zap_self(mob/living/user)
- ..()
- charges--
- if(user.anti_magic_check())
- user.visible_message("[src] has no effect on [user]!")
- return
- if(isliving(user))
- var/mob/living/L = user
- if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
- user.revive(full_heal = TRUE, admin_revive = TRUE)
- to_chat(user, "You feel great!")
- return
- to_chat(user, "You irradiate yourself with pure negative energy! \
- [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\
- ")
- user.death(FALSE)
-
-/obj/item/gun/magic/wand/death/debug
- desc = "In some obscure circles, this is known as the 'cloning tester's friend'."
- max_charges = 500
- variable_charges = FALSE
- can_charge = TRUE
- recharge_rate = 1
-
-
-/////////////////////////////////////
-//WAND OF HEALING
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/resurrection
- name = "wand of healing"
- desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
- ammo_type = /obj/item/ammo_casing/magic/heal
- fire_sound = 'sound/magic/staff_healing.ogg'
- icon_state = "revivewand"
- base_icon_state = "revivewand"
- max_charges = 10 //10, 5, 5, 4
-
-/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user)
- ..()
- charges--
- if(user.anti_magic_check())
- user.visible_message("[src] has no effect on [user]!")
- return
- if(isliving(user))
- var/mob/living/L = user
- if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
- to_chat(user, "You irradiate yourself with pure positive energy! \
- [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\
- ")
- user.death(0)
- return
- user.revive(full_heal = TRUE, admin_revive = TRUE)
- to_chat(user, "You feel great!")
-
-/obj/item/gun/magic/wand/resurrection/debug //for testing
- desc = "Is it possible for something to be even more powerful than regular magic? This wand is."
- max_charges = 500
- variable_charges = FALSE
- can_charge = TRUE
- recharge_rate = 1
-
-/////////////////////////////////////
-//WAND OF POLYMORPH
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/polymorph
- name = "wand of polymorph"
- desc = "This wand is attuned to chaos and will radically alter the victim's form."
- ammo_type = /obj/item/ammo_casing/magic/change
- icon_state = "polywand"
- base_icon_state = "polywand"
- fire_sound = 'sound/magic/staff_change.ogg'
- max_charges = 10 //10, 5, 5, 4
-
-/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user)
- ..() //because the user mob ceases to exists by the time wabbajack fully resolves
-
- wabbajack(user)
- charges--
-
-/////////////////////////////////////
-//WAND OF TELEPORTATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/teleport
- name = "wand of teleportation"
- desc = "This wand will wrench targets through space and time to move them somewhere else."
- ammo_type = /obj/item/ammo_casing/magic/teleport
- fire_sound = 'sound/magic/wand_teleport.ogg'
- icon_state = "telewand"
- base_icon_state = "telewand"
- max_charges = 10 //10, 5, 5, 4
- no_den_usage = TRUE
-
-/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
- if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC))
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(3, user.loc)
- smoke.start()
- charges--
- ..()
-
-/obj/item/gun/magic/wand/safety
- name = "wand of safety"
- desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe."
- ammo_type = /obj/item/ammo_casing/magic/safety
- fire_sound = 'sound/magic/wand_teleport.ogg'
- icon_state = "telewand"
- base_icon_state = "telewand"
- max_charges = 10 //10, 5, 5, 4
- no_den_usage = FALSE
-
-/obj/item/gun/magic/wand/safety/zap_self(mob/living/user)
- var/turf/origin = get_turf(user)
- var/turf/destination = find_safe_turf()
-
- if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC))
- for(var/t in list(origin, destination))
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(0, t)
- smoke.start()
- ..()
-
-/obj/item/gun/magic/wand/safety/debug
- desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?"
- max_charges = 500
- variable_charges = FALSE
- can_charge = TRUE
- recharge_rate = 1
-
-
-/////////////////////////////////////
-//WAND OF DOOR CREATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/door
- name = "wand of door creation"
- desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
- ammo_type = /obj/item/ammo_casing/magic/door
- icon_state = "doorwand"
- base_icon_state = "doorwand"
- fire_sound = 'sound/magic/staff_door.ogg'
- max_charges = 20 //20, 10, 10, 7
- no_den_usage = 1
-
-/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
- to_chat(user, "You feel vaguely more open with your feelings.")
- charges--
- ..()
-
-/////////////////////////////////////
-//WAND OF FIREBALL
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/fireball
- name = "wand of fireball"
- desc = "This wand shoots scorching balls of fire that explode into destructive flames."
- fire_sound = 'sound/magic/fireball.ogg'
- ammo_type = /obj/item/ammo_casing/magic/fireball
- icon_state = "firewand"
- base_icon_state = "firewand"
- max_charges = 8 //8, 4, 4, 3
-
-/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user)
- ..()
- explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
- charges--
-
-/////////////////////////////////////
-//WAND OF NOTHING
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/nothing
- name = "wand of nothing"
- desc = "It's not just a stick, it's a MAGIC stick?"
- ammo_type = /obj/item/ammo_casing/magic/nothing
-
-
-#undef WAND_WREST_CHANCE
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 829393d4d115..0b9bcb8da4f7 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -1,7 +1,3 @@
-
-#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan.
-#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
-
/obj/projectile
name = "projectile"
icon = 'icons/obj/projectiles.dmi'
diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm
index 0955745ed798..6011adb61c88 100644
--- a/code/modules/projectiles/projectile/bullets/gauss.dm
+++ b/code/modules/projectiles/projectile/bullets/gauss.dm
@@ -5,7 +5,8 @@
icon_state = "gauss-pellet"
damage = 25
range = 35
- light_color = COLOR_SOFT_RED
+ light_system = 2
+ light_color = MOVABLE_LIGHT
light_range = 3
// Ferromagnetic Lance (GAR AR)
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index 7ec48a74b970..0c62fe5b3d4f 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -152,3 +152,20 @@
armour_penetration = -45
ricochet_incidence_leeway = 20
ricochet_chance = 65
+
+// 44 Short (Roumain & Shadow)
+
+/obj/projectile/bullet/a44roum
+ name = ".44 roumain bullet"
+ damage = 25
+
+/obj/projectile/bullet/a44roum/rubber
+ name = ".44 roumain bullet"
+ damage = 7
+ stamina = 38
+ armour_penetration = -20
+
+/obj/projectile/bullet/a44roum/hp
+ name = ".44 roumain bullet"
+ damage = 45
+ armour_penetration = -20
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
index 5aa548991b7a..396f66972b21 100644
--- a/code/modules/projectiles/projectile/bullets/rifle.dm
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -58,28 +58,29 @@
//.308 WIN (M514 & GAL DMRs)
+
+//[СELADON-REMOVE] - CELADON_WEAPONS - хватит это терпеть! Теперь эти патроны только в модпаке - mod_celadon\weapons\code\modules\projectiles\projectile\bullets\rifle.dm
+/*
/obj/projectile/bullet/a308
name = ".308"
speed = 0.3
damage = 30
armour_penetration = 40
+*/
+//[/СELADON-REMOVE]
+
// 8x58mm caseless (SG-669)
/obj/projectile/bullet/a858
name = "8x58mm caseless bullet"
speed = 0.3
- // [CELADON-EDIT] - CELADON_WEAPONS
- // damage = 35 // CELADON-EDIT - ORIGINAL
- // armour_penetration = 40 // CELADON-EDIT - ORIGINAL
- damage = 50
- armour_penetration = 15
- // [/CELADON-EDIT]
-
+ damage = 35
+ armour_penetration = 40
// .299 Eoehoma Caseless (E-40)
/obj/projectile/bullet/c299
name = ".229 Eoehoma caseless bullet"
- damage = 25
- armour_penetration = 20
+ damage = 20
+ armour_penetration = 10
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
deleted file mode 100644
index 458c19d053da..000000000000
--- a/code/modules/projectiles/projectile/magic.dm
+++ /dev/null
@@ -1,736 +0,0 @@
-/obj/projectile/magic
- name = "bolt"
- icon_state = "energy"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- armour_penetration = 100
- flag = "magic"
-
-/obj/projectile/magic/death
- name = "bolt of death"
- icon_state = "pulse1_bl"
-
-/obj/projectile/magic/death/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- if(isliving(M))
- var/mob/living/L = M
- if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
- if(L.hellbound && L.stat == DEAD)
- return BULLET_ACT_BLOCK
- if(L.revive(full_heal = TRUE, admin_revive = TRUE))
- L.grab_ghost(force = TRUE)
- to_chat(L, "You rise with a start, you're undead!!!")
- else if(L.stat != DEAD)
- to_chat(L, "You feel great!")
- else
- L.death(0)
- else
- M.death(0)
-
-/obj/projectile/magic/resurrection
- name = "bolt of resurrection"
- icon_state = "ion"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
-
-/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
- . = ..()
- if(isliving(target))
- if(target.anti_magic_check())
- target.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
- target.death(0)
- else
- if(target.hellbound && target.stat == DEAD)
- return BULLET_ACT_BLOCK
- if(target.revive(full_heal = TRUE, admin_revive = TRUE))
- target.grab_ghost(force = TRUE) // even suicides
- to_chat(target, "You rise with a start, you're alive!!!")
- else if(target.stat != DEAD)
- to_chat(target, "You feel great!")
-
-/obj/projectile/magic/teleport
- name = "bolt of teleportation"
- icon_state = "bluespace"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- var/inner_tele_radius = 0
- var/outer_tele_radius = 6
-
-/obj/projectile/magic/teleport/on_hit(mob/target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] fizzles on contact with [target]!")
- return BULLET_ACT_BLOCK
- var/teleammount = 0
- var/teleloc = target
- if(!isturf(target))
- teleloc = target.loc
- for(var/atom/movable/stuff in teleloc)
- if(!stuff.anchored && stuff.loc && !isobserver(stuff))
- if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC))
- teleammount++
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
- smoke.start()
-
-/obj/projectile/magic/safety
- name = "bolt of safety"
- icon_state = "bluespace"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
-
-/obj/projectile/magic/safety/on_hit(atom/target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] fizzles on contact with [target]!")
- return BULLET_ACT_BLOCK
- if(isturf(target))
- return BULLET_ACT_HIT
-
- var/turf/origin_turf = get_turf(target)
- var/turf/destination_turf = find_safe_turf()
-
- if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC))
- for(var/t in list(origin_turf, destination_turf))
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(0, t)
- smoke.start()
-
-/obj/projectile/magic/door
- name = "bolt of door creation"
- icon_state = "energy"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond)
-
-/obj/projectile/magic/door/on_hit(atom/target)
- . = ..()
- if(istype(target, /obj/machinery/door))
- OpenDoor(target)
- else
- var/turf/T = get_turf(target)
- if(isclosedturf(T) && !isindestructiblewall(T))
- CreateDoor(T)
-
-/obj/projectile/magic/door/proc/CreateDoor(turf/T)
- var/door_type = pick(door_types)
- var/obj/structure/mineral_door/D = new door_type(T)
- T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- D.Open()
-
-/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D)
- if(istype(D, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/A = D
- A.locked = FALSE
- D.open()
-
-/obj/projectile/magic/change
- name = "bolt of change"
- icon_state = "ice_1"
- damage = 0
- damage_type = BURN
- nodamage = TRUE
-
-/obj/projectile/magic/change/on_hit(atom/change)
- . = ..()
- if(ismob(change))
- var/mob/M = change
- if(M.anti_magic_check())
- M.visible_message("[src] fizzles on contact with [M]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- wabbajack(change)
- qdel(src)
-
-/proc/wabbajack(mob/living/M)
- if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags))
- return
-
- M.notransform = TRUE
- ADD_TRAIT(M, TRAIT_IMMOBILIZED, MAGIC_TRAIT)
- ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT)
- M.icon = null
- M.cut_overlays()
- M.invisibility = INVISIBILITY_ABSTRACT
-
- var/list/contents = M.contents.Copy()
-
- if(iscyborg(M))
- var/mob/living/silicon/robot/Robot = M
- // Disconnect AI's in shells
- if(Robot.connected_ai)
- Robot.connected_ai.disconnect_shell()
- if(Robot.mmi)
- qdel(Robot.mmi)
- Robot.notify_ai(NEW_BORG)
- else
- for(var/obj/item/W in contents)
- if(!M.dropItemToGround(W))
- qdel(W)
-
- var/mob/living/new_mob
-
- var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal")
- switch(randomize)
- if("monkey")
- new_mob = new /mob/living/carbon/monkey(M.loc)
-
- if("robot")
- var/robot = pick(200;/mob/living/silicon/robot,
- /mob/living/silicon/robot/modules/syndicate,
- /mob/living/silicon/robot/modules/syndicate/medical,
- /mob/living/silicon/robot/modules/syndicate/saboteur,
- 200;/mob/living/simple_animal/drone/polymorphed)
- new_mob = new robot(M.loc)
- if(issilicon(new_mob))
- new_mob.gender = M.gender
- new_mob.invisibility = 0
- new_mob.job = "Cyborg"
- var/mob/living/silicon/robot/Robot = new_mob
- Robot.lawupdate = FALSE
- Robot.connected_ai = null
- Robot.mmi.transfer_identity(M) //Does not transfer key/client.
- Robot.clear_inherent_laws(0)
- Robot.clear_zeroth_law(0)
-
- if("slime")
- new_mob = new /mob/living/simple_animal/slime/random(M.loc)
-
- if("xeno")
- var/Xe
- if(M.ckey)
- Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel)
- else
- Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel)
- new_mob = new Xe(M.loc)
-
- if("animal")
- var/path = pick(/mob/living/simple_animal/hostile/carp,
- /mob/living/simple_animal/hostile/bear,
- /mob/living/simple_animal/hostile/mushroom,
- /mob/living/simple_animal/hostile/statue,
- /mob/living/simple_animal/hostile/retaliate/bat,
- /mob/living/simple_animal/hostile/retaliate/goat,
- /mob/living/simple_animal/hostile/killertomato,
- /mob/living/simple_animal/hostile/poison/giant_spider,
- /mob/living/simple_animal/hostile/poison/giant_spider/hunter,
- /mob/living/simple_animal/hostile/blob/blobbernaut/independent,
- /mob/living/simple_animal/hostile/carp/ranged,
- /mob/living/simple_animal/hostile/carp/ranged/chaos,
- /mob/living/simple_animal/hostile/asteroid/basilisk/watcher,
- /mob/living/simple_animal/hostile/asteroid/goliath/beast,
- /mob/living/simple_animal/hostile/headcrab,
- /mob/living/simple_animal/hostile/morph,
- /mob/living/simple_animal/hostile/stickman,
- /mob/living/simple_animal/hostile/stickman/dog,
- /mob/living/simple_animal/hostile/megafauna/dragon/lesser,
- /mob/living/simple_animal/hostile/gorilla,
- /mob/living/simple_animal/parrot,
- /mob/living/simple_animal/pet/dog/corgi,
- /mob/living/simple_animal/crab,
- /mob/living/simple_animal/pet/dog/pug,
- /mob/living/simple_animal/pet/cat,
- /mob/living/simple_animal/mouse,
- /mob/living/simple_animal/chicken,
- /mob/living/simple_animal/cow,
- /mob/living/simple_animal/hostile/lizard,
- /mob/living/simple_animal/pet/fox,
- /mob/living/simple_animal/butterfly,
- /mob/living/simple_animal/pet/cat/cak,
- /mob/living/simple_animal/chick)
- new_mob = new path(M.loc)
-
- if("humanoid")
- new_mob = new /mob/living/carbon/human(M.loc)
-
- if(prob(50))
- var/list/chooseable_races = list()
- for(var/speciestype in subtypesof(/datum/species))
- var/datum/species/S = speciestype
- if(initial(S.changesource_flags) & WABBAJACK)
- chooseable_races += speciestype
-
- if(chooseable_races.len)
- new_mob.set_species(pick(chooseable_races))
-
- var/datum/preferences/A = new() //Randomize appearance for the human
- A.copy_to(new_mob, icon_updates=0)
-
- var/mob/living/carbon/human/H = new_mob
- H.update_hair()
- H.update_body_parts(TRUE)
- H.dna.update_dna_identity()
-
- if(!new_mob)
- return
-
- // Some forms can still wear some items
- for(var/obj/item/W in contents)
- new_mob.equip_to_appropriate_slot(W)
-
- M.log_message("became [new_mob.real_name]", LOG_ATTACK, color="orange")
-
- new_mob.a_intent = INTENT_HARM
-
- M.wabbajack_act(new_mob)
-
- to_chat(new_mob, "Your form morphs into that of a [randomize].")
-
- var/poly_msg = get_policy(POLICY_POLYMORPH)
- if(poly_msg)
- to_chat(new_mob, poly_msg)
-
- M.transfer_observers_to(new_mob)
-
- qdel(M)
- return new_mob
-
-/obj/projectile/magic/animate
- name = "bolt of animation"
- icon_state = "red_1"
- damage = 0
- damage_type = BURN
- nodamage = TRUE
-
-/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE)
- target.animate_atom_living(firer)
- ..()
-
-/atom/proc/animate_atom_living(mob/living/owner = null)
- if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects))
- if(istype(src, /obj/structure/statue/petrified))
- var/obj/structure/statue/petrified/P = src
- if(P.petrified_mob)
- var/mob/living/L = P.petrified_mob
- var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner)
- S.name = "statue of [L.name]"
- if(owner)
- S.faction = list("[REF(owner)]")
- S.icon = P.icon
- S.icon_state = P.icon_state
- S.copy_overlays(P, TRUE)
- S.color = P.color
- S.atom_colours = P.atom_colours.Copy()
- if(L.mind)
- L.mind.transfer_to(S)
- if(owner)
- to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.")
- P.forceMove(S)
- return
- else
- var/obj/O = src
- if(istype(O, /obj/item/gun))
- new /mob/living/simple_animal/hostile/mimic/copy/ranged(loc, src, owner)
- else
- new /mob/living/simple_animal/hostile/mimic/copy(loc, src, owner)
-
- else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy))
- // Change our allegiance!
- var/mob/living/simple_animal/hostile/mimic/copy/C = src
- if(owner)
- C.ChangeOwner(owner)
-
-/obj/projectile/magic/spellblade
- name = "blade energy"
- icon_state = "lavastaff"
- damage = 15
- damage_type = BURN
- flag = "magic"
- dismemberment = 50
- nodamage = FALSE
-
-/obj/projectile/magic/spellblade/on_hit(target)
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- . = ..()
-
-/obj/projectile/magic/arcane_barrage
- name = "arcane bolt"
- icon_state = "arcane_barrage"
- damage = 20
- damage_type = BURN
- nodamage = FALSE
- armour_penetration = 0
- flag = "magic"
- hitsound = 'sound/weapons/barragespellhit.ogg'
-
-/obj/projectile/magic/arcane_barrage/on_hit(target)
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- . = ..()
-
-
-/obj/projectile/magic/locker
- name = "locker bolt"
- icon_state = "locker"
- nodamage = TRUE
- flag = "magic"
- var/weld = TRUE
- var/created = FALSE //prevents creation of more then one locker if it has multiple hits
- var/locker_suck = TRUE
- var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay
-
-/obj/projectile/magic/locker/Initialize()
- . = ..()
- locker_temp_instance = new(src)
-
-/obj/projectile/magic/locker/prehit_pierce(atom/A)
- . = ..()
- if(isliving(A) && locker_suck)
- var/mob/living/M = A
- if(M.anti_magic_check()) // no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit
- M.visible_message("[src] vanishes on contact with [A]!")
- return PROJECTILE_DELETE_WITHOUT_HITTING
- if(!locker_temp_instance.insertion_allowed(M))
- return
- M.forceMove(src)
- return PROJECTILE_PIERCE_PHASE
-
-/obj/projectile/magic/locker/on_hit(target)
- if(created)
- return ..()
- if(LAZYLEN(contents))
- for(var/atom/movable/AM in contents)
- locker_temp_instance.insert(AM)
- locker_temp_instance.welded = weld
- locker_temp_instance.update_appearance()
- created = TRUE
- return ..()
-
-/obj/projectile/magic/locker/Destroy()
- locker_suck = FALSE
- RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this
- for(var/atom/movable/AM in contents)
- AM.forceMove(get_turf(src))
- . = ..()
-
-/obj/structure/closet/decay
- breakout_time = 600
- icon_welded = null
- var/magic_icon = "cursed"
- var/weakened_icon = "decursed"
- var/auto_destroy = TRUE
-
-/obj/structure/closet/decay/Initialize()
- . = ..()
- if(auto_destroy)
- addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES)
- addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5)
-
-/obj/structure/closet/decay/proc/magicly_lock()
- if(!welded)
- return
- icon_state = magic_icon
- update_appearance()
-
-/obj/structure/closet/decay/after_weld(weld_state)
- if(weld_state)
- unmagify()
-
-/obj/structure/closet/decay/proc/decay()
- animate(src, alpha = 0, time = 30)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30)
-
-/obj/structure/closet/decay/open(mob/living/user, force = FALSE)
- . = ..()
- if(.)
- if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon
- unmagify()
- else
- addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
-
-/obj/structure/closet/decay/proc/unmagify()
- icon_state = weakened_icon
- update_appearance()
- addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
- icon_welded = "welded"
-
-/obj/projectile/magic/flying
- name = "bolt of flying"
- icon_state = "flight"
-
-/obj/projectile/magic/flying/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check())
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- var/atom/throw_target = get_edge_target_turf(L, angle2dir(Angle))
- L.throw_at(throw_target, 200, 4)
-
-/obj/projectile/magic/bounty
- name = "bolt of bounty"
- icon_state = "bounty"
-
-/obj/projectile/magic/bounty/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !firer)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- L.apply_status_effect(STATUS_EFFECT_BOUNTY, firer)
-
-/obj/projectile/magic/antimagic
- name = "bolt of antimagic"
- icon_state = "antimagic"
-
-/obj/projectile/magic/antimagic/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check())
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- L.apply_status_effect(STATUS_EFFECT_ANTIMAGIC)
-
-/obj/projectile/magic/fetch
- name = "bolt of fetching"
- icon_state = "fetch"
-
-/obj/projectile/magic/fetch/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !firer)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- var/atom/throw_target = get_edge_target_turf(L, get_dir(L, firer))
- L.throw_at(throw_target, 200, 4)
-
-/obj/projectile/magic/sapping
- name = "bolt of sapping"
- icon_state = "sapping"
-
-/obj/projectile/magic/sapping/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped)
-
-/obj/projectile/magic/necropotence
- name = "bolt of necropotence"
- icon_state = "necropotence"
-
-/obj/projectile/magic/necropotence/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- to_chat(L, "Your body feels drained and there is a burning pain in your chest.")
- L.maxHealth -= 20
- L.health = min(L.health, L.maxHealth)
- if(L.maxHealth <= 0)
- to_chat(L, "Your weakened soul is completely consumed by the [src]!")
- L.mind.hasSoul = FALSE
- for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list)
- spell.charge_counter = spell.charge_max
- spell.recharging = FALSE
- spell.update_appearance()
-
-/obj/projectile/magic/fortify
- name = "bolt of light"
- icon_state = "spark"
-
-/obj/projectile/magic/fortify/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- to_chat(L, "You feel your body flood with magical strength! Your flesh feels cleansed, and somehow... tougher.")
- L.maxHealth += 20
- L.heal_overall_damage(20, 20)
- L.apply_damage(-200, CLONE)//cleanses cellular damage
- if(L.mind.hasSoul == FALSE)//restores consumed souls
- to_chat(L, "You feel a warm light in your chest... the [src] has restored something you'd long forgotten.")
- L.mind.hasSoul = TRUE
- if(L.hellbound == 1)
- L.hellbound = 0//devil economy in shambles
- for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list)
- spell.charge_counter = spell.charge_max
- spell.recharging = FALSE
- spell.update_appearance()
-
-/obj/projectile/magic/wipe
- name = "bolt of possession"
- icon_state = "wipe"
-
-/obj/projectile/magic/wipe/on_hit(target)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- for(var/x in M.get_traumas())//checks to see if the victim is already going through possession
- if(istype(x, /datum/brain_trauma/special/imaginary_friend/trapped_owner))
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- to_chat(M, "Your mind has been opened to possession!")
- possession_test(M)
- return BULLET_ACT_HIT
-
-/obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/M)
- var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = M.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner)
- var/poll_message = "Do you want to play as [M.real_name]?"
- if(M.mind && M.mind.assigned_role)
- poll_message = "[poll_message] Job:[M.mind.assigned_role]."
- if(M.mind && M.mind.special_role)
- poll_message = "[poll_message] Status:[M.mind.special_role]."
- else if(M.mind)
- var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/)
- if(A)
- poll_message = "[poll_message] Status:[A.name]."
- var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M)
- if(M.stat == DEAD)//boo.
- return
- if(LAZYLEN(candidates))
- var/mob/dead/observer/C = pick(candidates)
- to_chat(M, "You have been noticed by a ghost and it has possessed you!")
- var/oldkey = M.key
- M.ghostize(0)
- M.key = C.key
- trauma.friend.key = oldkey
- trauma.friend.reset_perspective(null)
- trauma.friend.Show()
- trauma.friend_initialized = TRUE
- else
- to_chat(M, "Your mind has managed to go unnoticed in the spirit world.")
- qdel(trauma)
-
-/obj/projectile/magic/aoe
- name = "Area Bolt"
- desc = "What the fuck does this do?!"
- damage = 0
- var/proxdet = TRUE
-
-/obj/projectile/magic/aoe/Range()
- if(proxdet)
- for(var/mob/living/L in range(1, get_turf(src)))
- if(L.stat != DEAD && L != firer && !L.anti_magic_check())
- return Bump(L)
- ..()
-
-
-/obj/projectile/magic/aoe/lightning
- name = "lightning bolt"
- icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~
- damage = 15
- damage_type = BURN
- nodamage = FALSE
- speed = 0.3
- flag = "magic"
-
- var/zap_power = 20000
- var/zap_range = 15
- var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE
- var/chain
- var/mob/living/caster
-
-/obj/projectile/magic/aoe/lightning/fire(setAngle)
- if(caster)
- chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
- ..()
-
-/obj/projectile/magic/aoe/lightning/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- visible_message("[src] fizzles on contact with [target]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- tesla_zap(src, zap_range, zap_power, zap_flags)
- qdel(src)
-
-/obj/projectile/magic/aoe/lightning/Destroy()
- qdel(chain)
- . = ..()
-
-/obj/projectile/magic/aoe/fireball
- name = "bolt of fireball"
- icon_state = "fireball"
- damage = 10
- damage_type = BRUTE
- nodamage = FALSE
-
- //explosion values
- var/exp_heavy = 0
- var/exp_light = 2
- var/exp_flash = 3
- var/exp_fire = 2
-
-/obj/projectile/magic/aoe/fireball/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/living/M = target
- if(M.anti_magic_check())
- visible_message("[src] vanishes into smoke on contact with [target]!")
- return BULLET_ACT_BLOCK
- M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
- var/turf/T = get_turf(target)
- explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
-
-/obj/projectile/magic/aoe/fireball/infernal
- name = "infernal fireball"
- exp_heavy = -1
- exp_light = -1
- exp_flash = 4
- exp_fire= 5
-
-/obj/projectile/magic/aoe/fireball/infernal/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/living/M = target
- if(M.anti_magic_check())
- return BULLET_ACT_BLOCK
- var/turf/T = get_turf(target)
- for(var/i=0, i<50, i+=10)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
-
-//still magic related, but a different path
-
-/obj/projectile/temp/chill
- name = "bolt of chills"
- icon_state = "ice_2"
- damage = 0
- damage_type = BURN
- nodamage = FALSE
- armour_penetration = 100
- temperature = -200 // Cools you down greatly per hit
- flag = "magic"
-
-/obj/projectile/magic/nothing
- name = "bolt of nothing"
diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm
deleted file mode 100644
index 464586d2f8a4..000000000000
--- a/code/modules/projectiles/projectile/magic/spellcard.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-/obj/projectile/spellcard
- name = "enchanted card"
- desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one."
- icon_state = "spellcard"
- damage_type = BURN
- damage = 2
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 037256db302f..2fa26e8f4bfb 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -470,14 +470,14 @@
/datum/reagent/consumable/tea,
/datum/reagent/consumable/icetea,
/datum/reagent/consumable/space_cola,
- /datum/reagent/consumable/spacemountainwind,
- /datum/reagent/consumable/dr_gibb,
+ /datum/reagent/consumable/comet_trail,
+ /datum/reagent/consumable/tadrixx,
/datum/reagent/consumable/space_up,
/datum/reagent/consumable/tonic,
/datum/reagent/consumable/sodawater,
/datum/reagent/consumable/lemon_lime,
- /datum/reagent/consumable/pwr_game,
- /datum/reagent/consumable/shamblers,
+ /datum/reagent/consumable/pacfuel,
+ /datum/reagent/consumable/shoal_punch,
/datum/reagent/consumable/sugar,
/datum/reagent/consumable/pineapplejuice,
/datum/reagent/consumable/orangejuice,
@@ -489,7 +489,7 @@
)
upgrade_reagents = null
emagged_reagents = list(
- /datum/reagent/consumable/ethanol/thirteenloko,
+ /datum/reagent/consumable/ethanol/vimukti,
/datum/reagent/consumable/ethanol/whiskey_cola,
/datum/reagent/toxin/mindbreaker,
/datum/reagent/toxin/staminatoxin
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 5902665e85c9..10519c75c434 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -87,30 +87,30 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/beer
name = "Beer"
- description = "An alcoholic beverage brewed since ancient times on Old Earth. Still popular today."
+ description = "An alcoholic beverage, brewed originally to keep a safe source of drinking water. A timeless classic."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 25
- taste_description = "piss water"
+ taste_description = "bad water"
glass_name = "glass of beer"
- glass_desc = "A freezing pint of beer."
+ glass_desc = "A pint of beer."
/datum/reagent/consumable/ethanol/beer/light
name = "Light Beer"
- description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content."
+ description = "An alcoholic beverage, brewed originally to keep a safe source of drinking water. This variety has reduced calorie and alcohol content."
boozepwr = 5 //Space Europeans hate it
taste_description = "dish water"
glass_name = "glass of light beer"
- glass_desc = "A freezing pint of watery light beer."
+ glass_desc = "A pint of watery light beer."
/datum/reagent/consumable/ethanol/beer/green
name = "Green Beer"
- description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is dyed a festive green."
+ description = "An alcoholic beverage, brewed originally to keep a safe source of drinking water. This variety is dyed green, but you're not sure why."
color = "#A8E61D"
- taste_description = "green piss water"
+ taste_description = "green bad water"
glass_icon_state = "greenbeerglass"
glass_name = "glass of green beer"
- glass_desc = "A freezing pint of green beer. Festive."
+ glass_desc = "A pint of green beer. You get the feeling this had some sort of meaning, once."
/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M)
if(M.color != color)
@@ -122,12 +122,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/kahlua
name = "Kahlua"
- description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
+ description = "A widely known coffee-flavoured liqueur. Still labeled under an old name from Earth, despite the loss of history."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
glass_icon_state = "kahluaglass"
- glass_name = "glass of RR coffee liquor"
- glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
+ glass_name = "glass of coffee liquor"
+ glass_desc = "Bitter from the coffee and alcohol alike!"
shot_glass_icon_state = "shotglasscream"
/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M)
@@ -141,23 +141,23 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/whiskey
name = "Whiskey"
- description = "A superb and well-aged single-malt whiskey. Damn."
+ description = "A well-aged whiskey."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 75
taste_description = "molasses"
glass_icon_state = "whiskeyglass"
glass_name = "glass of whiskey"
- glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
+ glass_desc = "Often described as having a silky mouthfeel and a smokey aftertaste. The brown-amber color catches the light very well."
shot_glass_icon_state = "shotglassbrown"
/datum/reagent/consumable/ethanol/whiskey/kong
name = "Kong"
- description = "Makes You Go Ape!®"
+ description = "Makes You Go Ape!"
color = "#332100" // rgb: 51, 33, 0
addiction_threshold = 15
taste_description = "the grip of a giant ape"
glass_name = "glass of Kong"
- glass_desc = "Makes You Go Ape!®"
+ glass_desc = "Makes You Go Ape!"
/datum/reagent/consumable/ethanol/whiskey/kong/addiction_act_stage1(mob/living/M)
if(prob(5))
@@ -200,21 +200,21 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.hallucination += hal_amt //conscious dreamers can be treasurers to their own currency
..()
-/datum/reagent/consumable/ethanol/thirteenloko
- name = "Thirteen Loko"
- description = "A potent mixture of caffeine and alcohol."
+/datum/reagent/consumable/ethanol/vimukti
+ name = "Vimukti"
+ description = "A potent, fermented sweet lichen drink from the Shoal."
color = "#ce871d"
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 80
quality = DRINK_GOOD
overdose_threshold = 60
addiction_threshold = 30
- taste_description = "jitters and death"
- glass_icon_state = "thirteen_loko_glass"
- glass_name = "glass of Thirteen Loko"
- glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass."
+ taste_description = "oily syrup"
+ glass_icon_state = "vimukti_glass"
+ glass_name = "glass of Vimukti"
+ glass_desc = "A spiritually-taxing drink from the Shoal. Numerous warnings about this drink tell you to not drink too much, lest you incur some sort of wrath... or an overdose of a psychoactive lichen."
-/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/ethanol/vimukti/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-7)
M.AdjustSleeping(-40)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -222,12 +222,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.Jitter(5)
return ..()
-/datum/reagent/consumable/ethanol/thirteenloko/overdose_start(mob/living/M)
+/datum/reagent/consumable/ethanol/vimukti/overdose_start(mob/living/M)
to_chat(M, "Your entire body violently jitters as you start to feel queasy. You really shouldn't have drank all of that [name]!")
M.Jitter(20)
M.Stun(15)
-/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/M)
+/datum/reagent/consumable/ethanol/vimukti/overdose_process(mob/living/M)
if(prob(7) && iscarbon(M))
var/obj/item/I = M.get_active_held_item()
if(I)
@@ -260,18 +260,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(prob(1) && iscarbon(M))
var/datum/disease/D = new /datum/disease/heart_failure
M.ForceContractDisease(D)
- to_chat(M, "You're pretty sure you just felt your heart stop for a second there..")
+ to_chat(M, "You're pretty sure you just felt your heart stop for a second there...")
M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
/datum/reagent/consumable/ethanol/vodka
name = "Vodka"
- description = "Number one drink that also serves as fuel."
+ description = "A clear, hard liquor. Doubles as a flammable fuel source, if you really need it."
color = "#0064C8" // rgb: 0, 100, 200
boozepwr = 65
taste_description = "grain alcohol"
glass_icon_state = "ginvodkaglass"
glass_name = "glass of vodka"
- glass_desc = "The glass contain wodka. Xynta."
+ glass_desc = "It's almost difficult to tell the glass is full of vodka until you tip it around. The smell makes your nose wrinkle... but it might just be worth it."
shot_glass_icon_state = "shotglassclear"
/datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M)
@@ -280,14 +280,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bilk
name = "Bilk"
- description = "This appears to be beer mixed with milk. Disgusting."
+ description = "This appears to be beer mixed with milk. Creative...?"
color = "#895C4C" // rgb: 137, 92, 76
nutriment_factor = 2 * REAGENTS_METABOLISM
boozepwr = 15
taste_description = "desperation and lactate"
glass_icon_state = "glass_brown"
glass_name = "glass of bilk"
- glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
+ glass_desc = "A brew of milk and beer. You have to wonder if this was made by accident just from the smell."
/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(10))
@@ -297,14 +297,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/threemileisland
name = "Three Mile Island Iced Tea"
- description = "Made for a woman, strong enough for a man."
+ description = "The extreme version of fruity cocktails."
color = "#666340" // rgb: 102, 99, 64
boozepwr = 10
quality = DRINK_FANTASTIC
- taste_description = "dryness"
+ taste_description = "sweet dryness"
glass_icon_state = "threemileislandglass"
glass_name = "Three Mile Island Ice Tea"
- glass_desc = "A glass of this is sure to prevent a meltdown."
+ glass_desc = "A glass of Three Mile Island Ice Tea, named after a cordoned-off set of islands on Earth, for some reason. You almost can't taste the alcohol in it..."
/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -312,75 +312,75 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/gin
name = "Gin"
- description = "It's gin. In space. I say, good sir."
+ description = "A very sharp alcohol, with a flavor that's distinctly fresh."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
- taste_description = "an alcoholic christmas tree"
+ taste_description = "an alcoholic pine tree"
glass_icon_state = "ginvodkaglass"
glass_name = "glass of gin"
- glass_desc = "A crystal clear glass of Griffeater gin."
+ glass_desc = "A glass of gin, made with a specific type of berry that leaves it smelling like the tree it came from. It's enough to wet your eyes."
/datum/reagent/consumable/ethanol/rum
name = "Rum"
- description = "Yohoho and all that."
+ description = "The liquor of choice for sailors and spacers alike."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 60
taste_description = "spiked butterscotch"
glass_icon_state = "rumglass"
glass_name = "glass of rum"
- glass_desc = "Now you want to Pray for a pirate suit, don't you?"
+ glass_desc = "There's no need to worry about being seen as a pirate with one of these. If you add enough ice and let it melt, it'll turn into grog."
shot_glass_icon_state = "shotglassbrown"
/datum/reagent/consumable/ethanol/tequila
name = "Tequila"
- description = "A strong and mildly flavoured, Mexican produced spirit. Feeling thirsty, hombre?"
+ description = "A strongly flavoured spirit."
color = "#FFFF91" // rgb: 255, 255, 145
boozepwr = 70
taste_description = "paint stripper"
glass_icon_state = "tequilaglass"
glass_name = "glass of tequila"
- glass_desc = "Now all that's missing is the weird colored shades!"
+ glass_desc = "Despite the strong, woody taste, there's just enough sweetness to keep you coming for more."
shot_glass_icon_state = "shotglassgold"
/datum/reagent/consumable/ethanol/vermouth
name = "Vermouth"
- description = "You suddenly feel a craving for a martini..."
+ description = "A fine wine to go with a meal."
color = "#91FF91" // rgb: 145, 255, 145
boozepwr = 45
taste_description = "dry alcohol"
glass_icon_state = "vermouthglass"
glass_name = "glass of vermouth"
- glass_desc = "You wonder why you're even drinking this straight."
+ glass_desc = "Vermouth was used as a medicine in the past, and the flavor makes sure to remind you of that."
shot_glass_icon_state = "shotglassclear"
/datum/reagent/consumable/ethanol/wine
name = "Wine"
- description = "A premium alcoholic beverage made from distilled grape juice."
+ description = "An alcoholic beverage made from fermented grapes of all kinds."
color = "#7E4043" // rgb: 126, 64, 67
boozepwr = 35
taste_description = "bitter sweetness"
glass_icon_state = "wineglass"
glass_name = "glass of wine"
- glass_desc = "A very classy looking drink."
+ glass_desc = "Deeply red wine in a glass. You're not enough of a sommelier to really describe how it smells."
shot_glass_icon_state = "shotglassred"
/datum/reagent/consumable/ethanol/lizardwine
- name = "Kalixcis Wine"
- description = "A relatively popular Kalixcane beverage, made by infusing cacti in ethanol."
+ name = "Blueflame Pyrecask"
+ description = "A popular Zohil beverage, made by infusing specially-gathered cacti and grapes in ethanol."
color = "#7E4043" // rgb: 126, 64, 67
boozepwr = 45
quality = DRINK_FANTASTIC
- taste_description = "scaley sweetness"
+ taste_description = "warm sweetness"
/datum/reagent/consumable/ethanol/grappa
name = "Grappa"
- description = "A fine Italian brandy, for when regular wine just isn't alcoholic enough for you."
+ description = "A fine brandy mixed with spirits."
color = "#F8EBF1"
boozepwr = 60
taste_description = "classy bitter sweetness"
glass_icon_state = "grappa"
glass_name = "glass of grappa"
- glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking."
+ glass_desc = "Despite being made from the recycled remains of wine grapes, it's not bad at all."
/datum/reagent/consumable/ethanol/amaretto
name = "Amaretto"
@@ -390,28 +390,28 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "fruity and nutty sweetness"
glass_icon_state = "amarettoglass"
glass_name = "glass of amaretto"
- glass_desc = "A sweet and syrupy looking drink."
+ glass_desc = "A sweet and syrupy looking alcohol. You're lucky it wasn't lost to history."
/datum/reagent/consumable/ethanol/cognac
name = "Cognac"
- description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
+ description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing."
color = "#AB3C05" // rgb: 171, 60, 5
boozepwr = 75
- taste_description = "angry and irish"
+ taste_description = "sharp and relaxing"
glass_icon_state = "cognacglass"
glass_name = "glass of cognac"
- glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
+ glass_desc = "You wonder how many exhausted Solarian bureaucrats are drinking this the same way you are, right now."
shot_glass_icon_state = "shotglassbrown"
/datum/reagent/consumable/ethanol/absinthe
name = "Absinthe"
- description = "A powerful alcoholic drink. Rumored to cause hallucinations but does not."
+ description = "A powerful alcoholic drink. Rumored to cause hallucinations if taken irresponsibly."
color = rgb(10, 206, 0)
boozepwr = 80 //Very strong even by default
taste_description = "death and licorice"
glass_icon_state = "absinthe"
glass_name = "glass of absinthe"
- glass_desc = "It's as strong as it smells."
+ glass_desc = "The smell is enough to bring you to the verge of tears. The hint of liquorice threatens to bring you over the edge."
shot_glass_icon_state = "shotglassgreen"
/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M)
@@ -421,13 +421,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/hooch
name = "Hooch"
- description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?"
+ description = "Low quality, low grade, and low expectations."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 100
taste_description = "pure resignation"
glass_icon_state = "glass_brown2"
glass_name = "Hooch"
- glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ glass_desc = "You can't help but feel like you'd rather drink anything else right now, just from looking at it."
/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
if(M.mind && M.mind.assigned_role == "Assistant")
@@ -440,67 +440,67 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "A dark alcoholic beverage made with malted barley and yeast."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 65
- taste_description = "hearty barley ale"
+ taste_description = "hearty alcoholic grains"
glass_icon_state = "aleglass"
glass_name = "glass of ale"
- glass_desc = "A freezing pint of delicious Ale."
+ glass_desc = "A pint of ale. A classic for the working class."
/datum/reagent/consumable/ethanol/goldschlager
name = "Goldschlager"
- description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
+ description = "100 proof cinnamon schnapps, made for the Student Unions' unbearable tastes."
color = "#FFFF91" // rgb: 255, 255, 145
boozepwr = 25
quality = DRINK_VERYGOOD
taste_description = "burning cinnamon"
glass_icon_state = "goldschlagerglass"
glass_name = "glass of goldschlager"
- glass_desc = "100% proof that teen girls will drink anything with gold in it."
+ glass_desc = "Extremely high proof, with cinnamon to boot. At least the light catches the gold flakes nicely enough to distract you from the imminent sting."
shot_glass_icon_state = "shotglassgold"
/datum/reagent/consumable/ethanol/patron
name = "Patron"
- description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
+ description = "Tequila with silver in it, often found in nightclubs."
color = "#585840" // rgb: 88, 88, 64
boozepwr = 60
quality = DRINK_VERYGOOD
taste_description = "metallic and expensive"
glass_icon_state = "patronglass"
glass_name = "glass of patron"
- glass_desc = "Drinking patron in the bar, with all the subpar ladies."
+ glass_desc = "A glass of Patron. The silver is for show, but you can't help but wonder how you would show it off to anyone."
shot_glass_icon_state = "shotglassclear"
/datum/reagent/consumable/ethanol/gintonic
name = "Gin and Tonic"
- description = "An all time classic, mild cocktail."
+ description = "A classic cocktail, with quinine for flavor."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 25
quality = DRINK_NICE
taste_description = "mild and tart"
glass_icon_state = "gintonicglass"
glass_name = "Gin and Tonic"
- glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
+ glass_desc = "A mild, venerable cocktail. You wonder if the quinine is doing anything for you."
/datum/reagent/consumable/ethanol/rum_coke
name = "Rum and Coke"
description = "Rum, mixed with cola."
- taste_description = "cola"
+ taste_description = "cola and alcohol"
boozepwr = 40
quality = DRINK_NICE
color = "#6b2f01"
glass_icon_state = "whiskeycolaglass"
glass_name = "Rum and Coke"
- glass_desc = "The classic go-to of space-fratboys."
+ glass_desc = "The classic for mixing drinks on the fly."
/datum/reagent/consumable/ethanol/cuba_libre
- name = "Cuba Libre"
- description = "Viva la Revolucion! Viva Cuba Libre!"
+ name = "Frontier Libre"
+ description = "For a freer Frontier, everywhere!"
color = "#692e01"
boozepwr = 50
quality = DRINK_GOOD
taste_description = "a refreshing marriage of citrus and rum"
glass_icon_state = "cubalibreglass"
- glass_name = "Cuba Libre"
- glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!"
+ glass_name = "Frontier Libre"
+ glass_desc = "A mix of rum, cola, and lime. A favorite of among independent spacers and the Frontiersmen alike, who named it in the spirit of securing a free Frontier."
/datum/reagent/consumable/ethanol/whiskey_cola
name = "Whiskey Cola"
@@ -508,55 +508,55 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#602a00"
boozepwr = 70
quality = DRINK_NICE
- taste_description = "cola"
+ taste_description = "sweet soda and bitter alcohol"
glass_icon_state = "whiskeycolaglass"
glass_name = "whiskey cola"
- glass_desc = "An innocent-looking mixture of cola and whiskey. Delicious."
+ glass_desc = "An sweet-and-bitter mixture of cola and whiskey."
/datum/reagent/consumable/ethanol/martini
name = "Classic Martini"
- description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
+ description = "Vermouth with gin."
color = "#9e8c67"
boozepwr = 60
quality = DRINK_NICE
- taste_description = "dry class"
+ taste_description = "dry"
glass_icon_state = "martiniglass"
glass_name = "Classic Martini"
- glass_desc = "Damn, the bartender even stirred it, not shook it."
+ glass_desc = "Rumored to be a favorite amongst the Evidenzkompanien, much to their chagrin."
/datum/reagent/consumable/ethanol/vodkamartini
name = "Vodka Martini"
- description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
+ description = "Vodka with gin."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 65
quality = DRINK_NICE
taste_description = "shaken, not stirred"
glass_icon_state = "martiniglass"
glass_name = "Vodka martini"
- glass_desc ="A bastardisation of the classic martini. Still great."
+ glass_desc ="Rumored to be a favorite amongst the Verwaltungskompanien, to their entertainment."
/datum/reagent/consumable/ethanol/white_russian
- name = "White Russian"
- description = "That's just, like, your opinion, man..."
+ name = "White Gezenan"
+ description = "Cream and vodka."
color = "#A68340" // rgb: 166, 131, 64
boozepwr = 50
quality = DRINK_GOOD
taste_description = "bitter cream"
glass_icon_state = "whiterussianglass"
- glass_name = "White Russian"
- glass_desc = "A very nice looking drink. But that's just, like, your opinion, man."
+ glass_name = "White Gezenan"
+ glass_desc = "A mix of traditionally PGF-sourced vodka and cream derived from nut milk. You can still drink this if you're not from Gezena, though."
/datum/reagent/consumable/ethanol/screwdrivercocktail
name = "Screwdriver"
- description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
+ description = "Vodka mixed with orange juice."
color = "#A68310" // rgb: 166, 131, 16
boozepwr = 55
quality = DRINK_NICE
taste_description = "oranges"
glass_icon_state = "screwdriverglass"
glass_name = "Screwdriver"
- glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
+ glass_desc = "You won't be turning any screws with this, but you're far from lamenting that."
/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M)
var/static/list/increased_rad_loss = list("Station Engineer", "Atmospheric Technician", "Chief Engineer")
@@ -572,18 +572,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sweet 'n creamy"
glass_icon_state = "booger"
glass_name = "Booger"
- glass_desc = "Ewww..."
+ glass_desc = "The name isn't selling the drink very well, is it..."
/datum/reagent/consumable/ethanol/bloody_mary
name = "Bloody Mary"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 55
quality = DRINK_GOOD
taste_description = "tomatoes with a hint of lime"
glass_icon_state = "bloodymaryglass"
glass_name = "Bloody Mary"
- glass_desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder."
+ glass_desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. The taste is acquired, and usually acquired through tgrying to use it as a hangover remedy."
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
if(C.blood_volume < BLOOD_VOLUME_NORMAL)
@@ -592,14 +592,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/brave_bull
name = "Brave Bull"
- description = "It's just as effective as Dutch-Courage!"
+ description = "Liquid courage is as good as any courage!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 60
quality = DRINK_NICE
taste_description = "alcoholic bravery"
glass_icon_state = "bravebullglass"
glass_name = "Brave Bull"
- glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up."
+ glass_desc = "Tequila and coffee liqueur, brought together to give you the will to pick fights. Don't drink enough to ruin your sense of safety, though."
var/tough_text
/datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M)
@@ -615,14 +615,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/tequila_sunrise
name = "Tequila Sunrise"
- description = "Tequila, Grenadine, and Orange Juice."
+ description = "Tequila, grenadine, and orange juice."
color = "#FFE48C" // rgb: 255, 228, 140
boozepwr = 45
quality = DRINK_GOOD
taste_description = "oranges with a hint of pomegranate"
glass_icon_state = "tequilasunriseglass"
glass_name = "tequila Sunrise"
- glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
+ glass_desc = "You feel a distinct sense of nostalgia - when's the last time you felt the sun on your face?"
var/obj/effect/light_holder
/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M)
@@ -643,14 +643,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/toxins_special
name = "Toxins Special"
- description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!"
+ description = "It's a bit tasteless to name your drink after industrial accidents."
color = "#780162"
boozepwr = 25
quality = DRINK_VERYGOOD
taste_description = "spicy toxins"
glass_icon_state = "toxinsspecialglass"
glass_name = "Toxins Special"
- glass_desc = "Whoah, this thing is on FIRE!"
+ glass_desc = "Traditionally lit with a welder while the server is blindfolded, but you don't want to cause an ACTUAL accident here."
shot_glass_icon_state = "toxinsspecialglass"
/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/M)
@@ -659,15 +659,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/beepsky_smash
name = "Beepsky Smash"
- description = "Drink this and prepare for the LAW."
+ description = "A drink for those who pick fights with automated security."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 60 //THE FIST OF THE LAW IS STRONG AND HARD
quality = DRINK_GOOD
metabolization_rate = 0.5
- taste_description = "JUSTICE"
+ taste_description = "electrified justice"
glass_icon_state = "beepskysmashglass"
glass_name = "Beepsky Smash"
- glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
+ glass_desc = "Heavy, hot and strong. Just like the sting of a stunbaton."
overdose_threshold = 40
var/datum/brain_trauma/special/beepsky/B
@@ -700,26 +700,26 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC)
/datum/reagent/consumable/ethanol/irish_cream
- name = "Irish Cream"
- description = "Whiskey-imbued cream, what else would you expect from the Irish?"
+ name = "Zohil Cream"
+ description = "Whiskey-imbued cream."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 50
quality = DRINK_NICE
taste_description = "creamy alcohol"
glass_icon_state = "irishcreamglass"
- glass_name = "Irish Cream"
- glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
+ glass_name = "Zohil Cream"
+ glass_desc = "Cream mixed with whiskey. Don't expect to learn anything about the Blueflame from just a drink, though."
/datum/reagent/consumable/ethanol/manly_dorf
- name = "The Manly Dorf"
- description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
+ name = "The Shortstop"
+ description = "Beer and ale, brought together in a very grain-flavored mix."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 100 //For the manly only
quality = DRINK_NICE
- taste_description = "hair on your chest and your chin"
+ taste_description = "fire in your chest and windburn on your chin"
glass_icon_state = "manlydorfglass"
- glass_name = "The Manly Dorf"
- glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only."
+ glass_name = "The Shortstop"
+ glass_desc = "A concoction made from ale and beer. Named after a joke that only short people would order this to prove a point."
var/dorf_mode
/datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/carbon/human/badlands_chugs)
@@ -742,14 +742,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/longislandicedtea
name = "Long Island Iced Tea"
- description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+ description = "The entire liquor cabinet brought together with enough sugar to hide it."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "a mixture of cola and alcohol"
glass_icon_state = "longislandicedteaglass"
glass_name = "Long Island Iced Tea"
- glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+ glass_desc = "The entire liquor cabinet brought together with enough sugar to hide it."
/datum/reagent/consumable/ethanol/moonshine
@@ -763,103 +763,86 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
/datum/reagent/consumable/ethanol/b52
- name = "B-52"
- description = "Coffee, Irish Cream, and cognac. You will get bombed."
+ name = "AM-G"
+ description = "Coffee liquor, Zohil Cream, and cognac."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 85
quality = DRINK_GOOD
- taste_description = "angry and irish"
+ taste_description = "angry and intense"
glass_icon_state = "b52glass"
- glass_name = "B-52"
- glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed."
+ glass_name = "AM-G"
+ glass_desc = "Coffee liquor, Zohil Cream, and cognac. Enough to make you hide before the blast."
shot_glass_icon_state = "b52glass"
/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M)
playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE)
/datum/reagent/consumable/ethanol/irishcoffee
- name = "Irish Coffee"
- description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
+ name = "Gezenan Coffee"
+ description = "Coffee, and alcohol. Traditionally enjoyed in the morning on lazy days."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_NICE
taste_description = "giving up on the day"
glass_icon_state = "irishcoffeeglass"
- glass_name = "Irish Coffee"
- glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
+ glass_name = "Gezenan Coffee"
+ glass_desc = "Coffee and alcohol. Traditionally enjoyed in the morning on lazy days."
/datum/reagent/consumable/ethanol/margarita
name = "Margarita"
- description = "On the rocks with salt on the rim. Arriba~!"
+ description = "A fruity, tropical drink with a salted rim around the glass."
color = "#8CFF8C" // rgb: 140, 255, 140
boozepwr = 35
quality = DRINK_NICE
taste_description = "dry and salty"
glass_icon_state = "margaritaglass"
glass_name = "Margarita"
- glass_desc = "On the rocks with salt on the rim. Arriba~!"
+ glass_desc = "On the rocks with salt on the rim. Apparently the name meant something in a language long lost on Earth."
/datum/reagent/consumable/ethanol/black_russian
- name = "Black Russian"
- description = "For the lactose-intolerant. Still as classy as a White Russian."
+ name = "Black Rachnid"
+ description = "An alternative take to the White Gezenan. Doubles as an option for those who can't handle lactose."
color = "#360000" // rgb: 54, 0, 0
boozepwr = 70
quality = DRINK_NICE
taste_description = "bitterness"
glass_icon_state = "blackrussianglass"
- glass_name = "Black Russian"
- glass_desc = "For the lactose-intolerant. Still as classy as a White Russian."
+ glass_name = "Black Rachnid"
+ glass_desc = "An alternative take to the White Gezenan. Doubles as an option for those who can't handle lactose."
/datum/reagent/consumable/ethanol/manhattan
- name = "Manhattan"
- description = "The Detective's undercover drink of choice. He never could stomach gin..."
+ name = "Twelve Crossings"
+ description = "A mixed drink popularized by a murder mystery book series from Teceti."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 30
quality = DRINK_NICE
taste_description = "mild dryness"
glass_icon_state = "manhattanglass"
- glass_name = "Manhattan"
- glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
-
-
-/datum/reagent/consumable/ethanol/manhattan_proj
- name = "Manhattan Project"
- description = "A scientist's drink of choice, for pondering ways to blow up the sector."
- color = "#664300" // rgb: 102, 67, 0
- boozepwr = 45
- quality = DRINK_VERYGOOD
- taste_description = "death, the destroyer of worlds"
- glass_icon_state = "proj_manhattanglass"
- glass_name = "Manhattan Project"
- glass_desc = "A scientist's drink of choice, for thinking how to blow up the sector."
-
-
-/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M)
- M.set_drugginess(30)
- return ..()
+ glass_name = "Twelve Crossings"
+ glass_desc = "A mixed drink popularized by a murder mystery book series from Teceti. The Detective's undercover drink of choice. He never could stomach gin..."
/datum/reagent/consumable/ethanol/whiskeysoda
name = "Whiskey Soda"
- description = "For the more refined griffon."
+ description = "Whiskey and soda water, a simple mixed drink."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 70
quality = DRINK_NICE
taste_description = "soda"
glass_icon_state = "whiskeysodaglass2"
glass_name = "whiskey soda"
- glass_desc = "Ultimate refreshment."
+ glass_desc = "Bitter and refreshing."
/datum/reagent/consumable/ethanol/antifreeze
name = "Anti-freeze"
- description = "The ultimate refreshment. Not what it sounds like."
+ description = "The ultimate refreshment. Not actually made of antifreeze!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_NICE
- taste_description = "Jack Frost's piss"
+ taste_description = "frigid heat"
glass_icon_state = "antifreeze"
glass_name = "Anti-freeze"
- glass_desc = "The ultimate refreshment."
+ glass_desc = "Vodka, cream, and ice. No actual antifreeze included, of course."
/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal() + 20) //310.15 is the normal bodytemp.
@@ -867,14 +850,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/barefoot
name = "Barefoot"
- description = "Barefoot and pregnant."
+ description = "To be enjoyed on the beach or by a pool. You should keep your shoes on, though."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
quality = DRINK_VERYGOOD
taste_description = "creamy berries"
glass_icon_state = "b&p"
glass_name = "Barefoot"
- glass_desc = "Barefoot and pregnant."
+ glass_desc = "To be enjoyed on the beach or by a pool. You should keep your shoes on, though."
/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.
@@ -893,40 +876,40 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "refreshing cold"
glass_icon_state = "snowwhite"
glass_name = "Snow White"
- glass_desc = "A cold refreshment."
+ glass_desc = "A cold refreshment of beer and lemon-lime soda. Not exactly princess material, is it?"
/datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon.
name = "Demon's Blood"
- description = "AHHHH!!!!"
+ description = "A mix of two sodas, rum, and... real blood."
color = "#820000" // rgb: 130, 0, 0
boozepwr = 75
quality = DRINK_VERYGOOD
taste_description = "sweet tasting iron"
glass_icon_state = "demonsblood"
- glass_name = "Demons Blood"
- glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up."
+ glass_name = "Demon's Blood"
+ glass_desc = "A drink made with the blood of the server or the patron, which usually results in said patron being thrown out. While most substitute real blood for a saline solution, that drink is actually referred to as 'Demon's Sweat'."
/datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it.
name = "Devil's Kiss"
- description = "Creepy time!"
+ description = "Asking for a kiss to go with the blood drawing is pushing it."
color = "#A68310" // rgb: 166, 131, 16
boozepwr = 70
quality = DRINK_VERYGOOD
taste_description = "bitter iron"
glass_icon_state = "devilskiss"
- glass_name = "Devils Kiss"
- glass_desc = "Creepy time!"
+ glass_name = "Devil's Kiss"
+ glass_desc = "The boozier cousin of the Demon's Blood. Typically served in a glass shaped to specifically cut and draw blood from the patron's lip... which deters most."
/datum/reagent/consumable/ethanol/vodkatonic
name = "Vodka and Tonic"
- description = "For when a gin and tonic isn't Russian enough."
+ description = "The stronger sibling of the Gin and Tonic."
color = "#0064C8" // rgb: 0, 100, 200
boozepwr = 70
quality = DRINK_NICE
taste_description = "tart bitterness"
glass_icon_state = "vodkatonicglass"
- glass_name = "vodka and tonic"
- glass_desc = "For when a gin and tonic isn't Russian enough."
+ glass_name = "Vodka and Tonic"
+ glass_desc = "The stronger sibling of the Gin and Tonic."
/datum/reagent/consumable/ethanol/ginfizz
@@ -943,55 +926,55 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bahama_mama
name = "Bahama Mama"
- description = "A tropical cocktail with a complex blend of flavors."
+ description = "A tropical cocktail with a complex blend of fruity flavors."
color = "#FF7F3B" // rgb: 255, 127, 59
boozepwr = 35
quality = DRINK_GOOD
taste_description = "pineapple, coconut, and a hint of coffee"
glass_icon_state = "bahama_mama"
glass_name = "Bahama Mama"
- glass_desc = "A tropical cocktail with a complex blend of flavors."
+ glass_desc = "A tropical cocktail with a complex blend of fruity flavors. It makes you think about going on vacation someday..."
/datum/reagent/consumable/ethanol/singulo
name = "Singulo"
- description = "A blue-space beverage!"
+ description = "Named after a tragic industrial accident!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "concentrated matter"
glass_icon_state = "singulo"
glass_name = "Singulo"
- glass_desc = "A blue-space beverage."
+ glass_desc = "Named after a tragic industrial accident involving a singularity escaping containment. This drink doesn't taste particularly commemorative - it's too enjoyable!"
/datum/reagent/consumable/ethanol/sbiten
name = "Sbiten"
- description = "A spicy Vodka! Might be a little hot for the little guys!"
+ description = "Vodka with capsaicin for the extra feeling of intense warmth."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 70
quality = DRINK_GOOD
taste_description = "hot and spice"
glass_icon_state = "sbitenglass"
glass_name = "Sbiten"
- glass_desc = "A spicy mix of Vodka and Spice. Very hot."
+ glass_desc = "Vodka with capsaicin for the extra feeling of intense warmth. Difficult to take large swallows."
/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 , M.dna.species.bodytemp_heat_damage_limit) //310.15 is the normal bodytemp.
return ..()
/datum/reagent/consumable/ethanol/red_mead
- name = "Red Mead"
- description = "The true Viking drink! Even though it has a strange red color."
+ name = "Drop-pod"
+ description = "A commemorative drink, made in the name of those who died during failed orbital drop-pod landings."
color = "#C73C00" // rgb: 199, 60, 0
boozepwr = 31 //Red drinks are stronger
quality = DRINK_GOOD
taste_description = "sweet and salty alcohol"
glass_icon_state = "red_meadglass"
- glass_name = "Red Mead"
- glass_desc = "A true Viking's beverage, made with the blood of their enemies."
+ glass_name = "Drop-pod"
+ glass_desc = "A commemorative drink, made in the name of those who died during failed orbital drop-pod landings. Technically intended to use the blood of your enemies, but..."
/datum/reagent/consumable/ethanol/mead
name = "Mead"
- description = "A Viking drink, though a cheap one."
+ description = "Fermented honey. The gentler sibling to the beer."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 30
@@ -999,17 +982,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sweet, sweet alcohol"
glass_icon_state = "meadglass"
glass_name = "Mead"
- glass_desc = "A drink from Valhalla."
+ glass_desc = "Fermented honey. The gentler sibling to the beer - and almost just as old."
/datum/reagent/consumable/ethanol/iced_beer
- name = "Iced Beer"
- description = "A beer which is so cold the air around it freezes."
+ name = "Iced beer"
+ description = "Iced beer, served in a chilled glass."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 15
taste_description = "refreshingly cold"
glass_icon_state = "iced_beerglass"
glass_name = "iced beer"
- glass_desc = "A beer so frosty, the air around it freezes."
+ glass_desc = "Iced beer, served in a chilled glass. It's cold enough to leave a trail in the air."
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp.
@@ -1017,25 +1000,25 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/grog
name = "Grog"
- description = "Watered-down rum, Nanotrasen approves!"
+ description = "Watered-down rum, to really stretch out your alcohol rations. A Belter classic."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1 //Basically nothing
taste_description = "a poor excuse for alcohol"
glass_icon_state = "grogglass"
glass_name = "Grog"
- glass_desc = "A fine and cepa drink for Space."
+ glass_desc = "Watered-down rum, to really stretch out your alcohol rations. A Belter classic."
/datum/reagent/consumable/ethanol/aloe
name = "Aloe"
- description = "So very, very, very good."
+ description = "Zohil Cream and watermelon juice. Mellows out the alcoholic bite for a mild drink."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "sweet 'n creamy"
glass_icon_state = "aloe"
glass_name = "Aloe"
- glass_desc = "Very, very, very good."
+ glass_desc = "Zohil Cream and watermelon juice. Mellows out the alcoholic bite for a mild drink."
/datum/reagent/consumable/ethanol/andalusia
name = "Andalusia"
@@ -1046,51 +1029,51 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "lemons"
glass_icon_state = "andalusia"
glass_name = "Andalusia"
- glass_desc = "A nice, strangely named drink."
+ glass_desc = "A nice, strangely named drink. Theoretically named after a particular region on Terra, but no one's quite sure where."
/datum/reagent/consumable/ethanol/alliescocktail
- name = "Allies Cocktail"
- description = "A drink made from your allies. Not as sweet as those made from your enemies."
+ name = "Canton Cocktail"
+ description = "A drink intended to be shared across the Solarian cantons."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
quality = DRINK_NICE
taste_description = "bitter yet free"
glass_icon_state = "alliescocktail"
- glass_name = "Allies cocktail"
- glass_desc = "A drink made from your allies."
+ glass_name = "Canton cocktail"
+ glass_desc = "A drink intended to be shared across the Solarian cantons."
/datum/reagent/consumable/ethanol/acid_spit
- name = "Acid Spit"
- description = "A drink for the daring, can be deadly if incorrectly prepared!"
+ name = "Cracked Moon"
+ description = "Typically made on a dare by CLIP-BARD crews. It's deadly if incorrectly prepared!"
color = "#365000" // rgb: 54, 80, 0
boozepwr = 70
quality = DRINK_VERYGOOD
- taste_description = "stomach acid"
+ taste_description = "alien stomach acid"
glass_icon_state = "acidspitglass"
- glass_name = "Acid Spit"
- glass_desc = "A drink from Nanotrasen. Made from live aliens."
+ glass_name = "Cracked Moon"
+ glass_desc = "Typically made on a dare by CLIP-BARD crews. It's deadly if incorrectly prepared!"
/datum/reagent/consumable/ethanol/amasec
- name = "Amasec"
- description = "Official drink of the Nanotrasen Gun-Club!"
+ name = "Ren Kirsi"
+ description = "A Teceian drink mainly enjoyed on The Ring and it's sibling colonies."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_GOOD
taste_description = "dark and metallic"
glass_icon_state = "amasecglass"
- glass_name = "Amasec"
- glass_desc = "Always handy before COMBAT!!!"
+ glass_name = "Ren Kirsi"
+ glass_desc = "There's no way you're getting your hands on metal shavings from The Ring itself, but it's the thought that counts."
/datum/reagent/consumable/ethanol/changelingsting
name = "Changeling Sting"
- description = "You take a tiny sip and feel a burning sensation..."
+ description = "Made by the superstitous. Keeps the changelings away... whereever they may be."
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 50
quality = DRINK_GOOD
taste_description = "your brain coming out your nose"
glass_icon_state = "changelingsting"
glass_name = "Changeling Sting"
- glass_desc = "A stingy drink."
+ glass_desc = "Made by the superstitous. Keeps the changelings away... whereever they may be."
/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M)
if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals.
@@ -1101,26 +1084,26 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/irishcarbomb
- name = "Irish Car Bomb"
- description = "Mmm, tastes like the free Irish state."
+ name = "Lightspeed"
+ description = "A shot of Zohil cream in a pinch of ale, meant to be downed in one chug - hits you as fast as the name."
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 25
quality = DRINK_GOOD
- taste_description = "the spirit of Ireland"
+ taste_description = "the rush of hyperspace"
glass_icon_state = "irishcarbomb"
- glass_name = "Irish Car Bomb"
- glass_desc = "An Irish car bomb."
+ glass_name = "Lightspeed"
+ glass_desc = "A shot of Zohil cream in a pinch of ale, meant to be downed in one chug - hits you as fast as the name."
/datum/reagent/consumable/ethanol/syndicatebomb
- name = "Syndicate Bomb"
- description = "Tastes like terrorism!"
+ name = "Gorlex Surprise"
+ description = "Infamously named after the accusations of Syndicate-led bombings of space installations. It's a blast!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 90
quality = DRINK_GOOD
- taste_description = "purified antagonism"
+ taste_description = "anti-Nanotrasen sentiments"
glass_icon_state = "syndicatebomb"
- glass_name = "Syndicate Bomb"
- glass_desc = "A syndicate bomb."
+ glass_name = "Gorlex Surprise"
+ glass_desc = "Infamously named after the accusations of Syndicate-led bombings of space installations. It's a blast!"
/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -1128,50 +1111,50 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/hiveminderaser
- name = "Hivemind Eraser"
+ name = "Hivemind"
description = "A vessel of pure flavor."
color = "#FF80FC" // rgb: 255, 128, 252
boozepwr = 40
quality = DRINK_GOOD
taste_description = "psychic links"
glass_icon_state = "hiveminderaser"
- glass_name = "Hivemind Eraser"
- glass_desc = "For when even mindshields can't save you."
+ glass_name = "Hivemind"
+ glass_desc = "A legend around this drink states that drinking this at the same time as someone else links your mind with theirs. Are you going to find out?"
/datum/reagent/consumable/ethanol/erikasurprise
- name = "Erika Surprise"
- description = "The surprise is, it's green!"
+ name = "Terraformer Surprise"
+ description = "It's as green as the first terraforming experiments, allegedly."
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "tartness and bananas"
glass_icon_state = "erikasurprise"
- glass_name = "Erika Surprise"
- glass_desc = "The surprise is, it's green!"
+ glass_name = "Terraformer Surprise"
+ glass_desc = "It's as green as the first terraforming experiments, allegedly."
/datum/reagent/consumable/ethanol/driestmartini
- name = "Driest Martini"
- description = "Only for the experienced. You think you see sand floating in the glass."
+ name = "Saltflat"
+ description = "Nigh-dehydratingly dry. Intended to be a challenge."
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 65
quality = DRINK_GOOD
taste_description = "a beach"
glass_icon_state = "driestmartiniglass"
- glass_name = "Driest Martini"
- glass_desc = "Only for the experienced. You think you see sand floating in the glass."
+ glass_name = "Saltflat"
+ glass_desc = "Nigh-dehydratingly dry. Intended to be a challenge."
/datum/reagent/consumable/ethanol/bananahonk
- name = "Banana Honk"
- description = "A drink from Clown Heaven."
+ name = "Creamtruck"
+ description = "A distinctly non-kid friendly equivalent to the ice cream truck."
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#FFFF91" // rgb: 255, 255, 140
boozepwr = 60
quality = DRINK_GOOD
- taste_description = "a bad joke"
+ taste_description = "bananas and cream"
glass_icon_state = "bananahonkglass"
- glass_name = "Banana Honk"
- glass_desc = "A drink from Clown Heaven."
+ glass_name = "Creamtruck"
+ glass_desc = "A distinctly non-kid friendly equivalent to the ice cream truck."
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -1180,16 +1163,16 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..() || .
/datum/reagent/consumable/ethanol/silencer
- name = "Silencer"
- description = "A drink from Mime Heaven."
+ name = "Choker"
+ description = "It takes a moment of quiet to really appreciate some drinks - this one doesn't give you the illusion of choice."
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#664300" // rgb: 102, 67, 0
- boozepwr = 59 //Proof that clowns are better than mimes right here
+ boozepwr = 59
quality = DRINK_GOOD
- taste_description = "a pencil eraser"
+ taste_description = "peace and quiet"
glass_icon_state = "silencerglass"
- glass_name = "Silencer"
- glass_desc = "A drink from Mime Heaven."
+ glass_name = "Choker"
+ glass_desc = "It takes a moment of quiet to really appreciate some drinks - this one doesn't give you the illusion of choice."
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M)
if(ishuman(M) && M.mind?.miming)
@@ -1200,18 +1183,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/drunkenblumpkin
name = "Drunken Blumpkin"
- description = "A weird mix of whiskey and blumpkin juice."
+ description = "A weird mix of whiskey and... chlorine-pumpkin juice?"
color = "#1EA0FF" // rgb: 102, 67, 0
boozepwr = 50
quality = DRINK_VERYGOOD
taste_description = "molasses and a mouthful of pool water"
glass_icon_state = "drunkenblumpkin"
glass_name = "Drunken Blumpkin"
- glass_desc = "A drink for the drunks."
+ glass_desc = "A drink for the confused hydropon worker."
/datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour.
name = "Whiskey Sour"
- description = "Lemon juice/whiskey/sugar mixture. Moderate alcohol content."
+ description = "A mix of lemon juice, whiskey, and sugar."
color = rgb(255, 201, 49)
boozepwr = 35
quality = DRINK_GOOD
@@ -1222,35 +1205,16 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/hcider
name = "Hard Cider"
- description = "Apple juice, for adults."
+ description = "The alcoholic sibling to apple cider."
color = "#CD6839"
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 25
taste_description = "the season that falls between summer and winter"
glass_icon_state = "whiskeyglass"
glass_name = "hard cider"
- glass_desc = "Tastes like autumn... no wait, fall!"
+ glass_desc = "Sharper tasting, alcoholic apple cider."
shot_glass_icon_state = "shotglassbrown"
-
-/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber!
- name = "Fetching Fizz"
- description = "Whiskey sour/iron/uranium mixture resulting in a highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~
- color = rgb(255, 91, 15)
- boozepwr = 10
- quality = DRINK_VERYGOOD
- metabolization_rate = 0.1 * REAGENTS_METABOLISM
- taste_description = "charged metal" // the same as teslium, honk honk.
- glass_icon_state = "fetching_fizz"
- glass_name = "Fetching Fizz"
- glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste."
-
-
-/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M)
- for(var/obj/item/stack/ore/O in orange(3, M))
- step_towards(O, get_turf(M))
- return ..()
-
//Another reference. Heals those in critical condition extremely quickly.
/datum/reagent/consumable/ethanol/hearty_punch
name = "Hearty Punch"
@@ -1262,7 +1226,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "bravado in the face of disaster"
glass_icon_state = "hearty_punch"
glass_name = "Hearty Punch"
- glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead."
+ glass_desc = "An aromatic beverage, served piping hot. According to folktales, it can almost wake the dead."
/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M)
if(M.health <= 0)
@@ -1295,7 +1259,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "da bomb"
glass_icon_state = "atomicbombglass"
glass_name = "Atomic Bomb"
- glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
+ glass_desc = "Devastating to you and everyone around you, especially if you get drunk enough from it."
/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -1353,7 +1317,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
metabolization_rate = 1 * REAGENTS_METABOLISM
glass_icon_state = "neurotoxinglass"
glass_name = "Neurotoxin"
- glass_desc = "A drink that is guaranteed to knock you silly."
+ glass_desc = "The story goes that this drink was made on a bet between Cybersun chemists, debating if a drink could be used to put down a suspected Nanotrasen spy. While morphine wasn't supposed to be used, it put them down all the same."
/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
@@ -1365,7 +1329,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(prob(20))
M.adjustStaminaLoss(10)
M.drop_all_held_items()
- to_chat(M, "You cant feel your hands!")
+ to_chat(M, "You can't feel your hands!")
if(current_cycle > 5)
if(prob(20))
var/t = pickt()
@@ -1390,17 +1354,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/hippies_delight
- name = "Hippie's Delight"
- description = "You just don't get it maaaan."
+ name = "Between the Mandibles"
+ description = "Mushroom-supplied hallucinogens and strong alcohol."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 0
boozepwr = 0 //custom drunk effect
quality = DRINK_FANTASTIC
metabolization_rate = 0.2 * REAGENTS_METABOLISM
- taste_description = "giving peace a chance"
+ taste_description = "two finger-sized bites on your tongue"
glass_icon_state = "hippiesdelightglass"
- glass_name = "Hippie's Delight"
- glass_desc = "A drink enjoyed by people during the 1960's."
+ glass_name = "Between the Mandibles"
+ glass_desc = "Named after a request from a clueless spacer who asked for Rachnid venom to be mixed in a house special. While Rachnids don't have venom glands, this'll have you reeling all the same."
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M)
if (!M.slurring)
@@ -1436,7 +1400,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/eggnog
name = "Eggnog"
- description = "For enjoying the most wonderful time of the year."
+ description = "For enjoying the Winter Solstice."
color = "#fcfdc6" // rgb: 252, 253, 198
nutriment_factor = 2 * REAGENTS_METABOLISM
boozepwr = 1
@@ -1444,34 +1408,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "custard and alcohol"
glass_icon_state = "glass_yellow"
glass_name = "eggnog"
- glass_desc = "For enjoying the most wonderful time of the year."
-
-
-/datum/reagent/consumable/ethanol/narsour
- name = "Nar'Sour"
- description = "Side effects include self-mutilation and hoarding plasteel."
- color = RUNE_COLOR_DARKRED
- boozepwr = 10
- quality = DRINK_FANTASTIC
- taste_description = "bloody"
- glass_icon_state = "narsour"
- glass_name = "Nar'Sour"
- glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!"
-
-/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M)
- M.cultslurring = min(M.cultslurring + 3, 3)
- M.stuttering = min(M.stuttering + 3, 3)
- ..()
+ glass_desc = "For enjoying the Winter Solstice."
/datum/reagent/consumable/ethanol/triple_sec
name = "Triple Sec"
description = "A sweet and vibrant orange liqueur."
color = "#ffcc66"
boozepwr = 30
- taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of the caribbean"
+ taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of distant shores"
glass_icon_state = "glass_orange"
glass_name = "Triple Sec"
- glass_desc = "A glass of straight Triple Sec."
+ glass_desc = "A glass of straight triple sec. Citrusy and warm."
/datum/reagent/consumable/ethanol/creme_de_menthe
name = "Creme de Menthe"
@@ -1481,17 +1428,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a minty, cool, and invigorating splash of cold streamwater"
glass_icon_state = "glass_green"
glass_name = "Creme de Menthe"
- glass_desc = "You can almost feel the first breath of spring just looking at it."
+ glass_desc = "Bright green and minty - enough to tell you what it's going to taste like."
/datum/reagent/consumable/ethanol/creme_de_cacao
name = "Creme de Cacao"
- description = "A chocolatey liqueur excellent for adding dessert notes to beverages and bribing sororities."
+ description = "A chocolatey liqueur excellent for adding dessert notes to beverages."
color = "#996633"
boozepwr = 20
taste_description = "a slick and aromatic hint of chocolates swirling in a bite of alcohol"
glass_icon_state = "glass_brown"
glass_name = "Creme de Cacao"
- glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient."
+ glass_desc = "Creme de Cacao - chocolate-wine, essentially. Not milk chocolate, so expect some bite."
/datum/reagent/consumable/ethanol/creme_de_coconut
name = "Creme de Coconut"
@@ -1501,7 +1448,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a sweet milky flavor with notes of toasted sugar"
glass_icon_state = "glass_white"
glass_name = "Creme de Coconut"
- glass_desc = "An unintimidating glass of coconut liqueur."
+ glass_desc = "A white glass of coconut liqueur."
/datum/reagent/consumable/ethanol/quadruple_sec
name = "Quadruple Sec"
@@ -1509,10 +1456,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#cc0000"
boozepwr = 35
quality = DRINK_GOOD
- taste_description = "an invigorating bitter freshness which suffuses your being; no enemy of the corporation will go unrobusted this day"
+ taste_description = "an invigorating bitter freshness which suffuses your being; you can take on anyone who messes with your vessel"
glass_icon_state = "quadruple_sec"
glass_name = "Quadruple Sec"
- glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though."
+ glass_desc = "A glass of Quadruple Sec. Popularized for being a mixed drink of choice across multiple independent security agencies, and notably among Nanotrasen's internal security culture. It's not recommended to drink while manning a vessel, though!"
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M)
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes
@@ -1524,14 +1471,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/quintuple_sec
name = "Quintuple Sec"
- description = "Law, Order, Alcohol, and Police Brutality distilled into one single elixir of JUSTICE."
+ description = "Law, order and alcohol distilled into one single elixir."
color = "#ff3300"
boozepwr = 55
quality = DRINK_FANTASTIC
- taste_description = "THE LAW"
+ taste_description = "drinking on duty"
glass_icon_state = "quintuple_sec"
glass_name = "Quintuple Sec"
- glass_desc = "Now you are become law, destroyer of clowns."
+ glass_desc = "The logical endpoint of the Quadruple Sec. Often had in the hands of senior security staff, though you really should not be drinking this while on-duty."
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M)
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG..
@@ -1546,14 +1493,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/grasshopper
name = "Grasshopper"
- description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this."
+ description = "A fresh and sweet dessert shooter."
color = "#00ff00"
boozepwr = 25
quality = DRINK_GOOD
taste_description = "chocolate and mint dancing around your mouth"
glass_icon_state = "grasshopper"
glass_name = "Grasshopper"
- glass_desc = "You weren't aware edible beverages could be that green."
+ glass_desc = "Named after a particularly green insect. Theoretically, there's always adding vodka to this and making it a Flying Grasshopper..."
/datum/reagent/consumable/ethanol/stinger
name = "Stinger"
@@ -1564,7 +1511,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a slap on the face in the best possible way"
glass_icon_state = "stinger"
glass_name = "Stinger"
- glass_desc = "You wonder what would happen if you pointed this at a heat source..."
+ glass_desc = "A brandy-and-menthe mixed drink to end the day with. While often found in the hands of the upper class, there's nothing wrong with feeling a little fancy."
/datum/reagent/consumable/ethanol/bastion_bourbon
name = "Bastion Bourbon"
@@ -1664,13 +1611,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/sake
name = "Sake"
- description = "A sweet rice wine of questionable legality and extreme potency."
+ description = "A sweet rice wine."
color = "#DDDDDD"
boozepwr = 70
taste_description = "sweet rice wine"
glass_icon_state = "sakecup"
glass_name = "cup of sake"
- glass_desc = "A traditional cup of sake."
+ glass_desc = "A cup of sake. Capable of being served hot, cold, or at room temperature, and served in a traditionally-sized little cup."
/datum/reagent/consumable/ethanol/peppermint_patty
name = "Peppermint Patty"
@@ -1681,7 +1628,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
quality = DRINK_GOOD
glass_icon_state = "peppermint_patty"
glass_name = "Peppermint Patty"
- glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night."
+ glass_desc = "A boozy, minty hot cocoa that warms your belly on a cold night."
/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M)
M.apply_status_effect(/datum/status_effect/throat_soothed)
@@ -1689,15 +1636,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/alexander
- name = "Alexander"
- description = "Named after a Greek hero, this mix is said to embolden a user's shield as if they were in a phalanx."
+ name = "Ash-Shield"
+ description = "While not a traditional trickwine by any means, this mix is said to embolden a user's shield under certain circumstance."
color = "#F5E9D3"
boozepwr = 50
quality = DRINK_GOOD
taste_description = "bitter, creamy cacao"
glass_icon_state = "alexander"
- glass_name = "Alexander"
- glass_desc = "A creamy, indulgent delight that is stronger than it seems."
+ glass_name = "Ash-Shield"
+ glass_desc = "While not a traditional trickwine by any means (and considered in poor taste in mixing), this drink is said to embolden the shield in the imbiber's hand. Just don't let it engender passivity."
var/obj/item/shield/mighty_shield
/datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L)
@@ -1721,37 +1668,37 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/amaretto_alexander
- name = "Amaretto Alexander"
- description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor."
+ name = "Happy Huntsman"
+ description = "A cousin of the Ash-Shield, what it lacks in strength (and mysterious power), it makes up for in flavor."
color = "#DBD5AE"
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "sweet, creamy cacao"
glass_icon_state = "alexanderam"
- glass_name = "Amaretto Alexander"
- glass_desc = "A creamy, indulgent delight that is in fact as gentle as it seems."
+ glass_name = "Happy Huntsman"
+ glass_desc = "A gentle, creamy drink, enjoyed on rare occasions by the Saint Roumain's followers."
/datum/reagent/consumable/ethanol/sidecar
- name = "Sidecar"
- description = "The one ride you'll gladly give up the wheel for."
+ name = "Bridge Bunny"
+ description = "You're happy to not pilot the ship after having one of these."
color = "#FFC55B"
boozepwr = 45
quality = DRINK_GOOD
taste_description = "delicious freedom"
glass_icon_state = "sidecar"
- glass_name = "Sidecar"
- glass_desc = "The one ride you'll gladly give up the wheel for."
+ glass_name = "Bridge Bunny"
+ glass_desc = "You're happy to not pilot the ship after having one of these."
/datum/reagent/consumable/ethanol/between_the_sheets
name = "Between the Sheets"
- description = "A provocatively named classic. Funny enough, doctors recommend drinking it before taking a nap."
+ description = "A provocatively named classic."
color = "#F4C35A"
boozepwr = 55
quality = DRINK_GOOD
- taste_description = "seduction"
+ taste_description = "rum, lemons, and mild embarrassment"
glass_icon_state = "between_the_sheets"
glass_name = "Between the Sheets"
- glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy."
+ glass_desc = "Also known as The Maiden's Prayer, if you're not willing to say the original name aloud."
/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L)
..()
@@ -1767,15 +1714,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
L.adjustFireLoss(-0.2)
/datum/reagent/consumable/ethanol/kamikaze
- name = "Kamikaze"
- description = "Divinely windy."
+ name = "Mothball"
+ description = "Vodka, triple sec, and lime juice. Moth dust not usually included."
color = "#EEF191"
boozepwr = 60
quality = DRINK_GOOD
- taste_description = "divine windiness"
+ taste_description = "fluttery sour-sweetness"
glass_icon_state = "kamikaze"
- glass_name = "Kamikaze"
- glass_desc = "Divinely windy."
+ glass_name = "Mothball"
+ glass_desc = "Made in an attempt to commemorate the supposed original place mothpeople were created in, though it was since disproven. While moth dust could be used as a garnish, don't go asking for it unless you are one."
/datum/reagent/consumable/ethanol/mojito
name = "Mojito"
@@ -1789,15 +1736,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A drink that looks as refreshing as it tastes."
/datum/reagent/consumable/ethanol/moscow_mule
- name = "Moscow Mule"
- description = "A chilly drink that reminds you of the Derelict."
+ name = "Gorlex Gator"
+ description = "A chilly drink made in remembrance of Gorlex IV."
color = "#EEF1AA"
boozepwr = 30
quality = DRINK_GOOD
taste_description = "refreshing spiciness"
glass_icon_state = "moscow_mule"
- glass_name = "Moscow Mule"
- glass_desc = "A chilly drink that reminds you of the Derelict."
+ glass_name = "Gorlex Gator"
+ glass_desc = "A chilly drink made in remembrance of Gorlex IV. It's not a wise idea to go ordering this when the PGF are in town, though."
/datum/reagent/consumable/ethanol/fernet
name = "Fernet"
@@ -1806,7 +1753,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 80
taste_description = "utter bitterness"
glass_name = "glass of fernet"
- glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum
+ glass_desc = "A glass of pure Fernet. Intensely bitter and reserved to being a digestive more than something to be enjoyed." //Hi Kevum
/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1816,15 +1763,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/fernet_cola
- name = "Fernet Cola"
+ name = "Weldline"
description = "A very popular and bittersweet digestif, ideal after a heavy meal. Best served on a sawed-off cola bottle as per tradition."
color = "#390600" // rgb: 57, 6,
boozepwr = 25
quality = DRINK_NICE
taste_description = "sweet relief"
glass_icon_state = "godlyblend"
- glass_name = "glass of fernet cola"
- glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass."
+ glass_name = "glass of weldline"
+ glass_desc = "A shorn-off cola bottle filled with fernet and cola soft drink. A tradition among cargo workers and hull technicians is to use a welder to cut the cola can in half."
/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1834,7 +1781,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/fanciulli
-
name = "Fanciulli"
description = "What if the Manhattan cocktail ACTUALLY used a bitter herb liquour? Helps you sober up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness
color = "#CA933F" // rgb: 202, 147, 63
@@ -1843,7 +1789,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a sweet sobering mix"
glass_icon_state = "fanciulli"
glass_name = "glass of fanciulli"
- glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet."
+ glass_desc = "A glass of Fanciulli: a Manhattan with fernet mixed in. Bitter enough to knock some sense into your drunk self."
/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M)
M.adjust_nutrition(-5)
@@ -1858,15 +1804,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/branca_menta
- name = "Branca Menta"
+ name = "Mirage"
description = "A refreshing mixture of bitter Fernet with mint creme liquour."
color = "#4B5746" // rgb: 75, 87, 70
boozepwr = 35
quality = DRINK_GOOD
taste_description = "a bitter freshness"
glass_icon_state= "minted_fernet"
- glass_name = "glass of branca menta"
- glass_desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this
+ glass_name = "glass of Mirage"
+ glass_desc = "A glass of fernet and mint creme liquor, enjoyed on the warmer days on Teceti." //Get lazy literally by drinking this
/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M)
@@ -2014,7 +1960,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "auspicious occasions and bad decisions"
glass_icon_state = "champagne_glass"
glass_name = "Champagne"
- glass_desc = "The flute clearly displays the slowly rising bubbles."
+ glass_desc = "A sparkling wine, traditionally served in a flute that clearly displays the slowly rising bubbles."
/datum/reagent/consumable/ethanol/wizz_fizz
@@ -2023,7 +1969,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#4235d0" //Just pretend that the triple-sec was blue curacao.
boozepwr = 50
quality = DRINK_GOOD
- taste_description = "friendship! It is magic, after all"
+ taste_description = "whimsy and carbonation"
glass_icon_state = "wizz_fizz"
glass_name = "Wizz Fizz"
glass_desc = "The glass bubbles and froths with an almost magical intensity."
@@ -2037,48 +1983,36 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/bug_spray
- name = "Bug Spray"
+ name = "Stunball"
description = "A harsh, acrid, bitter drink, for those who need something to brace themselves."
color = "#33ff33"
boozepwr = 50
quality = DRINK_GOOD
- taste_description = "the pain of ten thousand slain mosquitos"
+ taste_description = "the distinct sense of drinking diluted poison"
glass_icon_state = "bug_spray"
- glass_name = "Bug Spray"
- glass_desc = "Your eyes begin to water as the sting of alcohol reaches them."
-
-/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
-//Bugs should not drink Bug spray.
- if(ismoth(M) || isflyperson(M) || isspiderperson(M))
- M.adjustToxLoss(1,0)
- return ..()
-/datum/reagent/consumable/ethanol/bug_spray/on_mob_metabolize(mob/living/carbon/M)
-
- if(ismoth(M) || isflyperson(M))
- M.emote("scream")
- return ..()
-
+ glass_name = "Stunball"
+ glass_desc = "Made in protest of the Mothball mixed drink being recognized by the Interstellar Bartenders Association, who refute the idea of a singular point of origin. The taste is as spiteful as its history."
/datum/reagent/consumable/ethanol/applejack
name = "Applejack"
- description = "The perfect beverage for when you feel the need to horse around."
+ description = "The officially sponsored drink by the National Association for Anti-Gravity Automobile Dragracing (NAAGAD)."
color = "#ff6633"
boozepwr = 20
- taste_description = "an honest day's work at the orchard"
+ taste_description = "resisting gravity through brandy"
glass_icon_state = "applejack_glass"
glass_name = "Applejack"
- glass_desc = "You feel like you could drink this all neight."
+ glass_desc = "You lament you can't watch any Agrav Races while out here."
/datum/reagent/consumable/ethanol/jack_rose
- name = "Jack Rose"
- description = "A light cocktail perfect for sipping with a slice of pie."
+ name = "Jackalope"
+ description = "A light cocktail named after a famous anti-gravity racer."
color = "#ff6633"
boozepwr = 15
quality = DRINK_NICE
taste_description = "a sweet and sour slice of apple"
glass_icon_state = "jack_rose"
- glass_name = "Jack Rose"
- glass_desc = "Enough of these, and you really will start to suppose your toeses are roses."
+ glass_name = "Jackalope"
+ glass_desc = "Enough of these, and you might feel like you're floating. Just don't think you can pilot!"
/datum/reagent/consumable/ethanol/turbo
name = "Turbo"
@@ -2089,11 +2023,11 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "the outlaw spirit"
glass_icon_state = "turbo"
glass_name = "Turbo"
- glass_desc = "A turbulent cocktail for outlaw hoverbikers."
+ glass_desc = "A turbulent cocktail for outlaw hoverbikers. Not officially recognized by National Association for Anti-Gravity Automobile Dragracing (NAAGAD)... but they're sticks in the mud, anyway!"
/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M)
if(prob(4))
- to_chat(M, "[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")
+ to_chat(M, "[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing...")]")
M.adjustStaminaLoss(-M.drunkenness * 0.25)
return ..()
@@ -2106,7 +2040,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "simpler times"
glass_icon_state = "old_timer"
glass_name = "Old Timer"
- glass_desc = "WARNING! May cause premature aging!"
+ glass_desc = "You might not be the target audience of this drink if you're still out in the Frontier, though."
/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M)
if(prob(20))
@@ -2119,9 +2053,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
N.update_hair()
if(N.age > N.dna.species.species_age_max * 0.8)
N.become_nearsighted(type)
- if(N.gender == MALE)
- N.facial_hairstyle = "Beard (Very Long)"
- N.update_hair()
if(N.age > N.dna.species.species_age_max * 1.2) //Best not let people get older than this or i might incur G-ds wrath
M.visible_message("[M] becomes older than any man should be.. and crumbles into dust!")
@@ -2135,42 +2066,42 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#ffe65b"
boozepwr = 60
quality = DRINK_GOOD
- taste_description = "artifical fruityness"
+ taste_description = "artifical fruitiness"
glass_icon_state = "rubberneck"
glass_name = "Rubberneck"
- glass_desc = "A popular drink amongst those adhering to an all synthetic diet."
+ glass_desc = "A popular drink amongst those adhering to an all-synthetic diet, popularized briefly as a counterculture movement."
/datum/reagent/consumable/ethanol/duplex
- name = "Duplex"
+ name = "North-South"
description = "An inseparable combination of two fruity drinks."
color = "#50e5cf"
boozepwr = 25
quality = DRINK_NICE
taste_description = "green apples and blue raspberries"
glass_icon_state = "duplex"
- glass_name = "Duplex"
- glass_desc = "To imbibe one component separately from the other is consider a great faux pas."
+ glass_name = "North-South"
+ glass_desc = "A fruity drink made, apparently, to represent North and South Teceti. You're supposed to hold it in a way that both vials pour together - one on top of the other."
/datum/reagent/consumable/ethanol/trappist
- name = "Trappist Beer"
- description = "A strong dark ale brewed by space-monks."
+ name = "Trapper's Beer"
+ description = "A strong dark ale brewed by the Saint Roumain Militia."
color = "#390c00"
boozepwr = 40
quality = DRINK_VERYGOOD
- taste_description = "dried plums and malt"
+ taste_description = "dried plums, ash, and malt"
glass_icon_state = "trappistglass"
- glass_name = "Trappist Beer"
- glass_desc = "boozy Catholicism in a glass."
+ glass_name = "Trapper's Beer"
+ glass_desc = "The Ashen Huntsman's blessings, in a glass. Despite proclaiming an ascetic lifestyle, it's okay to have a little fun once in a while."
/datum/reagent/consumable/ethanol/blazaam
- name = "Blazaam"
- description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover."
+ name = "Hyperspace Highball"
+ description = "A strange drink mixed with bluespace crystal flakes, which is already extremely expensive on its own merit."
boozepwr = 70
quality = DRINK_FANTASTIC
taste_description = "alternate realities"
glass_icon_state = "blazaamglass"
- glass_name = "Blazaam"
- glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover."
+ glass_name = "Hyperspace Highball"
+ glass_desc = "The glass is seemingly reacting with the bluespace flakes... maybe making this was a poor decision?"
var/stored_teleports = 0
/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M)
@@ -2185,15 +2116,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/mauna_loa
- name = "Mauna Loa"
+ name = "Inner Fire"
description = "Extremely hot; not for the faint of heart!"
boozepwr = 40
color = "#fe8308" // 254, 131, 8
quality = DRINK_FANTASTIC
taste_description = "fiery, with an aftertaste of burnt flesh"
glass_icon_state = "mauna_loa"
- glass_name = "Mauna Loa"
- glass_desc = "Lavaland in a drink... mug... volcano... thing."
+ glass_name = "Inner Fire"
+ glass_desc = "Not at all made by the Saint Roumain, this drink still bases itself as a test of will used by the hunters to test their endurance to intense heat... and alcohol."
/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/M)
// Heats the user up while the reagent is in the body. Occasionally makes you burst into flames.
@@ -2212,7 +2143,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sugary tartness"
glass_icon_state = "painkiller"
glass_name = "Painkiller"
- glass_desc = "A combination of tropical juices and rum. Surely this will make you feel better."
+ glass_desc = "A combination of tropical juices and rum. Surely, this will make you feel better."
/datum/reagent/consumable/ethanol/pina_colada
name = "Pina Colada"
@@ -2229,12 +2160,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/pruno // pruno mix is in drink_reagents
name = "pruno"
color = "#E78108"
- description = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done."
+ description = "Fermented prison wine made from fruit, sugar, and despair."
boozepwr = 85
- taste_description = "your tastebuds being individually shanked"
+ taste_description = "your tastebuds crying out"
glass_icon_state = "glass_orange"
glass_name = "glass of pruno"
- glass_desc = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done."
+ glass_desc = "Fermented prison wine made from fruit, sugar, and despair."
/datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/M)
M.adjust_disgust(5)
@@ -2249,7 +2180,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sweetness followed by a soft sourness and warmth"
glass_icon_state = "gingeramaretto"
glass_name = "Ginger Amaretto"
- glass_desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!"
+ glass_desc = "Technically intended to come with a sprig of rosemary... but where are you going to get your hands on that?"
/datum/reagent/consumable/ethanol/godfather
name = "Godfather"
@@ -2260,28 +2191,28 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a delightful softened punch"
glass_icon_state = "godfather"
glass_name = "Godfather"
- glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth."
+ glass_desc = "Technically still enjoyed by members of the Intersolar Mafia, though the homage is much older. Pray the orange peel doesn't end up in your mouth."
/datum/reagent/consumable/ethanol/godmother
name = "Godmother"
- description = "A twist on a classic, liked more by mature women."
+ description = "A twist on a classic, made as a sibling drink to the Godfather."
boozepwr = 50
color = "#E68F00"
quality = DRINK_GOOD
taste_description = "sweetness and a zesty twist"
glass_icon_state = "godmother"
glass_name = "Godmother"
- glass_desc = "A lovely fresh smelling cocktail, a true Sicilian delight."
+ glass_desc = "Just as enjoyed (and related to) the Intersolar Mafia. You're technically supposed to drink this alongside someone else having a Godfather."
/datum/reagent/consumable/ethanol/mudders_milk
- name = "mudder's milk"
+ name = "Miner's Milk"
color = "#dfc794"
- description = "All the protein, vitamins and carbs of your grandma's best turkey dinner, plus 15 percent alcohol."
+ description = "All the protein, vitamins and carbs of two full ration packs, plus 15% alcohol."
boozepwr = 15
- taste_description = "thick, nutty milk with a boozy kick"
+ taste_description = "thick, nut-flavored milk with a boozy kick"
glass_icon_state = "muddersmilk"
- glass_name = "Mudder's Milk"
- glass_desc = "All the protein, vitamins and carbs of your grandma's best turkey dinner, plus 15 percent alcohol."
+ glass_name = "Miner's Milk"
+ glass_desc = "All the protein, vitamins and carbs of two full ration packs, plus 15% alcohol. Created by Nanotrasen's Mining and Exploration League, and often still enjoyed in the New Gorlex Republic."
/datum/reagent/consumable/ethanol/mudders_milk/on_mob_life(mob/living/carbon/M)
if(prob(1))
@@ -2331,15 +2262,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/freezer_burn
- name = "Freezer Burn"
+ name = "Hullbreach"
description = "Fire and ice combine in your mouth! Drinking slowly recommended."
boozepwr = 40
color = "#ba3100"
quality = DRINK_FANTASTIC
- taste_description = "fire and ice"
+ taste_description = "frigid, hot stings"
glass_icon_state = "freezer_burn"
- glass_name = "Freezer Burn"
- glass_desc = "Fire and ice combine in your mouth! Drinking slowly recommended."
+ glass_name = "Hullbreach"
+ glass_desc = "Fire and ice combine in your mouth, like being pulled out into space."
/datum/reagent/consumable/ethanol/freezer_burn/on_mob_life(mob/living/carbon/M)
M.adjustFireLoss(-0.2, 0)
@@ -2367,14 +2298,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/darkest_chocolate
name = "Darkest Chocolate"
- description = "Darkness within darkness awaits you, spaceman!"
+ description = "Darkness within darkness awaits you, spacer!"
boozepwr = 40
color = "#240c0c"
quality = DRINK_FANTASTIC
taste_description = "bitter, chocolatey darkness with a note of cream"
glass_icon_state = "darkest_chocolate"
glass_name = "Darkest Chocolate"
- glass_desc = "Darkness within darkness awaits you, spaceman!"
+ glass_desc = "Darkness within darkness awaits you, spacer!"
var/obj/effect/light_holder
/datum/reagent/consumable/ethanol/darkest_chocolate/on_mob_metabolize(mob/living/M)
@@ -2393,28 +2324,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
to_chat(M, "The darkness subsides.")
QDEL_NULL(light_holder)
-/datum/reagent/consumable/ethanol/archmagus_brew
- name = "Archmagus' Brew"
- description = "Said to have been requested by a great Archmagus, hence the name. Tastes like tough love."
- boozepwr = 40
- color = "#c75295"
- quality = DRINK_FANTASTIC
- taste_description = "tough love"
- glass_icon_state = "archmagus_brew"
- glass_name = "Archmagus' Brew"
- glass_desc = "Said to have been requested by a great Archmagus, hence the name. Tastes like tough love."
-
-/datum/reagent/consumable/ethanol/archmagus_brew/on_mob_life(mob/living/carbon/human/M)
- if(M.mind && M.mind.spell_list.len != 0)
- var/spell_improved = FALSE
- for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
- if(S.clothes_req)
- S.clothes_req = 0
- spell_improved = TRUE
- if(spell_improved)
- to_chat(M, "You suddenly feel like you never needed those garish robes in the first place...")
- return ..()
-
/datum/reagent/consumable/ethanol/out_of_lime
name = "Out of Lime"
description = "A spin on the classic. Artists and street fighters swear by this stuff."
@@ -2433,22 +2342,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
consumer.facial_hair_color = pick("0ad","a0f","f73","d14","0b5","fc2","084","05e","d22","fa0")
consumer.update_hair()
-/datum/reagent/consumable/ethanol/cogchamp
- name = "CogChamp"
- description = "Now you can fill yourself with the power of Ratvar!"
- color = rgb(255, 201, 49)
- boozepwr = 10
- quality = DRINK_FANTASTIC
- taste_description = "a brass taste with a hint of oil"
- glass_icon_state = "cogchamp"
- glass_name = "CogChamp"
- glass_desc = "Not one of Ratvar's Four Generals could withstand this! Qevax Jryy!"
-
-/datum/reagent/consumable/ethanol/cogchamp/on_mob_life(mob/living/carbon/M)
- M.clockcultslurring = min(M.clockcultslurring + 3, 3)
- M.stuttering = min(M.stuttering + 3, 3)
- ..()
-
/datum/reagent/consumable/ethanol/shotinthedark
name = "Shot in the Dark"
description = "A coconut elixir with a golden tinge."
@@ -2458,7 +2351,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "an incoming bullet"
glass_icon_state = "shotinthedark"
glass_name = "Shot in the Dark"
- glass_desc = "A specially made drink from the popular webseries RILENA: LMR. Contains traces of gold from the real bullet inside."
+ glass_desc = "A specially made drink from the popular webseries RILENA: LMR. Contains traces of gold from the real bullet inside... which wouldn't make sense outside of the series it comes from."
/datum/reagent/consumable/ethanol/bullethell
name = "Bullet Hell"
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index d359600b0102..8cb74f4ad51e 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -11,7 +11,7 @@
taste_description = "oranges"
glass_icon_state = "glass_orange"
glass_name = "glass of orange juice"
- glass_desc = "Vitamins! Yay!"
+ glass_desc = "Tart and sweet. It might have pulp, if that's what you wanted."
/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/M)
if(M.getOxyLoss() && prob(30))
@@ -26,7 +26,7 @@
taste_description = "tomatoes"
glass_icon_state = "glass_red"
glass_name = "glass of tomato juice"
- glass_desc = "Are you sure this is tomato juice?"
+ glass_desc = "Some part of you wonders if this could have been a soup at some point."
/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/M)
if(M.getFireLoss() && prob(20))
@@ -41,7 +41,7 @@
taste_description = "unbearable sourness"
glass_icon_state = "glass_green"
glass_name = "glass of lime juice"
- glass_desc = "A glass of sweet-sour lime juice."
+ glass_desc = "A glass of intensely sour lime juice. You wonder to yourself: how much do you really need to ward off scurvy for it to come to the point?"
/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M)
if(M.getToxLoss() && prob(20))
@@ -56,7 +56,7 @@
taste_description = "carrots"
glass_icon_state = "carrotjuice"
glass_name = "glass of carrot juice"
- glass_desc = "It's just like a carrot but without crunching."
+ glass_desc = "Mildly sweet, but it won't actually improve your eyesight all that much beyond the baseline..."
/datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/M)
M.adjust_blurriness(-1)
@@ -77,7 +77,7 @@
taste_description = "berries"
glass_icon_state = "berryjuice"
glass_name = "glass of berry juice"
- glass_desc = "Berry juice. Or maybe it's jam. Who cares?"
+ glass_desc = "Berry juice. Technically a fruit punch all on its own!"
/datum/reagent/consumable/applejuice
name = "Apple Juice"
@@ -92,7 +92,7 @@
taste_description = "berries"
glass_icon_state = "poisonberryjuice"
glass_name = "glass of berry juice"
- glass_desc = "Berry juice. Or maybe it's poison. Who cares?"
+ glass_desc = "Berry juice. Technically a fruit punch all on its own!"
/datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(1, 0)
@@ -106,7 +106,7 @@
taste_description = "juicy watermelon"
glass_icon_state = "glass_red"
glass_name = "glass of watermelon juice"
- glass_desc = "A glass of watermelon juice."
+ glass_desc = "A glass of watermelon juice. Mild and sweet."
/datum/reagent/consumable/lemonjuice
name = "Lemon Juice"
@@ -115,16 +115,16 @@
taste_description = "sourness"
glass_icon_state = "lemonglass"
glass_name = "glass of lemon juice"
- glass_desc = "Sour..."
+ glass_desc = "A glass of intensely sour lime juice. You wonder to yourself: how much do you really need to ward off scurvy for it to come to the point?"
/datum/reagent/consumable/banana
name = "Banana Juice"
- description = "The raw essence of a banana. HONK"
+ description = "The raw essence of a banana."
color = "#e6d283"
taste_description = "banana"
glass_icon_state = "banana"
glass_name = "glass of banana juice"
- glass_desc = "The raw essence of a banana. HONK."
+ glass_desc = "While staring down at this glass, some part of you wonders what went through the minds of those who decided to add this to milk."
/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -179,25 +179,25 @@
description = "Juice of the potato. Bleh."
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#9e8045" // rgb: 48, 32, 0
- taste_description = "irish sadness"
+ taste_description = "starchy water"
glass_icon_state = "glass_brown"
glass_name = "glass of potato juice"
- glass_desc = "Bleh..."
+ glass_desc = "Starchy. It coats your mouth with a filament afterwards, which really isn't helping it's case."
/datum/reagent/consumable/grapejuice
name = "Grape Juice"
description = "The juice of a bunch of grapes. Guaranteed non-alcoholic."
color = "#790b79" // dark purple
- taste_description = "grape soda"
+ taste_description = "grapes"
/datum/reagent/consumable/milk
name = "Milk"
- description = "An opaque white liquid produced by the mammary glands of mammals."
+ description = "An opaque white liquid produced by the mammary glands of mammals, some arthropods, biogenerators, chemical factories..."
color = "#DFDFDF" // rgb: 223, 223, 223
taste_description = "milk"
glass_icon_state = "glass_white"
glass_name = "glass of milk"
- glass_desc = "White and nutritious goodness!"
+ glass_desc = "A glass of frothy milk. You wonder what animal this could have come from, if at all."
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -214,7 +214,7 @@
taste_description = "soy milk"
glass_icon_state = "glass_white"
glass_name = "glass of soy milk"
- glass_desc = "White and nutritious soy goodness!"
+ glass_desc = "Despite being made from soybeans, it sates the same desire to have an entire glass of milk."
/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -224,12 +224,12 @@
/datum/reagent/consumable/cream
name = "Cream"
- description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
+ description = "The fatty, still liquid part of milk."
color = "#DFD7AF" // rgb: 223, 215, 175
taste_description = "creamy milk"
glass_icon_state = "glass_white"
glass_name = "glass of cream"
- glass_desc = "Ewwww..."
+ glass_desc = "It's a bit thick to drink straight."
/datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -246,7 +246,7 @@
taste_description = "bitterness"
glass_icon_state = "glass_brown"
glass_name = "glass of coffee"
- glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
+ glass_desc = "Black coffee, served straight. It'll be pretty bitter without anything else in it!"
/datum/reagent/consumable/coffee/overdose_process(mob/living/M)
M.Jitter(5)
@@ -265,13 +265,13 @@
/datum/reagent/consumable/tea
name = "Tea"
- description = "Tasty black tea, it has antioxidants, it's good for you!"
+ description = "Warm, dark tea."
color = "#5f4a05"
nutriment_factor = 0
- taste_description = "tart black tea"
+ taste_description = "tart dark tea"
glass_icon_state = "teaglass"
glass_name = "glass of tea"
- glass_desc = "Drinking it from here would not seem right."
+ glass_desc = "There's a latent desire to drink this out of a teacup, but there's no time for teatime out here."
/datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -289,25 +289,25 @@
description = "Sweet, tangy lemonade. Good for the soul."
color = "#FFE978"
quality = DRINK_NICE
- taste_description = "sunshine and summertime"
+ taste_description = "sunshine and distant shores"
glass_icon_state = "lemonpitcher"
glass_name = "pitcher of lemonade"
- glass_desc = "This drink leaves you feeling nostalgic for some reason."
+ glass_desc = "Sweet, slightly tart, and refreshing. You feel some misplaced nostalgia when you have this, even though you're not sure you've ever squeezed a lemon before."
/datum/reagent/consumable/tea/arnold_palmer
name = "Arnold Palmer"
- description = "Encourages the patient to go golfing."
+ description = "Iced sweet tea and lemonade."
color = "#FFB766"
quality = DRINK_NICE
nutriment_factor = 2
taste_description = "bitter tea"
glass_icon_state = "arnold_palmer"
glass_name = "Arnold Palmer"
- glass_desc = "You feel like taking a few golf swings after a few swigs of this."
+ glass_desc = "Iced tea and lemonade. You don't think you know any Arnolds, though."
/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M)
if(prob(5))
- to_chat(M, "[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game.")]")
+ to_chat(M, "[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game... whatever that is.")]")
..()
. = 1
@@ -319,7 +319,7 @@
taste_description = "bitter coldness"
glass_icon_state = "icedcoffeeglass"
glass_name = "iced coffee"
- glass_desc = "A drink to perk you up and refresh you!"
+ glass_desc = "Iced black coffee. It's still going to be pretty bitter on it's own, though!"
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -339,7 +339,7 @@
taste_description = "bitter coldness and a hint of smoke"
glass_icon_state = "hoticecoffee"
glass_name = "hot ice coffee"
- glass_desc = "A sharp drink, this can't have come cheap."
+ glass_desc = "The wonders of fusion mixed into a cup of coffee, resulting in an extremely hot-cold drink."
/datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -353,13 +353,13 @@
/datum/reagent/consumable/icetea
name = "Iced Tea"
- description = "No relation to a certain rap artist/actor."
+ description = "Iced, sweetened tea."
color = "#104038" // rgb: 16, 64, 56
nutriment_factor = 0
taste_description = "sweet tea"
glass_icon_state = "icedteaglass"
glass_name = "iced tea"
- glass_desc = "All natural, antioxidant-rich flavour sensation."
+ glass_desc = "A much more appealing way to have tea while dealing with the heat."
/datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -377,61 +377,33 @@
color = "#743c05" // rgb: 16, 8, 0
taste_description = "cola"
glass_icon_state = "glass_brown"
- glass_name = "glass of Space Cola"
- glass_desc = "A glass of refreshing Space Cola."
+ glass_name = "glass of cola"
+ glass_desc = "A carbonated cola. You should drink it before it gets flat!"
/datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-5)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/nuka_cola
- name = "Nuka Cola"
- description = "Cola, cola never changes."
- color = "#3b6c0e" // rgb: 16, 8, 0
- quality = DRINK_VERYGOOD
- taste_description = "the future"
- glass_icon_state = "nuka_colaglass"
- glass_name = "glass of Nuka Cola"
- glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
-
-/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L)
- ..()
- L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola)
-
-/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola)
- ..()
-
-/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
- M.Jitter(20)
- M.set_drugginess(30)
- M.dizziness +=1.5
- M.drowsyness = 0
- M.AdjustSleeping(-40)
- M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
- ..()
- . = 1
-
-/datum/reagent/consumable/grey_bull
- name = "Grey Bull"
- description = "Grey Bull, it gives you gloves!"
+/datum/reagent/consumable/crosstalk
+ name = "Crosstalk"
+ description = "Crosstalk! Share the energy with everyone!"
color = "#EEFF00" // rgb: 238, 255, 0
quality = DRINK_VERYGOOD
- taste_description = "carbonated oil"
- glass_icon_state = "grey_bull_glass"
- glass_name = "glass of Grey Bull"
- glass_desc = "Surprisingly it isnt grey."
+ taste_description = "carbonated battery acid with a spoonful of sugar"
+ glass_icon_state = "crosstalk_glass"
+ glass_name = "glass of Crosstalk"
+ glass_desc = "The amount of sugar and chemicals in this drink makes your eyes water."
-/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L)
+/datum/reagent/consumable/crosstalk/on_mob_metabolize(mob/living/L)
..()
ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, type)
-/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/L)
+/datum/reagent/consumable/crosstalk/on_mob_end_metabolize(mob/living/L)
REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, type)
..()
-/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/crosstalk/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
M.dizziness +=1
M.drowsyness = 0
@@ -439,16 +411,16 @@
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/spacemountainwind
- name = "SM Wind"
- description = "Blows right through you like a space wind."
+/datum/reagent/consumable/comet_trail
+ name = "Comet Trail"
+ description = "A citrusy drink from the Kepori space installation known as The Ring."
color = "#c4ff2d" // rgb: 16, 32, 0
taste_description = "sweet citrus soda"
- glass_icon_state = "Space_mountain_wind_glass"
- glass_name = "glass of Space Mountain Wind"
- glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
+ glass_icon_state = "Comet_trail_glass"
+ glass_name = "glass of Comet Trail"
+ glass_desc = "A glass of Comet Trail. Taste the stars!"
-/datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/comet_trail/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-7)
M.AdjustSleeping(-20)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -456,16 +428,16 @@
..()
. = 1
-/datum/reagent/consumable/dr_gibb
- name = "Dr. Gibb"
- description = "A delicious blend of 42 different flavours."
+/datum/reagent/consumable/tadrixx
+ name = "Tadrixx"
+ description = "A Kalixcian drink made from a plant that tastes similar to sassafrass, which is used in root beer. A stumpy drake holding a mug of it is on the front."
color = "#732a03"
- taste_description = "cherry soda" // FALSE ADVERTISING
- glass_icon_state = "dr_gibb_glass"
- glass_name = "glass of Dr. Gibb"
- glass_desc = "Dr. Gibb. Not as dangerous as the glass_name might imply."
+ taste_description = "root beer" // FALSE ADVERTISING
+ glass_icon_state = "tadrixx_glass"
+ glass_name = "glass of Tadrixx"
+ glass_desc = "A cup of fizzy Tadrixx. It smells sweet."
-/datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/tadrixx/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-6)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
@@ -484,6 +456,38 @@
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
+/datum/reagent/consumable/molten
+ name = "Molten Bubbles"
+ description = "A spicy soft drink made from a coca-like plant from Kalixcis. Popularly served both cold -and- hot, depending on the weather."
+ color = "#5f2010"
+ taste_description = "spiced cola"
+ glass_icon_state = "molten_glass"
+ glass_name = "glass of Molten Bubbles"
+ glass_desc = "A glass of Molten Bubbles. The spices tickle your nose."
+
+/datum/reagent/consumable/molten/on_mob_life(mob/living/carbon/M)
+ M.heal_bodypart_damage(1,1,0)
+ if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE))
+ M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE))
+ else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1))
+ M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE))
+ ..()
+
+/datum/reagent/consumable/molten/plasma_fizz
+ name = "Plasma Fizz"
+ description = "A spinoff of the popular Molten Bubbles drink from Kalixcis, made to emulate the flavor of spiced grape instead. It's... not exactly convincing or a very good mix."
+ color = "#5f2010"
+ taste_description = "spiced grape soda"
+ glass_icon_state = "plasma_fizz_glass"
+ glass_name = "glass of Plasma Fizz"
+ glass_desc = "A glass of Plasma Fizz. The spices (and fake grape flavoring) wrinkles your nose."
+
+/datum/reagent/consumable/molten/sand
+ name = "Sandblast Sarsaparilla"
+ description = "Extra refreshing for those long desert days."
+ color = "#af9938"
+ taste_description = "root-beer and asbestos"
+
/datum/reagent/consumable/lemon_lime
name = "Lemon Lime"
description = "A tangy substance made of 0.5% natural citrus!"
@@ -499,48 +503,48 @@
..()
-/datum/reagent/consumable/pwr_game
- name = "Pwr Game"
- description = "The only drink with the PWR that true gamers crave."
+/datum/reagent/consumable/pacfuel
+ name = "PAC-Fuel"
+ description = "A carbonated energy drink themed after the purple coloration, similar to plasma."
color = "#9385bf" // rgb: 58, 52, 75
taste_description = "sweet and salty tang"
glass_icon_state = "glass_red"
- glass_name = "glass of Pwr Game"
- glass_desc = "Goes well with a Vlad's salad."
+ glass_name = "glass of PAC-Fuel"
+ glass_desc = "A glass of PAC-Fuel energy drink. It smells vaguely like acidic cotton candy..."
-/datum/reagent/consumable/pwr_game/expose_mob(mob/living/C, method=TOUCH, reac_volume)
+/datum/reagent/consumable/pacfuel/expose_mob(mob/living/C, method=TOUCH, reac_volume)
..()
if(C?.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && method==INGEST && !HAS_TRAIT(C, TRAIT_GAMERGOD))
ADD_TRAIT(C, TRAIT_GAMERGOD, "pwr_game")
- to_chat(C, "As you imbibe the Pwr Game, your gamer third eye opens... \
+ to_chat(C, "As you imbibe the PAC-Fuel, your gamer third eye opens... \
You feel as though a great secret of the universe has been made known to you...")
-/datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/pacfuel/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
if(prob(10))
M?.mind.adjust_experience(/datum/skill/gaming, 5)
..()
-/datum/reagent/consumable/shamblers
- name = "Shambler's Juice"
- description = "~Shake me up some of that Shambler's Juice!~"
+/datum/reagent/consumable/shoal_punch
+ name = "Shoal Punch"
+ description = "Sugary, and from the Shoal."
color = "#f00060" // rgb: 94, 0, 38
- taste_description = "carbonated metallic soda"
+ taste_description = "sugary fruity soda"
glass_icon_state = "glass_red"
- glass_name = "glass of Shambler's juice"
- glass_desc = "Mmm mm, shambly."
+ glass_name = "glass of Shoal Punch"
+ glass_desc = "It's hard to imagine all those fruits getting condensed into a cup like this."
-/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/shoal_punch/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
/datum/reagent/consumable/sodawater
name = "Soda Water"
- description = "A can of club soda. Why not make a scotch and soda?"
+ description = "A can of club soda."
color = "#619494" // rgb: 97, 148, 148
taste_description = "carbonated water"
glass_icon_state = "glass_clear"
glass_name = "glass of soda water"
- glass_desc = "Soda water. Why not make a scotch and soda?"
+ glass_desc = "Soda water. You feel like you should add something to this..."
/datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -550,12 +554,12 @@
/datum/reagent/consumable/tonic
name = "Tonic Water"
- description = "It tastes strange but at least the quinine keeps the Space Malaria at bay."
+ description = "It tastes strange, and it's not like malaria is much of an issue anymore."
color = "#709fce"
taste_description = "tart and fresh"
glass_icon_state = "glass_clear"
glass_name = "glass of tonic water"
- glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
+ glass_desc = "Quinine and carbonated water. You really should add something to this..."
/datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -565,17 +569,17 @@
..()
. = 1
-/datum/reagent/consumable/monkey_energy
- name = "Monkey Energy"
- description = "The only drink that will make you unleash the ape."
- color = "#f39b03" // rgb: 243, 155, 3
+/datum/reagent/consumable/xeno_energy
+ name = "Xeno-Energy"
+ description = "An unbearably sugary, fizzy green drink."
+ color = "#88b488" // rgb: 243, 155, 3
overdose_threshold = 60
- taste_description = "barbecue and nostalgia"
- glass_icon_state = "monkey_energy_glass"
- glass_name = "glass of Monkey Energy"
- glass_desc = "You can unleash the ape, but without the pop of the can?"
+ taste_description = "tooth-rotting sweetness"
+ glass_icon_state = "xeno_energy_glass"
+ glass_name = "glass of Xeno Energy"
+ glass_desc = "A glass of Xeno Energy. It seems to swirl and roil outside of the can..."
-/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/xeno_energy/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
M.dizziness +=1
M.drowsyness = 0
@@ -583,18 +587,13 @@
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/L)
+/datum/reagent/consumable/xeno_energy/on_mob_metabolize(mob/living/L)
..()
if(ismonkey(L))
- L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy)
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/xeno_energy)
-/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy)
- ..()
-
-/datum/reagent/consumable/monkey_energy/overdose_process(mob/living/M)
- if(prob(15))
- M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy)
+/datum/reagent/consumable/xeno_energy/on_mob_end_metabolize(mob/living/L)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/xeno_energy)
..()
/datum/reagent/consumable/ice
@@ -605,7 +604,7 @@
taste_description = "ice"
glass_icon_state = "iceglass"
glass_name = "glass of ice"
- glass_desc = "Generally, you're supposed to put something else in there too..."
+ glass_desc = "Generally, you're supposed to put something else in there, too..."
/datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -613,13 +612,13 @@
/datum/reagent/consumable/soy_latte
name = "Soy Latte"
- description = "A nice and tasty beverage while you are reading your hippie books."
+ description = "A hot beverage for those who can't handle the lactose."
color = "#664300" // rgb: 102, 67, 0
quality = DRINK_NICE
taste_description = "creamy coffee"
glass_icon_state = "soy_latte"
glass_name = "soy latte"
- glass_desc = "A nice and refreshing beverage while you're reading."
+ glass_desc = "A nice and refreshing beverage. It goes well with a book, if you have the time to read."
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -640,7 +639,7 @@
taste_description = "bitter cream"
glass_icon_state = "cafe_latte"
glass_name = "cafe latte"
- glass_desc = "A nice, strong and refreshing beverage while you're reading."
+ glass_desc = "A nice, strong and refreshing beverage. It goes well with a book, if you have the time to read."
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -655,13 +654,13 @@
/datum/reagent/consumable/doctor_delight
name = "The Doctor's Delight"
- description = "A gulp a day keeps the Medibot away! A mixture of juices that heals most damage types fairly quickly at the cost of hunger."
+ description = "A homemade curative. A mixture of juices that helps your body heal against most damage, at the cost of leaving you hungry."
color = "#FF8CFF" // rgb: 255, 140, 255
quality = DRINK_VERYGOOD
taste_description = "homely fruit"
glass_icon_state = "doctorsdelightglass"
glass_name = "Doctor's Delight"
- glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger."
+ glass_desc = "A homemade curative. Helps the body heal with the nutrition density, but it leaves a gnawing hunger afterwards."
/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-0.5, 0)
@@ -683,7 +682,7 @@
taste_description = "sweet chocolate"
glass_icon_state = "chocolatepudding"
glass_name = "chocolate pudding"
- glass_desc = "Tasty."
+ glass_desc = "Thick, sweet, and chocolatey."
/datum/reagent/consumable/vanillapudding
name = "Vanilla Pudding"
@@ -694,7 +693,7 @@
taste_description = "sweet vanilla"
glass_icon_state = "vanillapudding"
glass_name = "vanilla pudding"
- glass_desc = "Tasty."
+ glass_desc = "Thick, sweet, and pleasantly vanilla."
/datum/reagent/consumable/cherryshake
name = "Cherry Shake"
@@ -705,7 +704,7 @@
taste_description = "creamy cherry"
glass_icon_state = "cherryshake"
glass_name = "cherry shake"
- glass_desc = "A cherry flavored milkshake."
+ glass_desc = "A cherry flavored milkshake. Don't get any on your jumpsuit!"
/datum/reagent/consumable/bluecherryshake
name = "Blue Cherry Shake"
@@ -716,33 +715,33 @@
taste_description = "creamy blue cherry"
glass_icon_state = "bluecherryshake"
glass_name = "blue cherry shake"
- glass_desc = "An exotic blue milkshake."
+ glass_desc = "A blue-cherry milkshake. Generally, the blue is meant to be figurative, but..."
/datum/reagent/consumable/pumpkin_latte
name = "Pumpkin Latte"
- description = "A mix of pumpkin juice and coffee."
+ description = "A mix of spices and coffee. It doesn't actually contain any pumpkin, though."
color = "#F4A460"
quality = DRINK_VERYGOOD
nutriment_factor = 3 * REAGENTS_METABOLISM
taste_description = "creamy pumpkin"
glass_icon_state = "pumpkin_latte"
glass_name = "pumpkin latte"
- glass_desc = "A mix of coffee and pumpkin juice."
+ glass_desc = "A mix of coffee and pumpkin juice would taste a whole lot different than what you're having right now, you know."
-/datum/reagent/consumable/gibbfloats
- name = "Gibb Floats"
- description = "Ice cream on top of a Dr. Gibb glass."
- color = "#B22222"
+/datum/reagent/consumable/tadrixxfloat
+ name = "Tadrixx Float"
+ description = "Ice cream on top of a glass of Tadrixx."
+ color = "#533713"
quality = DRINK_NICE
nutriment_factor = 3 * REAGENTS_METABOLISM
- taste_description = "creamy cherry"
- glass_icon_state = "gibbfloats"
- glass_name = "Gibbfloat"
- glass_desc = "Dr. Gibb with ice cream on top."
+ taste_description = "creamy root beer"
+ glass_icon_state = "tadrixxfloat"
+ glass_name = "Tadrixxfloat"
+ glass_desc = "A glass of Tadrixx with ice cream on top."
/datum/reagent/consumable/pumpkinjuice
name = "Pumpkin Juice"
- description = "Juiced from real pumpkin."
+ description = "Juiced from real pumpkins."
color = "#FFA500"
taste_description = "pumpkin"
@@ -757,18 +756,18 @@
description = "A solution."
color = "#EEFF00"
quality = DRINK_NICE
- taste_description = "extreme bitterness"
+ taste_description = "extreme sourness"
glass_icon_state = "triplecitrus" //needs own sprite mine are trash //your sprite is great tho
glass_name = "glass of triple citrus"
- glass_desc = "A mixture of citrus juices. Tangy, yet smooth."
+ glass_desc = "A mixture of citrus juices. Intensely sour, and leaves you reeling afterwards."
/datum/reagent/consumable/grape_soda
name = "Grape soda"
- description = "Beloved by children and teetotalers."
+ description = "Artificial grape soda."
color = "#E6CDFF"
taste_description = "grape soda"
glass_name = "glass of grape juice"
- glass_desc = "It's grape (soda)!"
+ glass_desc = "It's grape soda!"
/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -776,20 +775,28 @@
/datum/reagent/consumable/milk/chocolate_milk
name = "Chocolate Milk"
- description = "Milk for cool kids."
+ description = "Milk mixed with chocolate powder. Beloved by children everywhere."
color = "#7D4E29"
quality = DRINK_NICE
taste_description = "chocolate milk"
+/datum/reagent/consumable/lunapunch
+ name = "Lunapunch"
+ description = "An herbal-sweet carbonated drink with a bitter bite."
+ color = "#7D4E29"
+ quality = DRINK_NICE
+ taste_description = "sweet herbs and lingering bitterness"
+ glass_name = "glass of Lunapunch"
+ glass_desc = "An herbal-sweet soft drink. The bitter bite after each sip is enough to make you wince, but leaves you wanting more."
/datum/reagent/consumable/hot_coco
- name = "Hot Coco"
- description = "Made with love! And coco beans."
+ name = "Hot Cocoa"
+ description = "Made with love and cocoa beans. Or from a vending machine."
nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#4f3a11" // rgb: 64, 48, 16
taste_description = "creamy chocolate"
glass_icon_state = "chocolateglass"
- glass_name = "glass of hot coco"
- glass_desc = "A favorite winter drink to warm you up."
+ glass_name = "glass of hot cocoa."
+ glass_desc = "A favorite winter drink from the Solar Confederation. Good for warming yourself up."
/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal())
@@ -810,7 +817,7 @@
taste_description = "mint"
glass_icon_state = "glass_green"
glass_name = "glass of menthol"
- glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
+ glass_desc = "Tastes naturally and sharply minty, with a mild numbing sensation."
/datum/reagent/consumable/menthol/on_mob_life(mob/living/L)
L.apply_status_effect(/datum/status_effect/throat_soothed)
@@ -818,26 +825,27 @@
/datum/reagent/consumable/grenadine
name = "Grenadine"
- description = "Not cherry flavored!"
+ description = "More blackcurrant than cherry, actually."
color = "#EA1D26"
taste_description = "sweet pomegranates"
glass_name = "glass of grenadine"
- glass_desc = "Delicious flavored syrup."
+ glass_desc = "Flavored syrup, traditionally used for mixing drinks. Having it straight is certainly a choice."
/datum/reagent/consumable/parsnipjuice
name = "Parsnip Juice"
- description = "Why..."
+ description = "Starchy and uncommon."
color = "#FFA500"
taste_description = "parsnip"
glass_name = "glass of parsnip juice"
+ glass_desc = "It doesn't really count as a soup this way. Maybe it'd better if it was a soup."
/datum/reagent/consumable/pineapplejuice
name = "Pineapple Juice"
- description = "Tart, tropical, and hotly debated."
+ description = "Tart, tropical, and sweet."
color = "#F7D435"
taste_description = "pineapple"
glass_name = "glass of pineapple juice"
- glass_desc = "Tart, tropical, and hotly debated."
+ glass_desc = "Tart, tropical, and sweet."
/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
name = "Peach Juice"
@@ -845,16 +853,17 @@
color = "#E78108"
taste_description = "peaches"
glass_name = "glass of peach juice"
+ glass_desc = "A glass full of sweet peach juice. Strange, you don't often see it out this far into the Frontier..."
/datum/reagent/consumable/cream_soda
name = "Cream Soda"
- description = "A classic space-American vanilla flavored soft drink."
+ description = "A classic vanilla flavored soft drink."
color = "#dcb137"
quality = DRINK_VERYGOOD
taste_description = "fizzy vanilla"
glass_icon_state = "cream_soda"
glass_name = "Cream Soda"
- glass_desc = "A classic space-American vanilla flavored soft drink."
+ glass_desc = "A classic vanilla flavored soft drink."
/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -867,7 +876,7 @@
quality = DRINK_NICE
taste_description = "sweet ginger spice"
glass_name = "Sol Dry"
- glass_desc = "A soothing, mellow drink made from ginger."
+ glass_desc = "A soothing, mellow drink made from ginger. You can't imagine drinking a carbonated drink while in microgravity, though, nausea or not..."
/datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/M)
M.adjust_disgust(-5)
@@ -875,13 +884,13 @@
/datum/reagent/consumable/red_queen
name = "Red Queen"
- description = "DRINK ME."
+ description = "You feel inclined to drink it, somehow."
color = "#e6ddc3"
quality = DRINK_GOOD
taste_description = "wonder"
glass_icon_state = "red_queen"
glass_name = "Red Queen"
- glass_desc = "DRINK ME."
+ glass_desc = "A cup of red tea. A small note is tied around the handle of it, which asks you to drink it."
var/current_size = RESIZE_DEFAULT_SIZE
/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H)
@@ -905,11 +914,11 @@
/datum/reagent/consumable/bungojuice
name = "Bungo Juice"
color = "#F9E43D"
- description = "Exotic! You feel like you are on vactation already."
+ description = "A botanical experiment gone right."
taste_description = "succulent bungo"
glass_icon_state = "glass_yellow"
glass_name = "glass of bungo juice"
- glass_desc = "Exotic! You feel like you are on vactation already."
+ glass_desc = "A botanical experiment in creating a new fruit. It smells faintly citrusy, along with a hint of... banana?"
/datum/reagent/consumable/prunomix
name = "pruno mixture"
@@ -927,7 +936,7 @@
taste_description = "vegetable"
glass_icon_state = "glass_yellow"
glass_name = "glass of aloe juice"
- glass_desc = "A healthy and refreshing juice."
+ glass_desc = "Juiced aloe vera. It's an acquired taste."
/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/M)
if(M.getToxLoss() && prob(30))
@@ -943,7 +952,7 @@
taste_description = "purple and a hint of opioid."
glass_icon_state = "lean"
glass_name = "Lean"
- glass_desc = "A drink that makes your life less miserable."
+ glass_desc = "You just don't often get to see cough syrup out here, and someone had enough to mix it with soda. You're left wondering why."
/datum/reagent/consumable/lean/on_mob_life(mob/living/carbon/M)
if(M.slurring < 3)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 4c4ad36b2413..6084311b3507 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -2113,30 +2113,3 @@
ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
..()
-
-/datum/reagent/medicine/molten_bubbles
- name = "Molten Bubbles"
- description = "Refreshing softdrink made for the desert."
- color = "#3d1916"
- metabolization_rate = REAGENTS_METABOLISM
- taste_description = "boiling sugar"
-
-/datum/reagent/medicine/molten_bubbles/on_mob_life(mob/living/carbon/M)
- M.heal_bodypart_damage(1,1,0)
- if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE))
- M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE))
- else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1))
- M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE))
- ..()
-
-/datum/reagent/medicine/molten_bubbles/plasma
- name = "Plasma Bubbles"
- description = "Molten Bubbles with the refreshing taste of plasma."
- color = "#852e63"
- taste_description = "grape flavored cleaning solution"
-
-/datum/reagent/medicine/molten_bubbles/sand
- name = "Sandblast Sarsaparilla"
- description = "Extra refreshing for those long desert days."
- color = "#af9938"
- taste_description = "root-beer and asbestos"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 02d8850f8776..9b6243358acb 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -2048,18 +2048,6 @@
to_chat(M, "You should sit down and take a rest...")
..()
-/datum/reagent/tranquility
- name = "Tranquility"
- description = "A highly mutative liquid of unknown origin."
- color = "#9A6750" //RGB: 154, 103, 80
- taste_description = "inner peace"
- can_synth = FALSE
-
-/datum/reagent/tranquility/expose_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
- if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- L.ForceContractDisease(new /datum/disease/transformation/gondola(), FALSE, TRUE)
-
-
/datum/reagent/spider_extract
name = "Spider Extract"
description = "A highly specialized extract coming from the Australicus sector, used to create broodmother spiders."
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 302d05f0712b..2397d67a1d2c 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -325,18 +325,3 @@ WS End */
/datum/chemical_reaction/chartreuse
results = list(/datum/reagent/medicine/chartreuse = 10)
required_reagents = list(/datum/reagent/medicine/puce_essence = 5, /datum/reagent/consumable/tinlux = 5, /datum/reagent/consumable/entpoly = 1)
-
-/datum/chemical_reaction/molten_bubbles
- results = list(/datum/reagent/medicine/molten_bubbles = 30)
- required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/lavaland_extract = 1)
-
-/datum/chemical_reaction/plasma_bubbles
- results = list(/datum/reagent/medicine/molten_bubbles/plasma = 3)
- required_reagents = list(/datum/reagent/medicine/molten_bubbles = 3, /datum/reagent/toxin/plasma = 2)
-
-/datum/chemical_reaction/sand_bubbles
- results = list(/datum/reagent/medicine/molten_bubbles/sand = 3)
- required_reagents = list(/datum/reagent/medicine/molten_bubbles = 3, /datum/reagent/silicon = 2)
-
-/datum/chemical_reaction/sand_bubbles/plasma // Subbing plasma bubbles for reg
- required_reagents = list(/datum/reagent/medicine/molten_bubbles/plasma = 3, /datum/reagent/silicon = 2)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index ee288feb0bac..149743c47e3c 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -184,12 +184,12 @@ Borg Shaker
accepts_reagent_upgrades = FALSE
reagent_ids = list(/datum/reagent/consumable/applejuice, /datum/reagent/consumable/banana, /datum/reagent/consumable/coffee,
- /datum/reagent/consumable/cream, /datum/reagent/consumable/dr_gibb, /datum/reagent/consumable/grenadine,
+ /datum/reagent/consumable/cream, /datum/reagent/consumable/tadrixx, /datum/reagent/consumable/grenadine,
/datum/reagent/consumable/ice, /datum/reagent/consumable/lemonjuice, /datum/reagent/consumable/lemon_lime,
/datum/reagent/consumable/limejuice, /datum/reagent/consumable/menthol, /datum/reagent/consumable/milk,
/datum/reagent/consumable/nothing, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/peachjuice,
- /datum/reagent/consumable/sodawater, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/spacemountainwind,
- /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers, /datum/reagent/consumable/soymilk,
+ /datum/reagent/consumable/sodawater, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/comet_trail,
+ /datum/reagent/consumable/pacfuel, /datum/reagent/consumable/shoal_punch, /datum/reagent/consumable/soymilk,
/datum/reagent/consumable/space_up, /datum/reagent/consumable/sugar, /datum/reagent/consumable/tea,
/datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/tonic, /datum/reagent/water,
/datum/reagent/consumable/pineapplejuice, /datum/reagent/consumable/sol_dry,
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 58e46dcb1048..62661594c06e 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -40,7 +40,7 @@
if(M != user)
M.visible_message("[user] attempts to feed [M] something from [src].", \
"[user] attempts to feed you something from [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
@@ -216,6 +216,10 @@
/obj/item/reagent_containers/glass/beaker/large/fuel
list_reagents = list(/datum/reagent/fuel = 100)
+/obj/item/reagent_containers/glass/beaker/large/napalm
+ list_reagents = list(/datum/reagent/napalm = 100)
+ cap_on = FALSE
+
/obj/item/reagent_containers/glass/beaker/synthflesh
list_reagents = list(/datum/reagent/medicine/synthflesh = 50)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 7efe82893918..11cbd03c9787 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -490,7 +490,7 @@
if(L != user)
L.visible_message("[user] is trying to inject [L] with [src]!", \
"[user] is trying to inject [L] with [src]!")
- if(!do_mob(user, L, inject_wait))
+ if(!do_after(user, inject_wait, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
@@ -501,7 +501,7 @@
L.visible_message("[user] uses the [src] on [L]!", \
"[user] uses the [src] on [L]!")
else
- if(!do_mob(user, L, inject_self))
+ if(!do_after(user, inject_self, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
@@ -526,7 +526,7 @@
if(L != user)
L.visible_message("[user] is trying to spray [L] with [src]!", \
"[user] is trying to spray [L] with [src]!")
- if(!do_mob(user, L, spray_wait))
+ if(!do_after(user, spray_wait, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
@@ -537,7 +537,7 @@
L.visible_message("[user] uses the [src] on [L]!", \
"[user] uses the [src] on [L]!")
else
- if(!do_mob(user, L, spray_self))
+ if(!do_after(user, spray_self, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm
index 193d588bcbb5..7e85c0c6d1ca 100644
--- a/code/modules/reagents/reagent_containers/medigel.dm
+++ b/code/modules/reagents/reagent_containers/medigel.dm
@@ -48,7 +48,7 @@
if(M == user)
M.visible_message("[user] attempts to [apply_method] [src] on [user.p_them()]self.")
if(self_delay)
- if(!do_mob(user, M, self_delay))
+ if(!do_after(user, self_delay, M))
return
if(!reagents || !reagents.total_volume)
return
@@ -58,7 +58,7 @@
log_combat(user, M, "attempted to apply", src, reagents.log_list())
M.visible_message("[user] attempts to [apply_method] [src] on [M].", \
"[user] attempts to [apply_method] [src] on you.")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 77b8bc8f318c..9cac6c3a52a2 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -34,14 +34,14 @@
if(M == user)
M.visible_message("[user] attempts to [apply_method] [src].")
if(self_delay)
- if(!do_mob(user, M, self_delay))
+ if(!do_after(user, self_delay, M))
return FALSE
to_chat(M, "You [apply_method] [src].")
else
M.visible_message("[user] attempts to force [M] to [apply_method] [src].", \
"[user] attempts to force you to [apply_method] [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return FALSE
M.visible_message("[user] forces [M] to [apply_method] [src].", \
"[user] forces you to [apply_method] [src].")
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index f0901e416b25..5d11dcb720ee 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -86,7 +86,7 @@
target.visible_message("[user] is trying to take a blood sample from [target]!", \
"[user] is trying to take a blood sample from you!")
busy = TRUE
- if(!do_mob(user, target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, target = target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
busy = FALSE
return
if(reagents.total_volume >= reagents.maximum_volume)
@@ -136,7 +136,7 @@
if(L != user)
L.visible_message("[user] is trying to inject [L]!", \
"[user] is trying to inject you!")
- if(!do_mob(user, L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, target = L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
if(!reagents.total_volume)
return
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index 9f2861218418..111428528242 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -131,7 +131,7 @@
user.visible_message("[user] starts climbing into [src].", "You start climbing into [src]...")
else
target.visible_message("[user] starts putting [target] into [src].", "[user] starts putting you into [src]!")
- if(do_mob(user, target, 20))
+ if(do_after(user, 2 SECONDS, target))
if (!loc)
return
target.forceMove(src)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 77525a1f309e..96e027a55476 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -388,8 +388,8 @@
/obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params)
. = ..()
- if(istype(I, /obj/item/card/id))
- var/obj/item/card/id/potential_acc = I
+ if(isbankcard(I))
+ var/obj/item/card/bank/potential_acc = I
if(potential_acc.registered_account)
payments_acc = potential_acc.registered_account
playsound(src, 'sound/machines/ping.ogg', 40, TRUE)
diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm
index 1c1caa5de1d6..67b337400315 100644
--- a/code/modules/religion/rites.dm
+++ b/code/modules/religion/rites.dm
@@ -18,7 +18,7 @@
return FALSE
to_chat(user, "You begin to perform the rite of [name]...")
if(!ritual_invocations)
- if(do_after(user, target = user, delay = ritual_length))
+ if(do_after(user, ritual_length))
return TRUE
return FALSE
var/first_invoke = TRUE
diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm
index a033b59b56ae..bb56a69adf2b 100644
--- a/code/modules/research/bepis.dm
+++ b/code/modules/research/bepis.dm
@@ -58,11 +58,11 @@
say("Deposited [deposit_value] credits into storage.")
update_icon_state()
return
- if(istype(O, /obj/item/card/id))
- var/obj/item/card/id/Card = O
- if(Card.registered_account)
- account = Card.registered_account
- account_name = Card.registered_name
+ if(istype(O, /obj/item/card/bank))
+ var/obj/item/card/bank/bank_card = O
+ if(bank_card.registered_account)
+ account = bank_card.registered_account
+ account_name = bank_card.registered_name
say("New account detected. Console Updated.")
else
say("No account detected on card. Aborting.")
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 9bdc513289e1..5e45c756c881 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -138,16 +138,15 @@ other types of metals and chemistry for reagents).
blueprints[1] = new /datum/design/c10mm()
-/obj/item/disk/design_disk/adv/disposable_gun
+/obj/item/disk/design_disk/disposable_gun
name = "design disk - disposable gun"
desc = "A design disk containing designs for a cheap and disposable gun."
illustration = "gun"
max_blueprints = 2
-/obj/item/disk/design_disk/adv/disposable_gun/Initialize()
+/obj/item/disk/design_disk/disposable_gun/Initialize()
. = ..()
blueprints[1] = new /datum/design/disposable_gun()
- blueprints[2] = new /datum/design/pizza_disposable_gun()
/obj/item/disk/design_disk/clip_mechs
name = "design disk - CLIP mecha modifications"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 6955bf525d29..5f79bbbf12e5 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -644,6 +644,14 @@
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/board/shuttle/engine/fire
+ name = "Machine Design (Combustion Thruster Board)"
+ desc = "The circuit board for a combustion thruster."
+ id = "engine_fire"
+ build_path = /obj/item/circuitboard/machine/shuttle/engine/fire
+ category = list("Shuttle Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+
/datum/design/board/shuttle/engine/electric
name = "Machine Design (Ion Thruster Board)"
desc = "The circuit board for an ion thruster."
@@ -676,6 +684,14 @@
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/board/shuttle/engine/fire_heater
+ name = "Machine Design (Combustion Engine Heater Board)"
+ desc = "The circuit board for a combustion engine heater."
+ id = "engine_fire_heater"
+ build_path = /obj/item/circuitboard/machine/shuttle/fire_heater
+ category = list("Shuttle Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+
/datum/design/board/shuttle/engine/smes
name = "Machine Design (Engine Heater Board)"
desc = "The circuit board for an engine heater."
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 5edbb4df1158..3353dcfb3289 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -582,15 +582,6 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-/datum/design/cleric_mace
- name = "Cleric Mace"
- desc = "A mace fit for a cleric. Useful for bypassing plate armor, but too bulky for much else."
- id = "cleric_mace"
- build_type = AUTOLATHE
- materials = list(MAT_CATEGORY_RIGID = 12000)
- build_path = /obj/item/melee/cleric_mace
- category = list("Imported")
-
/datum/design/stun_boomerang
name = "OZtek Boomerang"
desc = "Uses reverse flow gravitodynamics to flip its personal gravity back to the thrower mid-flight. Also functions similar to a stun baton."
@@ -650,14 +641,6 @@
build_path = /obj/item/gun/ballistic/automatic/pistol/disposable
category = list("Imported")
-/datum/design/pizza_disposable_gun
- name = "Pizza Disposable Gun"
- id = "disposable_pizza"
- build_type = AUTOLATHE
- materials = list(/datum/material/pizza = 4000)
- build_path = /obj/item/gun/ballistic/automatic/pistol/disposable/pizza
- category = list("Imported")
-
//SRM Ballistics
/datum/design/doublebarrel
name = "Double Barrel Shotgun"
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 9016d60515e7..ce473ad739cb 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -355,16 +355,6 @@
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
- else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
- var/turf/start = get_turf(src)
- var/mob/M = locate(/mob/living) in view(src, 3)
- var/turf/MT = get_turf(M)
- if(MT)
- visible_message("[src] dangerously overheats, launching a flaming fuel orb!")
- investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR)
- var/obj/projectile/magic/aoe/fireball/FB = new /obj/projectile/magic/aoe/fireball(start)
- FB.preparePixelProjectile(MT, start)
- FB.fire()
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!")
explosion(loc, -1, 0, 0, 0, 0, flame_range = 2)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index d867d7312ff1..a17e3f294402 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -716,7 +716,7 @@
// [CELADON-EDIT] - CELADON_WEAPONS - Новое пушки и патроны
// design_ids = list("ap9mm", "ap10mm", "ap45", "hp9mm", "hp10mm", "hp45", "ap556mmHITP", "hp556mmHITP") // CELADON-EDIT - ORIGINAL
// research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) // CELADON-EDIT - ORIGINAL
- design_ids = list("ap9mm", "ap10mm", "ap45", "hp9mm", "hp10mm", "hp45", "ap556mmHITP", "hp556mmHITP","a556surp","a308surp")
+ design_ids = list("ap9mm", "ap10mm", "ap45", "hp9mm", "hp10mm", "hp45", "ap556mmHITP", "hp556mmHITP","a556surp","a308_brak")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
// [/CELADON-EDIT]
@@ -1140,7 +1140,7 @@
display_name = "Basic Shuttle Research"
description = "Research the technology required to create and use basic shuttles."
prereq_ids = list("bluespace_travel", "adv_engi")
- design_ids = list("engine_plasma", "engine_ion", "engine_heater", "engine_smes", "shuttle_helm", "rapid_shuttle_designator")
+ design_ids = list("engine_plasma", "engine_fire", "engine_ion", "engine_heater", "engine_fire_heater", "engine_smes", "shuttle_helm", "rapid_shuttle_designator")
// [CELADON-EDIT] - CELADON_BALANCE - Трогаем РнД
// research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) // CELADON-EDIT - ORIGINAL
// export_price = 5000 // CELADON-EDIT - ORIGINAL
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 29ea3fbd4298..ac663059d0c0 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -65,54 +65,3 @@ Slimecrossing Weapons
/obj/item/shield/adamantineshield/ComponentInitialize()
. = ..()
AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15)
-
-//Bloodchiller - Chilling Green
-/obj/item/gun/magic/bloodchill
- name = "blood chiller"
- desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech."
- icon = 'icons/obj/slimecrossing.dmi'
- icon_state = "bloodgun"
- item_state = "bloodgun"
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- item_flags = ABSTRACT | DROPDEL
- w_class = WEIGHT_CLASS_HUGE
- slot_flags = NONE
- force = 5
- max_charges = 1 //Recharging costs blood.
- recharge_rate = 1
- ammo_type = /obj/item/ammo_casing/magic/bloodchill
- fire_sound = 'sound/effects/attackblob.ogg'
-
-/obj/item/gun/magic/bloodchill/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
-
-/obj/item/gun/magic/bloodchill/process()
- charge_tick++
- if(charge_tick < recharge_rate || charges >= max_charges)
- return 0
- charge_tick = 0
- var/mob/living/M = loc
- if(istype(M) && M.blood_volume >= 20)
- charges++
- M.blood_volume -= 20
- if(charges == 1)
- recharge_newshot()
- return 1
-
-/obj/item/ammo_casing/magic/bloodchill
- projectile_type = /obj/projectile/magic/bloodchill
-
-/obj/projectile/magic/bloodchill
- name = "blood ball"
- icon_state = "pulse0_bl"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- hitsound = 'sound/effects/splat.ogg'
-
-/obj/projectile/magic/bloodchill/on_hit(mob/living/target)
- . = ..()
- if(isliving(target))
- target.apply_status_effect(/datum/status_effect/bloodchill)
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 89fa16cca7f5..9fe7857c073b 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -235,29 +235,6 @@ Chilling extracts:
user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...")
..()
-/obj/item/slimecross/chilling/green
- colour = "green"
- effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo."
-
-/obj/item/slimecross/chilling/green/do_effect(mob/user)
- var/which_hand = "l_hand"
- if(!(user.active_hand_index % 2))
- which_hand = "r_hand"
- var/mob/living/L = user
- if(!istype(user))
- return
- var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case...
- L.dropItemToGround(held)
- var/obj/item/gun/magic/bloodchill/gun = new(user)
- if(!L.put_in_hands(gun))
- qdel(gun)
- user.visible_message("[src] flash-freezes [user]'s arm, cracking the flesh horribly!")
- else
- user.visible_message("[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!")
- user.emote("scream")
- L.apply_damage(30,BURN,which_hand)
- ..()
-
/obj/item/slimecross/chilling/pink
colour = "pink"
effect_desc = "Creates a slime corgi puppy."
diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
index 7cb7f8677408..75a1201d924a 100644
--- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm
+++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
@@ -41,12 +41,12 @@ Regenerative extracts:
to_chat(user, "[src] will not work on the dead!")
return
if(H != user)
- if(!do_mob(user, H, slime_delay)) // 1 second delay
+ if(!do_after(user, slime_delay, H)) // 1 second delay
return FALSE
user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating some of [H.p_their()] injuries!",
"You squeeze the [src], and it bursts over [H], the milky goo regenerating some of [H.p_their()] injuries.")
else
- if(!do_mob(user, H, (slime_delay * 1.5))) // 1.5 second delay
+ if(!do_after(user, (slime_delay * 1.5), H)) // 1.5 second delay
return FALSE
user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating some of [user.p_their()] injuries!",
"You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates some of your injuries!")
diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm
deleted file mode 100644
index dd4d39e91a20..000000000000
--- a/code/modules/ruins/icemoonruin_code/hotsprings.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-GLOBAL_LIST_EMPTY(cursed_minds)
-
-/**
- * Turns whoever enters into a mob or random person
- *
- * If mob is chosen, turns the person into a random animal type
- * If appearance is chosen, turns the person into a random human with a random species
- * This changes name, and changes their DNA as well
- * Random species is same as wizard swap event so people don't get killed ex: plasmamen
- * Once the spring is used, it cannot be used by the same mind ever again
- * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere)
- *
- */
-
-/turf/open/water/cursed_spring
- baseturfs = /turf/open/water/cursed_spring
- planetary_atmos = TRUE
- initial_gas_mix = ICEMOON_DEFAULT_ATMOS
-
-/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc)
- . = ..()
- if(!isliving(thing))
- return
- var/mob/living/L = thing
- if(!L.client)
- return
- if(GLOB.cursed_minds[L.mind])
- return
- GLOB.cursed_minds[L.mind] = TRUE
- RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed))
- var/random_choice = pick("Mob", "Appearance")
- switch(random_choice)
- if("Mob")
- L = wabbajack(L, "animal")
- if("Appearance")
- var/mob/living/carbon/human/H = wabbajack(L, "humanoid")
- randomize_human(H)
- var/list/all_species = list()
- for(var/stype in subtypesof(/datum/species))
- var/datum/species/S = stype
- if(initial(S.changesource_flags) & RACE_SWAP)
- all_species += stype
- var/random_race = pick(all_species)
- H.set_species(random_race)
- H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
- L = H
- var/turf/T = find_safe_turf()
- L.forceMove(T)
- to_chat(L, "You blink and find yourself in [get_area_name(T)].")
-
-/**
- * Deletes minds from the cursed minds list after their deletion
- *
- */
-/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M)
- GLOB.cursed_minds -= M
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
deleted file mode 100644
index 1115224a6733..000000000000
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
-
-///Wizard tower item
-/obj/item/disk/design_disk/adv/knight_gear
- name = "Magic Disk of Smithing"
- illustration = "sword"
- color = "#6F6F6F"
-
-/obj/item/disk/design_disk/adv/knight_gear/Initialize()
- . = ..()
- var/datum/design/knight_armour/A = new
- var/datum/design/knight_helmet/H = new
- blueprints[1] = A
- blueprints[2] = H
-
-//lavaland_surface_seed_vault.dmm
-//Seed Vault
-
-/obj/effect/spawner/lootdrop/seed_vault
- name = "seed vault seeds"
- lootcount = 1
-
- loot = list(/obj/item/seeds/random = 10,
- /obj/item/seeds/cherry/bomb = 10,
- /obj/item/seeds/berry/glow = 10,
- /obj/item/seeds/sunflower/moonflower = 8
- )
-
-///Syndicate Listening Post
-
-/obj/effect/mob_spawn/human/lavaland_syndicate
- name = "Syndicate Bioweapon Scientist"
- roundstart = FALSE
- death = FALSE
- random = TRUE
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper_s"
- short_desc = "You are a syndicate science technician, employed in a top secret research facility developing biological weapons."
- flavour_text = "Reports of potential Nanotrasen fleet movement in your sector prompted you to initiate Operation Smokescreen, killing base power and taking your crew into cryosleep. You've awoken an unknown amount of time later as base security initiates an emergency reboot. Keep vigilant for whatever reawoke you, continue your research as best you can, and try to keep a low profile."
- important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
- outfit = /datum/outfit/lavaland_syndicate
- assignedrole = "Lavaland Syndicate"
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/special(mob/living/new_spawn)
- new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
-
-/datum/outfit/lavaland_syndicate
- name = "Lavaland Syndicate Agent"
- r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle
- uniform = /obj/item/clothing/under/syndicate
- suit = /obj/item/clothing/suit/toggle/labcoat
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/tackler/combat/insulated
- ears = /obj/item/radio/headset/syndicate/alt
- back = /obj/item/storage/backpack
- r_pocket = /obj/item/gun/ballistic/automatic/pistol
- id = /obj/item/card/id/syndicate/anyone
- implants = list(/obj/item/implant/weapons_auth)
-
-/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H)
- H.faction |= ROLE_SYNDICATE
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/comms
- name = "Syndicate Comms Agent"
- short_desc = "You are a syndicate communications agent, employed in a top secret research facility developing biological weapons."
- flavour_text = "Reports of potential Nanotrasen fleet movement in your sector prompted you to initiate Operation Smokescreen, killing base power and taking your crew into cryosleep. You've awoken an unknown amount of time later as base security initiates an emergency reboot. Keep vigilant for whatever reawoke you, and try to keep a low profile. Use the communication equipment to monitor any local activity. Anyone nearby is presumed to be an agent of Nanotrasen: Sow disinformation to throw them off your trail. Do not let the base fall into enemy hands!"
- important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
- outfit = /datum/outfit/lavaland_syndicate/comms
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space
- short_desc = "You are a deep-cover syndicate agent, assigned to a small military listening post intended to keep an eye on Nanotrasen activity in the area. Increased military operations prompted you to follow Smokescreen protocol and go into cryosleep, leaving your base on minimal power."
- flavour_text = "Your base's emergency security system has reawoken you and brought the facility back to full power- It can only be presumed Nanotrasen personnel are close to locating you. Monitor any local activity as best you can, and try to keep a low profile. Use the communication equipment to attempt parlance, and sow disinformation to throw Nanotrasen off your trail."
- important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize()
- . = ..()
- if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie.
- new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src))
- return INITIALIZE_HINT_QDEL
-
-/datum/outfit/lavaland_syndicate/comms
- name = "Lavaland Syndicate Comms Agent"
- r_hand = /obj/item/melee/transforming/energy/sword/saber
- mask = /obj/item/clothing/mask/chameleon/gps
- suit = /obj/item/clothing/suit/armor/vest
-
-/obj/item/clothing/mask/chameleon/gps/Initialize()
- . = ..()
- AddComponent(/datum/component/gps, "Encrypted Signal")
diff --git a/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm b/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm
deleted file mode 100644
index 529d48cf551f..000000000000
--- a/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-//////lavaland clown planet papers
-
-/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape
- default_raw_text = "If you dare not continue down this path of madness, escape can be found through the chute in this room."
-
-/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope
- default_raw_text = "Abandon hope, all ye who enter here."
diff --git a/code/modules/ruins/lavalandruin_code/codelab.dm b/code/modules/ruins/lavalandruin_code/codelab.dm
deleted file mode 100644
index 4cdbb4b132a5..000000000000
--- a/code/modules/ruins/lavalandruin_code/codelab.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/obj/item/paper/codelab
-
-/obj/item/paper/crumpled/codelab
-
-/obj/item/paper/codelab/reception
- name = "Reception Instructions"
- default_raw_text = "RECITE TO ANY GUESTS UNDER 'EXPERIMENTAL' GROUP:
Welcome to the Nanotrasen Genetic Research Facility! Thank you for choosing to volunteer and progress genetic research by leaps and bounds. As stated in the contract, you will be here for the forseeable future helping the scientists further their studies. Remember that signing the contract means you cannot legally request a settlement for any injury or death that occurs during testing. Head to your chamber through the hall on the left and have a nice day!"
-
-/obj/item/paper/crumpled/codelab/subjectnote
- name = "Test Subjects Note"
- default_raw_text = "This testing had better be worth it. I've always wanted to have cat ears.
Not sure what all that gooey stuff I saw was, but at least I'll be in the cryo cell away from it.
And whats up with the floor tiles in the hall?"
-
-/obj/item/paper/codelab/researchernote
- name = "Head Researchers Note"
- default_raw_text = "With the help of these new 'volunteers' we are making great progress with our genetic research. These samples will earn us fame across the galaxy!
Earlier, one of the junior scientists wanted to try some gene editing on a white sample he recieved, which made it grow and mutate rapidly and slide into a hole in the floor on its own. Truly fascinating stuff!
The janitor can get it later, but we'll have to repeat the experiment under controlled conditions, perhaps even introducing it to one of the subjects."
-
-/obj/machinery/porta_turret/ship/weak/codelab
- name = "old perimeter defense turret"
- desc = "An old nanotrasen defense turret, rusted and weakened with age and constant use. Still capable of delivering lethal lasers to unwanted guests."
- faction = list("nanotrasen", "turret") //why are there 3 different factions for nanotrasen mobs :withered:
diff --git a/code/modules/ruins/lavalandruin_code/pizzaparty.dm b/code/modules/ruins/lavalandruin_code/pizzaparty.dm
deleted file mode 100644
index a7776f4e6a87..000000000000
--- a/code/modules/ruins/lavalandruin_code/pizzaparty.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-//lavaland_surface_pizzaparty.dmm
-
-/obj/effect/spawner/lootdrop/pizzaparty
- name = "pizza bomb spawner"
- loot = list(/obj/item/pizzabox/margherita = 3,
- /obj/item/pizzabox/meat = 3,
- /obj/item/pizzabox/mushroom = 3,
- /obj/item/pizzabox/bomb = 1)
- lootdoubles = FALSE
diff --git a/code/modules/ruins/lavalandruin_code/sloth.dm b/code/modules/ruins/lavalandruin_code/sloth.dm
deleted file mode 100644
index e06773d4f19c..000000000000
--- a/code/modules/ruins/lavalandruin_code/sloth.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/////////// lavaland slot ruin items
-
-/obj/item/paper/fluff/stations/lavaland/sloth/note
- name = "note from sloth"
- desc = "have not gotten around to finishing my cursed item yet sorry - sloth"
diff --git a/code/modules/ruins/lavalandruin_code/surface.dm b/code/modules/ruins/lavalandruin_code/surface.dm
index c58fb67fd61a..1f1113acf1a6 100644
--- a/code/modules/ruins/lavalandruin_code/surface.dm
+++ b/code/modules/ruins/lavalandruin_code/surface.dm
@@ -1,9 +1,3 @@
-//////lavaland surface papers
-
-/obj/item/paper/fluff/stations/lavaland/surface/henderson_report
- name = "Important Notice - Mrs. Henderson"
- default_raw_text = "Nothing of interest to report."
-
//ratvar
/obj/structure/dead_ratvar
diff --git a/code/modules/ruins/spaceruin_code/asteroid4.dm b/code/modules/ruins/spaceruin_code/asteroid4.dm
deleted file mode 100644
index 9ee576361f1f..000000000000
--- a/code/modules/ruins/spaceruin_code/asteroid4.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-/////////// asteroid4 items
-
-/obj/item/paper/fluff/ruins/asteroid4/extraction
- default_raw_text = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm
deleted file mode 100644
index 8877a693cdae..000000000000
--- a/code/modules/ruins/spaceruin_code/caravanambush.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-//caravan ambush
-
-/obj/item/wrench/caravan
- color = "#ff0000"
- desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster."
- name = "experimental wrench"
- toolspeed = 0.3
-
-/obj/item/screwdriver/caravan
- color = "#ff0000"
- desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster."
- name = "experimental screwdriver"
- toolspeed = 0.3
- random_color = FALSE
-
-/obj/item/wirecutters/caravan
- color = "#ff0000"
- desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster."
- name = "experimental wirecutters"
- toolspeed = 0.3
- random_color = FALSE
-
-/obj/item/crowbar/red/caravan
- color = "#ff0000"
- desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster."
- name = "experimental crowbar"
- toolspeed = 0.3
diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm
deleted file mode 100644
index 7ca75e888660..000000000000
--- a/code/modules/ruins/spaceruin_code/clericsden.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/////////// cleric's den items.
-
-//Primary reward: the cleric's mace design disk.
-/obj/item/disk/design_disk/adv/cleric_mace
- name = "Enshrined Disc of Smiting"
- illustration = "sword"
- color = "#6F6F6F"
-
-/obj/item/disk/design_disk/adv/cleric_mace/Initialize()
- . = ..()
- var/datum/design/cleric_mace/M = new
- blueprints[1] = M
-
-/obj/item/paper/fluff/ruins/clericsden/contact
- default_raw_text = "Father Aurellion, the ritual is complete, and soon our brothers at the bastion will see the error of our ways. After all, a god of clockwork or blood? Preposterous. Only the TRUE GOD should have so much power. Signed, Father Odivallus."
-
-/obj/item/paper/fluff/ruins/clericsden/warning
- default_raw_text = "FATHER ODIVALLUS, DO NOT GO FORWARD WITH THE RITUAL. THE ASTEROID WE'RE ANCHORED TO IS UNSTABLE, YOU WILL DESTROY THE STATION. I HOPE THIS REACHES YOU IN TIME. FATHER AURELLION."
-
-/mob/living/simple_animal/hostile/construct/proteon
- name = "Proteon"
- real_name = "Proteon"
- desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
- icon_state = "proteon"
- icon_living = "proteon"
- maxHealth = 35
- health = 35
- melee_damage_lower = 8
- melee_damage_upper = 10
- retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you.
- attack_verb_continuous = "pinches"
- attack_verb_simple = "pinch"
- environment_smash = ENVIRONMENT_SMASH_WALLS
- attack_sound = 'sound/weapons/punch2.ogg'
- playstyle_string = "You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists."
-
-/mob/living/simple_animal/hostile/construct/proteon/hostile //Style of mob spawned by trapped cult runes in the cleric ruin.
- AIStatus = AI_ON
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES //standard ai construct behavior, breaks things if it wants, but not walls.
diff --git a/code/modules/ruins/spaceruin_code/crashedclownship.dm b/code/modules/ruins/spaceruin_code/crashedclownship.dm
deleted file mode 100644
index 34d70881bc43..000000000000
--- a/code/modules/ruins/spaceruin_code/crashedclownship.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-/////////// crashedclownship items
-
-/obj/item/paper/fluff/ruins/crashedclownship/true_nation
- default_raw_text = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
diff --git a/code/modules/ruins/spaceruin_code/crashedship.dm b/code/modules/ruins/spaceruin_code/crashedship.dm
deleted file mode 100644
index 911deacd27dc..000000000000
--- a/code/modules/ruins/spaceruin_code/crashedship.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-// crashedship / packer ship
-
-//Areas
-
-/area/awaymission/BMPship
- name = "BMP Asteroids"
- icon_state = "away"
-
-
-/area/awaymission/BMPship/Aft
- name = "Aft Block"
- icon_state = "away1"
- requires_power = TRUE
-
-/area/awaymission/BMPship/Midship
- name = "Midship Block"
- icon_state = "away2"
- requires_power = TRUE
-
-/area/awaymission/BMPship/Fore
- name = "Fore Block"
- icon_state = "away3"
- requires_power = TRUE
-
-
-// crashedship items
-
-/obj/item/paper/fluff/ruins/crashedship/scribbled
- name = "scribbled note"
- default_raw_text = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"
-
-
-/obj/item/paper/fluff/ruins/crashedship/captains_log
- name = "Captain's log entry"
- default_raw_text = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."
-
-/obj/item/paper/fluff/ruins/crashedship/old_diary
- name = "Old Diary"
- default_raw_text = "DEAR DIARY: So we was doing our typical route when the captain says we've been picking up weird signals on some backwater planet. Madsen wanted to stay on course but he ain't the captain, so we went out of the way to check it out. There was lots of rocks on the way, but we got to the planet fine. Found a big fancy camp with nobody around and this big metal donut thing with NT stamps all over it right in the middle. Case of beer too. Captain reckons we can pass it off to some buyer in the Syndicate. Ingram says it's bad luck and that someone is going to come look for it but it sounds like better money than selling bad meat to jerky companies."
-
diff --git a/code/modules/ruins/spaceruin_code/deepstorage.dm b/code/modules/ruins/spaceruin_code/deepstorage.dm
deleted file mode 100644
index bcfc3be8f546..000000000000
--- a/code/modules/ruins/spaceruin_code/deepstorage.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/////////// deepstorage items
-
-/obj/item/paper/fluff/ruins/deepstorage/water_concern
- name = "water concerns"
- default_raw_text = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"
-
-/obj/item/paper/fluff/ruins/deepstorage/hydro_notice
- name = "hydroponics notice"
- default_raw_text = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"
-
-/obj/item/paper/fluff/ruins/deepstorage/recycling_notice
- name = "recycling notice"
- default_raw_text = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."
-
diff --git a/code/modules/ruins/spaceruin_code/forgottenship.dm b/code/modules/ruins/spaceruin_code/forgottenship.dm
index 70e003ffd4d4..24ca72b8087b 100644
--- a/code/modules/ruins/spaceruin_code/forgottenship.dm
+++ b/code/modules/ruins/spaceruin_code/forgottenship.dm
@@ -88,45 +88,3 @@ GLOBAL_VAR_INIT(fscpassword, generate_password())
area_flags = NOTELEPORT | UNIQUE_AREA
//Cybersun hardsuit
-
-//Special NT NPCs
-
-/mob/living/simple_animal/hostile/nanotrasen/ranged/assault
- name = "Nanotrasen Assault Officer"
- desc = "A Nanotrasen Assault Officer. Prepare to die, if you've been found near Syndicate property."
- icon_state = "nanotrasenrangedassault"
- icon_living = "nanotrasenrangedassault"
- icon_dead = null
- icon_gib = "syndicate_gib"
- ranged = TRUE
- rapid = 4
- rapid_fire_delay = 1
- rapid_melee = 1
- retreat_distance = 2
- minimum_distance = 4
- casingtype = /obj/item/ammo_casing/c46x30mm
- projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
- loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier)
-
-/mob/living/simple_animal/hostile/nanotrasen/elite
- name = "Nanotrasen Elite Assault Officer"
- desc = "Pray for your life, syndicate. Run while you can."
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "nanotrasen_ert"
- icon_living = "nanotrasen_ert"
- maxHealth = 150
- health = 150
- melee_damage_lower = 13
- melee_damage_upper = 18
- ranged = TRUE
- rapid = 3
- rapid_fire_delay = 5
- rapid_melee = 3
- retreat_distance = 0
- minimum_distance = 1
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- projectiletype = /obj/projectile/beam/laser
- projectilesound = 'sound/weapons/laser.ogg'
- loot = list(/obj/effect/gibspawner/human)
- faction = list(ROLE_DEATHSQUAD)
diff --git a/code/modules/ruins/spaceruin_code/hellfactory.dm b/code/modules/ruins/spaceruin_code/hellfactory.dm
deleted file mode 100644
index 6f992fbff52e..000000000000
--- a/code/modules/ruins/spaceruin_code/hellfactory.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/obj/machinery/door/keycard/office
- name = "management airlock"
- desc = "The boss man gets the best stuff. Always and forever."
- puzzle_id = "factory1"
-
-/obj/item/keycard/office
- name = "management keycard"
- desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'."
- color = "#f05812"
- puzzle_id = "factory1"
-
-/obj/machinery/door/keycard/stockroom
- name = "stockroom airlock"
- desc = "The boss man gets the best stuff. Always and forever."
- puzzle_id = "factory2"
-
-/obj/item/keycard/stockroom
- name = "stockroom keycard"
- desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'."
- color = "#1272f0"
- puzzle_id = "factory2"
-
-/obj/machinery/door/keycard/entry
- name = "secure airlock"
- desc = "The boss man gets the best stuff. Always and forever."
- puzzle_id = "factory3"
-
-/obj/item/keycard/entry
- name = "secure keycard"
- desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'."
- color = "#12f049"
- puzzle_id = "factory3"
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
deleted file mode 100644
index 80c3e268e830..000000000000
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/// Some ruins still use assets that came from Hilbert's Hotel.
-/turf/closed/indestructible/hotelwall
- name = "hotel wall"
- desc = "A wall designed to protect the security of the hotel's guests."
- icon_state = "hotelwall"
- smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_HOTEL_WALLS)
- canSmoothWith = list(SMOOTH_GROUP_HOTEL_WALLS)
- explosion_block = INFINITY
-
-/turf/open/indestructible/hotelwood
- desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering."
- icon_state = "wood"
- footstep = FOOTSTEP_WOOD
- tiled_dirt = FALSE
-
-/turf/open/indestructible/hoteltile
- desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering."
- icon_state = "showroomfloor"
- footstep = FOOTSTEP_FLOOR
- tiled_dirt = FALSE
diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm
deleted file mode 100644
index 4b4cb8046667..000000000000
--- a/code/modules/ruins/spaceruin_code/listeningstation.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/////////// listening station
-
-/obj/item/paper/fluff/ruins/listeningstation/reports
- default_raw_text = "Nothing of interest to report."
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/july
- name = "july report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/august
- name = "august report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/september
- name = "september report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/october
- name = "october report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/november
- name = "november report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/june
- name = "june report"
- default_raw_text = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/may
- name = "may report"
- default_raw_text = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/april
- name = "april report"
- default_raw_text = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."
-
-/obj/item/paper/fluff/ruins/listeningstation/receipt
- name = "receipt"
- default_raw_text = "1 x Stechkin pistol - 600 cr
1 x silencer - 200 cr
shipping charge - 4360 cr
total - 5160 cr"
-
-/obj/item/paper/fluff/ruins/listeningstation/odd_report
- name = "odd report"
- default_raw_text = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. -DonkCo Operative #451"
-
-/obj/item/paper/fluff/ruins/listeningstation/briefing
- name = "mission briefing"
- default_raw_text = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."
-
-
diff --git a/code/modules/ruins/spaceruin_code/spacehotel.dm b/code/modules/ruins/spaceruin_code/spacehotel.dm
deleted file mode 100644
index 735c039b5ee1..000000000000
--- a/code/modules/ruins/spaceruin_code/spacehotel.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/////////// spacehotel items
-
-
-/obj/item/paper/fluff/ruins/spacehotel/notice
- name = "!NOTICE!"
- default_raw_text = "!NOTICE!
We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either."
-
-/obj/item/paper/pamphlet/ruin/spacehotel
- name = "hotel pamphlet"
- default_raw_text = "The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff strive to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information."
-
-
diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm
index d0b4b49a92f6..31e650a90a31 100644
--- a/code/modules/shuttle/shuttle_rotate.dm
+++ b/code/modules/shuttle/shuttle_rotate.dm
@@ -70,10 +70,6 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D))
dpdir = new_dpdir
-/obj/structure/table/wood/bar/shuttleRotate(rotation, params)
- . = ..()
- boot_dir = angle2dir(rotation + dir2angle(boot_dir))
-
/obj/structure/alien/weeds/shuttleRotate(rotation, params)
params &= ~ROTATE_OFFSET
return ..()
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
deleted file mode 100644
index 2603d9ea3e24..000000000000
--- a/code/modules/shuttle/special.dm
+++ /dev/null
@@ -1,386 +0,0 @@
-// Special objects for shuttle templates go here if nowhere else
-
-// Wabbajack statue, a sleeping frog statue that shoots bolts of change if
-// living carbons are put on its altar/tables
-
-/obj/machinery/power/emitter/energycannon/magical
- name = "wabbajack statue"
- desc = "Who am I? What is my purpose in life? What do I mean by who am I?"
- projectile_type = /obj/projectile/magic/change
- icon = 'icons/obj/machines/magic_emitter.dmi'
- icon_state = "wabbajack_statue"
- icon_state_on = "wabbajack_statue_on"
- base_icon_state = "wabbajack_statue"
- active = FALSE
- allow_switch_interact = FALSE
- var/list/active_tables = list()
- var/tables_required = 2
-
-/obj/machinery/power/emitter/energycannon/magical/Initialize()
- . = ..()
- if(prob(50))
- desc = "Oh no, not again."
- update_appearance()
-
-/obj/machinery/power/emitter/energycannon/magical/update_icon_state()
- . = ..()
- icon_state = active ? icon_state_on : initial(icon_state)
-
-/obj/machinery/power/emitter/energycannon/magical/process()
- . = ..()
- if(active_tables.len >= tables_required)
- if(!active)
- visible_message("\
- [src] opens its eyes.")
- active = TRUE
- else
- if(active)
- visible_message("\
- [src] closes its eyes.")
- active = FALSE
- update_appearance()
-
-/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params)
- return
-
-/obj/machinery/power/emitter/energycannon/magical/ex_act(severity)
- return
-
-/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user)
- return
-
-/obj/structure/table/abductor/wabbajack
- name = "wabbajack altar"
- desc = "Whether you're sleeping or waking, it's going to be quite chaotic."
- max_integrity = 1000
- verb_say = "chants"
- var/obj/machinery/power/emitter/energycannon/magical/our_statue
- var/list/mob/living/sleepers = list()
- var/never_spoken = TRUE
- flags_1 = NODECONSTRUCT_1
-
-/obj/structure/table/abductor/wabbajack/Initialize(mapload)
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/structure/table/abductor/wabbajack/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/structure/table/abductor/wabbajack/process()
- var/area = orange(4, src)
- if(!our_statue)
- for(var/obj/machinery/power/emitter/energycannon/magical/M in area)
- our_statue = M
- break
-
- if(!our_statue)
- name = "inert [initial(name)]"
- return
- else
- name = initial(name)
-
- var/turf/T = get_turf(src)
- var/list/found = list()
- for(var/mob/living/carbon/C in T)
- if(C.stat != DEAD)
- found += C
-
- // New sleepers
- for(var/i in found - sleepers)
- var/mob/living/L = i
- L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY)
- L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.",
- "[desc]")
- // Don't let them sit suround unconscious forever
- addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100)
-
- // Existing sleepers
- for(var/i in found)
- var/mob/living/L = i
- L.SetSleeping(200)
-
- // Missing sleepers
- for(var/i in sleepers - found)
- var/mob/living/L = i
- L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080")
- L.visible_message("The glow from [L] fades \
- away.")
- L.grab_ghost()
-
- sleepers = found
-
- if(sleepers.len)
- our_statue.active_tables |= src
- if(never_spoken || prob(5))
- say(desc)
- never_spoken = FALSE
- else
- our_statue.active_tables -= src
-
-/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper)
- if(sleeper in sleepers)
- to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.")
- sleeper.ghostize(TRUE)
-
-/obj/structure/table/abductor/wabbajack/left
- desc = "You sleep so it may wake."
-
-/obj/structure/table/abductor/wabbajack/right
- desc = "It wakes so you may sleep."
-
-// Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks
-// and a good time.
-
-/mob/living/simple_animal/drone/snowflake/bardrone
- name = "Bardrone"
- desc = "A barkeeping drone, a robot built to tend bars."
- hacked = TRUE
- laws = "1. Serve drinks.\n\
- 2. Talk to patrons.\n\
- 3. Don't get messed up in their affairs."
- unique_name = FALSE // disables the (123) number suffix
- initial_language_holder = /datum/language_holder/universal
-
-/mob/living/simple_animal/drone/snowflake/bardrone/Initialize()
- . = ..()
- access_card.access |= ACCESS_CENT_BAR
- become_area_sensitive(ROUNDSTART_TRAIT)
- RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode))
- check_barstaff_godmode()
-
-/mob/living/simple_animal/drone/snowflake/bardrone/Destroy()
- lose_area_sensitivity(ROUNDSTART_TRAIT)
- return ..()
-
-/mob/living/simple_animal/hostile/alien/maid/barmaid
- gold_core_spawnable = NO_SPAWN
- name = "Barmaid"
- desc = "A barmaid, a maiden found in a bar."
- pass_flags = PASSTABLE
- unique_name = FALSE
- AIStatus = AI_OFF
- stop_automated_movement = TRUE
- initial_language_holder = /datum/language_holder/universal
-
-/mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize()
- . = ..()
- access_card = new /obj/item/card/id(src)
- var/datum/job/captain/C = new /datum/job/captain
- access_card.access = C.get_access()
- access_card.access |= ACCESS_CENT_BAR
- ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
- become_area_sensitive(ROUNDSTART_TRAIT)
- RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode))
- check_barstaff_godmode()
-
-/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy()
- qdel(access_card)
- lose_area_sensitivity(ROUNDSTART_TRAIT)
- return ..()
-
-/mob/living/simple_animal/proc/check_barstaff_godmode()
- SIGNAL_HANDLER
-
- if(istype(get_area(loc), /area/shuttle/escape))
- status_flags |= GODMODE
- else
- status_flags &= ~GODMODE
-
-// Bar table, a wooden table that kicks you in a direction if you're not
-// barstaff (defined as someone who was a roundstart bartender or someone
-// with CENTCOM_BARSTAFF)
-
-/obj/structure/table/wood/bar
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- flags_1 = NODECONSTRUCT_1
- max_integrity = 1000
- var/boot_dir = 1
-
-/obj/structure/table/wood/bar/Initialize()
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/table/wood/bar/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(isliving(AM) && !is_barstaff(AM))
- // No climbing on the bar please
- var/mob/living/M = AM
- var/throwtarget = get_edge_target_turf(src, boot_dir)
- M.Paralyze(40)
- M.throw_at(throwtarget, 5, 1)
- to_chat(M, "No climbing on the bar please.")
-
-/obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user)
- . = FALSE
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.mind && H.mind.assigned_role == "Bartender")
- return TRUE
-
- var/obj/item/card/id/ID = user.get_idcard(FALSE)
- if(ID && (ACCESS_CENT_BAR in ID.access))
- return TRUE
-
-//Luxury Shuttle Blockers
-
-/obj/machinery/scanner_gate/luxury_shuttle
- name = "luxury shuttle ticket field"
- density = FALSE //allows shuttle airlocks to close, nothing but an approved passenger gets past CanPass
- locked = TRUE
- use_power = FALSE
- var/threshold = 500
- var/static/list/approved_passengers = list()
- var/static/list/check_times = list()
- var/list/payees = list()
-
-/obj/machinery/scanner_gate/luxury_shuttle/CanAllowThrough(atom/movable/mover, border_dir)
- . = ..()
-
- if(mover in approved_passengers)
- set_scanline("scanning", 10)
- return TRUE
-
- if(!isliving(mover)) //No stowaways
- return FALSE
-
-/obj/machinery/scanner_gate/luxury_shuttle/auto_scan(atom/movable/AM)
- return
-
-/obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, params)
- return
-
-/obj/machinery/scanner_gate/luxury_shuttle/emag_act(mob/user)
- return
-
-#define LUXURY_MESSAGE_COOLDOWN 100
-/obj/machinery/scanner_gate/luxury_shuttle/Bumped(atom/movable/AM)
- if(!isliving(AM))
- alarm_beep()
- return ..()
-
- var/datum/bank_account/account
- if(istype(AM.pulling, /obj/item/card/id))
- var/obj/item/card/id/I = AM.pulling
- if(I.registered_account)
- account = I.registered_account
- else if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message
- to_chat(AM, "This ID card doesn't have an owner associated with it!")
- check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN
- else if(ishuman(AM))
- var/mob/living/carbon/human/H = AM
- if(H.get_bank_account())
- account = H.get_bank_account()
-
- if(account)
- if(account.account_balance < threshold - payees[AM])
- account.adjust_money(-account.account_balance, "luxury_shuttle")
- payees[AM] += account.account_balance
- else
- var/money_owed = threshold - payees[AM]
- account.adjust_money(-money_owed)
- payees[AM] += money_owed
-
- var/list/counted_money = list()
-
- for(var/obj/item/coin/C in AM.GetAllContents())
- if(payees[AM] >= threshold)
- break
- payees[AM] += C.value
- counted_money += C
- for(var/obj/item/spacecash/bundle/S in AM.GetAllContents())
- if(payees[AM] >= threshold)
- break
- payees[AM] += S.value
- counted_money += S
- for(var/obj/item/holochip/H in AM.GetAllContents())
- if(payees[AM] >= threshold)
- break
- payees[AM] += H.credits
- counted_money += H
-
- if(payees[AM] < threshold && istype(AM.pulling, /obj/item/coin))
- var/obj/item/coin/C = AM.pulling
- payees[AM] += C.value
- counted_money += C
-
- else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/spacecash/bundle))
- var/obj/item/spacecash/bundle/S = AM.pulling
- payees[AM] += S.value
- counted_money += S
-
- else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/holochip))
- var/obj/item/holochip/H = AM.pulling
- payees[AM] += H.credits
- counted_money += H
-
- if(payees[AM] < threshold)
- var/armless
- if(!ishuman(AM) && !istype(AM, /mob/living/simple_animal/slime))
- armless = TRUE
- else
- var/mob/living/carbon/human/H = AM
- if(!H.get_bodypart(BODY_ZONE_L_ARM) && !H.get_bodypart(BODY_ZONE_R_ARM))
- armless = TRUE
-
- if(armless)
- if(!AM.pulling || !iscash(AM.pulling) && !istype(AM.pulling, /obj/item/card/id))
- if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message
- to_chat(AM, "Try pulling a valid ID, space cash, holochip or coin into \the [src]!")
- check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN
-
- if(payees[AM] >= threshold)
- for(var/obj/I in counted_money)
- qdel(I)
- payees[AM] -= threshold
-
- var/change = FALSE
- if(payees[AM] > 0)
- change = TRUE
- var/obj/item/holochip/HC = new /obj/item/holochip(AM.loc)
- HC.credits = payees[AM]
- HC.name = "[HC.credits] credit holochip"
- if(istype(AM, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = AM
- if(!H.put_in_hands(HC))
- AM.pulling = HC
- else
- AM.pulling = HC
- payees[AM] -= payees[AM]
-
- say("Welcome to first class, [AM]![change ? " Here is your change." : ""]")
- approved_passengers += AM
-
- check_times -= AM
- return
- else if (payees[AM] > 0)
- for(var/obj/I in counted_money)
- qdel(I)
- if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message
- to_chat(AM, "[payees[AM]] cr received. You need [threshold-payees[AM]] cr more.")
- check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN
- alarm_beep()
- return ..()
- else
- alarm_beep()
- return ..()
-
-/mob/living/simple_animal/hostile/bear/fightpit
- name = "fight pit bear"
- desc = "This bear's trained through ancient Solarian secrets to fear the walls of its glass prison."
- environment_smash = ENVIRONMENT_SMASH_NONE
-
-/obj/effect/decal/hammerandsickle
- name = "hammer and sickle"
- desc = "Communism powerful force."
- icon = 'icons/effects/96x96.dmi'
- icon_state = "communist"
- layer = ABOVE_OPEN_TURF_LAYER
- pixel_x = -32
- pixel_y = -32
-
-/obj/effect/decal/hammerandsickle/shuttleRotate(rotation)
- setDir(angle2dir(rotation+dir2angle(dir))) // No parentcall, rest of the rotate code breaks the pixel offset.
diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm
deleted file mode 100644
index 71afa1c9bc72..000000000000
--- a/code/modules/shuttle/white_ship.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/obj/effect/spawner/lootdrop/whiteship_cere_ripley
- name = "25% mech 75% wreckage ripley spawner"
- loot = list(/obj/mecha/working/ripley/mining = 1,
- /obj/structure/mecha_wreckage/ripley = 5)
- lootdoubles = FALSE
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 9e30c708774d..46737c5b5a99 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -2,7 +2,7 @@
/obj/effect/proc_holder/spell/aimed
name = "aimed projectile spell"
base_icon_state = "projectile"
- var/projectile_type = /obj/projectile/magic/teleport
+ var/projectile_type = /obj/projectile
var/deactive_msg = "You discharge your projectile..."
var/active_msg = "You charge your projectile!"
var/active_icon_state = "projectile"
@@ -106,7 +106,7 @@
projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE)
active_msg = "You energize your hands with arcane lightning!"
deactive_msg = "You let the energy flow out of your hands back into yourself..."
- projectile_type = /obj/projectile/magic/aoe/lightning
+ projectile_type = /obj/projectile/magic
/obj/effect/proc_holder/spell/aimed/fireball
name = "Fireball"
@@ -118,7 +118,7 @@
invocation_type = INVOCATION_SHOUT
range = 20
cooldown_min = 20 //10 deciseconds reduction per rank
- projectile_type = /obj/projectile/magic/aoe/fireball
+ projectile_type = /obj/projectile/magic
base_icon_state = "fireball"
action_icon_state = "fireball0"
sound = 'sound/magic/fireball.ogg'
@@ -130,60 +130,3 @@
var/range = 6 + 2*spell_level
projectile_var_overrides = list("range" = range)
return ..()
-
-/obj/effect/proc_holder/spell/aimed/spell_cards
- name = "Spell Cards"
- desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!"
- school = "evocation"
- charge_max = 50
- clothes_req = FALSE
- invocation = "Sigi'lu M'Fan 'Tasia"
- invocation_type = INVOCATION_SHOUT
- range = 40
- cooldown_min = 10
- projectile_amount = 5
- projectiles_per_fire = 7
- projectile_type = /obj/projectile/spellcard
- base_icon_state = "spellcard"
- action_icon_state = "spellcard0"
- var/datum/weakref/current_target_weakref
- var/projectile_turnrate = 10
- var/projectile_pixel_homing_spread = 32
- var/projectile_initial_spread_amount = 30
- var/projectile_location_spread_amount = 12
- var/datum/component/lockon_aiming/lockon_component
- ranged_clickcd_override = TRUE
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M)
- QDEL_NULL(lockon_component)
- lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component)))
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs)
- if(!length(locked_weakrefs))
- current_target_weakref = null
- return
- current_target_weakref = locked_weakrefs[1]
- var/atom/A = current_target_weakref.resolve()
- if(A)
- var/mob/M = lockon_component.parent
- M.face_atom(A)
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M)
- QDEL_NULL(lockon_component)
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration)
- if(current_target_weakref)
- var/atom/A = current_target_weakref.resolve()
- if(A && get_dist(A, user) < 7)
- P.homing_turn_speed = projectile_turnrate
- P.homing_inaccuracy_min = projectile_pixel_homing_spread
- P.homing_inaccuracy_max = projectile_pixel_homing_spread
- P.set_homing_target(current_target_weakref.resolve())
- var/rand_spr = rand()
- var/total_angle = projectile_initial_spread_amount * 2
- var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5)
- var/one_fire_angle = adjusted_angle / projectiles_per_fire
- var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2)
- P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount)
- P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount)
- P.preparePixelProjectile(target, user, null, current_angle)
diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm
index 57325e685f4d..225c36580e49 100644
--- a/code/modules/spells/spell_types/charge.dm
+++ b/code/modules/spells/spell_types/charge.dm
@@ -51,20 +51,6 @@
I.used = FALSE
charged_item = I
break
- else if(istype(item, /obj/item/gun/magic))
- var/obj/item/gun/magic/I = item
- if(prob(80) && !I.can_charge)
- I.max_charges--
- if(I.max_charges <= 0)
- I.max_charges = 0
- burnt_out = TRUE
- I.charges = I.max_charges
- if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0)
- var/obj/item/gun/magic/W = item
- W.icon_state = initial(W.icon_state)
- I.recharge_newshot()
- charged_item = I
- break
else if(istype(item, /obj/item/stock_parts/cell))
var/obj/item/stock_parts/cell/C = item
if(!C.self_recharge)
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 6631d943a3aa..421b7f40f11c 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -84,7 +84,7 @@
invocation_type = INVOCATION_SHOUT
range = 2
- projectile_type = /obj/projectile/magic/aoe/fireball/infernal
+ projectile_type = /obj/projectile/magic
action_background_icon_state = "bg_demon"
@@ -107,7 +107,7 @@
if(istype(user.loc, /obj/effect/dummy/phased_mob/slaughter/))
if(valid_location(user))
to_chat(user, "You are now phasing in.")
- if(do_mob(user,user,150))
+ if(do_after(user, 1.5 SECONDS, user))
if(valid_location(user))
user.infernalphasein()
else
@@ -121,7 +121,7 @@
user.notransform = TRUE
user.fakefire()
to_chat(src, "You begin to phase back into sinful flames.")
- if(do_mob(user,user,150))
+ if(do_after(user, 1.5 SECONDS, user))
user.infernalphaseout()
else
to_chat(user, "You must remain still while exiting.")
diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm
deleted file mode 100644
index 3f400a8fb4bc..000000000000
--- a/code/modules/spells/spell_types/infinite_guns.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/obj/effect/proc_holder/spell/targeted/infinite_guns
- name = "Lesser Summon Guns"
- desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage."
- invocation_type = "none"
- include_user = TRUE
- range = -1
-
- school = "conjuration"
- charge_max = 750
- clothes_req = TRUE
- cooldown_min = 10 //Gun wizard
- action_icon_state = "bolt_action"
- var/summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
- for(var/mob/living/carbon/C in targets)
- C.drop_all_held_items()
- var/GUN = new summon_path
- C.put_in_hands(GUN)
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/gun
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
- name = "Arcane Barrage"
- desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun."
- action_icon_state = "arcane_barrage"
- summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index c8d1c4a7c027..720670e3fc21 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -49,7 +49,7 @@
playsound(user, 'sound/effects/pope_entry.ogg', 100)
- if(!do_after(M, 50, needhand=FALSE, target=marked_item))
+ if(!do_after(M, 50, target=marked_item, timed_action_flags = IGNORE_HELD_ITEM))
to_chat(M, "Your soul snaps back to your body as you stop ensouling [marked_item]!")
return
diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm
index 3231d22170e1..85f211511135 100644
--- a/code/modules/spells/spell_types/lightning.dm
+++ b/code/modules/spells/spell_types/lightning.dm
@@ -28,7 +28,7 @@
halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER)
user.add_overlay(halo)
playsound(get_turf(user), Snd, 50, FALSE)
- if(do_mob(user,user,100,1))
+ if(do_after(user, 10 SECONDS, user, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)))
if(ready && cast_check(skipcharge=1))
choose_targets()
else
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index e79ffb8a491e..ed6d9a9b957d 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -49,60 +49,8 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/energy/laser/scatter,
/obj/item/gun/energy/gravity_gun))
-//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types
-GLOBAL_LIST_INIT(summoned_magic, list(
- /obj/item/book/granter/spell/fireball,
- /obj/item/book/granter/spell/smoke,
- /obj/item/book/granter/spell/blind,
- /obj/item/book/granter/spell/mindswap,
- /obj/item/book/granter/spell/forcewall,
- /obj/item/book/granter/spell/knock,
- /obj/item/book/granter/spell/barnyard,
- /obj/item/book/granter/spell/charge,
- /obj/item/book/granter/spell/summonitem,
- /obj/item/gun/magic/wand/nothing,
- /obj/item/gun/magic/wand/death,
- /obj/item/gun/magic/wand/resurrection,
- /obj/item/gun/magic/wand/polymorph,
- /obj/item/gun/magic/wand/teleport,
- /obj/item/gun/magic/wand/door,
- /obj/item/gun/magic/wand/fireball,
- /obj/item/gun/magic/staff/healing,
- /obj/item/gun/magic/staff/door,
- /obj/item/scrying,
- /obj/item/voodoo,
- /obj/item/warpwhistle,
- /obj/item/clothing/suit/space/hardsuit/shielded/wizard,
- /obj/item/immortality_talisman,
- /obj/item/melee/ghost_sword))
-
-GLOBAL_LIST_INIT(summoned_special_magic, list(
- /obj/item/gun/magic/staff/change,
- /obj/item/gun/magic/staff/animate,
- /obj/item/storage/belt/wands/full,
- /obj/item/antag_spawner/contract,
- /obj/item/gun/magic/staff/chaos,
- /obj/item/necromantic_stone,
- /obj/item/blood_contract))
-
-//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways)
-GLOBAL_LIST_INIT(summoned_magic_objectives, list(
- /obj/item/antag_spawner/contract,
- /obj/item/blood_contract,
- /obj/item/clothing/suit/space/hardsuit/shielded/wizard,
- /obj/item/gun/magic,
- /obj/item/immortality_talisman,
- /obj/item/melee/ghost_sword,
- /obj/item/necromantic_stone,
- /obj/item/scrying,
- /obj/item/spellbook,
- /obj/item/storage/belt/wands/full,
- /obj/item/voodoo,
- /obj/item/warpwhistle))
-
// If true, it's the probability of triggering "survivor" antag.
GLOBAL_VAR_INIT(summon_guns_triggered, FALSE)
-GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
/proc/give_guns(mob/living/carbon/human/H)
if(H.stat == DEAD || !(H.client))
@@ -125,54 +73,19 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
to_chat(H, "\A [G] appears [in_hand ? "in your hand" : "at your feet"]!")
-/proc/give_magic(mob/living/carbon/human/H)
- if(H.stat == DEAD || !(H.client))
- return
- if(H.mind)
- if(iswizard(H) || H.mind.has_antag_datum(/datum/antagonist/survivalist/magic))
- return
-
- if(prob(GLOB.summon_magic_triggered) && !(H.mind.has_antag_datum(/datum/antagonist)))
- H.mind.add_antag_datum(/datum/antagonist/survivalist/magic)
- H.log_message("was made into a survivalist, and trusts no one!", LOG_ATTACK, color="red")
-
- var/magic_type = pick(GLOB.summoned_magic)
- var/lucky = FALSE
- if(prob(SPECIALIST_MAGIC_PROB))
- magic_type = pick(GLOB.summoned_special_magic)
- lucky = TRUE
-
- var/obj/item/M = new magic_type(get_turf(H))
- playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE)
-
- var/in_hand = H.put_in_hands(M)
-
- to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!")
- if(lucky)
- to_chat(H, "You feel incredibly lucky.")
-
-
-/proc/rightandwrong(summon_type, mob/user, survivor_probability)
- if(user) //in this case either someone holding a spellbook or a badmin
- to_chat(user, "You summoned [summon_type]!")
- message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!")
- log_game("[key_name(user)] summoned [summon_type]!")
+/proc/rightandwrong(mob/user, survivor_probability)
+ if(user) //in this case someone is a badmin
+ to_chat(user, "You summoned guns!")
+ message_admins("[ADMIN_LOOKUPFLW(user)] summoned guns!")
+ log_game("[key_name(user)] summoned guns!")
- if(summon_type == SUMMON_MAGIC)
- GLOB.summon_magic_triggered = survivor_probability
- else if(summon_type == SUMMON_GUNS)
- GLOB.summon_guns_triggered = survivor_probability
- else
- CRASH("Bad summon_type given: [summon_type]")
+ GLOB.summon_guns_triggered = survivor_probability
for(var/mob/living/carbon/human/H in GLOB.player_list)
var/turf/T = get_turf(H)
if(T && is_away_level(T))
continue
- if(summon_type == SUMMON_MAGIC)
- give_magic(H)
- else
- give_guns(H)
+ give_guns(H)
/proc/summonevents()
if(!SSevents.wizardmode)
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index 65eb0cebb2b3..254a43dc23af 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -19,7 +19,6 @@
var/mob/living/shapeshift_type
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\
/mob/living/simple_animal/pet/dog/corgi,\
- /mob/living/simple_animal/hostile/carp/ranged/chaos,\
/mob/living/simple_animal/bot/secbot/ed209,\
/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\
/mob/living/simple_animal/hostile/construct/juggernaut)
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 398d937cc586..61bbb88ab545 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -137,7 +137,6 @@
var/wired = FALSE
var/obj/item/stock_parts/cell/cell = null
-
/obj/item/bodypart/chest/robot/handle_atom_del(atom/A)
if(A == cell)
cell = null
@@ -191,7 +190,6 @@
cell.forceMove(drop_location())
cell = null
-
/obj/item/bodypart/chest/robot/examine(mob/user)
. = ..()
if(cell)
@@ -214,7 +212,6 @@
cell = null
..()
-
/obj/item/bodypart/head/robot
name = "cyborg head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
@@ -304,7 +301,6 @@
to_chat(user, "There is no flash to remove from [src].")
return TRUE
-
/obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal)
if(flash1)
flash1.forceMove(user.loc)
@@ -314,9 +310,6 @@
flash2 = null
..()
-
-
-
/obj/item/bodypart/l_arm/robot/surplus
name = "surplus prosthetic left arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 0c200df9f6b1..283ee77971eb 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -149,6 +149,9 @@
/obj/item/organ/eyes/robotic/lizard
eye_icon_state = "eyes_synth"
+/obj/item/organ/eyes/robotic/kepori
+ eye_icon_state = "eyes_kepori_synth"
+
/obj/item/organ/eyes/robotic/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 4b5dd9a49717..b8871b21524e 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -38,7 +38,7 @@
/obj/item/organ/Initialize()
. = ..()
if(organ_flags & ORGAN_EDIBLE)
- AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, CALLBACK(src, PROC_REF(OnEatFrom)))
+ AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, COLOR_PINK, CALLBACK(src, PROC_REF(OnEatFrom)))
///When you take a bite you cant jam it in for surgery anymore.
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index ebe3f2e9df33..10aad97cd021 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -21,7 +21,13 @@
/datum/language/moffic,
/datum/language/sylvan,
/datum/language/shadowtongue,
- /datum/language/ratvar
+ /datum/language/ratvar,
+// [CELADON-ADD] - CELADON_ITEMS
+ /datum/language/elysm,
+ /datum/language/alquadim,
+ /datum/language/thayoss,
+ /datum/language/fuyo
+// [/CELADON-ADD]
))
/obj/item/organ/tongue/Initialize(mapload)
diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm
index 94209d276aa2..f87c6e1bb923 100644
--- a/code/modules/surgery/surgery_helpers.dm
+++ b/code/modules/surgery/surgery_helpers.dm
@@ -85,7 +85,7 @@
/proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user)
var/selected_zone = user.zone_selected
to_chat(user, "You begin to cancel \the [S].")
- if (!do_mob(user, M, 3 SECONDS))
+ if (!do_after(user, 3 SECONDS, M))
return
if(S.status == 1)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index f58f94df84dd..eaa0a631ec5d 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1712,13 +1712,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/flashlight/lantern/syndicate
restricted_species = list("moth") //End WS edit
-/datum/uplink_item/race_restricted/syndigenetics
- name = "Fire Breath"
- desc = "One of our subsidiaries, 23AndMe, have recently found the formula of backtracking lizard's genetic trail and giving them the ability to breathe fire, much like their dragon ancestors."
- cost = 5
- item = /obj/item/dnainjector/firebreath
- restricted_species = list("lizard")
-
/datum/uplink_item/race_restricted/razorwing
name = "Razorwing Implant"
desc = "Put those wings to good use! This implant makes your wingtips razor sharp and gives you the ability to flourish them, slicing anyone in range."
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index 6b53fa9a02c3..d3040f862863 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -80,7 +80,7 @@
if(occupant_amount() >= max_occupants)
return FALSE
var/atom/old_loc = loc
- if(do_mob(forcer, M, get_enter_delay(M), extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc)))
+ if(do_after(forcer, get_enter_delay(M), M, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc)))
mob_forced_enter(M, silent)
return TRUE
return FALSE
diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm
index c9e990372374..fa3d569b0535 100644
--- a/code/modules/vehicles/motorized_wheelchair.dm
+++ b/code/modules/vehicles/motorized_wheelchair.dm
@@ -5,7 +5,7 @@
max_integrity = 150
var/speed = 2
var/power_efficiency = 1
- var/power_usage = 100
+ var/power_usage = 20
var/panel_open = FALSE
var/list/required_parts = list(/obj/item/stock_parts/manipulator,
/obj/item/stock_parts/manipulator,
@@ -21,7 +21,7 @@
for(var/obj/item/stock_parts/manipulator/M in contents)
speed += M.rating
for(var/obj/item/stock_parts/capacitor/C in contents)
- power_efficiency = C.rating
+ power_efficiency = (C.rating + 1)
var/datum/component/riding/D = GetComponent(/datum/component/riding)
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * delay_multiplier) / speed
@@ -52,7 +52,7 @@
canmove = FALSE
addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20)
return FALSE
- power_cell.use(power_usage / max(power_efficiency, 1))
+ power_cell.use(power_usage / max(power_efficiency, 2))
return ..()
/obj/vehicle/ridden/wheelchair/motorized/set_move_delay(mob/living/user)
diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm
index 6751ddfe3580..22b1eb42becb 100644
--- a/code/modules/vehicles/sealed.dm
+++ b/code/modules/vehicles/sealed.dm
@@ -29,7 +29,7 @@
return FALSE
if(occupant_amount() >= max_occupants)
return FALSE
- if(do_after(M, get_enter_delay(M), FALSE, src, TRUE))
+ if(do_after(M, get_enter_delay(M), src, progress = TRUE, timed_action_flags = IGNORE_HELD_ITEM))
mob_enter(M)
return TRUE
return FALSE
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 2914d6dda279..4d327c7a8234 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -47,7 +47,7 @@
if(istype(W, /obj/item/reagent_containers/food/snacks/grown/banana))
// ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now!
user.visible_message("[user] begins stuffing [W] into [src]'s tailpipe.", "You begin stuffing [W] into [src]'s tailpipe...", ignored_mobs = occupants)
- if(do_after(user, 30, TRUE, src))
+ if(do_after(user, 30, src))
if(user.transferItemToLoc(W, src))
user.visible_message("[user] stuffs [W] into [src]'s tailpipe.", "You stuff [W] into [src]'s tailpipe.", ignored_mobs = occupants)
eddie_murphy = W
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 4c97b3f7eaa2..6d73fad566f6 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -714,15 +714,13 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/ui_data(mob/user)
. = list()
var/mob/living/carbon/human/H
- var/obj/item/card/id/card
+ var/obj/item/card/bank/card
if(ishuman(user))
H = user
- card = H.get_idcard(TRUE)
+ card = H.get_bankcard()
if(card)
.["user"] = list()
.["user"]["points"] = card.mining_points
- .["user"]["name"] = card.registered_name
- .["user"]["job"] = card.assignment || "No Job"
if(card.registered_account)
.["user"]["name"] = card.registered_account.account_holder
.["user"]["cash"] = card.registered_account.account_balance
@@ -769,7 +767,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
return
if(!all_items_free && ishuman(usr))
var/mob/living/carbon/human/H = usr
- var/obj/item/card/id/C = H.get_idcard(TRUE)
+ var/obj/item/card/bank/C = H.get_bankcard()
if(!C)
say("No card found.")
@@ -946,10 +944,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/custom/compartmentLoadAccessCheck(mob/user)
. = FALSE
var/mob/living/carbon/human/H
- var/obj/item/card/id/C
+ var/obj/item/card/bank/C
if(ishuman(user))
H = user
- C = H.get_idcard(FALSE)
+ C = H.get_bankcard(FALSE)
if(C?.registered_account && C.registered_account == private_a)
return TRUE
@@ -1003,7 +1001,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
vend_ready = FALSE
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
- var/obj/item/card/id/C = H.get_idcard(TRUE)
+ var/obj/item/card/bank/C = H.get_bankcard()
if(!C)
say("No card found.")
@@ -1055,10 +1053,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/custom/attackby(obj/item/I, mob/user, params)
if(!private_a)
var/mob/living/carbon/human/H
- var/obj/item/card/id/C
+ var/obj/item/card/bank/C
if(ishuman(user))
H = user
- C = H.get_idcard(TRUE)
+ C = H.get_bankcard(TRUE)
if(C?.registered_account)
private_a = C.registered_account
say("\The [src] has been linked to [C].")
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 04ae257730f2..367c309d59a1 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -112,7 +112,6 @@
/obj/item/gohei = 1,
/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
- /obj/item/gun/magic/wand/nothing = 2,
/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/glasses/blindfold = 1,
/obj/item/clothing/mask/muzzle = 2)
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 1b7b2d9e5ccb..45dc055e1b21 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -3,7 +3,7 @@
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "boozeomat"
icon_deny = "boozeomat-deny"
- products = list(
+ products = list( // All of drink dispenser reagents should be available here.
/obj/item/reagent_containers/food/drinks/drinkingglass = 30,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12,
/obj/item/reagent_containers/food/drinks/modglass/small = 10,
@@ -11,18 +11,31 @@
/obj/item/reagent_containers/food/drinks/modglass/large = 10,
/obj/item/reagent_containers/food/drinks/flask = 3,
/obj/item/reagent_containers/food/drinks/ice = 10,
+ /obj/item/reagent_containers/food/drinks/waterbottle/large = 6,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/limejuice = 4,
+ /obj/item/reagent_containers/food/drinks/bottle/lemonjuice = 4,
+ /obj/item/reagent_containers/food/drinks/bottle/pineapplejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/cream = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 8,
+ /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/tonic = 8,
- /obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 15,
- /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 8,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 8,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/vimukti = 4,
/obj/item/reagent_containers/food/drinks/bottle/grenadine = 4,
/obj/item/reagent_containers/food/drinks/bottle/menthol = 4,
+ /obj/item/reagent_containers/food/drinks/mug/tea = 8,
+ /obj/item/reagent_containers/food/drinks/coffee = 8,
/obj/item/reagent_containers/food/drinks/ale = 6,
- /obj/item/reagent_containers/food/drinks/beer = 6,
+ /obj/item/reagent_containers/food/drinks/beer = 8,
/obj/item/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/reagent_containers/food/drinks/bottle/tequila = 5,
@@ -38,7 +51,10 @@
/obj/item/reagent_containers/food/drinks/bottle/amaretto = 5,
/obj/item/reagent_containers/food/drinks/bottle/sake = 5,
/obj/item/reagent_containers/food/drinks/bottle/applejack = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/triplesec = 5,
/obj/item/reagent_containers/food/drinks/bottle/coconut = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/cacao = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/menthe = 5,
/obj/item/reagent_containers/food/drinks/bottle = 15,
/obj/item/reagent_containers/food/drinks/bottle/small = 15,
/obj/item/garnish/olives = 10,
@@ -46,16 +62,16 @@
/obj/item/garnish/umbrellablue = 10,
/obj/item/garnish/umbrellagreen = 10
)
- contraband = list(
- /obj/item/reagent_containers/food/drinks/mug/tea = 12,
- /obj/item/reagent_containers/food/drinks/bottle/fernet = 5)
+ contraband = list()
premium = list(
/obj/item/reagent_containers/glass/bottle/ethanol = 4,
+ /obj/item/reagent_containers/glass/bottle/sugar = 3,
+ /obj/item/reagent_containers/food/drinks/bottle/fernet = 5,
/obj/item/reagent_containers/food/drinks/bottle/champagne = 5,
/obj/item/reagent_containers/food/drinks/bottle/trappist = 5)
- product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty 'round this sector?"
- product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
+ product_slogans = "I hope nobody asks me for a cup of tea...;Alcohol is everyone's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty 'round this sector?"
+ product_ads = "Drink up!;Booze is good for you!;Alcohol is everyone's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 53 FSC!;Award-winning wine!;Maximum alcohol!;Everyone loves beer.;A toast for progress!"
req_access = list(ACCESS_BAR)
refill_canister = /obj/item/vending_refill/boozeomat
default_price = 120
diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm
index 3cff7d3c361d..1c377c309464 100644
--- a/code/modules/vending/cigarette.dm
+++ b/code/modules/vending/cigarette.dm
@@ -1,8 +1,8 @@
/obj/machinery/vending/cigarette
name = "\improper ShadyCigs Deluxe"
desc = "If you want to get cancer, might as well do it in style."
- product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
- product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
+ product_slogans = "Space cigs taste good like a cigarette should.;I'd rather die than switch.;Smoke!;Don't believe the reports - smoke today!"
+ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 150 FSC.;Award-winning cigs."
icon_state = "cigs"
products = list(
/obj/item/storage/fancy/cigarettes = 5,
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index 4a9f4a456eee..84f82d81a2e2 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -1,35 +1,34 @@
/obj/machinery/vending/cola
- name = "\improper Robust Softdrinks"
- desc = "A softdrink vendor provided by Robust Industries, LLC."
+ name = "\improper RobustMore Softdrinks"
+ desc = "A softdrink vendor provided by RobustMore DrinkFoods Industries, LLC."
icon_state = "Cola_Machine"
- product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
- product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
+ product_slogans = "RobustMore Softdrinks: More robust than a toolbox to the head!"
+ product_ads = "Refreshing!;Hope you're thirsty!;Over 10 trillion drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks this side of the galaxy."
products = list(
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
/obj/item/reagent_containers/food/drinks/waterbottle = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/efuel = 5,
- /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
- /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
+ /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/vimukti = 6,
+ /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch = 6)
premium = list(
- /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/air = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1)
+ /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans/crosstalk = 1)
refill_canister = /obj/item/vending_refill/cola
default_price = 45
extra_price = 200
/obj/item/vending_refill/cola
- machine_name = "Robust Softdrinks"
+ machine_name = "RobustMore Softdrinks"
icon_state = "refill_cola"
/obj/machinery/vending/cola/random
@@ -54,9 +53,9 @@
/obj/machinery/vending/cola/red
icon_state = "red_cola"
- name = "\improper Space Cola Vendor"
- desc = "It vends cola, in space."
- product_slogans = "Cola in space!"
+ name = "\improper Master Cola Vendor"
+ desc = "This vending machine offers Master Cola. Master Cola - have a drink from the past!"
+ product_slogans = "Master Cola - have a drink from the past!"
light_mask = "red_cola-light-mask"
light_color = COLOR_DARK_RED
@@ -70,9 +69,9 @@
/obj/machinery/vending/cola/starkist
icon_state = "starkist"
- name = "\improper Star-kist Vendor"
- desc = "The taste of a star in liquid form."
- product_slogans = "Drink the stars! Star-kist!"
+ name = "\improper Lunapunch Vendor"
+ desc = "What keeps the colonies running - Lunapunch."
+ product_slogans = "The Colonies run on Lunapunch!"
light_mask = "starkist-light-mask"
light_color = COLOR_LIGHT_ORANGE
@@ -83,27 +82,27 @@
/obj/machinery/vending/cola/pwr_game
icon_state = "pwr_game"
- name = "\improper Pwr Game Vendor"
- desc = "You want it, we got it. Brought to you in partnership with Vlad's Salads."
- product_slogans = "The POWER that gamers crave! PWR GAME!"
+ name = "\improper PAC-Fuel Vendor"
+ desc = "PAC-Fuel: stay flying straight. Enter the code on every can for a chance to win gamer merch or industrial equipment!"
+ product_slogans = "Keep flying steady with PAC-Fuel!"
light_mask = "pwr_game-light-mask"
light_color = COLOR_STRONG_VIOLET
/obj/machinery/vending/cola/shamblers
- name = "\improper Shambler's Vendor"
- desc = "~Shake me up some of that Shambler's Juice!~"
+ name = "\improper Shoal Punch Vendor"
+ desc = "Every fruit you could want, at your beak! Shoal Punch!"
icon_state = "shamblers_juice"
products = list(
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 10)
- product_slogans = "~Shake me up some of that Shambler's Juice!~"
- product_ads = "Refreshing!;Jyrbv dv lg jfdv fw kyrk Jyrdscvi'j Alztv!;Over 1 trillion souls drank!;Thirsty? Nyp efk uizeb kyv uribevjj?;Kyv Jyrdscvi uizebj kyv ezxyk!;Drink up!;Krjkp."
+ /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch = 10)
+ product_slogans = "very fruit you could want, at your beak! Shoal Punch!"
+ product_ads = "Every fruit you could want, at your beak!;Don't go flying dry!;Over two trillion served!;Thirsty? Get punched!;Skrikira trikxti skrmikr rakti!;Don't go dry, get Shoal Punch."
light_mask = "shamblers-light-mask"
light_color = COLOR_MOSTLY_PURE_PINK
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm
index 5dbd8ea733db..3e51271093ad 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/drinnerware.dm
@@ -1,7 +1,7 @@
/obj/machinery/vending/dinnerware
name = "\improper Plasteel Chef's Dinnerware Vendor"
desc = "A kitchen and restaurant equipment vendor."
- product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
+ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils."
icon_state = "dinnerware"
products = list(
/obj/item/storage/bag/tray = 8,
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index d27a1f6ffe6e..c803fa347e9f 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -1,7 +1,7 @@
/obj/machinery/vending/games
name = "\improper Good Clean Fun"
desc = "Vends things that the Captain and Head of Personnel are probably not going to appreciate you fiddling with instead of your job..."
- product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!"
+ product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Fun times forever!"
icon_state = "games"
products = list(
/obj/item/toy/cards/deck = 5,
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
index 03d532c804e7..5f06b35f76b5 100644
--- a/code/modules/vending/liberation.dm
+++ b/code/modules/vending/liberation.dm
@@ -2,7 +2,7 @@
name = "\improper Liberation Station"
desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine."
icon_state = "liberationstation"
- product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
+ product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!"
product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
vend_reply = "Remember the name: Liberation Station!"
products = list(
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 989bd721a79c..911a190703f4 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -2,8 +2,8 @@
name = "\improper Syndicate Donksoft Toy Vendor"
desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!"
icon_state = "syndi"
- product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!"
- product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
+ product_slogans = "Get your cool toys today!;Quality toy weapons for cheap prices!"
+ product_ads = "Feel tough with your toys!;Express your inner child today!;Toy weapons don't kill people, but boredom does!;Who needs responsibilities when you have toy weapons?;Make your next foam fight FUN!"
vend_reply = "Come back for more!"
circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
products = list(/obj/item/gun/ballistic/automatic/toy = 10,
diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm
index d0130d7358fc..45d76a4754fa 100644
--- a/code/modules/vending/snack.dm
+++ b/code/modules/vending/snack.dm
@@ -1,8 +1,8 @@
/obj/machinery/vending/snack
name = "\improper Getmore Chocolate Corp"
- desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
+ desc = "A snack machine courtesy of the RobustMore DrinkFoods LLC."
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
- product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
+ product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Have a snack.;Snacks are good for you!;Have something better! Get RobustMore!;Best quality snacks!;We love chocolate!;Try our new jerky!"
icon_state = "snack"
light_mask = "snack-light-mask"
products = list(
@@ -24,7 +24,7 @@
input_display_header = "Chef's Food Selection"
/obj/item/vending_refill/snack
- machine_name = "Getmore Chocolate Corp"
+ machine_name = "RobustMore DrinkFoods LLC"
/obj/machinery/vending/snack/random
name = "\improper Random Snackies"
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index 8fefa1015536..a5092cf7373f 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -2,8 +2,8 @@
name = "\improper Donksoft Toy Vendor"
desc = "Ages 8 and up approved vendor that dispenses toys."
icon_state = "nt-donk"
- product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!"
- product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
+ product_slogans = "Get your cool toys today!;Quality toy weapons for cheap prices!"
+ product_ads = "Feel tough with your toys!;Express your inner child today!;Toy weapons don't kill people, but bordeom does!;Who needs responsibilities when you have toy weapons?;Make your next foam fight FUN!"
vend_reply = "Come back for more!"
light_mask = "donksoft-light-mask"
circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor
diff --git a/icons/blanks/64x64.dmi b/icons/blanks/64x64.dmi
new file mode 100644
index 000000000000..6bfbd471e5db
Binary files /dev/null and b/icons/blanks/64x64.dmi differ
diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi
index b64b8f0427e2..bab677d404e9 100644
Binary files a/icons/effects/ore_visuals.dmi and b/icons/effects/ore_visuals.dmi differ
diff --git a/icons/hud/gun_hud.dmi b/icons/hud/gun_hud.dmi
index a24f7f2964f3..d108a6088e8f 100644
Binary files a/icons/hud/gun_hud.dmi and b/icons/hud/gun_hud.dmi differ
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
index c52e55c475a6..9baf5cdde9b3 100644
Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/mob/augmentation/augments_kepori.dmi b/icons/mob/augmentation/augments_kepori.dmi
index 56e56dd22db5..e86bdfd9cf2d 100644
Binary files a/icons/mob/augmentation/augments_kepori.dmi and b/icons/mob/augmentation/augments_kepori.dmi differ
diff --git a/icons/mob/augmentation/augments_keporiOLD.dmi b/icons/mob/augmentation/augments_keporiOLD.dmi
new file mode 100644
index 000000000000..56e56dd22db5
Binary files /dev/null and b/icons/mob/augmentation/augments_keporiOLD.dmi differ
diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi
index d23ebfae4756..7e87f94fd183 100644
Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ
diff --git a/icons/mob/clothing/faction/clip/head.dmi b/icons/mob/clothing/faction/clip/head.dmi
index 71edbf436e96..5679758b2f61 100644
Binary files a/icons/mob/clothing/faction/clip/head.dmi and b/icons/mob/clothing/faction/clip/head.dmi differ
diff --git a/icons/mob/clothing/faction/clip/suits.dmi b/icons/mob/clothing/faction/clip/suits.dmi
index 785040d022fe..c68ab77196bb 100644
Binary files a/icons/mob/clothing/faction/clip/suits.dmi and b/icons/mob/clothing/faction/clip/suits.dmi differ
diff --git a/icons/mob/clothing/faction/clip/vox.dmi b/icons/mob/clothing/faction/clip/vox.dmi
index 882e41864ea0..e17d23fba20f 100644
Binary files a/icons/mob/clothing/faction/clip/vox.dmi and b/icons/mob/clothing/faction/clip/vox.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/belt.dmi b/icons/mob/clothing/faction/frontiersmen/belt.dmi
new file mode 100644
index 000000000000..a36573e66f5d
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/belt.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/head.dmi b/icons/mob/clothing/faction/frontiersmen/head.dmi
new file mode 100644
index 000000000000..03f2024b1e88
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/head.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/mask.dmi b/icons/mob/clothing/faction/frontiersmen/mask.dmi
new file mode 100644
index 000000000000..ecd716cdea0d
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/mask.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/suits.dmi b/icons/mob/clothing/faction/frontiersmen/suits.dmi
new file mode 100644
index 000000000000..50657c4df15e
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/suits.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/uniforms.dmi b/icons/mob/clothing/faction/frontiersmen/uniforms.dmi
new file mode 100644
index 000000000000..6dad817d6b64
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/uniforms.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/belt.dmi b/icons/mob/clothing/faction/hardliners/belt.dmi
new file mode 100644
index 000000000000..a864128547d6
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/belt.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/eyes.dmi b/icons/mob/clothing/faction/hardliners/eyes.dmi
new file mode 100644
index 000000000000..aec97963fd99
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/eyes.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/head.dmi b/icons/mob/clothing/faction/hardliners/head.dmi
new file mode 100644
index 000000000000..839826a7c426
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/head.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/suits.dmi b/icons/mob/clothing/faction/hardliners/suits.dmi
new file mode 100644
index 000000000000..05f41eb00d25
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/suits.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/uniforms.dmi b/icons/mob/clothing/faction/hardliners/uniforms.dmi
new file mode 100644
index 000000000000..8726f50b2f54
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/uniforms.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/head.dmi b/icons/mob/clothing/faction/ngr/head.dmi
index 08af6ee9ba08..c370f07aa0f3 100644
Binary files a/icons/mob/clothing/faction/ngr/head.dmi and b/icons/mob/clothing/faction/ngr/head.dmi differ
diff --git a/icons/mob/clothing/faction/srm/head.dmi b/icons/mob/clothing/faction/srm/head.dmi
new file mode 100644
index 000000000000..186d021abeb3
Binary files /dev/null and b/icons/mob/clothing/faction/srm/head.dmi differ
diff --git a/icons/mob/clothing/faction/srm/suits.dmi b/icons/mob/clothing/faction/srm/suits.dmi
new file mode 100644
index 000000000000..801414dceec7
Binary files /dev/null and b/icons/mob/clothing/faction/srm/suits.dmi differ
diff --git a/icons/mob/clothing/faction/srm/uniforms.dmi b/icons/mob/clothing/faction/srm/uniforms.dmi
new file mode 100644
index 000000000000..b43a33a34e8d
Binary files /dev/null and b/icons/mob/clothing/faction/srm/uniforms.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index c2a73da609b9..f207b2bfd826 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head/spacesuits.dmi b/icons/mob/clothing/head/spacesuits.dmi
index 12923a0e281c..55a7f69de51f 100644
Binary files a/icons/mob/clothing/head/spacesuits.dmi and b/icons/mob/clothing/head/spacesuits.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index 2b54aa38a584..bfcc9970930f 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index fe74923b657d..f168673850e0 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/mob/clothing/species/kepori.dmi b/icons/mob/clothing/species/kepori.dmi
index cfa1f108dc68..1586e80e9b19 100644
Binary files a/icons/mob/clothing/species/kepori.dmi and b/icons/mob/clothing/species/kepori.dmi differ
diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi
index d64a4cbbf04f..4c37ff4d8bff 100644
Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ
diff --git a/icons/mob/clothing/suits/spacesuits.dmi b/icons/mob/clothing/suits/spacesuits.dmi
index ee9896871a91..da5075195992 100644
Binary files a/icons/mob/clothing/suits/spacesuits.dmi and b/icons/mob/clothing/suits/spacesuits.dmi differ
diff --git a/icons/mob/clothing/suits/toggle.dmi b/icons/mob/clothing/suits/toggle.dmi
index 8ceffd1312c0..99fddcf51169 100644
Binary files a/icons/mob/clothing/suits/toggle.dmi and b/icons/mob/clothing/suits/toggle.dmi differ
diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi
new file mode 100644
index 000000000000..166e1a7624d9
Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi differ
diff --git a/icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi
similarity index 100%
rename from icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi
rename to icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi
diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi
new file mode 100644
index 000000000000..6fe4e042f679
Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi differ
diff --git a/icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi
similarity index 100%
rename from icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi
rename to icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi
diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi
new file mode 100644
index 000000000000..1a6a59cd5241
Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi differ
diff --git a/icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_keporiOLD.dmi
similarity index 100%
rename from icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi
rename to icons/mob/clothing/underwear/species/kepori/underwear_torso_keporiOLD.dmi
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 3926bce0f3b1..dced69dc5b6f 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/misc/food_lefthand.dmi b/icons/mob/inhands/misc/food_lefthand.dmi
index 740c63c4b370..63dee7bfea44 100644
Binary files a/icons/mob/inhands/misc/food_lefthand.dmi and b/icons/mob/inhands/misc/food_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/food_righthand.dmi b/icons/mob/inhands/misc/food_righthand.dmi
index 1e90ac3cb75a..bb1bd3f960fb 100644
Binary files a/icons/mob/inhands/misc/food_righthand.dmi and b/icons/mob/inhands/misc/food_righthand.dmi differ
diff --git a/icons/mob/kepori_parts.dmi b/icons/mob/kepori_parts.dmi
deleted file mode 100644
index 8f9d7e56043e..000000000000
Binary files a/icons/mob/kepori_parts.dmi and /dev/null differ
diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi
index 83729d2a2ba4..133544acc999 100644
Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ
diff --git a/icons/mob/species/kepori/bodyparts.dmi b/icons/mob/species/kepori/bodyparts.dmi
index f19aaeacbe08..058d315d7bd8 100644
Binary files a/icons/mob/species/kepori/bodyparts.dmi and b/icons/mob/species/kepori/bodyparts.dmi differ
diff --git a/icons/mob/species/kepori/kepori_eyes.dmi b/icons/mob/species/kepori/kepori_eyes.dmi
new file mode 100644
index 000000000000..3e1617315755
Binary files /dev/null and b/icons/mob/species/kepori/kepori_eyes.dmi differ
diff --git a/icons/mob/species/kepori/kepori_parts.dmi b/icons/mob/species/kepori/kepori_parts.dmi
new file mode 100644
index 000000000000..76d1819c9dd8
Binary files /dev/null and b/icons/mob/species/kepori/kepori_parts.dmi differ
diff --git a/icons/mob/species/kepori/onmob_belt_kepori.dmi b/icons/mob/species/kepori/onmob_belt_kepori.dmi
index cf74d73796c8..4a5a4ba7b32a 100644
Binary files a/icons/mob/species/kepori/onmob_belt_kepori.dmi and b/icons/mob/species/kepori/onmob_belt_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi b/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi
new file mode 100644
index 000000000000..cf74d73796c8
Binary files /dev/null and b/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_ears_kepori.dmi b/icons/mob/species/kepori/onmob_ears_kepori.dmi
new file mode 100644
index 000000000000..4a5a4ba7b32a
Binary files /dev/null and b/icons/mob/species/kepori/onmob_ears_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_eyes_kepori.dmi b/icons/mob/species/kepori/onmob_eyes_kepori.dmi
index 2cfe52f4630d..1b6c6f68a3a5 100644
Binary files a/icons/mob/species/kepori/onmob_eyes_kepori.dmi and b/icons/mob/species/kepori/onmob_eyes_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi b/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi
new file mode 100644
index 000000000000..2cfe52f4630d
Binary files /dev/null and b/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_feet_kepori.dmi b/icons/mob/species/kepori/onmob_feet_kepori.dmi
index 7af39a1f676d..93bb6ee443d5 100644
Binary files a/icons/mob/species/kepori/onmob_feet_kepori.dmi and b/icons/mob/species/kepori/onmob_feet_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi
new file mode 100644
index 000000000000..f352a422378a
Binary files /dev/null and b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_hands_kepori.dmi b/icons/mob/species/kepori/onmob_hands_kepori.dmi
index 6dff1607ef57..1cd287411171 100644
Binary files a/icons/mob/species/kepori/onmob_hands_kepori.dmi and b/icons/mob/species/kepori/onmob_hands_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi
new file mode 100644
index 000000000000..6dff1607ef57
Binary files /dev/null and b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_head_kepori.dmi b/icons/mob/species/kepori/onmob_head_kepori.dmi
index 4109e981c603..b4631838b75a 100644
Binary files a/icons/mob/species/kepori/onmob_head_kepori.dmi and b/icons/mob/species/kepori/onmob_head_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_head_keporiOLD.dmi b/icons/mob/species/kepori/onmob_head_keporiOLD.dmi
new file mode 100644
index 000000000000..31db76896ba2
Binary files /dev/null and b/icons/mob/species/kepori/onmob_head_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_mask_kepori.dmi b/icons/mob/species/kepori/onmob_mask_kepori.dmi
index 610c62338c18..d455cf0bd3e5 100644
Binary files a/icons/mob/species/kepori/onmob_mask_kepori.dmi and b/icons/mob/species/kepori/onmob_mask_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi
new file mode 100644
index 000000000000..610c62338c18
Binary files /dev/null and b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_suit_kepori.dmi b/icons/mob/species/kepori/onmob_suit_kepori.dmi
index 4d5eaaab1196..6182a9612547 100644
Binary files a/icons/mob/species/kepori/onmob_suit_kepori.dmi and b/icons/mob/species/kepori/onmob_suit_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi
new file mode 100644
index 000000000000..4d5eaaab1196
Binary files /dev/null and b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_uniform_kepori.dmi b/icons/mob/species/kepori/onmob_uniform_kepori.dmi
index d9bec6e95185..d6f011cef312 100644
Binary files a/icons/mob/species/kepori/onmob_uniform_kepori.dmi and b/icons/mob/species/kepori/onmob_uniform_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi b/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi
new file mode 100644
index 000000000000..66fa497129f6
Binary files /dev/null and b/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 6fac77253d60..86001423aeba 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index b80be47c795d..712adf5af17f 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/atmospherics/components/binary_devices.dmi
index 0a044c498faa..b666f391e793 100644
Binary files a/icons/obj/atmospherics/components/binary_devices.dmi and b/icons/obj/atmospherics/components/binary_devices.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index e0818c6853df..ecf54fb9f61a 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/faction/clip/head.dmi b/icons/obj/clothing/faction/clip/head.dmi
index b98ec00ea8e8..06962106e6e7 100644
Binary files a/icons/obj/clothing/faction/clip/head.dmi and b/icons/obj/clothing/faction/clip/head.dmi differ
diff --git a/icons/obj/clothing/faction/clip/suits.dmi b/icons/obj/clothing/faction/clip/suits.dmi
index 81e6ee001a2b..8dcc6fa72e9f 100644
Binary files a/icons/obj/clothing/faction/clip/suits.dmi and b/icons/obj/clothing/faction/clip/suits.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/belt.dmi b/icons/obj/clothing/faction/frontiersmen/belt.dmi
new file mode 100644
index 000000000000..01a020e47cfb
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/belt.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/head.dmi b/icons/obj/clothing/faction/frontiersmen/head.dmi
new file mode 100644
index 000000000000..f68169a5be65
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/head.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/mask.dmi b/icons/obj/clothing/faction/frontiersmen/mask.dmi
new file mode 100644
index 000000000000..961d27b0891f
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/mask.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/suits.dmi b/icons/obj/clothing/faction/frontiersmen/suits.dmi
new file mode 100644
index 000000000000..65c817191371
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/suits.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/uniforms.dmi b/icons/obj/clothing/faction/frontiersmen/uniforms.dmi
new file mode 100644
index 000000000000..7228ca93fc81
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/uniforms.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/belt.dmi b/icons/obj/clothing/faction/hardliners/belt.dmi
new file mode 100644
index 000000000000..e8925f9c5d36
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/belt.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/eyes.dmi b/icons/obj/clothing/faction/hardliners/eyes.dmi
new file mode 100644
index 000000000000..2e339c1b510a
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/eyes.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/head.dmi b/icons/obj/clothing/faction/hardliners/head.dmi
new file mode 100644
index 000000000000..5101eeedce9c
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/head.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/suits.dmi b/icons/obj/clothing/faction/hardliners/suits.dmi
new file mode 100644
index 000000000000..39da1c952739
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/suits.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/uniforms.dmi b/icons/obj/clothing/faction/hardliners/uniforms.dmi
new file mode 100644
index 000000000000..233eb500c826
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/uniforms.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/head.dmi b/icons/obj/clothing/faction/ngr/head.dmi
index 822766336620..d2258c5565dd 100644
Binary files a/icons/obj/clothing/faction/ngr/head.dmi and b/icons/obj/clothing/faction/ngr/head.dmi differ
diff --git a/icons/obj/clothing/faction/srm/head.dmi b/icons/obj/clothing/faction/srm/head.dmi
new file mode 100644
index 000000000000..8503fda7e3cf
Binary files /dev/null and b/icons/obj/clothing/faction/srm/head.dmi differ
diff --git a/icons/obj/clothing/faction/srm/suits.dmi b/icons/obj/clothing/faction/srm/suits.dmi
new file mode 100644
index 000000000000..031fb45e3ba6
Binary files /dev/null and b/icons/obj/clothing/faction/srm/suits.dmi differ
diff --git a/icons/obj/clothing/faction/srm/uniforms.dmi b/icons/obj/clothing/faction/srm/uniforms.dmi
new file mode 100644
index 000000000000..ec410e52e600
Binary files /dev/null and b/icons/obj/clothing/faction/srm/uniforms.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index cf7f5ff09bd0..402ce131a988 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/head/spacesuits.dmi b/icons/obj/clothing/head/spacesuits.dmi
index 5c2351c7489f..8befad3b380f 100644
Binary files a/icons/obj/clothing/head/spacesuits.dmi and b/icons/obj/clothing/head/spacesuits.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 049da153701a..3109928ff7ae 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi
index 9eaa67f04a42..232a2f6ec2bd 100644
Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ
diff --git a/icons/obj/clothing/suits/spacesuits.dmi b/icons/obj/clothing/suits/spacesuits.dmi
index c86acdcbf3e5..2208c8b7cf98 100644
Binary files a/icons/obj/clothing/suits/spacesuits.dmi and b/icons/obj/clothing/suits/spacesuits.dmi differ
diff --git a/icons/obj/clothing/suits/toggle.dmi b/icons/obj/clothing/suits/toggle.dmi
index 54df84ad5def..75a2f1a891b3 100644
Binary files a/icons/obj/clothing/suits/toggle.dmi and b/icons/obj/clothing/suits/toggle.dmi differ
diff --git a/icons/obj/drinks/drinks.dmi b/icons/obj/drinks/drinks.dmi
index 03fdf63dd00b..2ab3cd0db5ef 100644
Binary files a/icons/obj/drinks/drinks.dmi and b/icons/obj/drinks/drinks.dmi differ
diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi
index 5d82ef881973..cffb7c94b6e5 100644
Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ
diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi
index 2e102cda95ad..3b50ef08e89a 100644
Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ
diff --git a/icons/obj/nutanks.dmi b/icons/obj/nutanks.dmi
index c325dadf1c32..4365bdb86771 100644
Binary files a/icons/obj/nutanks.dmi and b/icons/obj/nutanks.dmi differ
diff --git a/icons/obj/ores.dmi b/icons/obj/ores.dmi
index 1e6c41a90c05..6ea0ed496e8f 100644
Binary files a/icons/obj/ores.dmi and b/icons/obj/ores.dmi differ
diff --git a/icons/obj/suns_floor.dmi b/icons/obj/suns_floor.dmi
deleted file mode 100644
index c8d416223ccc..000000000000
Binary files a/icons/obj/suns_floor.dmi and /dev/null differ
diff --git a/icons/obj/wallcloset.dmi b/icons/obj/wallcloset.dmi
index 6d41f0ecee85..f2314d0d84c2 100644
Binary files a/icons/obj/wallcloset.dmi and b/icons/obj/wallcloset.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals/decals.dmi
similarity index 100%
rename from icons/turf/decals.dmi
rename to icons/turf/decals/decals.dmi
diff --git a/icons/turf/decals/suns_floor.dmi b/icons/turf/decals/suns_floor.dmi
new file mode 100644
index 000000000000..ffebe3036722
Binary files /dev/null and b/icons/turf/decals/suns_floor.dmi differ
diff --git a/mod_celadon/_example/_example.dm b/mod_celadon/_example/_example.dm
index 863ca042b425..b8db777760d7 100644
--- a/mod_celadon/_example/_example.dm
+++ b/mod_celadon/_example/_example.dm
@@ -1,18 +1,27 @@
+/// name - название модпака. Используется для поиска других модпаков в init.
+/// desc - описание для модпака. Может использоваться для списка глаголов модпака в качестве описания.
+/// author - автор(ы) этого модпака.
+
/datum/modpack/example
- /// Строковое имя модпака. Используется для поиска других модпаков в init.
- name = "НАЗВАНИЕ"
- /// Строковое описание для модпака. Может использоваться для списка глаголов модпака в качестве описания.
- desc = "ОПИСАНИЕ"
- /// Строка с авторами этого модпака.
+ name = "ОСМЫСЛЕННОЕ_ПОНЯТНОЕ_НАЗВАНИЕ"
+ desc = "КОРОТКОЕ_ОПИСАНИЕ_МОДПАКА"
author = "АВТОР(Ы)"
-///**********************************************************************///
+/// Эти проки нужны, для того чтобы инициализировать датумы в определенный момент времени
+/// сборки билда. Инициализация обновляет данные в билде повторно, перезаписывая новыми значениями
+/// из модпака. Но иногда, сама инциализация есть и вызывается в кор коде в определенный момент, и
+/// тогда такие проки не нужны и вовсе. Также проки не нужны если в модпаке только объекты находятся.
+/// Если эти конструкции не нужны, просто закоментируй их!
+/// (можешь использовать все три, но запуск билда увеличится на 0.1 сек, за каждый датум в модпаке)
-/datum/modpack/example/pre_initialize() /// Эти конструкции нужны, для того чтобы в вашем модпаке что-то происходило.
+// Инициализация ДО
+/datum/modpack/example/pre_initialize()
. = ..()
-/datum/modpack/example/initialize() /// Если эти три конструкции не нужны, просто удалите их!
+// Инициализация ВОВРЕМЯ
+/datum/modpack/example/initialize()
. = ..()
+// Инициализация ПОСЛЕ
/datum/modpack/example/post_initialize()
. = ..()
diff --git a/mod_celadon/areas/README.md b/mod_celadon/areas/README.md
new file mode 100644
index 000000000000..be23c48f2fe5
--- /dev/null
+++ b/mod_celadon/areas/README.md
@@ -0,0 +1,84 @@
+
+#### Список PRов
+
+- https://github.com/CeladonSS13/Shiptest/pulls/#####
+
+
+
+## Новые зоны
+
+ID мода: CELADON_AREAS
+
+
+### Описание мода
+
+Это мод допольнительно расширяет зоны для мапинга, добавляя новые зоны.
+
+
+### Изменения *кор кода*
+
+- Отсутствуют
+
+
+### Оверрайды
+
+- Отсутствуют
+
+
+### Дефайны
+
+- Отсутствуют
+
+
+### Используемые файлы, не содержащиеся в модпаке
+
+- Отсутствуют
+
+
+### Авторы
+
+MrCat15352
+
diff --git a/mod_celadon/areas/_areas.dm b/mod_celadon/areas/_areas.dm
new file mode 100644
index 000000000000..b0bcb6cfccef
--- /dev/null
+++ b/mod_celadon/areas/_areas.dm
@@ -0,0 +1,9 @@
+/datum/modpack/areas
+ /// Строковое имя модпака. Используется для поиска других модпаков в init.
+ name = "New areas"
+ /// Строковое описание для модпака. Может использоваться для списка глаголов модпака в качестве описания.
+ desc = "Мод добавляет новые зоны для мапинга."
+ /// Строка с авторами этого модпака.
+ author = "MrCat15352"
+
+///**********************************************************************///
diff --git a/mod_celadon/areas/_areas.dme b/mod_celadon/areas/_areas.dme
new file mode 100644
index 000000000000..e5fcc5fc6268
--- /dev/null
+++ b/mod_celadon/areas/_areas.dme
@@ -0,0 +1,9 @@
+#ifndef MODPACK_CELADON_AREAS
+#define MODPACK_CELADON_AREAS
+
+#include "_areas.dm"
+
+#include "code/outpost.dm"
+#include "code/ship_areas.dm"
+
+#endif
diff --git a/mod_celadon/areas/code/outpost.dm b/mod_celadon/areas/code/outpost.dm
new file mode 100644
index 000000000000..bc79fa4cb7bc
--- /dev/null
+++ b/mod_celadon/areas/code/outpost.dm
@@ -0,0 +1,153 @@
+/* Это родительский класс
+/area/outpost/medical
+ name = "Infirmary"
+ icon_state = "medbay3"
+ ambientsounds = MEDICAL
+ lighting_colour_tube = "#e7f8ff"
+ lighting_colour_bulb = "#d5f2ff"
+ lighting_colour_night = "#d5f2ff"
+ min_ambience_cooldown = 90 SECONDS
+ max_ambience_cooldown = 180 SECONDS
+*/
+
+/// MEDICAL
+
+/area/outpost/medical/reseption
+ name = "Reseption"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "reseption"
+
+/area/outpost/medical/morgue
+ name = "Morg"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "morg"
+
+/area/outpost/medical/hall_1
+ name = "Hall 1"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "hall_1"
+
+/area/outpost/medical/hall_2
+ name = "Hall 2"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "hall_2"
+
+/area/outpost/medical/storage
+ name = "Storge"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "storge"
+
+/area/outpost/medical/surgery_1
+ name = "Surgery 1"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "surgery_1"
+
+/area/outpost/medical/surgery_2
+ name = "Surgery 2"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "surgery_2"
+
+/area/outpost/medical/palata_1
+ name = "Palata 1"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "palata_1"
+
+/area/outpost/medical/palata_2
+ name = "Palata 2"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "palata_2"
+
+/area/outpost/medical/relax_room
+ name = "Relax Room"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "relax"
+
+/area/outpost/medical/genetic
+ name = "Genetica"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "genetic"
+
+/area/outpost/medical/chemestry
+ name = "Chemestry"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "chemestry"
+
+/area/outpost/medical/cmo
+ name = "CMO"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "cmo"
+
+/// LONGUE
+
+/area/outpost/crew/lounge/cab_1
+ name = "Cabinka 1"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "lounge_cab_1"
+ sound_environment = SOUND_AREA_WOODFLOOR
+
+/area/outpost/crew/lounge/cab_2
+ name = "Cabinka 2"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "lounge_cab_2"
+ sound_environment = SOUND_AREA_WOODFLOOR
+
+/area/outpost/crew/lounge/cab_3
+ name = "Cabinka 3"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "lounge_cab_3"
+ sound_environment = SOUND_AREA_WOODFLOOR
+
+/area/outpost/crew/lounge/cab_4
+ name = "Cabinka 4"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "lounge_cab_4"
+ sound_environment = SOUND_AREA_WOODFLOOR
+
+/// BAR
+
+/area/outpost/crew/bar/vip_elysium_zone
+ name = "VIP Elysium Zone"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "vip_elysium"
+ lighting_colour_tube = "#e5ffd6"
+ lighting_colour_bulb = "#c1ffc7"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
+
+/area/outpost/crew/bar/vip_zone
+ name = "VIP Zone"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "vip"
+ lighting_colour_tube = "#f3d6ff"
+ lighting_colour_bulb = "#f0c1ff"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
+
+/area/outpost/crew/bar/theatre
+ name = "Theatre"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "theatre"
+ lighting_colour_tube = "#ffd6d6"
+ lighting_colour_bulb = "#ffc1c1"
+
+/area/outpost/crew/bar/central_bar
+ name = "Central Bar"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "central_bar"
+ lighting_colour_tube = "#d6feff"
+ lighting_colour_bulb = "#c1ffff"
+
+/// FRACTIONS
+
+/area/outpost/fraction
+ name = "Fraction"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+ icon_state = "fraction"
+ sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
+
+/area/outpost/fraction/syndi
+ name = "Syndicate Room"
+ icon_state = "syndie_elite"
+
+/area/outpost/fraction/syndi_shop
+ name = "Don Co Shop"
+ icon_state = "syndi_shop"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
diff --git a/mod_celadon/areas/code/ship_areas.dm b/mod_celadon/areas/code/ship_areas.dm
new file mode 100644
index 000000000000..210397ec4918
--- /dev/null
+++ b/mod_celadon/areas/code/ship_areas.dm
@@ -0,0 +1,102 @@
+/// GENERAL
+/area/ship/general
+ name = "General"
+ icon_state = "general"
+ icon = 'mod_celadon/areas/icons/areas.dmi'
+
+/// COMMAND CREW
+/area/ship/general/command_crew
+ name = "Captain room"
+ icon_state = "captain_room"
+
+/area/ship/general/command_crew/hos
+ name = "Head of Security"
+ icon_state = "hos"
+
+/area/ship/general/command_crew/hop
+ name = "Head of Personal"
+ icon_state = "hop"
+
+/area/ship/general/command_crew/ce
+ name = "CE"
+ icon_state = "ce"
+
+/area/ship/general/command_crew/rd
+ name = "Research of Directory"
+ icon_state = "rd"
+
+/area/ship/general/command_crew/cmo
+ name = "CMO"
+ icon_state = "cmo_ship"
+
+/// ENGINEERING
+/area/ship/general/engineering
+ name = "Engineering"
+ icon_state = "eng"
+ ambientsounds = ENGINEERING
+ lighting_colour_tube = "#ffce93"
+ lighting_colour_bulb = "#ffbc6f"
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
+
+/area/ship/general/engineering/engineering_1
+ name = "Engineering 1"
+ icon_state = "eng_1"
+
+/area/ship/general/engineering/engineering_2
+ name = "Engineering 2"
+ icon_state = "eng_2"
+
+/// SCIENCE
+/area/ship/general/science
+ name = "R&D 1"
+ icon_state = "rnd_1"
+ lighting_colour_tube = "#f0fbff"
+ lighting_colour_bulb = "#e4f7ff"
+
+/area/ship/general/science/rnd
+ name = "R&D 2"
+ icon_state = "rnd_2"
+
+/// MEDICAL
+/area/ship/general/medical
+ name = "Medbay 1"
+ icon_state = "med_1"
+ ambientsounds = MEDICAL
+ lighting_colour_tube = "#e7f8ff"
+ lighting_colour_bulb = "#d5f2ff"
+ min_ambience_cooldown = 90 SECONDS
+ max_ambience_cooldown = 180 SECONDS
+
+/area/ship/general/medical/medbay
+ name = "Medbay 2"
+ icon_state = "med_2"
+
+/// CARGO
+/area/ship/general/cargo
+ name = "Cargo 1"
+ icon_state = "cargo_1"
+ lighting_colour_tube = "#ffe3cc"
+ lighting_colour_bulb = "#ffdbb8"
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
+
+/area/ship/general/cargo/cargo_bay
+ name = "Cargo 2"
+ icon_state = "cargo_2"
+
+/// OTHER SHUTTLE
+/area/ship/general/other
+ name = "Other Shuttle 1"
+ icon_state = "osz_1"
+ sound_environment = SOUND_AREA_STANDARD_STATION
+
+/area/ship/general/other/zone_2
+ name = "Other Shuttle 2"
+ icon_state = "osz_2"
+
+/area/ship/general/other/zone_3
+ name = "Other Shuttle 3"
+ icon_state = "osz_3"
+
+/area/ship/general/other/zone_4
+ name = "Other Shuttle 4"
+ icon_state = "osz_4"
diff --git a/mod_celadon/areas/icons/areas.dmi b/mod_celadon/areas/icons/areas.dmi
new file mode 100644
index 000000000000..804a6e535955
Binary files /dev/null and b/mod_celadon/areas/icons/areas.dmi differ
diff --git a/mod_celadon/event_cly/README.md b/mod_celadon/event_cly/README.md
index 0a91190e4fc8..8f9a21b1e0fe 100644
--- a/mod_celadon/event_cly/README.md
+++ b/mod_celadon/event_cly/README.md
@@ -29,8 +29,7 @@ ID мода: EVENT_CLY
### Изменения *кор кода*
-- EDIT, ADD: `code/__DEFINES/cinematics.dm` - замена синематика в атоме
-- EDIT, ADD: `code/datums/cinematic.dm`
+
+
+
+## НАЗВАНИЕ_МОДА
+
+ID мода: MUSIC_CELADON
+
+
+### Описание мода
+
+Замена музыки в лобби , замена изображения в лобби , замена одного из звуков для конца раунда
+
+
+### Изменения *кор кода*
+
+- EDIT - strings/round_start_sounds.txt - изменены пути файлов для загрузки в лобби
+- EDIT - code\controllers\subsystem\ticker.dm - изменен один саунд для конца раунда
+- EDIT - code\controllers\subsystem\ticker.dm - изменен саунд для старта сервера
+- EDIT - code\controllers\subsystem\title.dm - заменено стартовое изображение в лобби
+
+
+### Оверрайды
+
+- Отсутствуют
+
+
+### Дефайны
+
+- Отсутствуют
+
+
+### Используемые файлы, не содержащиеся в модпаке
+
+- Отсутствуют
+
+
+### Авторы
+
+Mirag1993
+
diff --git a/mod_celadon/music_celadon/_music_celadon.dm b/mod_celadon/music_celadon/_music_celadon.dm
new file mode 100644
index 000000000000..0308136c76f0
--- /dev/null
+++ b/mod_celadon/music_celadon/_music_celadon.dm
@@ -0,0 +1,27 @@
+/// name - название модпака. Используется для поиска других модпаков в init.
+/// desc - описание для модпака. Может использоваться для списка глаголов модпака в качестве описания.
+/// author - автор(ы) этого модпака.
+
+/datum/modpack/music_celadon
+ name = "Музыка и логотип"
+ desc = "Изменяет файлы используемые в локальном сервере"
+ author = "Mirag1993"
+
+/// Эти проки нужны, для того чтобы инициализировать датумы в определенный момент времени
+/// сборки билда. Инициализация обновляет данные в билде повторно, перезаписывая новыми значениями
+/// из модпака. Но иногда, сама инциализация есть и вызывается в кор коде в определенный момент, и
+/// тогда такие проки не нужны и вовсе. Также проки не нужны если в модпаке только объекты находятся.
+/// Если эти конструкции не нужны, просто закоментируй их!
+/// (можешь использовать все три, но запуск билда увеличится на 0.1 сек, за каждый датум в модпаке)
+
+// Инициализация ДО
+//datum/modpack/music_celadon/pre_initialize()
+// . = ..()
+
+// Инициализация ВОВРЕМЯ
+//datum/modpack/music_celadon/initialize()
+// . = ..()
+
+// Инициализация ПОСЛЕ
+//datum/modpack/music_celadon/post_initialize()
+// . = ..()
diff --git a/mod_celadon/music_celadon/_music_celadon.dme b/mod_celadon/music_celadon/_music_celadon.dme
new file mode 100644
index 000000000000..72afed470d3a
--- /dev/null
+++ b/mod_celadon/music_celadon/_music_celadon.dme
@@ -0,0 +1,6 @@
+#ifndef MODPACK_CELADON_MUSIC_CELADON
+#define MODPACK_CELADON_MUSIC_CELADON
+
+#include "_music_celadon.dm"
+
+#endif
diff --git a/mod_celadon/music_celadon/icons/default_title.dmi b/mod_celadon/music_celadon/icons/default_title.dmi
new file mode 100644
index 000000000000..11d3e06f2dbf
Binary files /dev/null and b/mod_celadon/music_celadon/icons/default_title.dmi differ
diff --git a/mod_celadon/music_celadon/sound/sztart.ogg b/mod_celadon/music_celadon/sound/sztart.ogg
new file mode 100644
index 000000000000..642673c43f11
Binary files /dev/null and b/mod_celadon/music_celadon/sound/sztart.ogg differ
diff --git a/mod_celadon/music_celadon/sound/title0.ogg b/mod_celadon/music_celadon/sound/title0.ogg
new file mode 100644
index 000000000000..dd4b2c6720ae
Binary files /dev/null and b/mod_celadon/music_celadon/sound/title0.ogg differ
diff --git a/mod_celadon/music_celadon/sound/title1.ogg b/mod_celadon/music_celadon/sound/title1.ogg
new file mode 100644
index 000000000000..8acd7a1dec5b
Binary files /dev/null and b/mod_celadon/music_celadon/sound/title1.ogg differ
diff --git a/mod_celadon/music_celadon/sound/title2.ogg b/mod_celadon/music_celadon/sound/title2.ogg
new file mode 100644
index 000000000000..b6867487f718
Binary files /dev/null and b/mod_celadon/music_celadon/sound/title2.ogg differ
diff --git a/mod_celadon/music_celadon/sound/title3.ogg b/mod_celadon/music_celadon/sound/title3.ogg
new file mode 100644
index 000000000000..c022e78ddd21
Binary files /dev/null and b/mod_celadon/music_celadon/sound/title3.ogg differ
diff --git a/mod_celadon/music_celadon/sound/voiko_law.ogg b/mod_celadon/music_celadon/sound/voiko_law.ogg
new file mode 100644
index 000000000000..290beca89754
Binary files /dev/null and b/mod_celadon/music_celadon/sound/voiko_law.ogg differ
diff --git a/mod_celadon/solgov_outfit/code/solgov_outfit.dm b/mod_celadon/solgov_outfit/code/solgov_outfit.dm
index b341fa0958f1..9c5de34c429c 100644
--- a/mod_celadon/solgov_outfit/code/solgov_outfit.dm
+++ b/mod_celadon/solgov_outfit/code/solgov_outfit.dm
@@ -1,5 +1,88 @@
-// Ученые
+// //
+// SOLAR FEDERATION //
+// //
+
+/datum/outfit/job/solgov/proc/get_solfed_captain_access(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_SOLGOV)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access = list(ACCESS_SOLGOV, ACCESS_CAPTAIN, ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_ARMORY, ACCESS_BRIG, ACCESS_SECURITY)
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+
+/datum/outfit/job/solgov/proc/get_solfed_overseer_access(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_SOLGOV)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access += list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_ARMORY, ACCESS_BRIG, ACCESS_SECURITY)
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+
+/datum/outfit/job/solgov/proc/get_solfed_sonnensoldner_access(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_SOLGOV)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access += list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_BRIG, ACCESS_SECURITY)
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+
+/datum/outfit/job/solgov/proc/get_solfed_engineer_access(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_SOLGOV)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access += list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_SECURITY)
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+// Ученые
/datum/outfit/job/solgov/scientist
name = "SolGov - Scientific Officer"
jobtype = /datum/job/scientist
@@ -55,19 +138,8 @@
gloves = null
/datum/outfit/job/solgov/captain/elysium_celadon/post_equip(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.assignment = "Musharif"
- I.access = list(ACCESS_SOLGOV, ACCESS_CAPTAIN, ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_ARMORY, ACCESS_BRIG, ACCESS_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_solfed_captain_access(H)
// Хос //
/datum/outfit/job/solgov/overseer/elysium_celadon
@@ -82,19 +154,8 @@
neck = null
/datum/outfit/job/solgov/overseer/elysium_celadon/post_equip(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.assignment = "Mulazim"
- I.access = list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_ARMORY, ACCESS_BRIG, ACCESS_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_solfed_overseer_access(H)
// Офицер //
/datum/outfit/job/solgov/sonnensoldner/elysium_celadon
@@ -108,19 +169,8 @@
uniform = /obj/item/clothing/under/solfed/elysium
/datum/outfit/job/solgov/sonnensoldner/elysium_celadon/post_equip(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.assignment = "Haris"
- I.access = list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_BRIG, ACCESS_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_solfed_sonnensoldner_access(H)
// медик //
/datum/outfit/job/solgov/doctor/elysium_celadon
@@ -134,19 +184,8 @@
uniform = /obj/item/clothing/under/solfed/elysium
/datum/outfit/job/solgov/doctor/elysium_celadon/post_equip(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.assignment = "Shafi"
- I.access = list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_solfed_engineer_access(H)
// Инженер //
/datum/outfit/job/solgov/engineer/elysium_celadon
@@ -160,16 +199,5 @@
uniform = /obj/item/clothing/under/solfed/elysium
/datum/outfit/job/solgov/engineer/elysium_celadon/post_equip(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.assignment = "Khabeer Fanni"
- I.access = list(ACCESS_ENGINE, ACCESS_MEDICAL, ACCESS_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_solfed_engineer_access(H)
diff --git a/mod_celadon/stuff_inteq/code/outfits.dm b/mod_celadon/stuff_inteq/code/outfits.dm
index fe0967b14786..ba79655a7455 100644
--- a/mod_celadon/stuff_inteq/code/outfits.dm
+++ b/mod_celadon/stuff_inteq/code/outfits.dm
@@ -5,26 +5,74 @@
/proc/get_inteq_acces()
return list(ACCESS_INTEQ_GENERAL, ACCESS_INTEQ_SECURITY, ACCESS_INTEQ_CAPTAIN)
+/datum/outfit/job/inteq/proc/get_inteq_g_acces(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_INTEQ)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access += list(ACCESS_INTEQ_GENERAL)
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+
+/datum/outfit/job/inteq/proc/get_inteq_gsec_acces(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_INTEQ)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access += list(ACCESS_INTEQ_GENERAL, ACCESS_INTEQ_SECURITY)
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+
+/datum/outfit/job/inteq/proc/get_inteq_all_acces(mob/living/carbon/human/H)
+ H.faction |= list(FACTION_PLAYER_INTEQ)
+ var/obj/item/storage/wallet/W = null
+ for (var/obj/item/O in H.contents)
+ if (istype(O, /obj/item/storage/wallet))
+ W = O
+ break
+ if (W)
+ var/obj/item/card/id/I = null
+ for (var/obj/item/O in W.contents)
+ if (istype(O, /obj/item/card/id))
+ I = O
+ break
+ if (I)
+ I.access = get_all_accesses()+get_inteq_acces()
+ I.update_label()
+ W.combined_access = list()
+ for (var/obj/item/card/id/card in W.contents)
+ W.combined_access |= card.access
+
//рекрут
/datum/outfit/job/inteq/assistant/celadon
name = "Recruit (InteQ)"
id = /obj/item/card/id/inteq/recruit
/datum/outfit/job/inteq/assistant/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access += list(ACCESS_INTEQ_GENERAL)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_g_acces(H)
//Капитан
@@ -39,20 +87,8 @@
id = /obj/item/card/id/inteq/vanguard
/datum/outfit/job/inteq/captain/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access = get_all_accesses()+get_inteq_acces()
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_all_acces(H)
// Лейтенант первого класса
/datum/outfit/job/inteq/captain/enfco/celadon
@@ -68,20 +104,8 @@
id = /obj/item/card/id/inteq/enfco
/datum/outfit/job/inteq/captain/enfco/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access = get_all_accesses()+get_inteq_acces()
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_all_acces(H)
//Парамедик
@@ -91,20 +115,8 @@
id = /obj/item/card/id/inteq/corspman
/datum/outfit/job/inteq/paramedic/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access += list(ACCESS_INTEQ_GENERAL)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_g_acces(H)
//Служба безопасности
@@ -113,20 +125,8 @@
id = /obj/item/card/id/inteq/enf
/datum/outfit/job/inteq/security/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access += list(ACCESS_INTEQ_GENERAL,ACCESS_INTEQ_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_gsec_acces(H)
// Варден
@@ -135,20 +135,8 @@
id = /obj/item/card/id/inteq/maas
/datum/outfit/job/inteq/warden/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access += list(ACCESS_INTEQ_GENERAL,ACCESS_INTEQ_SECURITY)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_gsec_acces(H)
// Главный инженер
@@ -157,20 +145,8 @@
id = /obj/item/card/id/inteq/afr/ce
/datum/outfit/job/inteq/ce/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access = get_all_accesses()+get_inteq_acces()
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_all_acces(H)
//Инженегр
@@ -179,17 +155,5 @@
id = /obj/item/card/id/inteq/afr
/datum/outfit/job/inteq/engineer/celadon/post_equip(mob/living/carbon/human/H)
- H.faction |= list(FACTION_PLAYER_INTEQ)
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = H.real_name
- I.access += list(ACCESS_INTEQ_GENERAL)
-
- for (var/datum/bank_account/bank_account in SSeconomy.bank_accounts)
- if (bank_account.account_id == H.account_id)
- bank_account.bank_cards += src
- I.registered_account = bank_account
- to_chat(H, "Your account number has been automatically assigned.")
- break
-
- I.update_label()
+ . = ..()
+ get_inteq_g_acces(H)
diff --git a/mod_celadon/weapons/_weapons.dme b/mod_celadon/weapons/_weapons.dme
index 774886583333..1365d7934e22 100644
--- a/mod_celadon/weapons/_weapons.dme
+++ b/mod_celadon/weapons/_weapons.dme
@@ -16,3 +16,4 @@
#include "code/modules/research/all_nodes.dm"
#endif
+
diff --git a/mod_celadon/weapons/code/ammo.dm b/mod_celadon/weapons/code/ammo.dm
index d7b07f64531a..78bf2d1ed85e 100644
--- a/mod_celadon/weapons/code/ammo.dm
+++ b/mod_celadon/weapons/code/ammo.dm
@@ -1,35 +1,109 @@
-/datum/supply_pack/ammo/g36_ammo
- name = "G-36 5.56mm Magazine Crate"
- desc = "Содержит два магазина калибра 5,56 мм для винтовки p16, каждый из которых содержит по 30 патронов. Также в комплект входят коробки стандартных патронов."
+//Магазины для оружия
+
+/datum/supply_pack/ammo/p16_ammo
+ name = "Набор магазинов для P-16 5.56mm"
+ desc = "Содержит два магазина калибра 5,56 мм для винтовки P-16, каждый из которых содержит по 30 патронов."
contains = list(/obj/item/ammo_box/magazine/p16,
- /obj/item/ammo_box/magazine/p16,
- /obj/item/ammo_box/a556_box,
- /obj/item/ammo_box/a556_box)
- cost = 3000
+ /obj/item/ammo_box/magazine/p16)
+ cost = 1950
-/datum/supply_pack/ammo/morita_ammo
- name = "Morita Mk.I .308 Magazine Crate"
- desc = "Содержит два магазина калибра .308 мм для винтовки Morita Mk.I, каждый из которых содержит по 10 патронов. Также в комплект входят коробки стандартных патронов."
+/datum/supply_pack/ammo/g36_sh
+ name = "Набор магазинов для G36-SH 5.56mm"
+ desc = "Содержит два магазина калибра 5,56 мм для винтовки G36-SH, каждый из которых содержит по 20 патронов."
+ contains = list(/obj/item/ammo_box/magazine/p16/g36sh,
+ /obj/item/ammo_box/magazine/p16/g36sh)
+ cost = 1400
+
+/datum/supply_pack/ammo/g36
+ name = "Набор магазинов для G36 5.56mm"
+ desc = "Содержит два магазина калибра 5,56 мм для винтовки G36, каждый из которых содержит по 30 патронов."
+ contains = list(/obj/item/ammo_box/magazine/p16/g36,
+ /obj/item/ammo_box/magazine/p16/g36)
+ cost = 1950
+
+/datum/supply_pack/ammo/g36_drum
+ name = "Барабанный магазин для G36 5.56mm"
+ desc = "Барабанный магазин калибра 5,56 мм для винтовки G36, вмещает до 75 патронов."
+ contains = list(/obj/item/ammo_box/magazine/p16/g36drum)
+ cost = 5000
+
+/datum/supply_pack/ammo/morita_ammo_small
+ name = "Набор укороченых магазинов для Morita Mk.I"
+ desc = "Содержит два магазина калибра .308 мм для винтовки Morita Mk.I, каждый из которых содержит по 10 патронов."
contains = list(/obj/item/ammo_box/magazine/morita1/small,
- /obj/item/ammo_box/magazine/morita1/small,
- /obj/item/ammo_box/a308,
- /obj/item/ammo_box/a308)
- cost = 3000
-
-/datum/supply_pack/ammo/box556
- name = "5.56mm ammo Crate"
- desc = "Содержит коробку патронов калибра 5,56 мм для автоматических винтовок."
+ /obj/item/ammo_box/magazine/morita1/small)
+ cost = 2000
+
+/datum/supply_pack/ammo/morita_ammo
+ name = "Набор стандартных магазинов для Morita Mk.I"
+ desc = "Содержит два магазина калибра .308 мм для винтовки Morita Mk.I, каждый из которых содержит по 25 патронов."
+ contains = list(/obj/item/ammo_box/magazine/morita1,
+ /obj/item/ammo_box/magazine/morita1)
+ cost = 4000
+
+/datum/supply_pack/ammo/morita_ammo_drum
+ name = "Барабанный магазин для Morita Mk.I .308"
+ desc = "Барабанный магазин калибра .308 мм для винтовки Morita Mk.I, барабан вмещает до 50 патронов."
+ contains = list(/obj/item/ammo_box/magazine/morita1/drum)
+ cost = 5000
+
+/datum/supply_pack/ammo/usp_magazine
+ name = "Магазин для пистолета USP"
+ desc = "Магазин калибра .45 для пистолета USP, вмещает до 12 патронов."
+ contains = list(/obj/item/ammo_box/magazine/usp45_standart)
+ cost = 650
+
+/datum/supply_pack/ammo/glock_magazine
+ name = "Магазин для пистолета Glock"
+ desc = "Магазин калибра 9 мм для пистолета Glock, вмещает до 17 патронов."
+ contains = list(/obj/item/ammo_box/magazine/glock_standart)
+ cost = 500
+
+
+//Коробки патронов
+
+//5.56
+
+/datum/supply_pack/ammo/box556_box
+ name = "Коробка патронов 5.56mm"
+ desc = "Содержит одну коробку патронов"
contains = list(/obj/item/ammo_box/a556_box)
- cost = 400
+ cost = 500
-/datum/supply_pack/ammo/box556/a856
- name = "5.56mm(а856) ammo Crate"
- desc = "Содержит коробку патронов калибра 5,56 мм для автоматических винтовок."
+/datum/supply_pack/ammo/box556/a856_box
+ name = "Коробка патронов 5.56mm(а856)"
+ desc = "Содержит одну коробку патронов"
contains = list(/obj/item/ammo_box/a556_box/a856)
- cost = 600
+ cost = 650
-/datum/supply_pack/ammo/box556/m903
- name = "5.56mm(m903) ammo Crate"
- desc = "Содержит коробку патронов калибра 5,56 мм для автоматических винтовок."
+/datum/supply_pack/ammo/box556/m903_box
+ name = "Коробка патронов 5.56mm(m903)"
+ desc = "Содержит одну коробку патронов"
contains = list(/obj/item/ammo_box/a556_box/m903)
- cost = 1200
+ cost = 1300
+
+//.308
+
+/datum/supply_pack/ammo/a308_box
+ name = "Коробка патронов .308"
+ desc = "Содержит одну коробку патронов"
+ contains = list(/obj/item/ammo_box/a308)
+ cost = 650
+
+/datum/supply_pack/ammo/a308_rubber_box
+ name = "Коробка патронов .308(Резина)"
+ desc = "Содержит одну коробку патронов"
+ contains = list(/obj/item/ammo_box/a308/a308_rubber)
+ cost = 300
+
+/datum/supply_pack/ammo/a308_sp_box
+ name = "Коробка патронов .308(Охотничий)"
+ desc = "Содержит одну коробку патронов"
+ contains = list(/obj/item/ammo_box/a308/a308_sp)
+ cost = 800
+
+/datum/supply_pack/ammo/a308_ap_box
+ name = "Коробка патронов .308(Бронебойный)"
+ desc = "Содержит одну коробку патронов"
+ contains = list(/obj/item/ammo_box/a308/a308_ap)
+ cost = 1300
diff --git a/mod_celadon/weapons/code/gun.dm b/mod_celadon/weapons/code/gun.dm
index f578ad810802..2b47747b9fae 100644
--- a/mod_celadon/weapons/code/gun.dm
+++ b/mod_celadon/weapons/code/gun.dm
@@ -2,27 +2,25 @@
Rifles // Origin -> code\modules\cargo\packs\gun.dm
*/
/datum/supply_pack/gun/g36sh
- name = "G36-SH Rifle crate"
- desc = "Содержит G36-SH и запасную обойму. "
- cost = 13000
+ name = "Оружейный яшик G36-SH"
+ desc = "Содержит автоматическую винтовку G36-SH и запасную обойму. "
+ cost = 5000
contains = list(/obj/item/gun/ballistic/automatic/assault/g36sh,
- /obj/item/ammo_box/magazine/p16/g36,
- /obj/item/ammo_box/a556_box)
+ /obj/item/ammo_box/magazine/p16/g36sh)
crate_name = "auto rifle crate"
/datum/supply_pack/gun/g36
- name = "G36 Rifle crate"
- desc = "Содержит G36 и запасную обойму. "
- cost = 15000
+ name = "Оружейный яшик G36"
+ desc = "Содержит автоматическую винтовку G36 и запасную обойму. "
+ cost = 5000
contains = list(/obj/item/gun/ballistic/automatic/assault/g36,
- /obj/item/ammo_box/magazine/p16/g36,
- /obj/item/ammo_box/a556_box)
+ /obj/item/ammo_box/magazine/p16/g36)
crate_name = "auto rifle crate"
/datum/supply_pack/gun/morita1
name = "Morita Mk.I Rifle crate"
desc = "Содержит Morita Mk.I. и дополнительную обойму. "
- cost = 20000
+ cost = 8000
contains = list(/obj/item/gun/ballistic/automatic/assault/morita1,
/obj/item/ammo_box/magazine/morita1)
crate_name = "auto rifle crate"
@@ -30,7 +28,7 @@
/datum/supply_pack/gun/morita1_forest
name = "Morita/forest Mk.I Rifle crate"
desc = "Содержит Morita/forest Mk.I. и дополнительный барабанный магазин. "
- cost = 23000
+ cost = 11500
contains = list(/obj/item/gun/ballistic/automatic/assault/morita1/desert,
/obj/item/ammo_box/magazine/morita1/drum,
/obj/item/ammo_box/a308)
@@ -39,7 +37,7 @@
/datum/supply_pack/gun/morita1_desert
name = "Morita/desert Mk.I Rifle crate"
desc = "Содержит Morita/desert Mk.I. и дополнительный барабанный магазин. "
- cost = 23000
+ cost = 11500
contains = list(/obj/item/gun/ballistic/automatic/assault/morita1/forest,
/obj/item/ammo_box/magazine/morita1/drum,
/obj/item/ammo_box/a308)
@@ -48,8 +46,22 @@
/datum/supply_pack/gun/morita1_swamp
name = "Morita/swamp Mk.I Rifle crate"
desc = "Содержит Morita/swamp Mk.I. и дополнительный барабанный магазин. "
- cost = 23000
+ cost = 11500
contains = list(/obj/item/gun/ballistic/automatic/assault/morita1/swamp,
/obj/item/ammo_box/magazine/morita1/drum,
/obj/item/ammo_box/a308)
crate_name = "auto rifle crate"
+
+/datum/supply_pack/gun/glock
+ name = "Оружейный яшик Glock"
+ desc = "Содержит пистолет Glock, калибра 9mm."
+ cost = 1800
+ contains = list(/obj/item/gun/ballistic/automatic/pistol/glock)
+ crate_name = "auto rifle crate"
+
+/datum/supply_pack/gun/usp
+ name = "Оружейный яшик USP"
+ desc = "Содержит пистолет USP, калибра .45"
+ cost = 2000
+ contains = list(/obj/item/gun/ballistic/automatic/pistol/usp45)
+ crate_name = "auto rifle crate"
diff --git a/mod_celadon/weapons/code/modules/projectiles/ammunition/ballistic/rifle.dm b/mod_celadon/weapons/code/modules/projectiles/ammunition/ballistic/rifle.dm
index da2c5340caa5..6ae523b46918 100644
--- a/mod_celadon/weapons/code/modules/projectiles/ammunition/ballistic/rifle.dm
+++ b/mod_celadon/weapons/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -4,6 +4,7 @@
icon_state = "rifle-brass-incen"
caliber = "5.56x45mm"
projectile_type = /obj/projectile/bullet/a556_45/a856
+ bullet_per_box = 80 // Хрен знает зачем это , ставим пока одинаковые значения везде
/obj/item/ammo_casing/a556_45/m903
name = "5.56mm M903 bullet casing"
@@ -11,6 +12,7 @@
icon_state = "rifle-brass-ap"
caliber = "5.56x45mm"
projectile_type = /obj/projectile/bullet/a556_45/m903
+ bullet_per_box = 80
/obj/item/ammo_casing/a556_45/surplus
name = "5.56mm surplus bullet casing"
@@ -18,23 +20,44 @@
icon_state = "rifle-brass-surplus"
caliber = "5.56x45mm"
projectile_type = /obj/projectile/bullet/a556_45/surplus
+ bullet_per_box = 80
-//Берем стандартные пули из основного кода , наши пули обновим когда будут готовы спрайты
-//obj/item/ammo_casing/a308
- //name = "7,62x51 Winchester bullet casing"
- //desc = "A 7,62x51 Winchester bullet casing."
- //icon_state = "rifle-brass"
- //caliber = ".308 Winchester"
- //projectile_type = /obj/projectile/bullet/win308
+//
+// .308
+//
-/obj/item/ammo_casing/a308/surplus
+/obj/item/ammo_casing/a308
+ name = "7,62x51 Winchester bullet casing"
+ desc = "A 7,62x51 Winchester bullet casing."
+ icon_state = "rifle-brass"
+ caliber = ".308"
+ projectile_type = /obj/projectile/bullet/a308
+ bullet_per_box = 80
+
+/obj/item/ammo_casing/a308/a308_sp
+ name = "7,62x51 Winchester bullet casing"
+ desc = "A 7,62x51 Winchester bullet casing."
+ icon_state = "rifle-brass-hollow"
+ projectile_type = /obj/projectile/bullet/a308_sp
+ bullet_per_box = 80
+
+/obj/item/ammo_casing/a308/a308_brak
name = "7,62x51 surplus bullet casing"
desc = "7,62x51 surplus bullet casing."
icon_state = "rifle-brass-surplus"
- projectile_type = /obj/projectile/bullet/a308/surplus
+ projectile_type = /obj/projectile/bullet/a308/a308_brak
+ bullet_per_box = 80
-/obj/item/ammo_casing/a308/ap
+/obj/item/ammo_casing/a308/a308_ap
name = "7,62x51 M-80 bullet casing"
desc = "A 7,62x51 M-80 bullet casing."
icon_state = "rifle-brass-ap"
- projectile_type = /obj/projectile/bullet/a308/ap
+ projectile_type = /obj/projectile/bullet/a308/a308_ap
+ bullet_per_box = 80
+
+/obj/item/ammo_casing/a308/a308_rubber
+ name = "7,62x51 M-80 bullet casing"
+ desc = "A 7,62x51 M-80 bullet casing."
+ icon_state = "rifle-brass-rubber"
+ projectile_type = /obj/projectile/bullet/a308/a308_rub
+ bullet_per_box = 80
diff --git a/mod_celadon/weapons/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/mod_celadon/weapons/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 4085bb6395f2..a756eef448bc 100644
--- a/mod_celadon/weapons/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/mod_celadon/weapons/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -1,6 +1,9 @@
-//Коробки нестандартных патронов
+//
+// 5.56mm
+//
//Коробки 5.56 , плюс стандартная коробка так как ее нету в основном коде
+
/obj/item/ammo_box/a556_box
name = "ammo box (5.56x45mm)"
desc = "A box of standard 5.56x45mm ammo."
@@ -33,18 +36,45 @@
ammo_type = /obj/item/ammo_casing/a556_45/surplus
max_ammo = 50
-/obj/item/ammo_box/a308/surplus
- name = "ammo box (.308)"
- desc = "Surplus pack .308"
- icon = 'mod_celadon/weapons/icons/ammo/ammo.dmi'
- icon_state = "win308new_surplus"
- ammo_type = /obj/item/ammo_casing/a308/surplus
- max_ammo = 40
+//
+// .308
+//
-/obj/item/ammo_box/a308/ap
- name = "ammo box (.308)"
- desc = "Surplus pack .308"
+//коробки патроны 308 калибра - на данный момент эндгейм патроны , огромный урон , огромное пробитие , высокая цена
+
+/obj/item/ammo_box/a308
+ name = "Коробка патронов .308"
+ desc = "Коробка стандартных патронов .308 . Заводского качества, еще в смазке."
icon = 'mod_celadon/weapons/icons/ammo/ammo.dmi'
- icon_state = "win308new_m80"
- ammo_type = /obj/item/ammo_casing/a308/ap
- max_ammo = 40
+ icon_state = "308_fmj"
+ ammo_type = /obj/item/ammo_casing/a308
+ max_ammo = 30
+
+//Пули против мяса , минусовое пробитие , не должно пробивать даже минимальную броню , но огромный урон здоровью
+/obj/item/ammo_box/a308/a308_sp
+ name = "Коробка патронов .308(Охотничий)"
+ desc = "Пуля с мягкой оболочкой , эффективна против крупной дичи , но практически бесполезна даже против базовой брони"
+ icon_state = "308_sp"
+ ammo_type = /obj/item/ammo_casing/a308/a308_sp
+
+//Тупое название сурплус , будет брак или некачественное исполнение. Снижен урон , минимум пробития - не для продажи
+/obj/item/ammo_box/a308/a308_brak
+ name = "Коробка бракованных патронов .308"
+ desc = "Не слишком качественные патроны калибра .308 , хуже заводских но все еще годны."
+ icon_state = "a308_brak"
+ ammo_type = /obj/item/ammo_casing/a308/a308_brak
+ max_ammo = 50
+
+//Бронебойки , должны пробивать любую броню , но урон снижен
+/obj/item/ammo_box/a308/a308_ap
+ name = "Коробка патронов .308(Бронебойный)"
+ desc = "Бронебойные патроны с вольфрамовым наконечником , хороши против брони но наносят не так много повреждений."
+ icon_state = "308_ap"
+ ammo_type = /obj/item/ammo_casing/a308/a308_ap
+
+//Резина , минимум урона здоровью , средне стамине
+/obj/item/ammo_box/a308/a308_rubber
+ name = "Коробка патронов .308(Резина)"
+ desc = "Патроны с резиновой пулей , не смертельны но все еще наносят травмы."
+ icon_state = "308_rub"
+ ammo_type = /obj/item/ammo_casing/a308/a308_rubber
diff --git a/mod_celadon/weapons/code/modules/projectiles/guns/ballistic/assault.dm b/mod_celadon/weapons/code/modules/projectiles/guns/ballistic/assault.dm
index adbf47ab526f..3a819ad34d1c 100644
--- a/mod_celadon/weapons/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/mod_celadon/weapons/code/modules/projectiles/guns/ballistic/assault.dm
@@ -13,8 +13,8 @@
w_class = WEIGHT_CLASS_NORMAL
spread = 16
actions_types = list()
- mag_display = TRUE
- special_mags = TRUE
+ // mag_display = TRUE
+ // special_mags = TRUE - сломано
tac_reloads = TRUE
var/obj/item/ammo_box/magazine/p16/g36sh/alternate_magazine
actions_types = list(/datum/action/item_action/toggle_firemode)
@@ -29,7 +29,7 @@
alternate_magazine = new mag_type(src)
spawnwithmagazine = FALSE
mag_type = /obj/item/ammo_box/magazine/p16
-
+/*
/obj/item/gun/ballistic/automatic/assault/g36sh/burst_select()
var/mob/living/carbon/human/user = usr
switch(select)
@@ -55,7 +55,7 @@
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_icon()
return
-
+*/
/obj/item/gun/ballistic/automatic/assault/g36sh/inteq
name = "\improper Moded G36-SH"
desc = "Обширная модификация G36-SH, которая входит в стандартную комплектацию вооружения InteQ. Калибр 5,56x45 мм."
@@ -80,8 +80,8 @@
spread = 12
mag_type = /obj/item/ammo_box/magazine/p16/g36
actions_types = list()
- mag_display = TRUE
- special_mags = TRUE
+ // mag_display = TRUE
+ // special_mags = TRUE - сломано
tac_reloads = TRUE
var/obj/item/ammo_box/magazine/p16/g36/alternate_magazine
actions_types = list(/datum/action/item_action/toggle_firemode)
@@ -96,7 +96,7 @@
alternate_magazine = new mag_type(src)
spawnwithmagazine = FALSE
mag_type = /obj/item/ammo_box/magazine/p16
-
+/*
/obj/item/gun/ballistic/automatic/assault/g36/burst_select()
var/mob/living/carbon/human/user = usr
switch(select)
@@ -122,7 +122,7 @@
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_icon()
return
-
+*/
/obj/item/gun/ballistic/automatic/assault/g36/inteq
name = "\improper Moded G36"
desc = "Обширная модификация G36, которая входит в стандартную комплектацию вооружения InteQ. Калибр 5,56x45 мм."
@@ -134,13 +134,15 @@
/obj/item/gun/ballistic/automatic/assault/morita1
name = "\improper Morita MK.I"
desc = "Стандартная пехотная автоматическая винтовка под калибр .308. Широко применяется армейскими корпусами в Союзе Человечества. Популярность в гражданских кругах заслужила после сьемок в фильме Starboat Troopes."
+ lefthand_file = 'mod_celadon/weapons/icons/guns/guns_lefthand.dmi'
+ righthand_file = 'mod_celadon/weapons/icons/guns/guns_righthand.dmi'
icon = 'mod_celadon/weapons/icons/guns/48x32guns.dmi'
fire_sound = 'mod_celadon/_components/sounds/gun/morita1.ogg'
icon_state = "morita1"
item_state = "morita1"
actions_types = list()
- special_mags = TRUE
- mag_display = TRUE
+ // special_mags = TRUE - сломано
+ // mag_display = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
@@ -151,7 +153,7 @@
/obj/item/gun/ballistic/automatic/assault/morita1/ComponentInitialize()
. = ..()
AddComponent(/datum/component/automatic_fire, 0.20 SECONDS)
-
+/*
/obj/item/gun/ballistic/automatic/assault/morita1/burst_select()
var/mob/living/carbon/human/user = usr
switch(select)
@@ -177,7 +179,7 @@
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_icon()
return
-
+*/
/obj/item/gun/ballistic/automatic/assault/morita1/desert
name = "\improper Morita MK.I(desert)"
desc = "Стандартная пехотная автоматическая винтовка под калибр .308. Широко применяется армейскими корпусами в Союзе Человечества. Популярность в гражданских кругах заслужила после сьемок в фильме Starboat Troopes./Модификация с пустынным камуфляжем"
diff --git a/mod_celadon/weapons/code/modules/projectiles/projectile/bullets/rifle.dm b/mod_celadon/weapons/code/modules/projectiles/projectile/bullets/rifle.dm
index 3b8ab2e97080..4af45f119b0e 100644
--- a/mod_celadon/weapons/code/modules/projectiles/projectile/bullets/rifle.dm
+++ b/mod_celadon/weapons/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -1,46 +1,52 @@
+//5.56x45
/obj/projectile/bullet/a556_45/a856
name = "5.56x45mm A856 bullet"
- damage = 28
- armour_penetration = 22
+ damage = 30
+ armour_penetration = 25
/obj/projectile/bullet/a556_45/m903
name = "5.56x45mm M903 bullet"
- damage = 15
- armour_penetration = 60
+ damage = 20
+ armour_penetration = 40
/obj/projectile/bullet/a556_45/surplus
name = "5.56x45mm surplus bullet"
damage = 20
- armour_penetration = 15
+ armour_penetration = 10
-// 7.62 (Nagant Rifle)
+//.308
-/obj/projectile/bullet/a762
- name = "7.62x54mmR bullet"
+/obj/projectile/bullet/a308
+ name = ".308"
+ icon = 'mod_celadon/weapons/icons/ammo/projectiles.dmi'
+ icon_state = "bullet"
+ speed = 0.3
damage = 30
armour_penetration = 40
-//7.62x39mm (SVG-67)
+/obj/projectile/bullet/a308_sp
+ name = ".308"
+ speed = 0.3
+ damage = 60
+ armour_penetration = -10
-/obj/projectile/bullet/a762_39
- name = "7.62x39mm"
- damage = 30
- armour_penetration = 20
-
-//.308 WIN (M514)
-
-//obj/projectile/bullet/a308
- //name = ".308 Winchester"
- //damage = 30
- //armour_penetration = 40
+/obj/projectile/bullet/a308/a308_brak
+ name = ".308"
+ speed = 0.3
+ damage = 28
+ armour_penetration = 25
-/obj/projectile/bullet/a308/surplus
- name = ".308 surplus"
- damage = 25
- armour_penetration = 30
+/obj/projectile/bullet/a308/a308_ap
+ name = ".308"
+ speed = 0.3
+ damage = 28
+ armour_penetration = 60
-/obj/projectile/bullet/a308/ap
- name = ".308 M-80"
- damage = 35
- armour_penetration = 45
+/obj/projectile/bullet/a308/a308_rub
+ name = ".308"
+ icon_state = "rubber"
+ speed = 0.4
+ damage = 5
+ armour_penetration = -10
+ stamina = 38
diff --git a/mod_celadon/weapons/code/modules/research/all_nodes.dm b/mod_celadon/weapons/code/modules/research/all_nodes.dm
index bbd11dd731e9..bf67522a0ff7 100644
--- a/mod_celadon/weapons/code/modules/research/all_nodes.dm
+++ b/mod_celadon/weapons/code/modules/research/all_nodes.dm
@@ -1,19 +1,19 @@
/datum/design/a556/surplus
- name = "5.56 mm surplus ammo box"
- desc = "A box full of surplus 5.56x45mm ammunition."
+ name = "Некачественные патроны 5.56x45mm"
+ desc = "Коробка некачественных патронов 5.56x45mm."
id = "a556surp"
build_type = PROTOLATHE
- materials = list(/datum/material/iron = 35000, /datum/material/titanium = 3000, /datum/material/silver = 11000)
+ materials = list(/datum/material/iron = 35000, /datum/material/titanium = 3000)
build_path = /obj/item/ammo_box/a556_box/surplus
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-/datum/design/a308/surplus
- name = ".308 surplus ammo box"
- desc = "A box full of surplus .308 ammunition."
- id = "a308surp"
+/datum/design/a308/a308_brak
+ name = "Некачественные патроны .308"
+ desc = "Коробка некачественных патронов .308."
+ id = "a308_brak"
build_type = PROTOLATHE
- materials = list(/datum/material/iron = 45000, /datum/material/titanium = 4000, /datum/material/silver = 12000)
- build_path = /obj/item/ammo_box/a308/surplus
+ materials = list(/datum/material/iron = 45000, /datum/material/titanium = 4000)
+ build_path = /obj/item/ammo_box/a308/a308_brak
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/mod_celadon/weapons/icons/ammo/ammo.dmi b/mod_celadon/weapons/icons/ammo/ammo.dmi
index eda2bec90774..c832e5abd97f 100644
Binary files a/mod_celadon/weapons/icons/ammo/ammo.dmi and b/mod_celadon/weapons/icons/ammo/ammo.dmi differ
diff --git a/mod_celadon/weapons/icons/ammo/projectiles.dmi b/mod_celadon/weapons/icons/ammo/projectiles.dmi
new file mode 100644
index 000000000000..1acd53e8bf11
Binary files /dev/null and b/mod_celadon/weapons/icons/ammo/projectiles.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index 1136673626ec..4650f835cd1a 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -52,6 +52,7 @@
#include "code\__DEFINES\directional.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\do_afters.dm"
#include "code\__DEFINES\dye_keys.dm"
#include "code\__DEFINES\economy.dm"
#include "code\__DEFINES\events.dm"
@@ -142,6 +143,7 @@
#include "code\__DEFINES\tgs.dm"
#include "code\__DEFINES\tgui.dm"
#include "code\__DEFINES\time.dm"
+#include "code\__DEFINES\timed_action.dm"
#include "code\__DEFINES\tools.dm"
#include "code\__DEFINES\traits.dm"
#include "code\__DEFINES\turfs.dm"
@@ -866,7 +868,7 @@
#include "code\game\machinery\aug_manipulator.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\bank_machine.dm"
-#include "code\game\machinery\Beacon.dm"
+#include "code\game\machinery\beacon.dm"
#include "code\game\machinery\bounty_board.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
@@ -879,7 +881,7 @@
#include "code\game\machinery\dish_drive.dm"
#include "code\game\machinery\dna_scanner.dm"
#include "code\game\machinery\doppler_array.dm"
-#include "code\game\machinery\droneDispenser.dm"
+#include "code\game\machinery\drone_dispenser.dm"
#include "code\game\machinery\exp_cloner.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
@@ -898,6 +900,7 @@
#include "code\game\machinery\medipen_refiller.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\newscaster.dm"
+#include "code\game\machinery\outpost_electrolyzer.dm"
#include "code\game\machinery\PDApainter.dm"
#include "code\game\machinery\prisonlabor.dm"
#include "code\game\machinery\quantum_pad.dm"
@@ -909,7 +912,7 @@
#include "code\game\machinery\scan_gate.dm"
#include "code\game\machinery\sheetifier.dm"
#include "code\game\machinery\shieldgen.dm"
-#include "code\game\machinery\Sleeper.dm"
+#include "code\game\machinery\sleeper.dm"
#include "code\game\machinery\slotmachine.dm"
#include "code\game\machinery\spaceheater.dm"
#include "code\game\machinery\stasis.dm"
@@ -1113,6 +1116,7 @@
#include "code\game\objects\items\AI_modules.dm"
#include "code\game\objects\items\airlock_painter.dm"
#include "code\game\objects\items\apc_frame.dm"
+#include "code\game\objects\items\bank_card.dm"
#include "code\game\objects\items\bell.dm"
#include "code\game\objects\items\binoculars.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -1354,7 +1358,6 @@
#include "code\game\objects\structures\fireplace.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
-#include "code\game\objects\structures\fugitive_role_spawners.dm"
#include "code\game\objects\structures\ghost_role_spawners.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
@@ -1707,7 +1710,6 @@
#include "code\modules\antagonists\ert\nanotrasen.dm"
#include "code\modules\antagonists\ert\solgov.dm"
#include "code\modules\antagonists\ert\syndicate.dm"
-#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
#include "code\modules\antagonists\gang\outfits.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
#include "code\modules\antagonists\magic_servant\servant.dm"
@@ -1965,9 +1967,12 @@
#include "code\modules\clothing\towels.dm"
#include "code\modules\clothing\ears\_ears.dm"
#include "code\modules\clothing\factions\clip.dm"
+#include "code\modules\clothing\factions\frontiersmen.dm"
#include "code\modules\clothing\factions\gezena.dm"
+#include "code\modules\clothing\factions\hardliners.dm"
#include "code\modules\clothing\factions\nanotrasen.dm"
#include "code\modules\clothing\factions\ngr.dm"
+#include "code\modules\clothing\factions\srm.dm"
#include "code\modules\clothing\factions\suns.dm"
#include "code\modules\clothing\glasses\_glasses.dm"
#include "code\modules\clothing\glasses\engine_goggles.dm"
@@ -2136,7 +2141,6 @@
#include "code\modules\events\wizard\invincible.dm"
#include "code\modules\events\wizard\lava.dm"
#include "code\modules\events\wizard\madness.dm"
-#include "code\modules\events\wizard\magicarp.dm"
#include "code\modules\events\wizard\petsplosion.dm"
#include "code\modules\events\wizard\race.dm"
#include "code\modules\events\wizard\rpgloot.dm"
@@ -2425,6 +2429,7 @@
#include "code\modules\mining\equipment\regenerative_core.dm"
#include "code\modules\mining\equipment\resonator.dm"
#include "code\modules\mining\equipment\survival_pod.dm"
+#include "code\modules\mining\equipment\trophies.dm"
#include "code\modules\mining\equipment\wormhole_jaunter.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"
@@ -2712,13 +2717,10 @@
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
-#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm"
#include "code\modules\mob\living\simple_animal\hostile\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\cockroach.dm"
-#include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
-#include "code\modules\mob\living\simple_animal\hostile\frontiersman.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
@@ -2729,26 +2731,26 @@
#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
-#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm"
-#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm"
-#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm"
#include "code\modules\mob\living\simple_animal\hostile\space_dragon.dm"
#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
-#include "code\modules\mob\living\simple_animal\hostile\stickman.dm"
-#include "code\modules\mob\living\simple_animal\hostile\survivors.dm"
-#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
-#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
-#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\cat_butcher.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\frontiersman.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\human.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\nanotrasen.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\pirate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\skeleton.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\survivors.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\syndicate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\zombie.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm"
@@ -2772,8 +2774,8 @@
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord_outfits.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord_outfits.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice demon.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice whelp.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobstrosity.dm"
@@ -3037,7 +3039,6 @@
#include "code\modules\projectiles\guns\ballistic.dm"
#include "code\modules\projectiles\guns\energy.dm"
#include "code\modules\projectiles\guns\gunhud.dm"
-#include "code\modules\projectiles\guns\magic.dm"
#include "code\modules\projectiles\guns\powered.dm"
#include "code\modules\projectiles\guns\ballistic\assault.dm"
#include "code\modules\projectiles\guns\ballistic\automatic.dm"
@@ -3060,8 +3061,6 @@
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
#include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm"
-#include "code\modules\projectiles\guns\magic\staff.dm"
-#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
#include "code\modules\projectiles\guns\misc\bow.dm"
@@ -3071,7 +3070,6 @@
#include "code\modules\projectiles\guns\misc\syringe_gun.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\magic.dm"
#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
@@ -3093,7 +3091,6 @@
#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm"
#include "code\modules\projectiles\projectile\energy\stun.dm"
#include "code\modules\projectiles\projectile\energy\tesla.dm"
-#include "code\modules\projectiles\projectile\magic\spellcard.dm"
#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
#include "code\modules\projectiles\projectile\reusable\arrow.dm"
#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
@@ -3259,36 +3256,19 @@
#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm"
#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm"
#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
-#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\rockplanet_ruin_code.dm"
-#include "code\modules\ruins\icemoonruin_code\hotsprings.dm"
#include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm"
#include "code\modules\ruins\icemoonruin_code\library.dm"
#include "code\modules\ruins\icemoonruin_code\wrath.dm"
-#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
#include "code\modules\ruins\lavalandruin_code\biodome_winter.dm"
-#include "code\modules\ruins\lavalandruin_code\codelab.dm"
#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm"
-#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"
#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
-#include "code\modules\ruins\lavalandruin_code\sloth.dm"
#include "code\modules\ruins\lavalandruin_code\surface.dm"
#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
-#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
-#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
-#include "code\modules\ruins\spaceruin_code\clericsden.dm"
-#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
-#include "code\modules\ruins\spaceruin_code\crashedship.dm"
-#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
-#include "code\modules\ruins\spaceruin_code\forgottenship.dm"
-#include "code\modules\ruins\spaceruin_code\hellfactory.dm"
-#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
-#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
-#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
#include "code\modules\screen_alerts\_screen_alerts.dm"
#include "code\modules\security_levels\keycard_authentication.dm"
@@ -3301,9 +3281,7 @@
#include "code\modules\shuttle\ripple.dm"
#include "code\modules\shuttle\shuttle.dm"
#include "code\modules\shuttle\shuttle_rotate.dm"
-#include "code\modules\shuttle\special.dm"
#include "code\modules\shuttle\supply.dm"
-#include "code\modules\shuttle\white_ship.dm"
#include "code\modules\spells\spell.dm"
#include "code\modules\spells\spell_types\aimed.dm"
#include "code\modules\spells\spell_types\area_teleport.dm"
@@ -3321,7 +3299,6 @@
#include "code\modules\spells\spell_types\forcewall.dm"
#include "code\modules\spells\spell_types\genetic.dm"
#include "code\modules\spells\spell_types\godhand.dm"
-#include "code\modules\spells\spell_types\infinite_guns.dm"
#include "code\modules\spells\spell_types\inflict_handler.dm"
#include "code\modules\spells\spell_types\knock.dm"
#include "code\modules\spells\spell_types\lichdom.dm"
diff --git a/sound/voice/kepori/kepiclick.ogg b/sound/voice/kepori/kepiclick.ogg
index 61670a607b66..3f22b6d90d5e 100644
Binary files a/sound/voice/kepori/kepiclick.ogg and b/sound/voice/kepori/kepiclick.ogg differ
diff --git a/sound/voice/kepori/kepiwhistle.ogg b/sound/voice/kepori/kepiwhistle.ogg
index bf1cc76bf5cf..f6260f4c5894 100644
Binary files a/sound/voice/kepori/kepiwhistle.ogg and b/sound/voice/kepori/kepiwhistle.ogg differ
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index 0788672367e5..0de43a9c651e 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -1,4 +1,5 @@
-sound/ambience/title1.ogg
-sound/ambience/title2.ogg
-sound/ambience/title3.ogg
-sound/ambience/clown.ogg
+mod_celadon/music_celadon/sound/title0.ogg
+mod_celadon/music_celadon/sound/title1.ogg
+mod_celadon/music_celadon/sound/title2.ogg
+mod_celadon/music_celadon/sound/title3.ogg
+
diff --git a/tgui/package.json b/tgui/package.json
index 5d963e70873b..6a82afa35d8f 100644
--- a/tgui/package.json
+++ b/tgui/package.json
@@ -56,7 +56,7 @@
"terser-webpack-plugin": "^5.1.4",
"typescript": "^4.9.4",
"url-loader": "^4.1.1",
- "webpack": "^5.76.0",
+ "webpack": "^5.92.1",
"webpack-bundle-analyzer": "^4.4.2",
"webpack-cli": "^4.7.2"
}
diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json
index 56951b14846f..e4654319c56d 100644
--- a/tgui/packages/tgui-dev-server/package.json
+++ b/tgui/packages/tgui-dev-server/package.json
@@ -8,6 +8,6 @@
"glob": "^7.1.7",
"source-map": "^0.7.3",
"stacktrace-parser": "^0.1.10",
- "ws": "^7.5.3"
+ "ws": "^8.17.1"
}
}
diff --git a/tgui/packages/tgui/interfaces/HydrogenExchange.js b/tgui/packages/tgui/interfaces/HydrogenExchange.js
new file mode 100644
index 000000000000..c07fe40afeab
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/HydrogenExchange.js
@@ -0,0 +1,74 @@
+import { useBackend } from '../backend';
+import { Button, LabeledList, Section } from '../components';
+import { Window } from '../layouts';
+
+export const HydrogenExchange = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { credits, merits, next_merit_rate, credits_to_merits, credit_tax } =
+ data;
+ return (
+
+
+
+
+
+ {' '}
+ {credit_tax + '%'}
+
+
+ {' '}
+ {next_merit_rate + 'cr'}
+
+
+
+
+
+ act('convert_to_merits')}
+ />
+ }
+ />
+ act('convert_to_credits')}
+ />
+ }
+ />
+ act('dispense')}
+ />
+ }
+ />
+
+
+
+
+ );
+};
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index 90a80435c28c..cd06f57d313d 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -2622,12 +2622,12 @@ __metadata:
languageName: node
linkType: hard
-"acorn-import-assertions@npm:^1.9.0":
- version: 1.9.0
- resolution: "acorn-import-assertions@npm:1.9.0"
+"acorn-import-attributes@npm:^1.9.5":
+ version: 1.9.5
+ resolution: "acorn-import-attributes@npm:1.9.5"
peerDependencies:
acorn: ^8
- checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c
+ checksum: 1c0c49b6a244503964ae46ae850baccf306e84caf99bc2010ed6103c69a423987b07b520a6c619f075d215388bd4923eccac995886a54309eda049ab78a4be95
languageName: node
linkType: hard
@@ -3169,11 +3169,11 @@ __metadata:
linkType: hard
"braces@npm:^3.0.1, braces@npm:~3.0.2":
- version: 3.0.2
- resolution: "braces@npm:3.0.2"
+ version: 3.0.3
+ resolution: "braces@npm:3.0.3"
dependencies:
- fill-range: ^7.0.1
- checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459
+ fill-range: ^7.1.1
+ checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69
languageName: node
linkType: hard
@@ -4019,13 +4019,13 @@ __metadata:
languageName: node
linkType: hard
-"enhanced-resolve@npm:^5.16.0":
- version: 5.16.1
- resolution: "enhanced-resolve@npm:5.16.1"
+"enhanced-resolve@npm:^5.17.0":
+ version: 5.17.0
+ resolution: "enhanced-resolve@npm:5.17.0"
dependencies:
graceful-fs: ^4.2.4
tapable: ^2.2.0
- checksum: 6e4c166fef72ef231455f9119686d93ecccb11874f8256d73a42de5b293cb2536050849382468864b25973514ca4fa4cb13c37be2ff857a211e2aca3ff05bb6c
+ checksum: 1066000454da6a7aeabdbe1f433d912d1e39e6892142a78a37b6577aab27e0436091fa1399d857ad87085b1c3b73a0f811c8874da3dbdc40fbd5ebe89a5568e6
languageName: node
linkType: hard
@@ -4749,12 +4749,12 @@ __metadata:
languageName: node
linkType: hard
-"fill-range@npm:^7.0.1":
- version: 7.0.1
- resolution: "fill-range@npm:7.0.1"
+"fill-range@npm:^7.1.1":
+ version: 7.1.1
+ resolution: "fill-range@npm:7.1.1"
dependencies:
to-regex-range: ^5.0.1
- checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917
+ checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798
languageName: node
linkType: hard
@@ -8938,7 +8938,7 @@ resolve@^2.0.0-next.3:
glob: ^7.1.7
source-map: ^0.7.3
stacktrace-parser: ^0.1.10
- ws: ^7.5.3
+ ws: ^8.17.1
languageName: unknown
linkType: soft
@@ -9017,7 +9017,7 @@ resolve@^2.0.0-next.3:
terser-webpack-plugin: ^5.1.4
typescript: ^4.9.4
url-loader: ^4.1.1
- webpack: ^5.76.0
+ webpack: ^5.92.1
webpack-bundle-analyzer: ^4.4.2
webpack-cli: ^4.7.2
languageName: unknown
@@ -9700,9 +9700,9 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
-"webpack@npm:^5.76.0":
- version: 5.91.0
- resolution: "webpack@npm:5.91.0"
+"webpack@npm:^5.92.1":
+ version: 5.92.1
+ resolution: "webpack@npm:5.92.1"
dependencies:
"@types/eslint-scope": ^3.7.3
"@types/estree": ^1.0.5
@@ -9710,10 +9710,10 @@ resolve@^2.0.0-next.3:
"@webassemblyjs/wasm-edit": ^1.12.1
"@webassemblyjs/wasm-parser": ^1.12.1
acorn: ^8.7.1
- acorn-import-assertions: ^1.9.0
+ acorn-import-attributes: ^1.9.5
browserslist: ^4.21.10
chrome-trace-event: ^1.0.2
- enhanced-resolve: ^5.16.0
+ enhanced-resolve: ^5.17.0
es-module-lexer: ^1.2.1
eslint-scope: 5.1.1
events: ^3.2.0
@@ -9733,7 +9733,7 @@ resolve@^2.0.0-next.3:
optional: true
bin:
webpack: bin/webpack.js
- checksum: f1073715dbb1ed5c070affef293d800a867708bcbc5aba4d8baee87660e0cf53c55966a6f36fab078d1d6c9567cdcd0a9086bdfb607cab87ea68c6449791b9a3
+ checksum: 11bec781260c4180883e98a4a15a08df297aca654ded45e70598f688881dd722f992d680addafe6f6342debede345cddcce2b781c50f5cde29d6c0bc33a82452
languageName: node
linkType: hard
@@ -9848,7 +9848,7 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
-"ws@npm:^7.3.1, ws@npm:^7.4.6, ws@npm:^7.5.3":
+"ws@npm:^7.3.1, ws@npm:^7.4.6":
version: 7.5.3
resolution: "ws@npm:7.5.3"
peerDependencies:
@@ -9863,6 +9863,21 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
+"ws@npm:^8.17.1":
+ version: 8.17.1
+ resolution: "ws@npm:8.17.1"
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ">=5.0.2"
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf
+ languageName: node
+ linkType: hard
+
"xml-name-validator@npm:^3.0.0":
version: 3.0.0
resolution: "xml-name-validator@npm:3.0.0"
diff --git a/tools/UpdatePaths/Scripts/2972_human_hostile.txt b/tools/UpdatePaths/Scripts/2972_human_hostile.txt
new file mode 100644
index 000000000000..297ba2df7bb9
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/2972_human_hostile.txt
@@ -0,0 +1,7 @@
+/mob/living/simple_animal/hostile/pirate/@SUBTYPES: /mob/living/simple_animal/hostile/human/pirate/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/frontier/@SUBTYPES: /mob/living/simple_animal/hostile/human/frontier/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/nanotrasen/@SUBTYPES: /mob/living/simple_animal/hostile/human/nanotrasen/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/skeleton/@SUBTYPES: /mob/living/simple_animal/hostile/human/skeleton/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/asteroid/whitesands/@SUBTYPES: /mob/living/simple_animal/hostile/human/hermit/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/cat_butcherer/@SUBTYPES: /mob/living/simple_animal/hostile/human/cat_butcherer/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/syndicate/@SUBTYPES:: /mob/living/simple_animal/hostile/human/syndicate/@SUBTYPES {@OLD}
diff --git a/tools/UpdatePaths/Scripts/3109_drinks_lore_update.txt b/tools/UpdatePaths/Scripts/3109_drinks_lore_update.txt
new file mode 100644
index 000000000000..712c2a906ffc
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/3109_drinks_lore_update.txt
@@ -0,0 +1,11 @@
+/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game : /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel
+/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime : /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda
+/obj/item/reagent_containers/food/drinks/soda_cans/starkist : /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch
+/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind : /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail
+/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko : /obj/item/reagent_containers/food/drinks/soda_cans/vimukti
+/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb : /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx
+/obj/item/reagent_containers/food/drinks/soda_cans/shamblers : /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch
+/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull : /obj/item/reagent_containers/food/drinks/soda_cans/crosstalk
+/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy : /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy
+/obj/item/reagent_containers/food/drinks/britcup : /obj/item/reagent_containers/food/drinks/mug
+/obj/item/reagent_containers/food/drinks/solgovcup : /obj/item/reagent_containers/food/drinks/mug
diff --git a/tools/build/build.js b/tools/build/build.js
index fe171c1eeb92..fe3cad28a71b 100755
--- a/tools/build/build.js
+++ b/tools/build/build.js
@@ -56,8 +56,12 @@ export const DmMapsIncludeTarget = new Juke.Target({
executes: async () => {
const folders = [
...Juke.glob("_maps/outpost/**/*.dmm"),
- ...Juke.glob("_maps/RandomRuins/**/*.dmm"),
- ...Juke.glob("_maps/shuttles/**/*.dmm"),
+ // [CELADON-EDIT] - CELADON_CONFIGS_MAPS
+ // ...Juke.glob("_maps/RandomRuins/**/*.dmm"),
+ // ...Juke.glob("_maps/shuttles/**/*.dmm"), // CELADON-EDIT - ORIGINAL
+ ...Juke.glob("_maps/_mod_celadon/RandomRuins/**/*.dmm"),
+ ...Juke.glob("_maps/_mod_celadon/shuttles/**/*.dmm"),
+ // [/CELADON-EDIT]
...Juke.glob("_maps/templates/**/*.dmm"),
];
const content =