diff --git a/baystation12.dme b/baystation12.dme
index 3c8de428d3..11f9db1b0f 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -718,7 +718,6 @@
#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lamarr_cage.dm"
#include "code\game\objects\structures\lattice.dm"
-#include "code\game\objects\structures\mineral_doors.dm"
#include "code\game\objects\structures\mirror.dm"
#include "code\game\objects\structures\mop_bucket.dm"
#include "code\game\objects\structures\morgue.dm"
@@ -726,6 +725,7 @@
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
+#include "code\game\objects\structures\simple_doors.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
#include "code\game\objects\structures\transit_tubes.dm"
diff --git a/code/game/gamemodes/cult/cultify/obj.dm b/code/game/gamemodes/cult/cultify/obj.dm
index c29c4044cb..a45c46a6ce 100644
--- a/code/game/gamemodes/cult/cultify/obj.dm
+++ b/code/game/gamemodes/cult/cultify/obj.dm
@@ -59,7 +59,7 @@
qdel(src)
/obj/machinery/door/airlock/external/cultify()
- new /obj/structure/mineral_door/wood(loc)
+ new /obj/structure/simple_door/wood(loc)
..()
/obj/machinery/door/cultify()
@@ -114,11 +114,11 @@
/obj/structure/grille/cult/cultify()
return
-/obj/structure/mineral_door/cultify()
- new /obj/structure/mineral_door/wood(loc)
+/obj/structure/simple_door/cultify()
+ new /obj/structure/simple_door/wood(loc)
..()
-/obj/structure/mineral_door/wood/cultify()
+/obj/structure/simple_door/wood/cultify()
return
/obj/singularity/cultify()
diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm
index abb6adb48d..9311428942 100644
--- a/code/game/objects/items/ashtray.dm
+++ b/code/game/objects/items/ashtray.dm
@@ -1,25 +1,44 @@
/obj/item/ashtray
- icon = 'icons/ashtray.dmi'
- var/
- max_butts = 0
- empty_desc = ""
- icon_empty = ""
- icon_half = ""
- icon_full = ""
- icon_broken = ""
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "blank"
+ var/max_butts = 0
+ var/material/material
-/obj/item/ashtray/New()
- ..()
+/obj/item/ashtray/New(var/newloc, var/material_name)
+ ..(newloc)
+ if(!material_name)
+ material_name = "plastic"
+ material = get_material_by_name(material_name)
+ if(!material)
+ qdel(src)
+ return
+ name = "[material.display_name] ashtray"
src.pixel_y = rand(-5, 5)
src.pixel_x = rand(-6, 6)
+ update_icon()
return
+/obj/item/ashtray/update_icon()
+ overlays.Cut()
+ var/image/I = image('icons/obj/objects.dmi',"ashtray")
+ I.color = material.icon_colour
+ overlays |= I
+
+ if (contents.len == max_butts)
+ overlays |= image('icons/obj/objects.dmi',"ashtray_full")
+ desc = "It's stuffed full."
+ else if (contents.len > max_butts/2)
+ overlays |= image('icons/obj/objects.dmi',"ashtray_half")
+ desc = "It's half-filled."
+ else
+ desc = "An ashtray made of [material.display_name]."
+
/obj/item/ashtray/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (health < 1)
+ if (health <= 0)
return
if (istype(W,/obj/item/weapon/cigbutt) || istype(W,/obj/item/clothing/mask/smokable/cigarette) || istype(W, /obj/item/weapon/flame/match))
if (contents.len >= max_butts)
- user << "This ashtray is full."
+ user << "\The [src] is full."
return
user.remove_from_mob(W)
W.loc = src
@@ -27,7 +46,7 @@
if (istype(W,/obj/item/clothing/mask/smokable/cigarette))
var/obj/item/clothing/mask/smokable/cigarette/cig = W
if (cig.lit == 1)
- src.visible_message("[user] crushes [cig] in [src], putting it out.")
+ src.visible_message("[user] crushes [cig] in \the [src], putting it out.")
processing_objects.Remove(cig)
var/obj/item/butt = new cig.type_butt(src)
cig.transfer_fingerprints_to(butt)
@@ -40,12 +59,7 @@
user.update_inv_l_hand()
user.update_inv_r_hand()
add_fingerprint(user)
- if (contents.len == max_butts)
- icon_state = icon_full
- desc = empty_desc + " It's stuffed full."
- else if (contents.len > max_butts/2)
- icon_state = icon_half
- desc = empty_desc + " It's half-filled."
+ update_icon()
else
health = max(0,health - W.force)
user << "You hit [src] with [W]."
@@ -63,73 +77,34 @@
src.visible_message("\red [src] slams into [hit_atom] spilling its contents!")
for (var/obj/item/clothing/mask/smokable/cigarette/O in contents)
O.loc = src.loc
- icon_state = icon_empty
+ update_icon()
return ..()
/obj/item/ashtray/proc/die()
- src.visible_message("\red [src] shatters spilling its contents!")
- for (var/obj/item/clothing/mask/smokable/cigarette/O in contents)
- O.loc = src.loc
- icon_state = icon_broken
+ material.place_shard(get_turf(src))
+ qdel(src)
+ return
/obj/item/ashtray/plastic
- name = "plastic ashtray"
- desc = "Cheap plastic ashtray."
- icon_state = "ashtray_bl"
- icon_empty = "ashtray_bl"
- icon_half = "ashtray_half_bl"
- icon_full = "ashtray_full_bl"
- icon_broken = "ashtray_bork_bl"
max_butts = 14
- health = 24.0
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 30)
- empty_desc = "Cheap plastic ashtray."
- throwforce = 3.0
- die()
- ..()
- name = "pieces of plastic"
- desc = "Pieces of plastic with ash on them."
- return
+ health = 24
+ throwforce = 3
+/obj/item/ashtray/plastic/New(var/newloc)
+ ..(newloc, "plastic")
/obj/item/ashtray/bronze
- name = "bronze ashtray"
- desc = "Massive bronze ashtray."
- icon_state = "ashtray_br"
- icon_empty = "ashtray_br"
- icon_half = "ashtray_half_br"
- icon_full = "ashtray_full_br"
- icon_broken = "ashtray_bork_br"
max_butts = 10
- health = 72.0
- matter = list(DEFAULT_WALL_MATERIAL = 80)
- empty_desc = "Massive bronze ashtray."
- throwforce = 10.0
-
- die()
- ..()
- name = "pieces of bronze"
- desc = "Pieces of bronze with ash on them."
- return
+ health = 72
+ throwforce = 10
+/obj/item/ashtray/bronze/New(var/newloc)
+ ..(newloc, "gold") //placeholder
/obj/item/ashtray/glass
- name = "glass ashtray"
- desc = "Glass ashtray. Looks fragile."
- icon_state = "ashtray_gl"
- icon_empty = "ashtray_gl"
- icon_half = "ashtray_half_gl"
- icon_full = "ashtray_full_gl"
- icon_broken = "ashtray_bork_gl"
max_butts = 12
- health = 12.0
- matter = list("glass" = 60)
- empty_desc = "Glass ashtray. Looks fragile."
- throwforce = 6.0
+ health = 12
+ throwforce = 6
- die()
- ..()
- name = "shards of glass"
- desc = "Shards of glass with ash on them."
- playsound(src, "shatter", 30, 1)
- return
\ No newline at end of file
+/obj/item/ashtray/glass/New(var/newloc)
+ ..(newloc, "glass")
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 8fb7493b8c..fd20de103c 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -143,7 +143,7 @@
singular_name = "phoron glass sheet"
icon_state = "sheet-phoronglass"
created_window = /obj/structure/window/phoronbasic
- default_type = "phoronglass"
+ default_type = "phoron glass"
/obj/item/stack/material/glass/phoronglass/attackby(obj/item/W, mob/user)
..()
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
deleted file mode 100644
index 63ef8fe31f..0000000000
--- a/code/game/objects/structures/mineral_doors.dm
+++ /dev/null
@@ -1,272 +0,0 @@
-//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its
-//machineryness
-
-/obj/structure/mineral_door
- name = "mineral door"
- density = 1
- anchored = 1
- opacity = 1
-
- icon = 'icons/obj/doors/mineral_doors.dmi'
- icon_state = "metal"
-
- var/mineralType = DEFAULT_WALL_MATERIAL
- var/state = 0 //closed, 1 == open
- var/isSwitchingStates = 0
- var/hardness = 1
- var/oreAmount = 7
-
- New(location)
- ..()
- icon_state = mineralType
- name = "[mineralType] door"
- update_nearby_tiles(need_rebuild=1)
-
- Destroy()
- update_nearby_tiles()
- ..()
-
- Bumped(atom/user)
- ..()
- if(!state)
- return TryToSwitchState(user)
- return
-
- attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
- if(isAI(user)) //so the AI can't open it
- return
- else if(isrobot(user)) //but cyborgs can
- if(get_dist(user,src) <= 1) //not remotely though
- return TryToSwitchState(user)
-
- attack_hand(mob/user as mob)
- return TryToSwitchState(user)
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
- if(istype(mover, /obj/effect/beam))
- return !opacity
- return !density
-
- proc/TryToSwitchState(atom/user)
- if(isSwitchingStates) return
- if(ismob(user))
- var/mob/M = user
- if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
- if(M.client)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.handcuffed)
- SwitchState()
- else
- SwitchState()
- else if(istype(user, /obj/mecha))
- SwitchState()
-
- proc/SwitchState()
- if(state)
- Close()
- else
- Open()
-
- proc/Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
- update_nearby_tiles()
-
- proc/Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
- update_nearby_tiles()
-
- update_icon()
- if(state)
- icon_state = "[mineralType]open"
- else
- icon_state = mineralType
-
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/pickaxe))
- var/obj/item/weapon/pickaxe/digTool = W
- user << "You start digging the [name]."
- if(do_after(user,digTool.digspeed*hardness) && src)
- user << "You finished digging."
- Dismantle()
- else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
- hardness -= W.force/100
- user << "You hit the [name] with your [W.name]!"
- CheckHardness()
- else
- attack_hand(user)
- return
-
- proc/CheckHardness()
- if(hardness <= 0)
- Dismantle(1)
-
- proc/Dismantle(devastated = 0)
- var/material/M = name_to_material[mineralType]
- if(istype(M))
- for(var/i = (devastated? 1 : 3), i <= oreAmount, i++)
- new M.stack_type(get_turf(src))
- qdel(src)
-
- ex_act(severity = 1)
- switch(severity)
- if(1)
- Dismantle(1)
- if(2)
- if(prob(20))
- Dismantle(1)
- else
- hardness--
- CheckHardness()
- if(3)
- hardness -= 0.1
- CheckHardness()
- return
-
-/obj/structure/mineral_door/iron
- mineralType = "iron"
- hardness = 3
-
-/obj/structure/mineral_door/silver
- mineralType = "silver"
- hardness = 3
-
-/obj/structure/mineral_door/gold
- mineralType = "gold"
-
-/obj/structure/mineral_door/uranium
- mineralType = "uranium"
- hardness = 3
- light_range = 2
-
-/obj/structure/mineral_door/sandstone
- mineralType = "sandstone"
- hardness = 0.5
-
-/obj/structure/mineral_door/transparent
- opacity = 0
-
- Close()
- ..()
- opacity = 0
-
-/obj/structure/mineral_door/transparent/phoron
- mineralType = "phoron"
-
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- TemperatureAct(100)
- ..()
-
- fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- TemperatureAct(exposed_temperature)
-
- proc/TemperatureAct(temperature)
- for(var/turf/simulated/floor/target_tile in range(2,loc))
- var/phoronToDeduce = temperature/10
- target_tile.assume_gas("phoron", phoronToDeduce, 200+T0C)
-
- spawn (0) target_tile.hotspot_expose(temperature, 400)
-
- hardness -= phoronToDeduce/100
- CheckHardness()
-
-/obj/structure/mineral_door/transparent/diamond
- mineralType = "diamond"
- hardness = 10
-
-/obj/structure/mineral_door/wood
- mineralType = "wood"
- hardness = 1
-
- Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/doorcreaky.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/doorcreaky.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
-
- Dismantle(devastated = 0)
- if(!devastated)
- for(var/i = 1, i <= oreAmount, i++)
- new/obj/item/stack/material/wood(get_turf(src))
- qdel(src)
-
-/obj/structure/mineral_door/resin
- mineralType = "resin"
- hardness = 1.5
- var/close_delay = 100
-
- TryToSwitchState(atom/user)
-
- var/mob/living/carbon/M = user
- if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
- return ..()
-
- Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- spawn(close_delay)
- if(!isSwitchingStates && state == 1)
- Close()
-
- Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
-
- Dismantle(devastated = 0)
- qdel(src)
-
- CheckHardness()
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- ..()
diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm
new file mode 100644
index 0000000000..d2cd101a1a
--- /dev/null
+++ b/code/game/objects/structures/simple_doors.dm
@@ -0,0 +1,193 @@
+/obj/structure/simple_door
+ name = "door"
+ density = 1
+ anchored = 1
+
+ icon = 'icons/obj/doors/mineral_doors.dmi'
+ icon_state = "metal"
+
+ var/material/material
+ var/state = 0 //closed, 1 == open
+ var/isSwitchingStates = 0
+ var/hardness = 1
+ var/oreAmount = 7
+
+/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > material.ignition_point)
+ TemperatureAct(exposed_temperature)
+
+/obj/structure/simple_door/proc/TemperatureAct(temperature)
+ if(temperature > material.ignition_point)
+ for(var/turf/simulated/floor/target_tile in range(2,loc))
+ var/phoronToDeduce = temperature/10
+ target_tile.assume_gas("phoron", phoronToDeduce, 200+T0C)
+ spawn (0) target_tile.hotspot_expose(temperature, 400)
+ hardness -= phoronToDeduce/100
+ CheckHardness()
+
+/obj/structure/simple_door/New(var/newloc, var/material_name)
+ ..()
+ if(!material_name)
+ material_name = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name(material_name)
+ if(!material)
+ qdel(src)
+ return
+ hardness = max(1,round(material.integrity/10))
+ icon_state = material.door_icon_base
+ name = "[material.display_name] door"
+ color = material.icon_colour
+ if(material.opacity < 0.5)
+ opacity = 0
+ else
+ opacity = 1
+ update_nearby_tiles(need_rebuild=1)
+
+/obj/structure/simple_door/Destroy()
+ update_nearby_tiles()
+ ..()
+
+/obj/structure/simple_door/Bumped(atom/user)
+ ..()
+ if(!state)
+ return TryToSwitchState(user)
+ return
+
+/obj/structure/simple_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
+ if(isAI(user)) //so the AI can't open it
+ return
+ else if(isrobot(user)) //but cyborgs can
+ if(get_dist(user,src) <= 1) //not remotely though
+ return TryToSwitchState(user)
+
+/obj/structure/simple_door/attack_hand(mob/user as mob)
+ return TryToSwitchState(user)
+
+/obj/structure/simple_door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group) return 0
+ if(istype(mover, /obj/effect/beam))
+ return !opacity
+ return !density
+
+/obj/structure/simple_door/proc/TryToSwitchState(atom/user)
+ if(isSwitchingStates) return
+ if(ismob(user))
+ var/mob/M = user
+ if(!material.can_open_material_door(user))
+ return
+ if(world.time - user.last_bumped <= 60)
+ return
+ if(M.client)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.handcuffed)
+ SwitchState()
+ else
+ SwitchState()
+ else if(istype(user, /obj/mecha))
+ SwitchState()
+
+/obj/structure/simple_door/proc/SwitchState()
+ if(state)
+ Close()
+ else
+ Open()
+
+/obj/structure/simple_door/proc/Open()
+ isSwitchingStates = 1
+ playsound(loc, material.dooropen_noise, 100, 1)
+ flick("[material.door_icon_base]opening",src)
+ sleep(10)
+ density = 0
+ opacity = 0
+ state = 1
+ update_icon()
+ isSwitchingStates = 0
+ update_nearby_tiles()
+
+/obj/structure/simple_door/proc/Close()
+ isSwitchingStates = 1
+ playsound(loc, material.dooropen_noise, 100, 1)
+ flick("[material.door_icon_base]closing",src)
+ sleep(10)
+ density = 1
+ opacity = 1
+ state = 0
+ update_icon()
+ isSwitchingStates = 0
+ update_nearby_tiles()
+
+/obj/structure/simple_door/update_icon()
+ if(state)
+ icon_state = "[material.door_icon_base]open"
+ else
+ icon_state = material.door_icon_base
+
+/obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/pickaxe))
+ var/obj/item/weapon/pickaxe/digTool = W
+ user << "You start digging the [name]."
+ if(do_after(user,digTool.digspeed*hardness) && src)
+ user << "You finished digging."
+ Dismantle()
+ else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
+ hardness -= W.force/100
+ user << "You hit the [name] with your [W.name]!"
+ CheckHardness()
+ else if(istype(W,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(material.ignition_point && WT.remove_fuel(0, user))
+ TemperatureAct(100)
+ else
+ attack_hand(user)
+ return
+
+/obj/structure/simple_door/proc/CheckHardness()
+ if(hardness <= 0)
+ Dismantle(1)
+
+/obj/structure/simple_door/proc/Dismantle(devastated = 0)
+ material.place_dismantled_product(get_turf(src))
+ qdel(src)
+
+/obj/structure/simple_door/ex_act(severity = 1)
+ switch(severity)
+ if(1)
+ Dismantle(1)
+ if(2)
+ if(prob(20))
+ Dismantle(1)
+ else
+ hardness--
+ CheckHardness()
+ if(3)
+ hardness -= 0.1
+ CheckHardness()
+ return
+
+/obj/structure/simple_door/iron/New(var/newloc,var/material_name)
+ ..(newloc, "iron")
+
+/obj/structure/simple_door/silver/New(var/newloc,var/material_name)
+ ..(newloc, "silver")
+
+/obj/structure/simple_door/gold/New(var/newloc,var/material_name)
+ ..(newloc, "gold")
+
+/obj/structure/simple_door/uranium/New(var/newloc,var/material_name)
+ ..(newloc, "uranium")
+
+/obj/structure/simple_door/sandstone/New(var/newloc,var/material_name)
+ ..(newloc, "sandstone")
+
+/obj/structure/simple_door/phoron/New(var/newloc,var/material_name)
+ ..(newloc, "phoron")
+
+/obj/structure/simple_door/diamond/New(var/newloc,var/material_name)
+ ..(newloc, "diamond")
+
+/obj/structure/simple_door/wood/New(var/newloc,var/material_name)
+ ..(newloc, "wood")
+
+/obj/structure/simple_door/resin/New(var/newloc,var/material_name)
+ ..(newloc, "resin")
\ No newline at end of file
diff --git a/code/modules/examine/descriptions/stacks.dm b/code/modules/examine/descriptions/stacks.dm
index e1e5b66616..fb2e8e277b 100644
--- a/code/modules/examine/descriptions/stacks.dm
+++ b/code/modules/examine/descriptions/stacks.dm
@@ -5,18 +5,18 @@
/obj/item/stack/material/glass
description_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets."
-/obj/item/stack/material/glass/cyborg
+/obj/item/stack/material/cyborg/glass
description_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.
\
As a synthetic, you can acquire more sheets of glass by recharging."
/obj/item/stack/material/glass/reinforced
description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage."
-/obj/item/stack/material/glass/reinforced/cyborg
+/obj/item/stack/material/cyborg/glass/reinforced
description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage.
\
As a synthetic, you can gain more reinforced glass by recharging."
-/obj/item/stack/material/steel/cyborg
+/obj/item/stack/material/cyborg/steel
description_info = "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it.
\
You can replenish your supply of metal as a synthetic by recharging."
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index c5d5c39d5c..feb7abc945 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -5,8 +5,9 @@
/material/proc/generate_recipes()
recipes = list()
+ recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/kitchen/utensil/knife/plastic, 1, on_floor = 1, supplied_material = "[name]")
@@ -82,27 +83,6 @@
/material/sandstone/generate_recipes()
..()
recipes += new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1)
- recipes += new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1)
-
-/material/silver/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1)
-
-/material/diamond/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1)
-
-/material/uranium/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1)
-
-/material/gold/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1)
-
-/material/phoron/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("phoron door", /obj/structure/mineral_door/transparent/phoron, 10, one_per_turf = 1, on_floor = 1)
/material/plastic/generate_recipes()
..()
@@ -113,17 +93,12 @@
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0) // 250u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u
-/material/iron/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1)
-
/material/wood/generate_recipes()
..()
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
- recipes += new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
/material/cardboard/generate_recipes()
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index b3688322c2..bc1f2510c2 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -79,6 +79,7 @@ obj/item/stack/material/iron
name = "iron"
icon_state = "sheet-silver"
default_type = "iron"
+ apply_colour = 1
/obj/item/stack/material/sandstone
name = "sandstone brick"
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 99700dbcc1..29cd325ee3 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -21,6 +21,12 @@ var/list/name_to_material
metal
solid
cult
+ Valid door icons:
+ stone
+ metal
+ resin
+ wood
+
*/
/material
@@ -31,6 +37,7 @@ var/list/name_to_material
// Shards/tables/structures
var/tableslam_noise = 'sound/weapons/tablehit1.ogg'
+ var/dooropen_noise = 'sound/effects/stonedoor_openclose.ogg'
var/shard_type = SHARD_SHRAPNEL
var/shard_icon
var/shard_can_repair = 1
@@ -39,6 +46,7 @@ var/list/name_to_material
// Icons
var/icon_colour
var/icon_base = "metal"
+ var/door_icon_base = "metal"
var/icon_reinf = "reinf_metal"
var/stack_type = /obj/item/stack/material/steel
var/stack_origin_tech = "materials=1"
@@ -67,6 +75,9 @@ var/list/name_to_material
/material/proc/get_blunt_damage()
return weight //todo
+/material/proc/can_open_material_door(var/mob/living/user)
+ return 1
+
/material/proc/get_edge_damage()
return round(hardness/4) //todo
@@ -106,6 +117,7 @@ var/list/name_to_material
icon_colour = "#007A00"
weight = 22
stack_origin_tech = "materials=5"
+ door_icon_base = "stone"
/material/diamond
name = "diamond"
@@ -145,6 +157,7 @@ var/list/name_to_material
shard_type = SHARD_SHARD
hardness = 30
stack_origin_tech = "phorontech=2;materials=2"
+ door_icon_base = "stone"
/material/sandstone
name = "sandstone"
@@ -155,6 +168,7 @@ var/list/name_to_material
shard_type = SHARD_STONE_PIECE
weight = 22
hardness = 55
+ door_icon_base = "stone"
/material/steel
name = DEFAULT_WALL_MATERIAL
@@ -194,6 +208,7 @@ var/list/name_to_material
tableslam_noise = 'sound/effects/Glasshit.ogg'
hardness = 15
weight = 15
+ door_icon_base = "stone"
/material/glass/phoron
name = "phoron glass"
@@ -281,6 +296,8 @@ var/list/name_to_material
hardness = 15
weight = 18
stack_origin_tech = "materials=1;biotech=1"
+ dooropen_noise = 'sound/effects/doorcreaky.ogg'
+ door_icon_base = "wood"
/material/wood/holographic
name = "holographic wood"
@@ -298,10 +315,12 @@ var/list/name_to_material
hardness = 1
weight = 1
stack_origin_tech = "materials=1"
+ door_icon_base = "wood"
/material/cloth //todo
name = "cloth"
stack_origin_tech = "materials=2"
+ door_icon_base = "wood"
/material/cult
name = "cult"
@@ -323,3 +342,15 @@ var/list/name_to_material
/material/cult/reinf/place_dismantled_product(var/turf/target)
new /obj/effect/decal/remains/human(target)
+
+/material/resin
+ name = "resin"
+ icon_colour = "#E85DD8"
+ dooropen_noise = 'sound/effects/attackblob.ogg'
+ door_icon_base = "resin"
+
+/material/resin/can_open_material_door(var/mob/living/user)
+ var/mob/living/carbon/M = user
+ if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
index bee6928a23..a11bccf163 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
@@ -210,7 +210,7 @@
visible_message("[src] vomits up a thick purple substance and begins to shape it!", "You shape a [choice].")
switch(choice)
if("resin door")
- new /obj/structure/mineral_door/resin(loc)
+ new /obj/structure/simple_door/resin(loc)
if("resin wall")
new /obj/effect/alien/resin/wall(loc)
if("resin membrane")
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 6515bcdc0e..359562063d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -310,7 +310,7 @@ var/global/list/robot_modules = list(
synths += plasteel
synths += glass
- var/obj/item/stack/material/steel/cyborg/M = new /obj/item/stack/material/steel/cyborg(src)
+ var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
@@ -322,7 +322,7 @@ var/global/list/robot_modules = list(
S.synths = list(plasteel)
src.modules += S
- var/obj/item/stack/material/glass/reinforced/cyborg/RG = new /obj/item/stack/material/glass/reinforced/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
@@ -356,11 +356,11 @@ var/global/list/robot_modules = list(
MD.glass = glass
src.modules += MD
- var/obj/item/stack/material/steel/cyborg/M = new /obj/item/stack/material/steel/cyborg(src)
+ var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
- var/obj/item/stack/material/glass/cyborg/G = new /obj/item/stack/material/glass/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/G = new (src)
G.synths = list(glass)
src.modules += G
@@ -376,7 +376,7 @@ var/global/list/robot_modules = list(
S.synths = list(metal)
src.modules += S
- var/obj/item/stack/material/glass/reinforced/cyborg/RG = new /obj/item/stack/material/glass/reinforced/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
@@ -676,11 +676,11 @@ var/global/list/robot_modules = list(
MD.plastic = plastic
src.modules += MD
- var/obj/item/stack/material/steel/cyborg/M = new /obj/item/stack/material/steel/cyborg(src)
+ var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
- var/obj/item/stack/material/glass/cyborg/G = new /obj/item/stack/material/glass/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/G = new (src)
G.synths = list(glass)
src.modules += G
@@ -696,7 +696,7 @@ var/global/list/robot_modules = list(
S.synths = list(metal)
src.modules += S
- var/obj/item/stack/material/glass/reinforced/cyborg/RG = new /obj/item/stack/material/glass/reinforced/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index d4be3a638a..a92819606c 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -232,8 +232,8 @@
if(istype(A,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/D = A
D.open(1)
- else if(istype(A,/obj/structure/mineral_door))
- var/obj/structure/mineral_door/D = A
+ else if(istype(A,/obj/structure/simple_door))
+ var/obj/structure/simple_door/D = A
if(D.density)
D.Open()
else if(istype(A,/obj/structure/cult/pylon))
diff --git a/icons/ashtray.dmi b/icons/ashtray.dmi
deleted file mode 100644
index 2a5ba56819..0000000000
Binary files a/icons/ashtray.dmi and /dev/null differ
diff --git a/icons/obj/doors/mineral_doors.dmi b/icons/obj/doors/mineral_doors.dmi
index 1613f466d5..a497f7e763 100644
Binary files a/icons/obj/doors/mineral_doors.dmi and b/icons/obj/doors/mineral_doors.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 23beb5f4fa..cf366f75ea 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index 8154a2b9a2..64dc9e9cee 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -1778,11 +1778,11 @@
"Ij" = (/obj/structure/toilet{pixel_y = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"Ik" = (/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"Il" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
-"Im" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"Im" = (/obj/structure/simple_door/iron,/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"In" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station)
"Io" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/wizard_station)
"Ip" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station)
-"Iq" = (/obj/structure/mineral_door/iron,/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
+"Iq" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"Ir" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"Is" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"It" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/structure/closet/coffin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
@@ -1798,7 +1798,7 @@
"ID" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"IE" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"IF" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"IG" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
+"IG" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"IH" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"II" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"})
"IJ" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"})
@@ -2391,7 +2391,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHZHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYIgIhIiHYIjIkIlHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcImInIoIpIqIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcIqInIoIpImIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIsIsIcIcIcItHYIuIvIwHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIxHYIyIyIzHYIAIBICIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYIyIyIyIGIyIyIyIHHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM