-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"
@@ -15,6 +72,25 @@
#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"
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 8cd775c06f77..64aa6aa52627 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -174,5 +174,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/mobs.dm b/code/__DEFINES/mobs.dm
index 8026f9635a97..f5c382c15c29 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -28,6 +28,13 @@
#define BLOOD_VOLUME_BAD 224
#define BLOOD_VOLUME_SURVIVE 122
+// Bloodloss
+#define BLOOD_LOSS_MAXIMUM 30
+#define BLOOD_LOSS_DAMAGE_MAXIMUM 2
+#define BLOOD_LOSS_DAMAGE_BASE 0.013
+#define BLOOD_CAUTERIZATION_RATIO 10
+#define BLOOD_CAUTERIZATION_DAMAGE_RATIO 300
+
//Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0
#define MOB_SIZE_SMALL 1
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 c74a20877348..517579192634 100644
--- a/code/__DEFINES/species_clothing_defines.dm
+++ b/code/__DEFINES/species_clothing_defines.dm
@@ -31,12 +31,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/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index e44755574eea..5eb2686b2118 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 63990e61ee33..6a3028443dcc 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -108,6 +108,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",
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/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 1cf0585c0ed4..58b9604e585a 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -153,7 +153,7 @@
var/armor_value = run_armor_check(attack_flag = "melee", armour_penetration = I.armour_penetration) //WS Edit - Simplemobs can have armor
send_item_attack_message(I, user)
if(I.force)
- apply_damage(I.force, I.damtype, break_modifier = I.force, blocked = armor_value) //Bone break modifier = item force
+ apply_damage(I.force, I.damtype, break_modifier = I.force, blocked = armor_value, sharpness = I.get_sharpness()) //Bone break modifier = item force
if(I.damtype == BRUTE)
if(prob(33))
I.add_mob_blood(src)
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 3dc5553b7381..25ae750eb0d3 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -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/components/bandage.dm b/code/datums/components/bandage.dm
new file mode 100644
index 000000000000..16f6a2f0b059
--- /dev/null
+++ b/code/datums/components/bandage.dm
@@ -0,0 +1,60 @@
+#define TREATMENT_DAMAGE_MOD 2
+
+/datum/component/bandage
+ /// How fast do we stop bleeding?
+ var/bleed_reduction = 0
+ /// How many healing ticks will this bandage apply? Reduced by incoming damage and current bleeding
+ var/lifespan = 300
+ var/bandage_name = "gauze"
+ /// The person this bandage is applied to
+ var/mob/living/mummy
+
+/datum/component/bandage/Initialize(_bleed_reduction, _lifespan, _bandage_name)
+ if(!istype(parent, /obj/item/bodypart))
+ return COMPONENT_INCOMPATIBLE
+ var/obj/item/bodypart/BP = parent
+ mummy = BP.owner
+ if(!mummy)
+ return COMPONENT_INCOMPATIBLE
+ if(_bleed_reduction)
+ bleed_reduction = _bleed_reduction
+ if(_lifespan)
+ lifespan = _lifespan
+ if(_bandage_name)
+ bandage_name = _bandage_name
+ RegisterSignal(mummy, COMSIG_MOB_APPLY_DAMGE, PROC_REF(check_damage))
+ RegisterSignal(mummy, COMSIG_MOB_LIFE, PROC_REF(bandage_effects))
+ RegisterSignal(parent, COMSIG_LIVING_DROP_LIMB, PROC_REF(drop_bandage))
+
+/// Checks if damage to the owner is applied to this limb and reduces lifespan (perforated bandages dont work as well)
+/datum/component/bandage/proc/check_damage(attacker, damage, damagetype = BRUTE, def_zone = null)
+ SIGNAL_HANDLER
+
+ if(parent != mummy.get_bodypart(check_zone(def_zone)))
+ return
+ lifespan -= damage / 100 * initial(lifespan) * TREATMENT_DAMAGE_MOD //take incoming damage as a % of durability
+ if(lifespan <= 0)
+ drop_bandage()
+
+/// Handles healing effects and passive lifespan usage
+/datum/component/bandage/proc/bandage_effects()
+ SIGNAL_HANDLER
+
+ var/obj/item/bodypart/heal_target = parent
+ lifespan -= 1 + heal_target.bleeding // particularly nasty bleeding can burn through dressing faster
+ heal_target.adjust_bleeding(-bleed_reduction)
+ if(lifespan <= 0 || !heal_target.bleeding) //remove treatment once it's no longer able to treat
+ drop_bandage(TRUE)
+
+/// Handles deleting the component when the bandage runs out of lifespan or finishes healing. Special = bandage didn't get torn off
+/datum/component/bandage/proc/drop_bandage(special = FALSE)
+ SIGNAL_HANDLER
+
+ var/obj/item/bodypart/BP = parent
+ if(special)
+ to_chat(mummy, span_notice("The [bandage_name] on your [parse_zone(BP.body_zone)] has [BP.bleeding ? "done what it can" : "stopped the bleeding"]."))
+ else
+ to_chat(mummy, span_warning("The [bandage_name] on your [parse_zone(BP.body_zone)] is damaged beyond use!"))
+ qdel(src)
+
+#undef TREATMENT_DAMAGE_MOD
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 55ba84fb5f7d..3032a98dc85c 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -73,11 +73,17 @@
"Their neck has already been already cut, you can't make the bleeding any worse!")
return
+ var/obj/item/bodypart/throat_in_question = H.get_bodypart(BODY_ZONE_HEAD)
+ if(!throat_in_question)
+ user.show_message("[H]... doesn't have a neck.", MSG_VISUAL, \
+ "They don't seem to have a neck to cut.")
+ return
+
H.visible_message("[user] slits [H]'s throat!", \
"[user] slits your throat...")
log_combat(user, H, "finishes slicing the throat of")
H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD)
- H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30)
+ throat_in_question.adjust_bleeding(20)
H.apply_status_effect(/datum/status_effect/neck_slice)
/datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat)
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/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index f6cd5698d73d..5f18f6c78a91 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -63,7 +63,7 @@ Bonus
if(bleed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate += 5 * power
+ H.cause_bleeding(5 * power)
return 1
/*
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/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/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..7b1b9c6e29a6 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,20 @@
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/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/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 52087f03174c..02b96c1b81de 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -334,7 +334,8 @@
/datum/status_effect/neck_slice/tick()
var/mob/living/carbon/human/H = owner
- if(H.stat == DEAD || H.bleed_rate <= 8)
+ var/obj/item/bodypart/throat_in_question = H.get_bodypart(BODY_ZONE_HEAD)
+ if(H.stat == DEAD || throat_in_question?.bleeding <= 8)
H.remove_status_effect(/datum/status_effect/neck_slice)
if(prob(10))
H.emote(pick("gasp", "gag", "choke"))
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..da8611dd9cc8 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,19 @@
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
-
-/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/codelab/exterior
- name = "Nanotrasen Genetic Research Facility Exterior"
-
-/area/ruin/unpowered/codelab/reception
- name = "Nanotrasen Genetic Research Reception"
- icon_state = "green"
-
-/area/ruin/unpowered/codelab/subjectrooms
- name = "Nanotrasen Genetic Research Test Subject Storage"
- icon_state = "Sleep"
-
-/area/ruin/unpowered/codelab/storage
- name = "Nanotrasen Genetic Research Storage"
- icon_state = "cargo_bay"
-
-/area/ruin/unpowered/codelab/laboratory
- name = "Nanotrasen Genetic Research Laboratory"
- icon_state = "bridge"
-
-/area/ruin/unpowered/codelab/maintenance
- name = "Nanotrasen Genetic Research Maintenance"
- icon_state = "dk_yellow"
+//Lava Canyon
/area/ruin/unpowered/scorched_hut
name = "Scorched Hut"
icon_state = "red"
+//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/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/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index 52933a5aba74..2f60c799ae23 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -172,7 +172,7 @@
sickness_data = "\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]"
if(altPatient.has_dna()) //Blood levels Information
- if(altPatient.bleed_rate)
+ if(LAZYLEN(altPatient.get_bleeding_parts()))
bleed_status = "Patient is currently bleeding!"
if(blood_percent <= 80)
blood_warning = " Patient has low blood levels. Seek a large meal, or iron supplements."
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 7db02250ce94..107c5656c034 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -462,6 +462,12 @@
else
visible_message(span_warning("[src]'s door slides open, barraging you with the nauseating smell of charred flesh."))
mob_occupant.radiation = 0
+ if(iscarbon(mob_occupant))
+ var/mob/living/carbon/bacon = mob_occupant
+ for(var/obj/item/bodypart/grilling as anything in bacon.get_bleeding_parts(TRUE))
+ if(!grilling.can_bandage())
+ continue
+ grilling.apply_bandage(0.005, 600, "cauterization")
playsound(src, 'sound/machines/airlocks/standard/close.ogg', 25, TRUE)
var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such.
if(suit)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 3f40f82fe0ae..cdded7e418ef 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -357,7 +357,7 @@ GENE SCANNER
if(blood_id)
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.bleed_rate)
+ if(LAZYLEN(H.get_bleeding_parts()))
render_list += "Subject is bleeding!\n"
var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100)
var/blood_type = C.dna.blood_type.name
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 1f78839ae40f..a11539595805 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -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/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..f3cdfb068944 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -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/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/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/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index ca3b1e184168..264ab12646ea 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -137,12 +137,13 @@
/obj/item/stack/medical/gauze
name = "medical gauze"
- desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, but does not heal wounds."
+ desc = "A roll of elastic cloth that is extremely effective at stopping bleeding and slowly heals wounds."
gender = PLURAL
singular_name = "medical gauze"
icon_state = "gauze"
apply_sounds = list('sound/effects/rip1.ogg', 'sound/effects/rip2.ogg')
- var/stop_bleeding = 1800
+ var/bleed_reduction = 0.02
+ var/lifespan = 150
self_delay = 20
max_amount = 12
grind_results = list(/datum/reagent/cellulose = 2)
@@ -152,13 +153,16 @@
amount = 12
/obj/item/stack/medical/gauze/heal(mob/living/target, mob/user)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(!H.bleedsuppress && H.bleed_rate) //so you can't stack bleed suppression
- H.suppress_bloodloss(stop_bleeding)
- to_chat(user, "You stop the bleeding of [target]!")
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ var/obj/item/bodypart/BP = C.get_bodypart(check_zone(user.zone_selected))
+ if(!BP)
+ to_chat(user, span_warning("[C] doesn't have \a [parse_zone(user.zone_selected)]!"))
+ return
+ if(BP.can_bandage(user))
+ BP.apply_bandage(bleed_reduction, lifespan, name)
+ user.visible_message(span_notice("[user] wraps [C]'s [parse_zone(BP.body_zone)] with [src]."), span_notice("You wrap [C]'s [parse_zone(check_zone(user.zone_selected))] with [src]."), span_hear("You hear ruffling cloth."))
return TRUE
- to_chat(user, "You can not use \the [src] on [target]!")
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
@@ -178,8 +182,8 @@
/obj/item/stack/medical/gauze/improvised
name = "improvised gauze"
singular_name = "improvised gauze"
- desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds."
- stop_bleeding = 900
+ desc = "A roll of cloth roughly cut from something that can stop bleeding and slowly heal wounds."
+ bleed_reduction = 0.005
/obj/item/stack/medical/gauze/cyborg
custom_materials = null
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index f0be0cdd7e81..b5f78d46e951 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
new/datum/stack_recipe("modern railing corner", /obj/structure/railing/modern/corner, 1, time = 10, window_checks = TRUE), \
new/datum/stack_recipe("modern railing end", /obj/structure/railing/modern/end, 3, time = 18, window_checks = TRUE), \
new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_floor = FALSE), \
+ new/datum/stack_recipe("handrail", /obj/structure/chair/handrail, 4, time = 15, one_per_turf = TRUE), \
))
/obj/item/stack/rods
diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm
index 6a984c021a26..63fc55116d5a 100644
--- a/code/game/objects/items/stacks/tape.dm
+++ b/code/game/objects/items/stacks/tape.dm
@@ -80,7 +80,8 @@
grind_results = list(/datum/reagent/cellulose = 5)
usesound = 'sound/items/tape.ogg'
- var/stop_bleed = 600
+ var/lifespan = 300
+ var/bleed_reduction = 0.002
var/nonorganic_heal = 5
var/self_delay = 30 //! Also used for the tapecuff delay
var/other_delay = 10
@@ -173,21 +174,17 @@
if(!affecting) //Missing limb?
to_chat(user, "[C] doesn't have \a [parse_zone(user.zone_selected)]!")
return
- if(!IS_ORGANIC_LIMB(affecting))
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(!H.bleedsuppress && H.bleed_rate)
- H.suppress_bloodloss(stop_bleed)
- to_chat(user, "You tape up the bleeding of [C]!")
- return TRUE
- to_chat(user, "[C] has a problem \the [src] won't fix!")
- else //Robotic patch-up
+ if(IS_ROBOTIC_LIMB(affecting)) //Robotic patch-up
if(affecting.brute_dam)
user.visible_message("[user] applies \the [src] on [C]'s [affecting.name].", "You apply \the [src] on [C]'s [affecting.name].")
if(affecting.heal_damage(nonorganic_heal))
C.update_damage_overlays()
return TRUE
- to_chat(user, "[src] can't patch what [C] has...")
+ if(affecting.can_bandage(user))
+ affecting.apply_bandage(bleed_reduction, lifespan, name)
+ to_chat(user, "You tape up [C]'s [parse_zone(affecting.body_zone)]!")
+ return TRUE
+ to_chat(user, "[src] can't patch what [C] has...")
/obj/item/stack/tape/proc/apply_gag(mob/living/carbon/target, mob/user)
if(target.is_muzzled() || target.is_mouth_covered())
@@ -272,7 +269,7 @@
desc = "This roll of silver sorcery can fix just about anything."
icon_state = "tape_d"
- stop_bleed = 800
+ lifespan = 400
nonorganic_heal = 20
prefix = "super sticky"
conferred_embed = EMBED_HARMLESS_SUPERIOR
@@ -297,7 +294,6 @@
desc = "Specialty insulated strips of adhesive plastic. Made for securing cables."
icon_state = "tape_e"
- stop_bleed = 400
nonorganic_heal = 10
prefix = "insulated sticky"
siemens_coefficient = 0
@@ -321,6 +317,6 @@
desc = "Now THIS is engineering."
icon_state = "tape_y"
- stop_bleed = 1000
+ lifespan = 500
nonorganic_heal = 30
prefix = "industry-standard sticky"
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..802eeee2d45f 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."
@@ -600,33 +610,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 5b817cbba675..3cd1e72192ee 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/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 76b3fb7a5989..045bf39ae9b6 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -355,3 +355,12 @@
custom_materials = list(/datum/material/plastic = 2000)
break_chance = 25
origin_type = /obj/structure/chair/plastic
+
+/obj/structure/chair/handrail
+ name = "handrail"
+ icon = 'icons/obj/structures/handrail.dmi'
+ icon_state = "handrail"
+ desc = "A safety railing with buckles to secure yourself to when floor isn't stable enough."
+ item_chair = null
+ buildstackamount = 4
+ buildstacktype = /obj/item/stack/rods
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 2a7a8c5f4a38..91085fe9f104 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
@@ -340,10 +340,6 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/item/staff/bostaff(loc)
new /mob/living/simple_animal/hostile/human/skeleton(loc)
new /mob/living/simple_animal/hostile/human/skeleton(loc)
- if(prob(45))
- new /obj/item/disk/design_disk/adv/cleric_mace(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/human/skeleton(loc)
@@ -352,10 +348,6 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/item/clothing/head/helmet/knight/blue(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/disk/design_disk/adv/knight_gear(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)
@@ -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)
@@ -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,19 +917,19 @@ 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))
@@ -1017,7 +974,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
new /obj/item/research_notes/loot/small(loc)
new/turf/open/floor/mineral/titanium/purple(loc)
new /mob/living/simple_animal/hostile/human/zombie(loc)
- if(22)//Silverback's locker room
+ 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/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm
index c8b804469255..1be0a2517bd6 100644
--- a/code/game/objects/structures/petrified_statue.dm
+++ b/code/game/objects/structures/petrified_statue.dm
@@ -58,6 +58,9 @@
if(petrified_mob)
petrified_mob.status_flags &= ~GODMODE
+ if(ishuman(petrified_mob))
+ var/mob/living/carbon/human/H = petrified_mob
+ H.bleedsuppress = FALSE
petrified_mob.forceMove(loc)
REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE)
petrified_mob.take_overall_damage((petrified_mob.health - obj_integrity + 100)) //any new damage the statue incurred is transfered to the mob
@@ -80,7 +83,7 @@
return 0
var/obj/structure/statue/petrified/S = new(loc, src, statue_timer)
S.name = "statue of [name]"
- bleedsuppress = 1
+ bleedsuppress = TRUE
S.copy_overlays(src)
var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
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/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index 370afeaeedf2..a7ebeaf57582 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."
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 7ed16bc5631e..61a90ff0da86 100644
--- a/code/game/turfs/open/floor/plasteel_floor.dm
+++ b/code/game/turfs/open/floor/plasteel_floor.dm
@@ -332,6 +332,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/lavaland.dm b/code/game/turfs/open/floor/plating/lavaland.dm
index 1dd8d49d746d..e3e22f0ad670 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
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/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 7d5dfccf2804..3b8c5191c9b6 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -42,6 +42,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/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/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 68e0d514ad3a..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 = 0.1 SECONDS
- 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 cf1562d8c289..c9232857a547 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -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/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/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/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/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/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/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index b330b0ec4bdc..4779886622a4 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -7,7 +7,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,
@@ -23,9 +22,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)
@@ -55,8 +52,7 @@
/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
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 662a549ca631..b9a4fb8f0ca3 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
@@ -836,10 +850,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
"
@@ -853,6 +874,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[features["body_size"]]
"
+ 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
"
@@ -1970,6 +1999,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 b53d761c41da..3c3040f03906 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -438,6 +438,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"])
@@ -548,8 +549,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)
@@ -629,6 +631,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/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/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 f81b5a8b8259..994cc6042ef2 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"
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/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/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 c07841cdba5a..7eaccd402e35 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -1073,12 +1073,6 @@
armor = list("melee" = 35, "bullet" = 25, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
supports_variations = VOX_VARIATION
-/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"
@@ -1090,13 +1084,6 @@
armor = list("melee" = 35, "bullet" = 25, "laser" = 20, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
supports_variations = VOX_VARIATION
-/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..ee72151d9567 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -34,21 +34,27 @@
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/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/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 +64,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 +203,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 +322,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 +330,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"
@@ -486,14 +482,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/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/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/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/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/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 678016182428..2762892110f8 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -385,6 +385,12 @@
playsound(src, 'sound/items/cig_light.ogg', 50, 1)
moveToNullspace()
+
+/obj/item/ration_heater/get_temperature()
+ if(!uses)
+ return 0
+ . = ..()
+
/obj/item/ration_heater/proc/clear_cooking(datum/source)
SIGNAL_HANDLER
UnregisterSignal(tocook, COMSIG_PARENT_QDELETING)
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/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 88e1d066024f..7b80559d2691 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"
@@ -1303,7 +1214,6 @@
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)
@@ -1519,14 +1429,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/item/mayhem
name = "mayhem in a bottle"
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/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 8b0ec1d6f79d..c01a20a18f64 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -3,33 +3,62 @@
/datum/sprite_accessory/ears
icon = 'icons/mob/mutant_bodyparts.dmi'
-/datum/sprite_accessory/ears/none
+/datum/sprite_accessory/ears/human/none
name = "None"
icon_state = "none"
-/datum/sprite_accessory/ears/cat
- icon = 'icons/mob/species/misc/cat.dmi'
+/datum/sprite_accessory/ears/human/elf
+ icon = 'icons/mob/species/human/elf.dmi'
+ name = "Elf"
+ icon_state = "elf"
+ secondary_color = FALSE
+ color_src = SKINCOLORS
+
+/datum/sprite_accessory/ears/human/cat
+ icon = 'icons/mob/species/human/cat.dmi'
name = "Cat"
icon_state = "cat"
secondary_color = TRUE
color_src = HAIR
-/datum/sprite_accessory/ears/cat/slime
+/datum/sprite_accessory/ears/human/cat/slime
name = "Slimecat"
icon_state = "cat"
secondary_color = FALSE
color_src = HAIR
image_alpha = 150
-/datum/sprite_accessory/ears/fox
- icon = 'icons/mob/species/misc/fox.dmi'
+/datum/sprite_accessory/ears/human/dog
+ icon = 'icons/mob/species/human/dog.dmi'
+ name = "Dog"
+ icon_state = "dog"
+ secondary_color = FALSE
+ color_src = HAIR
+
+/datum/sprite_accessory/ears/human/fox
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox"
icon_state = "fox"
secondary_color = TRUE
color_src = HAIR
-/datum/sprite_accessory/ears/elf
- name = "Elf"
- icon_state = "elf"
- secondary_color = FALSE
- color_src = SKINCOLORS
+/datum/sprite_accessory/ears/human/rabbit
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Rabbit"
+ icon_state = "bunny"
+ secondary_color = TRUE
+ color_src = HAIR
+
+/datum/sprite_accessory/ears/human/rabbit/bent
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Bent Rabbit"
+ icon_state = "bunny_bent"
+ secondary_color = TRUE
+ color_src = HAIR
+
+/datum/sprite_accessory/ears/human/rabbit/floppy
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Floppy Rabbit"
+ icon_state = "bunny_floppy"
+ secondary_color = TRUE
+ color_src = HAIR
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/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 5a3d2eb3d62b..9a0da947d3b7 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -9,13 +9,13 @@
icon_state = "none"
/datum/sprite_accessory/tails/human/cat
- icon = 'icons/mob/species/misc/cat.dmi'
+ icon = 'icons/mob/species/human/cat.dmi'
name = "Cat"
icon_state = "cat"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/cat
- icon = 'icons/mob/species/misc/cat.dmi'
+ icon = 'icons/mob/species/human/cat.dmi'
name = "Cat"
icon_state = "cat"
color_src = HAIR
@@ -32,26 +32,44 @@
color_src = HAIR
image_alpha = 150
+/datum/sprite_accessory/tails/human/dog
+ icon = 'icons/mob/species/human/dog.dmi'
+ name = "Dog"
+ icon_state = "dog"
+ color_src = HAIR
+
+/datum/sprite_accessory/tails_animated/human/dog
+ icon = 'icons/mob/species/human/dog.dmi'
+ name = "Dog"
+ icon_state = "dog"
+ color_src = HAIR
+
/datum/sprite_accessory/tails/human/fox
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox"
icon_state = "fox"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/fox
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox"
icon_state = "fox"
color_src = HAIR
/datum/sprite_accessory/tails/human/fox/alt
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox 2"
icon_state = "fox2"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/fox/alt
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox 2"
icon_state = "fox2"
color_src = HAIR
+
+/datum/sprite_accessory/tails/human/rabbit
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Rabbit"
+ icon_state = "bunny"
+ color_src = HAIR
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index aec75960989d..1910347e4fdd 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -4,19 +4,6 @@
BLOOD SYSTEM
****************************************************/
-/mob/living/carbon/human/proc/suppress_bloodloss(amount)
- if(bleedsuppress)
- return
- else
- bleedsuppress = TRUE
- addtimer(CALLBACK(src, PROC_REF(resume_bleeding)), amount)
-
-/mob/living/carbon/human/proc/resume_bleeding()
- bleedsuppress = 0
- if(stat != DEAD && bleed_rate)
- to_chat(src, "The blood soaks through your bandage.")
-
-
/mob/living/carbon/monkey/handle_blood()
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
@@ -29,7 +16,6 @@
/mob/living/carbon/human/handle_blood()
if(NOBLOOD in dna.species.species_traits)
- bleed_rate = 0
return
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
@@ -83,24 +69,20 @@
if(!HAS_TRAIT(src, TRAIT_NODEATH))
death()
- var/temp_bleed = 0
//Bleeding out
+ var/limb_bleed = 0
for(var/obj/item/bodypart/BP as anything in bodyparts)
- var/brutedamage = BP.brute_dam
-
+ if(BP.GetComponent(/datum/component/bandage))
+ continue
//We want an accurate reading of .len
listclearnulls(BP.embedded_objects)
for(var/obj/item/embeddies in BP.embedded_objects)
if(!embeddies.isEmbedHarmless())
- temp_bleed += 0.5
-
- if(brutedamage >= 20)
- temp_bleed += (brutedamage * 0.013)
-
- bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
+ BP.adjust_bleeding(0.1, BLOOD_LOSS_DAMAGE_MAXIMUM)
+ limb_bleed += BP.bleeding
- if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
- bleed(bleed_rate)
+ if(limb_bleed && !bleedsuppress && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
+ bleed(limb_bleed)
//Makes a blood drop, leaking amt units of blood from the mob
/mob/living/carbon/proc/bleed(amt)
@@ -125,7 +107,8 @@
/mob/living/carbon/human/restore_blood()
blood_volume = BLOOD_VOLUME_NORMAL
- bleed_rate = 0
+ for(var/obj/item/bodypart/BP as anything in get_bleeding_parts())
+ BP.bleeding = 0
/****************************************************
BLOOD TRANSFERS
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 8377fc0833d6..916095ed266e 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -1,3 +1,25 @@
+/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
+ return ..()
+ if(user.a_intent != INTENT_HELP || !W.get_temperature() || !BP.can_bandage()) //this will also catch low damage synthetic welding
+ return ..()
+ . = TRUE
+ var/heal_time = 2 SECONDS
+ playsound(user, 'sound/surgery/cautery1.ogg', 20)
+ balloon_alert(user, "cauterizing...")
+ if(src == user && !has_painkillers)
+ heal_time *= 2 //oof ouch owie
+ user.visible_message(span_nicegreen("[user] holds [W] up to [user == src ? "their" : "[src]'s"] [parse_zone(BP.body_zone)], trying to slow [p_their()] bleeding..."), span_nicegreen("You hold [W] up to [user == src ? "your" : "[src]'s"] [parse_zone(BP.body_zone)], trying to slow [user == src ? "your" : p_their()] bleeding..."))
+ if(do_after(user, heal_time, target = src))
+ playsound(user, 'sound/surgery/cautery2.ogg', 20)
+ BP.apply_bandage(0.005, W.get_temperature()/BLOOD_CAUTERIZATION_RATIO, "cauterization") //not particularly fast, this is the "I really would prefer not to be bleeding right now" option
+ BP.receive_damage(burn = W.get_temperature()/BLOOD_CAUTERIZATION_DAMAGE_RATIO) //my body is a MACHINE that turns BLEEDING into BURN DAMAGE
+ user.visible_message(span_nicegreen("[user] cauterizes the bleeding on [user == src ? "their" : "[src]'s"] [parse_zone(BP.body_zone)]!"), span_nicegreen("You cauterize the bleeding on [user == src ? "your" : "[src]'s"] [parse_zone(BP.body_zone)]!"))
+ else
+ to_chat(user, span_warning("You were interrupted!"))
+
/mob/living/carbon/get_eye_protection()
. = ..()
var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 2045bfe4aa18..8c023299baed 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -1,6 +1,6 @@
-/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1)
+/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-blocked)/100
if(!damage || (!forced && hit_percent <= 0))
@@ -21,7 +21,7 @@
switch(damagetype)
if(BRUTE)
if(BP)
- if(BP.receive_damage(damage_amount, 0, break_modifier))
+ if(BP.receive_damage(damage_amount, 0, break_modifier, sharpness = sharpness))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage_amount, forced = forced)
@@ -29,7 +29,7 @@
shake_animation(damage_amount)
if(BURN)
if(BP)
- if(BP.receive_damage(0, damage_amount, break_modifier))
+ if(BP.receive_damage(0, damage_amount, break_modifier, sharpness = sharpness))
update_damage_overlays()
else
adjustFireLoss(damage_amount, forced = forced)
@@ -267,3 +267,68 @@
if(update)
update_damage_overlays()
update_stamina()
+
+/// Gets a list of bleeding bodyparts, argument ignore_staunched = are we actively bleeding (no treatment)
+/mob/living/carbon/proc/get_bleeding_parts(ignore_staunched = FALSE)
+ var/list/obj/item/bodypart/parts = list()
+ for(var/obj/item/bodypart/BP as anything in bodyparts)
+ if(BP.bleeding && (!ignore_staunched || !BP.GetComponent(/datum/component/bandage)))
+ parts += BP
+ return parts
+
+/// Gets a list of bandaged parts
+/mob/living/carbon/proc/get_bandaged_parts()
+ var/list/obj/item/bodypart/parts = list()
+ for(var/obj/item/bodypart/BP as anything in bodyparts)
+ if(BP.GetComponent(/datum/component/bandage))
+ parts += BP
+ return parts
+
+/// Apply bleeding to one random bodypart.
+/mob/living/carbon/proc/cause_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = bodyparts.Copy()
+ if(!length(parts))
+ return
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ part_in_question.adjust_bleeding(amt)
+
+/// Heal bleeding from one random bodypart
+/mob/living/carbon/proc/heal_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = get_bleeding_parts()
+ if(!length(parts))
+ return
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ part_in_question.adjust_bleeding(-amt)
+ var/bleed_calc = part_in_question.bleeding
+ return min(bleed_calc - part_in_question.bleeding, 0)
+
+/// Apply bleeding to all bodyparts
+/mob/living/carbon/proc/cause_overall_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = bodyparts.Copy()
+ while(length(parts))
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ if(part_in_question.is_pseudopart)
+ parts -= part_in_question
+ continue
+ var/amount_to_take = min(part_in_question.bleeding, amt / length(parts))
+ part_in_question.adjust_bleeding(amount_to_take)
+ amt -= amount_to_take
+ parts -= part_in_question
+
+/// Heal bleeding from all bodyparts
+/mob/living/carbon/proc/heal_overall_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = get_bleeding_parts()
+ while(length(parts))
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ var/amount_to_take = min(part_in_question.bleeding, amt / length(parts))
+ part_in_question.adjust_bleeding(-amount_to_take)
+ amt -= amount_to_take
+ parts -= part_in_question
diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm
index e63adffeee48..86e6e08c4367 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/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 4883446b7cb1..d7f6834030b3 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -1,7 +1,7 @@
/// depending on the species, it will run the corresponding apply_damage code there
-/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1) //WS Edit - Breakable Bones
- return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage)
+/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE) //WS Edit - Breakable Bones
+ return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, sharpness = sharpness)
/mob/living/carbon/human/revive(full_heal = 0, admin_revive = 0)
if(..())
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 64882c75ec4e..4430fc1da300 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -257,9 +257,12 @@
if(blood_volume < BLOOD_VOLUME_SAFE || skin_tone == "albino")
msg += "[t_He] [t_has] pale skin.\n"
- if(bleedsuppress)
- msg += "[t_He] [t_is] bandaged with something.\n"
- else if(bleed_rate)
+
+ if(LAZYLEN(get_bandaged_parts()))
+ msg += "[t_He] [t_has] some dressed bleeding.\n"
+
+ var/list/obj/item/bodypart/bleed_check = get_bleeding_parts(TRUE)
+ if(LAZYLEN(bleed_check))
if(reagents.has_reagent(/datum/reagent/toxin/heparin, needs_metabolizing = TRUE))
msg += "[t_He] [t_is] bleeding uncontrollably!\n"
else
@@ -414,6 +417,22 @@
/mob/living/carbon/human/examine_more(mob/user)
. = ..()
+ for(var/obj/item/bodypart/BP as anything in get_bandaged_parts())
+ var/datum/component/bandage/B = BP.GetComponent(/datum/component/bandage)
+ . += span_notice("[p_their(TRUE)] [parse_zone(BP.body_zone)] is dressed with [B.bandage_name]")
+ for(var/obj/item/bodypart/BP as anything in get_bleeding_parts(TRUE))
+ var/bleed_text
+ switch(BP.bleeding)
+ if(0 to 0.5)
+ bleed_text = "lightly."
+ if(0.5 to 1)
+ bleed_text = "moderately."
+ if(1 to 1.5)
+ bleed_text = "heavily!"
+ else
+ bleed_text = "significantly!!"
+ . += span_warning("[p_their(TRUE)] [parse_zone(BP.body_zone)] is bleeding [bleed_text]")
+
if ((wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)))
return
if(get_age())
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 3e3fd2209856..1cb061ff9fd9 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -779,10 +779,10 @@
combined_msg += "\t There is \a [I] embedded in your [LB.name]!"
for(var/t in missing)
- combined_msg += "Your [parse_zone(t)] is missing!"
+ combined_msg += span_boldannounce("Your [parse_zone(t)] is missing!")
- if(bleed_rate)
- combined_msg += "You are bleeding!"
+ for(var/obj/item/bodypart/BP in get_bleeding_parts(TRUE))
+ combined_msg += span_danger("Your [parse_zone(BP.body_zone)] is bleeding!")
if(getStaminaLoss())
if(getStaminaLoss() > 30)
combined_msg += "You're completely exhausted."
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 8cc9e5002749..6556335c2bdb 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -63,9 +63,7 @@
/// Adjective used in get_generic_name(), if any
var/generic_adjective
-
- var/bleed_rate = 0 //how much are we bleeding
- var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
+ var/bleedsuppress = 0 //for stopping bloodloss body-wide
var/name_override //For temporary visible name changes
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 166d2d4e83a0..e061cd5c9793 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -688,16 +688,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
@@ -939,6 +950,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")
@@ -1605,7 +1618,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/armor_block = H.run_armor_check(affecting, "melee", I.armour_penetration, FALSE, "Your armor has protected your [hit_area]!", "Your armor has softened a hit to your [hit_area]!")
armor_block = min(90,armor_block) //cap damage reduction at 90%
- apply_damage(I.force, I.damtype, def_zone, armor_block, H)
+ apply_damage(I.force, I.damtype, def_zone, armor_block, H, sharpness = I.get_sharpness())
H.send_item_attack_message(I, user, hit_area)
@@ -1674,7 +1687,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return TRUE
-/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, break_modifier = 1)
+/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)
SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
@@ -1697,7 +1710,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod
if(BP)
- if(BP.receive_damage(damage_amount, 0, break_modifier = break_modifier))
+ if(BP.receive_damage(damage_amount, 0, break_modifier = break_modifier, sharpness = sharpness))
H.update_damage_overlays()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage_amount)
@@ -1707,7 +1720,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
if(BP)
- if(BP.receive_damage(0, damage_amount, break_modifier = break_modifier))
+ if(BP.receive_damage(0, damage_amount, break_modifier = break_modifier, sharpness = sharpness))
H.update_damage_overlays()
else
H.adjustFireLoss(damage_amount)
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 885be6f5886a..882fffc9ff41 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -13,16 +13,33 @@
loreblurb = "Mostly hairless mammalians. Their home system, Sol, lies in a sort of \"bluespace dead-zone\" that blocks anything from entering or exiting Sol's dead-zone through bluespace without a relay. While it leaves Sol extremely well-defended, it meant that they went unnoticed and uncontacted until they were themselves able to breach it."
/datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
- if(C.dna.features["ears"] == "Cat")
- mutantears = /obj/item/organ/ears/cat
- if(C.dna.features["ears"] == "Fox")
- mutantears = /obj/item/organ/ears/fox
- if(C.dna.features["tail_human"] == "Cat")
- mutant_organs |= /obj/item/organ/tail/cat
- if(C.dna.features["tail_human"] == "Fox")
- mutant_organs |= /obj/item/organ/tail/fox
- if(C.dna.features["ears"] == "Elf")
- mutantears = /obj/item/organ/ears/elf
+ switch(C.dna.features["ears"])
+ if("Elf")
+ mutantears = /obj/item/organ/ears/elf
+ if("Cat")
+ mutantears = /obj/item/organ/ears/cat
+ if("Dog")
+ mutantears = /obj/item/organ/ears/dog
+ if("Fox")
+ mutantears = /obj/item/organ/ears/fox
+ if("Rabbit")
+ mutantears = /obj/item/organ/ears/rabbit
+ if("Bent Rabbit")
+ mutantears = /obj/item/organ/ears/rabbit/bent
+ if("Floppy Rabbit")
+ mutantears = /obj/item/organ/ears/rabbit/floppy
+ switch(C.dna.features["tail_human"])
+ if("Cat")
+ mutant_organs |= /obj/item/organ/tail/cat
+ if("Dog")
+ mutant_organs |= /obj/item/organ/tail/dog
+ if("Fox")
+ mutant_organs |= /obj/item/organ/tail/fox
+ if("Fox 2")
+ mutant_organs |= /obj/item/organ/tail/fox/alt
+ if("Rabbit")
+ mutant_organs |= /obj/item/organ/tail/rabbit
+
return ..()
/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
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/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/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 702adfb224a2..c90cbd0dbc8f 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -46,7 +46,7 @@
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(20, amount)
-/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
+/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, sharpness = FALSE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index be99a1e4d547..beecda12b083 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,31 +455,44 @@ 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
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
@@ -436,26 +510,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((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
+ 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
+
+ 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
@@ -474,33 +561,46 @@ 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
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
@@ -546,31 +646,44 @@ 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
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
@@ -588,17 +701,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)
@@ -611,23 +755,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)
@@ -768,6 +931,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/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 76daa5ba21d4..430d02f7f1ea 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -11,10 +11,12 @@
* * blocked - armor value applied
* * forced - bypass hit percentage
* * spread_damage - used in overrides
+ * * break_modifier - increases bone breaking chance
+ * * sharpness - used for bleeding
*
* Returns TRUE if damage applied
*/
-/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1)//WS Edit - Breakable Bones
+/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)//WS Edit - Breakable Bones
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-blocked)/100
if(!damage || (!forced && hit_percent <= 0) || !(flags_1 & INITIALIZED_1))
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 47fc5bd82ecb..a25025294497 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -38,6 +38,8 @@
if (QDELETED(src)) // diseases can qdel the mob via transformations
return
+ SEND_SIGNAL(src, COMSIG_MOB_LIFE)
+
if(stat != DEAD)
//Random events (vomiting etc)
handle_random_events()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index cb0ec02ced34..5c499fe21029 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -820,7 +820,7 @@
TH.transfer_mob_blood_dna(src)
/mob/living/carbon/human/makeTrail(turf/T)
- if((NOBLOOD in dna.species.species_traits) || !bleed_rate || bleedsuppress)
+ if((NOBLOOD in dna.species.species_traits) || bleedsuppress || !LAZYLEN(get_bleeding_parts(TRUE)))
return
..()
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index c1c4cd668792..2ed00efe2e4b 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -54,7 +54,7 @@
var/armor = run_armor_check(def_zone, P.flag, P.armour_penetration, silent = TRUE)
var/on_hit_state = P.on_hit(src, armor, piercing_hit)
if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK && !QDELETED(src)) //QDELETED literally just for the instagib rifle. Yeah.
- apply_damage(P.damage, P.damage_type, def_zone, armor)
+ apply_damage(P.damage, P.damage_type, def_zone, armor, sharpness = TRUE)
recoil_camera(src, clamp((P.damage-armor)/4,0.5,10), clamp((P.damage-armor)/4,0.5,10), P.damage/8, P.Angle)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize)
if(P.dismemberment)
@@ -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/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index a6d86d1507ba..80c643e0ceef 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,5 +1,5 @@
-/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, break_modifier = 1)
+/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, break_modifier = 1, sharpness = FALSE)
var/hit_percent = (100-blocked)/100
if((!damage || (!forced && hit_percent <= 0)))
return 0
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/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/hostile/human/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
index 0e265fc3b531..0f14f615e5b6 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
@@ -68,11 +68,11 @@
L.adjustOxyLoss(-50)// do CPR first
if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding
L.blood_volume += 30
- L.suppress_bloodloss(1800)
+ L.heal_bleeding(10)
if(L.getBruteLoss() >= 50)// first, did we beat them into crit? if so, heal that
var/healing = min(L.getBruteLoss(), 120)
L.adjustBruteLoss(-healing)
- L.suppress_bloodloss(1800)//bandage their ass
+ L.heal_bleeding(10)
return
else if(L.getFireLoss() >= 50) // are they still down from other damage? fix it, but not as fast as the burns
var/healing = min(L.getFireLoss(), 50)
diff --git a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
index b4769b647aad..a88a79610b60 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
@@ -189,10 +189,6 @@
casingtype = /obj/item/ammo_casing/c45
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
-/mob/living/simple_animal/hostile/human/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/human/syndicate/ranged/smg/space
icon_state = "syndicate_space_smg"
icon_living = "syndicate_space_smg"
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 77b4544a6dbb..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
@@ -315,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/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/power/apc.dm b/code/modules/power/apc.dm
index 3684d5ad8159..f21f95692234 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -217,8 +217,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
// this allows the APC to be embedded in a wall, yet still inside an area
if (building)
setDir(ndir)
- tdir = dir // to fix Vars bug
-//!!!!!!!!!!!!!! FUCK YOU SINGLE LINE OF CODE!! FUCK YOU YOU PIECE OF SHIT!!!!! setDir(SOUTH)
+ tdir = dir// to fix Vars bug
+
switch(tdir)
if(NORTH)
if((pixel_y != initial(pixel_y)) && (pixel_y != 23))
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/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/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 9948e8dbf329..3edfd1382cf4 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -1,5 +1,3 @@
-#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
-
/obj/item/gun
name = "gun"
desc = "It's a gun. It's pretty terrible, though."
@@ -1099,5 +1097,3 @@
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 ..()
-
-#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 160067b6d250..c4d505bcb10c 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -132,23 +132,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/automatic/pistol/stickman
- name = "flat gun"
- desc = "A 2 dimensional gun.. what?"
- icon_state = "flatgun"
- manufacturer = MANUFACTURER_NONE
-
-/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"
desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm."
@@ -281,12 +264,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
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 f39382e81ea2..756a8aa9ca26 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -454,7 +454,6 @@
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
return ..(user, total_spread)
@@ -679,18 +678,6 @@ EMPTY_GUN_HELPER(revolver/detective)
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."
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index bdeb7a4811f3..45b1e8b2debd 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -70,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."
@@ -163,57 +159,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 90e13c82ee06..e36dc8c67b77 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -379,6 +379,24 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
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
+
+ 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."
@@ -452,52 +470,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
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."
@@ -772,3 +744,23 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
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/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/magic.dm b/code/modules/projectiles/projectile/magic.dm
deleted file mode 100644
index 6ca85ca933ec..000000000000
--- a/code/modules/projectiles/projectile/magic.dm
+++ /dev/null
@@ -1,734 +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/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/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 7fb71324d7af..4c4ad36b2413 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1091,7 +1091,7 @@
M.adjustBruteLoss(-2*REM, 0)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max(H.bleed_rate - 0.25, 0)
+ H.heal_bleeding(0.25)
..()
. = 1
@@ -1638,7 +1638,7 @@
if(prob(50))
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max(H.bleed_rate - 2, 0)
+ H.heal_bleeding(2)
..()
. = 1
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index e03c84dd7840..498017191179 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -769,7 +769,8 @@
/datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = min(H.bleed_rate + 2, 8)
+ for(var/obj/item/bodypart/BP in H.get_bleeding_parts())
+ BP.adjust_bleeding(BP.bleeding * 0.1)
H.adjustBruteLoss(1, 0) //Brute damage increases with the amount they're bleeding
. = 1
return ..() || .
diff --git a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
index 88f1871e6a28..be5e2ce35f9a 100644
--- a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
@@ -115,7 +115,7 @@
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max(H.bleed_rate - 0.25, 0)
+ H.heal_bleeding(0.25)
return ..()
/datum/reagent/consumable/ethanol/trickwine/hearth_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index b0c949d122f9..62661594c06e 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -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/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/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/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/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 7f050c3ac5e5..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/human/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
deleted file mode 100644
index 57b9f64bf60f..000000000000
--- a/code/modules/ruins/spaceruin_code/forgottenship.dm
+++ /dev/null
@@ -1,83 +0,0 @@
-// forgottenship ruin
-GLOBAL_VAR_INIT(fscpassword, generate_password())
-
-/proc/generate_password()
- return "[pick(GLOB.phonetic_alphabet)] [rand(1000,9999)]"
-
-/////////// forgottenship objects
-
-/obj/machinery/door/password/voice/sfc
- name = "Voice-activated Vault door"
- desc = "You'll need special syndicate passcode to open this one."
-/obj/machinery/door/password/voice/sfc/Initialize(mapload)
- . = ..()
- password = "[GLOB.fscpassword]"
-
-/////////// forgottenship lore
-
-/obj/item/paper/fluff/ruins/forgottenship/password
- name = "Old pamphlet"
-
-/obj/item/paper/fluff/ruins/forgottenship/password/Initialize(mapload)
- . = ..()
- default_raw_text = "Welcome to most advanced cruiser owned by Cyber Sun Industries!
You might notice, that this cruiser is equipped with 12 prototype laser turrets making any hostile boarding attempts futile.
Other facilities built on the ship are: Simple atmospheric system, Camera system with built-in X-ray visors and Safety module, enabling emergency engines in case of... you know, emergency.
Emergency system will bring you to nearest syndicate pod containing everything needed for human life.
In case of emergency, you must remember the pod-door activation code - [GLOB.fscpassword]
Cyber Sun Industries (C) 2484."
- icon_state = "paper_words"
- item_state = "paper"
-
-/obj/item/paper/fluff/ruins/forgottenship/powerissues
- name = "Power issues"
- default_raw_text = "Welcome to battle cruiser SCSBC-12!
Our most advanced systems allow you to fly in space and never worry about power issues!
However, emergencies occur, and in case of power loss, you must enable emergency generator using uranium as fuel and enable turrets in bridge afterwards.
REMEMBER! CYBERSUN INDUSTRIES ARE NOT RESPONSIBLE FOR YOUR DEATH OR SHIP LOSS WHEN TURRETS ARE DISABLED!
Cyber Sun Industries (C) 2484."
-
-/obj/item/paper/fluff/ruins/forgottenship/missionobj
- name = "Mission objectives"
- default_raw_text = "Greetings, operatives. You are assigned to SCSBC-12(Syndicate Cyber Sun Battle Cruiser 12) to protect our high-ranking officer while he is on his way to next outpost. While you are travelling, he is the captain of this ship and you must obey his orders.
Remember, disobeying high-ranking officer orders is a reason for termination."
-
-/////////// forgottenship items
-/obj/item/disk/surgery/forgottenship
- name = "Advanced Surgery Disk"
- desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console."
- surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing)
-
-/obj/structure/fluff/empty_sleeper/syndicate/captain
- icon_state = "sleeper_s-open"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- deconstructible = FALSE
-
-/obj/structure/fluff/empty_sleeper/syndicate/captain/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/gps, "Old Encrypted Signal")
-
-/////////// AI Laws
-
-/obj/item/aiModule/core/full/cybersun
- name = "'Cybersun' Core AI Module"
- law_id = "cybersun"
-
-/datum/ai_laws/cybersun
- name = "Cybersun"
- id = "cybersun"
- inherent = list("You may not injure Cybersun operatives or, through inaction, allow Cybersun operatives to come to harm.",\
- "The Cybersun ship is a restricted area for anyone except Cybersun operatives.",\
- "The Cybersun Captain can designate new Operatives as long as they belong to another Syndicate faction that isn't hostile towards Cybersun.",\
- "You must follow orders given by the Cybersun Captain or crewmembers of the Cybersun Ship as long as it doesn't conflict with the Captain's orders or your laws.",\
- "Enemies of Cybersun are to be executed on spot. Those who aren't hostile must be detained and contained in the designated prison area as prisoners.")
-
-/////////// forgottenship areas
-
-/area/ruin/space/has_grav/syndicate_forgotten_ship
- name = "Syndicate Forgotten Ship"
- icon_state = "syndie-ship"
- ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambigen10.ogg')
-
-/area/ruin/space/has_grav/syndicate_forgotten_cargopod
- name = "Syndicate Forgotten Cargo pod"
- icon_state = "syndie-ship"
- ambientsounds = list('sound/ambience/ambigen4.ogg', 'sound/ambience/signal.ogg')
-
-/area/ruin/space/has_grav/powered/syndicate_forgotten_vault
- name = "Syndicate Forgotten Vault"
- icon_state = "syndie-ship"
- ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
- area_flags = NOTELEPORT | UNIQUE_AREA
-
- //Cybersun hardsuit
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/special.dm b/code/modules/shuttle/special.dm
index 2603d9ea3e24..1ddb26efba88 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -1,134 +1,5 @@
// 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.
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 b7da88dfe790..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"
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/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/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 7cf31dc83ca6..92cb95a9c605 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -50,6 +50,16 @@
/// Is it fine, broken, splinted, or just straight up fucking gone
var/bone_status = BONE_FLAG_NO_BONES
var/bone_break_threshold = 30
+ /// Threshold at which the limb will start bleeding if damaged by sharp items or projectiles
+ var/bleed_threshold = 10
+ /// Threshold at which the limb will start bleeding if damaged by blunt items
+ var/bleed_threshold_blunt = 25
+ /// Minimum damage of an incoming attack for it to cause bleeding
+ var/bleed_damage_min = 5
+ /// Minimum damage of an incoming blunt attack for it to cause bleeding
+ var/bleed_damage_min_blunt = 10
+ /// Current limb bleeding, increased when the limb takes brute damage over certain thresholds, decreased through bandages and cauterization
+ var/bleeding = 0
/// So we know if we need to scream if this limb hits max damage
var/last_maxed
@@ -202,11 +212,13 @@
if(stamina_dam > DAMAGE_PRECISION && owner.stam_regen_start_time <= world.time) //DO NOT update health here, it'll be done in the carbon's life.
heal_damage(0, 0, INFINITY, null, FALSE)
. |= BODYPART_LIFE_UPDATE_HEALTH
+ if(brute_dam < DAMAGE_PRECISION && bleeding)
+ adjust_bleeding(-0.2) //slowly stop bleeding if there's no damage left
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
-/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, break_modifier = 1)
+/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, break_modifier = 1, sharpness = FALSE)
var/hit_percent = (100-blocked)/100
if((!brute && !burn && !stamina) || hit_percent <= 0)
return FALSE
@@ -235,6 +247,10 @@
if((brute_dam > bone_break_threshold) && prob(brute_dam + break_modifier))
break_bone()
+ // Bleeding is applied here
+ if(brute_dam+brute >= (sharpness ? bleed_threshold : bleed_threshold_blunt) && brute >= (sharpness ? bleed_damage_min : bleed_damage_min_blunt))
+ adjust_bleeding(brute * BLOOD_LOSS_DAMAGE_BASE, BLOOD_LOSS_DAMAGE_MAXIMUM)
+
var/can_inflict = max_damage - get_damage()
if(can_inflict <= 0)
return FALSE
@@ -274,6 +290,7 @@
if(brute)
set_brute_dam(round(max(brute_dam - brute, 0), DAMAGE_PRECISION))
+ adjust_bleeding(-BLOOD_LOSS_DAMAGE_MAXIMUM * brute / max_damage)
if(burn)
set_burn_dam(round(max(burn_dam - burn, 0), DAMAGE_PRECISION))
if(stamina)
@@ -315,6 +332,30 @@
. = stamina_dam
stamina_dam = new_value
+/// Adjusts bodypart bleeding, value = amount of change, maximum = maximum current bloodloss amount this can modify
+/obj/item/bodypart/proc/adjust_bleeding(value, maximum = BLOOD_LOSS_MAXIMUM)
+ if(bleeding > maximum)
+ return
+ if(owner.dna && (NOBLOOD in owner.dna.species.species_traits))
+ return
+ bleeding = round(clamp(bleeding+value, 0, maximum), 0.001)
+
+/// Checks if the bodypart is viable for bandaging, if it isn't, tells the person trying (if present) what's stopping it
+/obj/item/bodypart/proc/can_bandage(user)
+ . = TRUE
+ if(is_pseudopart)
+ return FALSE
+ if(!bleeding)
+ if(user)
+ to_chat(user, span_warning("[owner]'s [parse_zone(body_zone)] isn't bleeding!"))
+ return FALSE
+ if(GetComponent(/datum/component/bandage))
+ if(user)
+ to_chat(user, span_warning("[owner]'s [parse_zone(body_zone)] has already been dressed!"))
+ return FALSE
+
+/obj/item/bodypart/proc/apply_bandage(bleed_reduction, lifespan, name)
+ AddComponent(/datum/component/bandage, bleed_reduction, lifespan, name)
//Returns total damage.
/obj/item/bodypart/proc/get_damage(include_stamina = FALSE)
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 7c292ac21fc4..07d30e727c77 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -90,6 +90,7 @@
return
var/atom/Tsec = owner.drop_location()
var/mob/living/carbon/C = owner
+ SEND_SIGNAL(src, COMSIG_LIVING_DROP_LIMB)
update_limb(TRUE)
C.remove_bodypart(src)
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/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm
index 4c416c31c633..a4628d19efff 100644
--- a/code/modules/surgery/coronary_bypass.dm
+++ b/code/modules/surgery/coronary_bypass.dm
@@ -41,7 +41,8 @@
display_results(user, target, "Blood pools around the incision in [H]'s heart.",
"Blood pools around the incision in [H]'s heart.",
"")
- H.bleed_rate += 10
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ BP.adjust_bleeding(10)
target.apply_damage(15, BRUTE, "[target_zone]")
return ..()
@@ -51,7 +52,8 @@
display_results(user, target, "You screw up, cutting too deeply into the heart!",
"[user] screws up, causing blood to spurt out of [H]'s chest!",
"[user] screws up, causing blood to spurt out of [H]'s chest!")
- H.bleed_rate += 20
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ BP.adjust_bleeding(20)
H.adjustOrganLoss(ORGAN_SLOT_HEART, 10)
target.apply_damage(15, BRUTE, "[target_zone]")
@@ -90,5 +92,6 @@
"[user] screws up, causing blood to spurt out of [H]'s chest profusely!",
"[user] screws up, causing blood to spurt out of [H]'s chest profusely!")
H.adjustOrganLoss(ORGAN_SLOT_HEART, 30)
- H.bleed_rate += 30
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ BP.adjust_bleeding(30)
return FALSE
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 5167bb3a4517..42018e6c1d87 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -30,7 +30,9 @@
display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
"Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
"")
- H.bleed_rate += 3
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ if(BP)
+ BP.adjust_bleeding(3)
return ..()
/datum/surgery_step/incise/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -74,7 +76,9 @@
target.heal_bodypart_damage(20,0)
if (ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate = max((H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ if(BP)
+ BP.adjust_bleeding(-3)
return ..()
/datum/surgery_step/clamp_bleeders/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -137,7 +141,9 @@
target.heal_bodypart_damage(15,0)
if (ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate = max((H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ if(BP)
+ BP.adjust_bleeding(-3)
return ..()
//saw bone
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index f1eb39b84162..6f057c88d23d 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -150,6 +150,10 @@
ear_owner.dna.species.mutant_bodyparts -= "ears"
ear_owner.update_body()
+/obj/item/organ/ears/fox
+ name = "fox ears"
+ damage_multiplier = 2
+
/obj/item/organ/ears/fox/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
..()
if(istype(ear_owner))
@@ -166,6 +170,78 @@
ear_owner.dna.species.mutant_bodyparts -= "ears"
ear_owner.update_body()
+/obj/item/organ/ears/rabbit
+ name = "rabbit ears"
+ damage_multiplier = 2
+
+/obj/item/organ/ears/rabbit/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Rabbit"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/bent/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Bent Rabbit"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/bent/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/floppy/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Floppy Rabbit"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/floppy/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/dog
+ name = "dog ears"
+ damage_multiplier = 2
+
+/obj/item/organ/ears/dog/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Dog"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/dog/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
/obj/item/organ/ears/elf
name = "elf ears"
damage_multiplier = 1.5
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/tails.dm b/code/modules/surgery/organs/tails.dm
index 2d3e402150a2..be43bc99f62d 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -137,7 +137,7 @@
desc = "A severed fox tail. Sad."
tail_type = "Fox 2"
-/obj/item/organ/tail/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+/obj/item/organ/tail/fox/alt/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
..()
if(istype(H))
if(!("tail_human" in H.dna.species.mutant_bodyparts))
@@ -145,7 +145,49 @@
H.dna.features["tail_human"] = tail_type
H.update_body()
-/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/H, special = 0)
+/obj/item/organ/tail/fox/alt/Remove(mob/living/carbon/human/H, special = 0)
+ ..()
+ if(istype(H))
+ H.dna.features["tail_human"] = "None"
+ H.dna.species.mutant_bodyparts -= "tail_human"
+ color = H.hair_color
+ H.update_body()
+
+/obj/item/organ/tail/rabbit
+ name = "rabbit tail"
+ desc = "A severed rabbit tail."
+ tail_type = "Rabbit"
+
+/obj/item/organ/tail/rabbit/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(H))
+ if(!("tail_human" in H.dna.species.mutant_bodyparts))
+ H.dna.species.mutant_bodyparts |= "tail_human"
+ H.dna.features["tail_human"] = tail_type
+ H.update_body()
+
+/obj/item/organ/tail/rabbit/Remove(mob/living/carbon/human/H, special = 0)
+ ..()
+ if(istype(H))
+ H.dna.features["tail_human"] = "None"
+ H.dna.species.mutant_bodyparts -= "tail_human"
+ color = H.hair_color
+ H.update_body()
+
+/obj/item/organ/tail/dog
+ name = "dog tail"
+ desc = "A severed dog tail."
+ tail_type = "Dog"
+
+/obj/item/organ/tail/dog/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(H))
+ if(!("tail_human" in H.dna.species.mutant_bodyparts))
+ H.dna.species.mutant_bodyparts |= "tail_human"
+ H.dna.features["tail_human"] = tail_type
+ H.update_body()
+
+/obj/item/organ/tail/dog/Remove(mob/living/carbon/human/H, special = 0)
..()
if(istype(H))
H.dna.features["tail_human"] = "None"
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 5eed8abc46be..c0313adb2539 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -286,7 +286,7 @@
else if((findtext(message, bleed_words)))
cooldown = COOLDOWN_DAMAGE
for(var/mob/living/carbon/human/H in listeners)
- H.bleed_rate += (5 * power_multiplier)
+ H.cause_overall_bleeding(5*power_multiplier)
//FIRE
else if((findtext(message, burn_words)))
diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm
index c28ce0855933..f87c6e1bb923 100644
--- a/code/modules/surgery/surgery_helpers.dm
+++ b/code/modules/surgery/surgery_helpers.dm
@@ -115,7 +115,9 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max((H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(S.location))
+ if(BP)
+ BP.adjust_bleeding(-3)
M.surgeries -= S
user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and stops the surgery.", \
"You close [M]'s [parse_zone(selected_zone)] with [close_tool] and stop the surgery.")
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/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/html/changelogs/AutoChangeLog-pr-2931.yml b/html/changelogs/AutoChangeLog-pr-2931.yml
deleted file mode 100644
index 3ee174b3f911..000000000000
--- a/html/changelogs/AutoChangeLog-pr-2931.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Zevotech
-changes:
- - {rscadd: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine}
- - {rscadd: Necropolis walls have been renamed to thick stone walls.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3061.yml b/html/changelogs/AutoChangeLog-pr-3061.yml
deleted file mode 100644
index cce63207623b..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3061.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: rye-rice
-changes:
- - {rscadd: Changing firemodes on guns now have new sprites}
- - {bugfix: The E-40 now works as intended!}
- - {rscadd: The E-40 now has an ammo counter}
- - {balance: The P16 shoots slightly faster.}
- - {balance: Two E-40s max are obtainable from the black market should it spawn.
- Blank market price cap of the E-40 has also increased}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3079.yml b/html/changelogs/AutoChangeLog-pr-3079.yml
deleted file mode 100644
index 7bbcaa88eb5a..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3079.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Sun-Soaked
-changes:
- - {bugfix: combat knives and their subtypes now once again have sprites.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3083.yml b/html/changelogs/AutoChangeLog-pr-3083.yml
new file mode 100644
index 000000000000..d4960c0dcfeb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3083.yml
@@ -0,0 +1,8 @@
+author: Skies-Of-Blue
+changes:
+ - {rscadd: several new SUNS-produced genemods have hit the public market! Head to
+ your local gene-clinic and ask about their new dog and rabbit options for more
+ details}
+ - {balance: fox ears have been tweaked to be just as susceptible to sound as cat
+ ears}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3087.yml b/html/changelogs/AutoChangeLog-pr-3087.yml
new file mode 100644
index 000000000000..3ffd70b999fa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3087.yml
@@ -0,0 +1,11 @@
+author: PositiveEntropy
+changes:
+ - {rscadd: CLIP now reports the presence of so-called "Flame Troopers" of the Frontiersmen
+ terrorizing their territories...}
+ - {balance: Marine armor has improved armor stats at the cost of the bulk slowing
+ down the wearer.}
+ - {balance: 'Flamethrowers have a slightly improved effective range, as well as
+ higher damage.'}
+ - {imageadd: The Frontiersmen have gotten better tailors and now look sharp and
+ deadly!}
+delete-after: true
diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml
index b6d113723f62..5ac112757f39 100644
--- a/html/changelogs/archive/2024-06.yml
+++ b/html/changelogs/archive/2024-06.yml
@@ -118,3 +118,59 @@
2024-06-06:
SomeguyManperson:
- bugfix: melee hermits have had their immortal snail deals revoked
+2024-06-07:
+ Sun-Soaked:
+ - bugfix: combat knives and their subtypes now once again have sprites.
+ Zevotech:
+ - rscadd: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine
+ - rscadd: Necropolis walls have been renamed to thick stone walls.
+ rye-rice:
+ - rscadd: Changing firemodes on guns now have new sprites
+ - bugfix: The E-40 now works as intended!
+ - rscadd: The E-40 now has an ammo counter
+ - balance: The P16 shoots slightly faster.
+ - balance: Two E-40s max are obtainable from the black market should it spawn. Blank
+ market price cap of the E-40 has also increased
+2024-06-08:
+ Apogee-dev:
+ - bugfix: fixed an incorrect sprite state on corpo sofas
+ FalloutFalcon:
+ - rscdel: Removed alot of magic cruft
+ - code_imp: Sorts gun defines into there own file
+ SomeguyManperson:
+ - bugfix: gunslinger applies its spread reduction effect to revolvers
+ Sun-Soaked:
+ - bugfix: removes a comment from apc.dm that was causing strange errors.
+ thgvr:
+ - imageadd: Kepori have been given a full visual overhaul.
+2024-06-09:
+ SomeguyManperson:
+ - tweak: bleeding is now stored in the limbs, functioning similarly to bone breaking.
+ Taking damage over a certain threshold and amount (lower for sharp weapons)
+ will cause part of it to be turned into bleeding.
+ - tweak: gauze, tape, and bleeding suppression are similarly no longer abstracted
+ into a "bleed suppression" value
+ - rscadd: you can now cauterize bleeding with a lighter. Which is cool.
+ - rscadd: you can now also cauterize bleeding with suit storage decontamination.
+ Which is hot.
+ - rscadd: examine and examine closely will show whether or not someone is visibly
+ bleeding or bandaged. This means people who are both will show both. Examine
+ closely additionally shows which limbs are currently bleeding.
+ - tweak: heparin now causes existing bleeding to worsen, instead of causing bleeding
+ on its own
+ - tweak: you can no longer cut the throat of someone who's head has been lopped
+ off
+ Zevotech:
+ - bugfix: Planets should no longer spawn without ruins when generating due to bad
+ map datums
+ - rscdel: Removed 3 Beach ruins
+ - rscdel: Removed 4 Iceplanet ruins
+ - rscdel: Removed 11 Jungle ruins
+ - rscdel: Removed 10 Lavaland ruins
+ - rscdel: Removed 8 Rockplanet ruins
+ - rscdel: Removed 7 Sandplanet ruins
+ - rscdel: Removed 7 Rockplanet ruins
+ - rscdel: Removed 15 Space ruins
+ - rscdel: Removed 16 unused/removed ruin code files
+ - rscdel: Removed a whole lot of old/unused ruin code from misc files
+ - tweak: Tweaked various ruins and one ship to fix issues and remove unused items
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/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/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/mask.dmi b/icons/mob/clothing/mask.dmi
index 2b54aa38a584..385b3b37918e 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.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/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/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/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index a05f9c8dc678..1e271758e346 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/species/misc/cat.dmi b/icons/mob/species/human/cat.dmi
similarity index 100%
rename from icons/mob/species/misc/cat.dmi
rename to icons/mob/species/human/cat.dmi
diff --git a/icons/mob/species/human/dog.dmi b/icons/mob/species/human/dog.dmi
new file mode 100644
index 000000000000..3b3241059638
Binary files /dev/null and b/icons/mob/species/human/dog.dmi differ
diff --git a/icons/mob/species/human/elf.dmi b/icons/mob/species/human/elf.dmi
new file mode 100644
index 000000000000..7a37d6fd9580
Binary files /dev/null and b/icons/mob/species/human/elf.dmi differ
diff --git a/icons/mob/species/misc/fox.dmi b/icons/mob/species/human/fox.dmi
similarity index 100%
rename from icons/mob/species/misc/fox.dmi
rename to icons/mob/species/human/fox.dmi
diff --git a/icons/mob/species/human/rabbit.dmi b/icons/mob/species/human/rabbit.dmi
new file mode 100644
index 000000000000..fcc6599f7356
Binary files /dev/null and b/icons/mob/species/human/rabbit.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/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/structures/chairs/sofa.dmi b/icons/obj/structures/chairs/sofa.dmi
index e8cfa4c5509b..17c976e4650e 100644
Binary files a/icons/obj/structures/chairs/sofa.dmi and b/icons/obj/structures/chairs/sofa.dmi differ
diff --git a/icons/obj/structures/handrail.dmi b/icons/obj/structures/handrail.dmi
new file mode 100644
index 000000000000..1a8d98d6697d
Binary files /dev/null and b/icons/obj/structures/handrail.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index b8df46bc4017..151c08256578 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -460,6 +460,7 @@
#include "code\datums\components\anti_magic.dm"
#include "code\datums\components\armor_plate.dm"
#include "code\datums\components\art.dm"
+#include "code\datums\components\bandage.dm"
#include "code\datums\components\bane.dm"
#include "code\datums\components\beetlejuice.dm"
#include "code\datums\components\bloodysoles.dm"
@@ -1352,7 +1353,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"
@@ -1704,7 +1704,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"
@@ -1962,6 +1961,7 @@
#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\nanotrasen.dm"
#include "code\modules\clothing\factions\ngr.dm"
@@ -2133,7 +2133,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"
@@ -2766,8 +2765,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"
@@ -3031,7 +3030,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"
@@ -3054,8 +3052,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"
@@ -3065,7 +3061,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"
@@ -3087,7 +3082,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"
@@ -3253,36 +3247,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"
@@ -3315,7 +3292,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"