0

Add colored beds & use bed facing/type properties

- Add beds with colors other than red
- Use bed 'facing' property to determine bed's rotation
- Use bed 'type' property to determine if the head or foot is rendered
- Correct faulty logic during bed texture generation
This commit is contained in:
Joseph Camp
2020-02-08 18:31:30 +00:00
parent 98fe552790
commit 2a7280f8bf
2 changed files with 55 additions and 72 deletions

View File

@@ -1289,88 +1289,80 @@ def sandstone(self, blockid, data):
# note block
block(blockid=25, top_image="assets/minecraft/textures/block/note_block.png")
@material(blockid=26, data=list(range(12)), transparent=True, nospawn=True)
# Bed
@material(blockid=26, data=list(range(256)), transparent=True, nospawn=True)
def bed(self, blockid, data):
# Bits 1-2 Rotation
# Bit 3 Occupancy, no impact on appearance
# Bit 4 Foot/Head of bed (0 = foot, 1 = head)
# Bits 5-8 Color
# first get rotation done
# Masked to not clobber block head/foot info
if self.rotation == 1:
if (data & 0b0011) == 0: data = data & 0b1100 | 1
elif (data & 0b0011) == 1: data = data & 0b1100 | 2
elif (data & 0b0011) == 2: data = data & 0b1100 | 3
elif (data & 0b0011) == 3: data = data & 0b1100 | 0
elif self.rotation == 2:
if (data & 0b0011) == 0: data = data & 0b1100 | 2
elif (data & 0b0011) == 1: data = data & 0b1100 | 3
elif (data & 0b0011) == 2: data = data & 0b1100 | 0
elif (data & 0b0011) == 3: data = data & 0b1100 | 1
elif self.rotation == 3:
if (data & 0b0011) == 0: data = data & 0b1100 | 3
elif (data & 0b0011) == 1: data = data & 0b1100 | 0
elif (data & 0b0011) == 2: data = data & 0b1100 | 1
elif (data & 0b0011) == 3: data = data & 0b1100 | 2
bed_texture = self.load_image("assets/minecraft/textures/entity/bed/red.png") # FIXME: do tile entity colours
# Masked to not clobber block head/foot & color info
data = data & 0b11111100 | ((self.rotation + (data & 0b11)) % 4)
bed_texture = self.load_image("assets/minecraft/textures/entity/bed/%s.png" % color_map[data >> 4])
increment = 8
left_face = None
right_face = None
top_face = None
if data & 0x8 == 0x8: # head of the bed
top = bed_texture.copy().crop((6,6,22,22))
if data & 0x8 == 0x8: # head of the bed
top = bed_texture.copy().crop((6, 6, 22, 22))
# Composing the side
side = Image.new("RGBA", (16,16))
side_part1 = bed_texture.copy().crop((0,6,6,22)).rotate(90, expand=True)
side = Image.new("RGBA", (16, 16), self.bgcolor)
side_part1 = bed_texture.copy().crop((0, 6, 6, 22)).rotate(90, expand=True)
# foot of the bed
side_part2 = bed_texture.copy().crop((53,3,56,6))
side_part2 = bed_texture.copy().crop((53, 3, 56, 6))
side_part2_f = side_part2.transpose(Image.FLIP_LEFT_RIGHT)
alpha_over(side, side_part1, (0,7), side_part1)
alpha_over(side, side_part2, (0,13), side_part2)
alpha_over(side, side_part1, (0, 7), side_part1)
alpha_over(side, side_part2, (0, 13), side_part2)
end = Image.new("RGBA", (16,16))
end_part = bed_texture.copy().crop((6,0,22,6)).rotate(180)
alpha_over(end, end_part, (0,7), end_part)
alpha_over(end, side_part2, (0,13), side_part2)
alpha_over(end, side_part2_f, (13,13), side_part2_f)
if data & 0x00 == 0x00: # South
end = Image.new("RGBA", (16, 16), self.bgcolor)
end_part = bed_texture.copy().crop((6, 0, 22, 6)).rotate(180)
alpha_over(end, end_part, (0, 7), end_part)
alpha_over(end, side_part2, (0, 13), side_part2)
alpha_over(end, side_part2_f, (13, 13), side_part2_f)
if data & 0x03 == 0x00: # South
top_face = top.rotate(180)
left_face = side.transpose(Image.FLIP_LEFT_RIGHT)
right_face = end
if data & 0x01 == 0x01: # West
elif data & 0x03 == 0x01: # West
top_face = top.rotate(90)
left_face = end
right_face = side.transpose(Image.FLIP_LEFT_RIGHT)
if data & 0x02 == 0x02: # North
elif data & 0x03 == 0x02: # North
top_face = top
left_face = side
if data & 0x03 == 0x03: # East
elif data & 0x03 == 0x03: # East
top_face = top.rotate(270)
right_face = side
else: # foot of the bed
top = bed_texture.copy().crop((6,28,22,44))
side = Image.new("RGBA", (16,16))
side_part1 = bed_texture.copy().crop((0,28,6,44)).rotate(90, expand=True)
side_part2 = bed_texture.copy().crop((53,3,56,6))
side_part2_f = side_part2.transpose(Image.FLIP_LEFT_RIGHT)
alpha_over(side, side_part1, (0,7), side_part1)
alpha_over(side, side_part2, (13,13), side_part2)
end = Image.new("RGBA", (16,16))
end_part = bed_texture.copy().crop((22,22,38,28)).rotate(180)
alpha_over(end, end_part, (0,7), end_part)
alpha_over(end, side_part2, (0,13), side_part2)
alpha_over(end, side_part2_f, (13,13), side_part2_f)
if data & 0x00 == 0x00: # South
else: # foot of the bed
top = bed_texture.copy().crop((6, 28, 22, 44))
side = Image.new("RGBA", (16, 16), self.bgcolor)
side_part1 = bed_texture.copy().crop((0, 28, 6, 44)).rotate(90, expand=True)
side_part2 = bed_texture.copy().crop((53, 3, 56, 6))
side_part2_f = side_part2.transpose(Image.FLIP_LEFT_RIGHT)
alpha_over(side, side_part1, (0, 7), side_part1)
alpha_over(side, side_part2, (13, 13), side_part2)
end = Image.new("RGBA", (16, 16), self.bgcolor)
end_part = bed_texture.copy().crop((22, 22, 38, 28)).rotate(180)
alpha_over(end, end_part, (0, 7), end_part)
alpha_over(end, side_part2, (0, 13), side_part2)
alpha_over(end, side_part2_f, (13, 13), side_part2_f)
if data & 0x03 == 0x00: # South
top_face = top.rotate(180)
left_face = side.transpose(Image.FLIP_LEFT_RIGHT)
if data & 0x01 == 0x01: # West
elif data & 0x03 == 0x01: # West
top_face = top.rotate(90)
right_face = side.transpose(Image.FLIP_LEFT_RIGHT)
if data & 0x02 == 0x02: # North
elif data & 0x03 == 0x02: # North
top_face = top
left_face = side
right_face = end
if data & 0x03 == 0x03: # East
elif data & 0x03 == 0x03: # East
top_face = top.rotate(270)
left_face = end
right_face = side