diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index aa5a9e000c..19bd2b9c53 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -33,6 +33,9 @@
defence_mode_possible = 1
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
+
/*
/obj/mecha/combat/durand/New()
..()
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 0323124c47..1f9d4a0b6e 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -31,6 +31,9 @@
overload_possible = 1
+ icon_scale_x = 1.35
+ icon_scale_y = 1.35
+
//Not quite sure how to move those yet.
/obj/mecha/combat/gygax/get_commands()
var/output = {"
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index e2c0b9467a..fd0442a294 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -44,6 +44,9 @@
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
)
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
+
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "Seraph"
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index bec2b1a6c3..c716b1f33e 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -49,6 +49,9 @@
..()
return
+/obj/item/mecha_parts/mecha_equipment/proc/add_equip_overlay(obj/mecha/M as obj)
+ return
+
/obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page()
if(chassis)
send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
diff --git a/code/game/mecha/equipment/tools/repair_droid.dm b/code/game/mecha/equipment/tools/repair_droid.dm
index 7cd8ebd9ab..acae64142f 100644
--- a/code/game/mecha/equipment/tools/repair_droid.dm
+++ b/code/game/mecha/equipment/tools/repair_droid.dm
@@ -26,9 +26,10 @@
pr_repair_droid = null
..()
-/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj)
+/obj/item/mecha_parts/mecha_equipment/repair_droid/add_equip_overlay(obj/mecha/M as obj)
..()
- droid_overlay = new(src.icon, icon_state = "repair_droid")
+ if(!droid_overlay)
+ droid_overlay = new(src.icon, icon_state = "repair_droid")
M.add_overlay(droid_overlay)
return
diff --git a/code/game/mecha/equipment/tools/shield.dm b/code/game/mecha/equipment/tools/shield.dm
index ce0c43e7da..0a50869e88 100644
--- a/code/game/mecha/equipment/tools/shield.dm
+++ b/code/game/mecha/equipment/tools/shield.dm
@@ -37,15 +37,19 @@
my_shield = null
..()
+/obj/item/mecha_parts/mecha_equipment/combat_shield/add_equip_overlay(obj/mecha/M as obj)
+ ..()
+ if(!drone_overlay)
+ drone_overlay = new(src.icon, icon_state = "shield_droid")
+ M.overlays += drone_overlay
+ return
+
/obj/item/mecha_parts/mecha_equipment/combat_shield/attach(obj/mecha/M as obj)
..()
if(chassis)
my_shield.shield_health = 0
my_shield.my_mecha = chassis
my_shield.forceMove(chassis)
-
- drone_overlay = new(src.icon, icon_state = "shield_droid")
- M.overlays += drone_overlay
return
/obj/item/mecha_parts/mecha_equipment/combat_shield/detach()
diff --git a/code/game/mecha/equipment/tools/syringe_gun.dm b/code/game/mecha/equipment/tools/syringe_gun.dm
index 7449d80c0f..1658a01df6 100644
--- a/code/game/mecha/equipment/tools/syringe_gun.dm
+++ b/code/game/mecha/equipment/tools/syringe_gun.dm
@@ -467,11 +467,15 @@
if(enabled)
set_ready_state(0)
log_message("Activated.")
- chassis.overlays += drone_overlay
else
set_ready_state(1)
log_message("Deactivated.")
- chassis.overlays -= drone_overlay
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj)
+ ..()
+ if(enabled)
+ M.add_overlay(drone_overlay)
+ return
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Topic(href, href_list)
..()
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 548bb0fbe9..6b925b564e 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -209,6 +209,11 @@
var/obj/item/mecha_parts/mecha_equipment/ME = new path(src)
ME.attach(src)
+<<<<<<< HEAD
+=======
+ update_transform()
+
+>>>>>>> 95ea4f6... Mech Appearance Update (#7818)
/obj/mecha/drain_power(var/drain_check)
if(drain_check)
@@ -1576,11 +1581,12 @@
src.verbs += /obj/mecha/verb/eject
src.Entered(mmi_as_oc)
src.Move(src.loc)
- src.icon_state = src.reset_icon()
+ update_icon()
set_dir(dir_in)
src.log_message("[mmi_as_oc] moved in as pilot.")
if(!hasInternalDamage())
src.occupant << sound('sound/mecha/nominal.ogg',volume=50)
+ update_icon()
return 1
else
return 0
@@ -1883,11 +1889,15 @@
src.forceMove(src.loc)
src.verbs += /obj/mecha/verb/eject
src.log_append_to_last("[H] moved in as pilot.")
+<<<<<<< HEAD
src.icon_state = src.reset_icon()
//VOREStation Edit Add
if(occupant.hud_used)
minihud = new (occupant.hud_used, src)
//VOREStation Edit Add End
+=======
+ update_icon()
+>>>>>>> 95ea4f6... Mech Appearance Update (#7818)
//This part removes all the verbs if you don't have them the _possible on your mech. This is a little clunky, but it lets you just add that to any mech.
//And it's not like this 10yo code wasn't clunky before.
@@ -2003,7 +2013,7 @@
occupant.clear_alert("mech damage")
occupant.in_enclosed_vehicle = 0
occupant = null
- icon_state = src.reset_icon()+"-open"
+ update_icon()
set_dir(dir_in)
verbs -= /obj/mecha/verb/eject
@@ -2663,13 +2673,6 @@
return 1
return 0
-/obj/mecha/proc/reset_icon()
- if (initial_icon)
- icon_state = initial_icon
- else
- icon_state = initial(icon_state)
- return icon_state
-
//This is for mobs mostly.
/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
diff --git a/code/game/mecha/mecha_appearance.dm b/code/game/mecha/mecha_appearance.dm
new file mode 100644
index 0000000000..5136ef070b
--- /dev/null
+++ b/code/game/mecha/mecha_appearance.dm
@@ -0,0 +1,65 @@
+
+
+/obj/mecha
+ // Show the pilot.
+ var/show_pilot = FALSE
+
+ // The state of the 'face', or the thing that overlays on the pilot. If this isn't set, it will probably look really weird.
+ var/face_state = null
+ var/icon/face_overlay
+
+ var/icon/pilot_image
+
+ // How many pixels do we bump the pilot upward?
+ var/pilot_lift = 0
+
+/obj/mecha/update_transform()
+ // Now for the regular stuff.
+ var/matrix/M = matrix()
+ M.Scale(icon_scale_x, icon_scale_y)
+ M.Translate(0, 16*(icon_scale_y-1))
+ animate(src, transform = M, time = 10)
+ return
+
+/obj/mecha/update_icon()
+ if(!initial_icon)
+ initial_icon = initial(icon_state)
+
+ if(occupant)
+ icon_state = initial_icon
+ else
+ icon_state = "[initial_icon]-open"
+
+ cut_overlays()
+
+ if(show_pilot)
+ if(occupant)
+ pilot_image = getCompoundIcon(occupant)
+
+ if(!istype(occupant, /mob/living/carbon/brain))
+
+ var/icon/Cutter
+
+ if("[initial_icon]_cutter" in icon_states(icon))
+ Cutter = new(src.icon, "[initial_icon]_cutter")
+
+ if(Cutter)
+ pilot_image.Blend(Cutter, ICON_MULTIPLY, y = (-1 * pilot_lift))
+
+ var/image/Pilot = image(pilot_image)
+
+ Pilot.pixel_y = pilot_lift
+
+ add_overlay(Pilot)
+ else
+ pilot_image = null
+
+ if(face_state && !face_overlay)
+ face_overlay = new(src.icon, icon_state = face_state)
+
+ if(face_overlay)
+ add_overlay(face_overlay)
+
+ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
+ ME.add_equip_overlay(src)
+ return
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index dbba0cd251..4db6332cb1 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -17,6 +17,9 @@
step_energy_drain = 6
var/obj/item/clothing/glasses/hud/health/mech/hud
+ icon_scale_x = 1.2
+ icon_scale_y = 1.2
+
/obj/mecha/medical/odysseus/New()
..()
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index aff19e301d..def044c9bb 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -24,6 +24,9 @@
/obj/item/mecha_parts/component/electrical
)
+ icon_scale_x = 1.2
+ icon_scale_y = 1.2
+
/obj/mecha/working/ripley/Destroy()
for(var/atom/movable/A in src.cargo)
A.loc = loc
@@ -92,6 +95,20 @@
for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily
qdel (B)
+/obj/mecha/working/ripley/antique
+ name = "APLU \"Geiger\""
+ desc = "You can't beat the classics."
+ icon_state = "ripley-old"
+ initial_icon = "ripley-old"
+
+ show_pilot = TRUE
+ pilot_lift = 5
+
+ max_utility_equip = 1
+ max_universal_equip = 3
+
+ icon_scale_x = 1
+ icon_scale_y = 1
//Vorestation Edit Start
diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm
index 223c9a2018..45430a41c9 100644
--- a/code/game/objects/items/paintkit.dm
+++ b/code/game/objects/items/paintkit.dm
@@ -241,7 +241,7 @@
M.initial_icon = new_icon
if(new_icon_file)
M.icon = new_icon_file
- M.reset_icon()
+ M.update_icon()
use(1, user)
/obj/mecha/attackby(var/obj/item/weapon/W, var/mob/user)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index f47566279a..e963539aff 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -286,6 +286,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping.
icon_key += "_t" //VOREStation Edit.
+ if(istype(tail_style, /datum/sprite_accessory/tail/taur))
+ icon_key += tail_style.clip_mask_state
+
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
if(human_icon_cache[icon_key])
@@ -295,10 +298,26 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/obj/item/organ/external/chest = get_organ(BP_TORSO)
base_icon = chest.get_icon()
+ var/icon/Cutter = null
+
+ if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that.
+ Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask)
+
+ Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black.
+
+ Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white.
+ Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty.
+
+ Cutter.Blend("#000000", ICON_MULTIPLY) // Black again.
+
for(var/obj/item/organ/external/part in organs)
if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
continue
var/icon/temp = part.get_icon(skeleton)
+
+ if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter)
+ temp.Blend(Cutter, ICON_AND, x = -16)
+
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
if(part.icon_position & (LEFT | RIGHT))
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 65dfa98237..44f6047eeb 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index bf9150e85e..b410e9fe49 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -948,6 +948,7 @@
#include "code\game\mecha\mech_sensor.dm"
#include "code\game\mecha\mecha.dm"
#include "code\game\mecha\mecha_actions.dm"
+#include "code\game\mecha\mecha_appearance.dm"
#include "code\game\mecha\mecha_construction_paths.dm"
#include "code\game\mecha\mecha_control_console.dm"
#include "code\game\mecha\mecha_helpers.dm"