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