Remove old blockrotation file
This commit is contained in:
parent
bd3024a405
commit
9b78da6255
@ -1,544 +0,0 @@
|
|||||||
"""
|
|
||||||
blockrotation.py
|
|
||||||
|
|
||||||
Functions for adjusting blockdatas after rotating, rolling, flipping
|
|
||||||
or mirroring a schematic file.
|
|
||||||
|
|
||||||
Most of this file initializes the gigantic lookup tables that
|
|
||||||
list the new blockdata for each blocktype and rotation type. A lot of this
|
|
||||||
should be moved to the block definition file (minecraft.json) by naming
|
|
||||||
the different blockdata values with directions and inferring the rotations
|
|
||||||
from those. Only certain blocks (e.g. Doors and Vines) need special handling
|
|
||||||
during rotation.
|
|
||||||
|
|
||||||
Entities and TileEntities are rotated in schematic.py.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import absolute_import
|
|
||||||
|
|
||||||
from numpy import arange, zeros
|
|
||||||
|
|
||||||
from mceditlib import blocktypes
|
|
||||||
|
|
||||||
def genericVerticalFlip(cls):
|
|
||||||
rotation = arange(16, dtype='uint8')
|
|
||||||
if hasattr(cls, "Up") and hasattr(cls, "Down"):
|
|
||||||
rotation[cls.Up] = cls.Down
|
|
||||||
rotation[cls.Down] = cls.Up
|
|
||||||
|
|
||||||
if hasattr(cls, "TopNorth") and hasattr(cls, "TopWest") and hasattr(cls, "TopSouth") and hasattr(cls, "TopEast"):
|
|
||||||
rotation[cls.North] = cls.TopNorth
|
|
||||||
rotation[cls.West] = cls.TopWest
|
|
||||||
rotation[cls.South] = cls.TopSouth
|
|
||||||
rotation[cls.East] = cls.TopEast
|
|
||||||
rotation[cls.TopNorth] = cls.North
|
|
||||||
rotation[cls.TopWest] = cls.West
|
|
||||||
rotation[cls.TopSouth] = cls.South
|
|
||||||
rotation[cls.TopEast] = cls.East
|
|
||||||
|
|
||||||
return rotation
|
|
||||||
|
|
||||||
|
|
||||||
def genericRotation(cls):
|
|
||||||
rotation = arange(16, dtype='uint8')
|
|
||||||
rotation[cls.North] = cls.West
|
|
||||||
rotation[cls.West] = cls.South
|
|
||||||
rotation[cls.South] = cls.East
|
|
||||||
rotation[cls.East] = cls.North
|
|
||||||
if hasattr(cls, "TopNorth") and hasattr(cls, "TopWest") and hasattr(cls, "TopSouth") and hasattr(cls, "TopEast"):
|
|
||||||
rotation[cls.TopNorth] = cls.TopWest
|
|
||||||
rotation[cls.TopWest] = cls.TopSouth
|
|
||||||
rotation[cls.TopSouth] = cls.TopEast
|
|
||||||
rotation[cls.TopEast] = cls.TopNorth
|
|
||||||
|
|
||||||
return rotation
|
|
||||||
|
|
||||||
|
|
||||||
def genericEastWestFlip(cls):
|
|
||||||
rotation = arange(16, dtype='uint8')
|
|
||||||
rotation[cls.West] = cls.East
|
|
||||||
rotation[cls.East] = cls.West
|
|
||||||
if hasattr(cls, "TopWest") and hasattr(cls, "TopEast"):
|
|
||||||
rotation[cls.TopWest] = cls.TopEast
|
|
||||||
rotation[cls.TopEast] = cls.TopWest
|
|
||||||
|
|
||||||
return rotation
|
|
||||||
|
|
||||||
|
|
||||||
def genericNorthSouthFlip(cls):
|
|
||||||
rotation = arange(16, dtype='uint8')
|
|
||||||
rotation[cls.South] = cls.North
|
|
||||||
rotation[cls.North] = cls.South
|
|
||||||
if hasattr(cls, "TopNorth") and hasattr(cls, "TopSouth"):
|
|
||||||
rotation[cls.TopSouth] = cls.TopNorth
|
|
||||||
rotation[cls.TopNorth] = cls.TopSouth
|
|
||||||
|
|
||||||
return rotation
|
|
||||||
|
|
||||||
rotationClasses = []
|
|
||||||
|
|
||||||
|
|
||||||
def genericFlipRotation(cls):
|
|
||||||
cls.rotateLeft = genericRotation(cls)
|
|
||||||
|
|
||||||
cls.flipVertical = genericVerticalFlip(cls)
|
|
||||||
cls.flipEastWest = genericEastWestFlip(cls)
|
|
||||||
cls.flipNorthSouth = genericNorthSouthFlip(cls)
|
|
||||||
rotationClasses.append(cls)
|
|
||||||
|
|
||||||
#
|
|
||||||
#class Torch:
|
|
||||||
# blocktypes = [
|
|
||||||
# pc_blocktypes.Torch.ID,
|
|
||||||
# pc_blocktypes.RedstoneTorchOn.ID,
|
|
||||||
# pc_blocktypes.RedstoneTorchOff.ID,
|
|
||||||
# ]
|
|
||||||
#
|
|
||||||
# South = 1
|
|
||||||
# North = 2
|
|
||||||
# West = 3
|
|
||||||
# East = 4
|
|
||||||
#
|
|
||||||
#genericFlipRotation(Torch)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Ladder:
|
|
||||||
# blocktypes = [pc_blocktypes.Ladder.ID]
|
|
||||||
#
|
|
||||||
# East = 2
|
|
||||||
# West = 3
|
|
||||||
# North = 4
|
|
||||||
# South = 5
|
|
||||||
#genericFlipRotation(Ladder)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Stair:
|
|
||||||
# blocktypes = [b.ID for b in pc_blocktypes.AllStairs]
|
|
||||||
#
|
|
||||||
# South = 0
|
|
||||||
# North = 1
|
|
||||||
# West = 2
|
|
||||||
# East = 3
|
|
||||||
# TopSouth = 4
|
|
||||||
# TopNorth = 5
|
|
||||||
# TopWest = 6
|
|
||||||
# TopEast = 7
|
|
||||||
#genericFlipRotation(Stair)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class HalfSlab:
|
|
||||||
# blocktypes = [pc_blocktypes.StoneSlab.ID]
|
|
||||||
#
|
|
||||||
# StoneSlab = 0
|
|
||||||
# SandstoneSlab = 1
|
|
||||||
# WoodenSlab = 2
|
|
||||||
# CobblestoneSlab = 3
|
|
||||||
# BrickSlab = 4
|
|
||||||
# StoneBrickSlab = 5
|
|
||||||
# TopStoneSlab = 8
|
|
||||||
# TopSandstoneSlab = 9
|
|
||||||
# TopWoodenSlab = 10
|
|
||||||
# TopCobblestoneSlab = 11
|
|
||||||
# TopBrickSlab = 12
|
|
||||||
# TopStoneBrickSlab = 13
|
|
||||||
#
|
|
||||||
#HalfSlab.flipVertical = arange(16, dtype='uint8')
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.StoneSlab] = HalfSlab.TopStoneSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.SandstoneSlab] = HalfSlab.TopSandstoneSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.WoodenSlab] = HalfSlab.TopWoodenSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.CobblestoneSlab] = HalfSlab.TopCobblestoneSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.BrickSlab] = HalfSlab.TopBrickSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.StoneBrickSlab] = HalfSlab.TopStoneBrickSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.TopStoneSlab] = HalfSlab.StoneSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.TopSandstoneSlab] = HalfSlab.SandstoneSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.TopWoodenSlab] = HalfSlab.WoodenSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.TopCobblestoneSlab] = HalfSlab.CobblestoneSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.TopBrickSlab] = HalfSlab.BrickSlab
|
|
||||||
#HalfSlab.flipVertical[HalfSlab.TopStoneBrickSlab] = HalfSlab.StoneBrickSlab
|
|
||||||
#rotationClasses.append(HalfSlab)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class WallSign:
|
|
||||||
# blocktypes = [pc_blocktypes.WallSign.ID]
|
|
||||||
#
|
|
||||||
# East = 2
|
|
||||||
# West = 3
|
|
||||||
# North = 4
|
|
||||||
# South = 5
|
|
||||||
#genericFlipRotation(WallSign)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class FurnaceDispenserChest:
|
|
||||||
# blocktypes = [
|
|
||||||
# pc_blocktypes.Furnace.ID,
|
|
||||||
# pc_blocktypes.LitFurnace.ID,
|
|
||||||
# pc_blocktypes.Dispenser.ID,
|
|
||||||
# pc_blocktypes.Chest.ID,
|
|
||||||
# ]
|
|
||||||
# East = 2
|
|
||||||
# West = 3
|
|
||||||
# North = 4
|
|
||||||
# South = 5
|
|
||||||
#genericFlipRotation(FurnaceDispenserChest)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Pumpkin:
|
|
||||||
# blocktypes = [
|
|
||||||
# pc_blocktypes.Pumpkin.ID,
|
|
||||||
# pc_blocktypes.JackOLantern.ID,
|
|
||||||
# ]
|
|
||||||
#
|
|
||||||
# East = 0
|
|
||||||
# South = 1
|
|
||||||
# West = 2
|
|
||||||
# North = 3
|
|
||||||
#genericFlipRotation(Pumpkin)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Rail:
|
|
||||||
# blocktypes = [pc_blocktypes.Rail.ID]
|
|
||||||
#
|
|
||||||
# EastWest = 0
|
|
||||||
# NorthSouth = 1
|
|
||||||
# South = 2
|
|
||||||
# North = 3
|
|
||||||
# East = 4
|
|
||||||
# West = 5
|
|
||||||
#
|
|
||||||
# Northeast = 6
|
|
||||||
# Southeast = 7
|
|
||||||
# Southwest = 8
|
|
||||||
# Northwest = 9
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#def generic8wayRotation(cls):
|
|
||||||
#
|
|
||||||
# cls.rotateLeft = genericRotation(cls)
|
|
||||||
# cls.rotateLeft[cls.Northeast] = cls.Northwest
|
|
||||||
# cls.rotateLeft[cls.Southeast] = cls.Northeast
|
|
||||||
# cls.rotateLeft[cls.Southwest] = cls.Southeast
|
|
||||||
# cls.rotateLeft[cls.Northwest] = cls.Southwest
|
|
||||||
#
|
|
||||||
# cls.flipEastWest = genericEastWestFlip(cls)
|
|
||||||
# cls.flipEastWest[cls.Northeast] = cls.Northwest
|
|
||||||
# cls.flipEastWest[cls.Northwest] = cls.Northeast
|
|
||||||
# cls.flipEastWest[cls.Southwest] = cls.Southeast
|
|
||||||
# cls.flipEastWest[cls.Southeast] = cls.Southwest
|
|
||||||
#
|
|
||||||
# cls.flipNorthSouth = genericNorthSouthFlip(cls)
|
|
||||||
# cls.flipNorthSouth[cls.Northeast] = cls.Southeast
|
|
||||||
# cls.flipNorthSouth[cls.Southeast] = cls.Northeast
|
|
||||||
# cls.flipNorthSouth[cls.Southwest] = cls.Northwest
|
|
||||||
# cls.flipNorthSouth[cls.Northwest] = cls.Southwest
|
|
||||||
# rotationClasses.append(cls)
|
|
||||||
#
|
|
||||||
#generic8wayRotation(Rail)
|
|
||||||
#Rail.rotateLeft[Rail.NorthSouth] = Rail.EastWest
|
|
||||||
#Rail.rotateLeft[Rail.EastWest] = Rail.NorthSouth
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#def applyBit(apply):
|
|
||||||
# def _applyBit(class_or_array):
|
|
||||||
# if hasattr(class_or_array, "rotateLeft"):
|
|
||||||
# for a in (class_or_array.flipEastWest,
|
|
||||||
# class_or_array.flipNorthSouth,
|
|
||||||
# class_or_array.rotateLeft):
|
|
||||||
# apply(a)
|
|
||||||
# else:
|
|
||||||
# array = class_or_array
|
|
||||||
# apply(array)
|
|
||||||
#
|
|
||||||
# return _applyBit
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#@applyBit
|
|
||||||
#def applyBit8(array):
|
|
||||||
# array[8:16] = array[0:8] | 0x8
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#@applyBit
|
|
||||||
#def applyBit4(array):
|
|
||||||
# array[4:8] = array[0:4] | 0x4
|
|
||||||
# array[12:16] = array[8:12] | 0x4
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#@applyBit
|
|
||||||
#def applyBits48(array):
|
|
||||||
# array[4:8] = array[0:4] | 0x4
|
|
||||||
# array[8:16] = array[0:8] | 0x8
|
|
||||||
#
|
|
||||||
#applyThrownBit = applyBit8
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class PoweredDetectorRail(Rail):
|
|
||||||
# blocktypes = [pc_blocktypes.PoweredRail.ID, pc_blocktypes.DetectorRail.ID]
|
|
||||||
#PoweredDetectorRail.rotateLeft = genericRotation(PoweredDetectorRail)
|
|
||||||
#
|
|
||||||
#PoweredDetectorRail.rotateLeft[PoweredDetectorRail.NorthSouth] = PoweredDetectorRail.EastWest
|
|
||||||
#PoweredDetectorRail.rotateLeft[PoweredDetectorRail.EastWest] = PoweredDetectorRail.NorthSouth
|
|
||||||
#
|
|
||||||
#PoweredDetectorRail.flipEastWest = genericEastWestFlip(PoweredDetectorRail)
|
|
||||||
#PoweredDetectorRail.flipNorthSouth = genericNorthSouthFlip(PoweredDetectorRail)
|
|
||||||
#applyThrownBit(PoweredDetectorRail)
|
|
||||||
#rotationClasses.append(PoweredDetectorRail)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Lever:
|
|
||||||
# blocktypes = [pc_blocktypes.Lever.ID]
|
|
||||||
# ThrownBit = 0x8
|
|
||||||
# South = 1
|
|
||||||
# North = 2
|
|
||||||
# West = 3
|
|
||||||
# East = 4
|
|
||||||
# EastWest = 5
|
|
||||||
# NorthSouth = 6
|
|
||||||
#Lever.rotateLeft = genericRotation(Lever)
|
|
||||||
#Lever.rotateLeft[Lever.NorthSouth] = Lever.EastWest
|
|
||||||
#Lever.rotateLeft[Lever.EastWest] = Lever.NorthSouth
|
|
||||||
#Lever.flipEastWest = genericEastWestFlip(Lever)
|
|
||||||
#Lever.flipNorthSouth = genericNorthSouthFlip(Lever)
|
|
||||||
#applyThrownBit(Lever)
|
|
||||||
#rotationClasses.append(Lever)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Button:
|
|
||||||
# blocktypes = [pc_blocktypes.Button.ID, pc_blocktypes.WoodButton.ID]
|
|
||||||
# PressedBit = 0x8
|
|
||||||
# South = 1
|
|
||||||
# North = 2
|
|
||||||
# West = 3
|
|
||||||
# East = 4
|
|
||||||
#Button.rotateLeft = genericRotation(Button)
|
|
||||||
#Button.flipEastWest = genericEastWestFlip(Button)
|
|
||||||
#Button.flipNorthSouth = genericNorthSouthFlip(Button)
|
|
||||||
#applyThrownBit(Button)
|
|
||||||
#rotationClasses.append(Button)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class SignPost:
|
|
||||||
# blocktypes = [pc_blocktypes.Sign.ID]
|
|
||||||
# #west is 0, increasing clockwise
|
|
||||||
#
|
|
||||||
# rotateLeft = arange(16, dtype='uint8')
|
|
||||||
# rotateLeft -= 4
|
|
||||||
# rotateLeft &= 0xf
|
|
||||||
#
|
|
||||||
# flipEastWest = arange(16, dtype='uint8')
|
|
||||||
# flipNorthSouth = arange(16, dtype='uint8')
|
|
||||||
# pass
|
|
||||||
#
|
|
||||||
#rotationClasses.append(SignPost)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Bed:
|
|
||||||
# blocktypes = [pc_blocktypes.Bed.ID]
|
|
||||||
# West = 0
|
|
||||||
# North = 1
|
|
||||||
# East = 2
|
|
||||||
# South = 3
|
|
||||||
#
|
|
||||||
#genericFlipRotation(Bed)
|
|
||||||
#applyBit8(Bed)
|
|
||||||
#applyBit4(Bed)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Door:
|
|
||||||
# blocktypes = [
|
|
||||||
# pc_blocktypes.IronDoor.ID,
|
|
||||||
# pc_blocktypes.WoodenDoor.ID,
|
|
||||||
# ]
|
|
||||||
# TopHalfBit = 0x8
|
|
||||||
# SwungCCWBit = 0x4
|
|
||||||
#
|
|
||||||
# Northeast = 0
|
|
||||||
# Southeast = 1
|
|
||||||
# Southwest = 2
|
|
||||||
# Northwest = 3
|
|
||||||
#
|
|
||||||
# rotateLeft = arange(16, dtype='uint8')
|
|
||||||
#
|
|
||||||
#Door.rotateLeft[Door.Northeast] = Door.Northwest
|
|
||||||
#Door.rotateLeft[Door.Southeast] = Door.Northeast
|
|
||||||
#Door.rotateLeft[Door.Southwest] = Door.Southeast
|
|
||||||
#Door.rotateLeft[Door.Northwest] = Door.Southwest
|
|
||||||
#
|
|
||||||
#applyBit4(Door.rotateLeft)
|
|
||||||
#
|
|
||||||
##when flipping horizontally, swing the doors so they at least look the same
|
|
||||||
#
|
|
||||||
#Door.flipEastWest = arange(16, dtype='uint8')
|
|
||||||
#Door.flipEastWest[Door.Northeast] = Door.Northwest
|
|
||||||
#Door.flipEastWest[Door.Northwest] = Door.Northeast
|
|
||||||
#Door.flipEastWest[Door.Southwest] = Door.Southeast
|
|
||||||
#Door.flipEastWest[Door.Southeast] = Door.Southwest
|
|
||||||
#Door.flipEastWest[4:8] = Door.flipEastWest[0:4]
|
|
||||||
#Door.flipEastWest[0:4] = Door.flipEastWest[4:8] | 0x4
|
|
||||||
#Door.flipEastWest[8:16] = Door.flipEastWest[0:8] | 0x8
|
|
||||||
#
|
|
||||||
#Door.flipNorthSouth = arange(16, dtype='uint8')
|
|
||||||
#Door.flipNorthSouth[Door.Northeast] = Door.Southeast
|
|
||||||
#Door.flipNorthSouth[Door.Northwest] = Door.Southwest
|
|
||||||
#Door.flipNorthSouth[Door.Southwest] = Door.Northwest
|
|
||||||
#Door.flipNorthSouth[Door.Southeast] = Door.Northeast
|
|
||||||
#Door.flipNorthSouth[4:8] = Door.flipNorthSouth[0:4]
|
|
||||||
#Door.flipNorthSouth[0:4] = Door.flipNorthSouth[4:8] | 0x4
|
|
||||||
#Door.flipNorthSouth[8:16] = Door.flipNorthSouth[0:8] | 0x8
|
|
||||||
#
|
|
||||||
#rotationClasses.append(Door)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class RedstoneRepeater:
|
|
||||||
# blocktypes = [
|
|
||||||
# pc_blocktypes.RedstoneRepeaterOff.ID,
|
|
||||||
# pc_blocktypes.RedstoneRepeaterOn.ID,
|
|
||||||
#
|
|
||||||
# ]
|
|
||||||
#
|
|
||||||
# East = 0
|
|
||||||
# South = 1
|
|
||||||
# West = 2
|
|
||||||
# North = 3
|
|
||||||
#
|
|
||||||
#genericFlipRotation(RedstoneRepeater)
|
|
||||||
#
|
|
||||||
##high bits of the repeater indicate repeater delay, and should be preserved
|
|
||||||
#applyBits48(RedstoneRepeater)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Trapdoor:
|
|
||||||
# blocktypes = [pc_blocktypes.Trapdoor.ID]
|
|
||||||
#
|
|
||||||
# West = 0
|
|
||||||
# East = 1
|
|
||||||
# South = 2
|
|
||||||
# North = 3
|
|
||||||
#
|
|
||||||
#genericFlipRotation(Trapdoor)
|
|
||||||
#applyOpenedBit = applyBit4
|
|
||||||
#applyOpenedBit(Trapdoor)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class PistonBody:
|
|
||||||
# blocktypes = [pc_blocktypes.StickyPiston.ID, pc_blocktypes.Piston.ID]
|
|
||||||
#
|
|
||||||
# Down = 0
|
|
||||||
# Up = 1
|
|
||||||
# East = 2
|
|
||||||
# West = 3
|
|
||||||
# North = 4
|
|
||||||
# South = 5
|
|
||||||
#
|
|
||||||
#genericFlipRotation(PistonBody)
|
|
||||||
#applyPistonBit = applyBit8
|
|
||||||
#applyPistonBit(PistonBody)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class PistonHead(PistonBody):
|
|
||||||
# blocktypes = [pc_blocktypes.PistonHead.ID]
|
|
||||||
#rotationClasses.append(PistonHead)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
##Mushroom types:
|
|
||||||
##Value Description Textures
|
|
||||||
##0 Fleshy piece Pores on all sides
|
|
||||||
##1 Corner piece Cap texture on top, directions 1 (cloud direction) and 2 (sunrise)
|
|
||||||
##2 Side piece Cap texture on top and direction 2 (sunrise)
|
|
||||||
##3 Corner piece Cap texture on top, directions 2 (sunrise) and 3 (cloud origin)
|
|
||||||
##4 Side piece Cap texture on top and direction 1 (cloud direction)
|
|
||||||
##5 Top piece Cap texture on top
|
|
||||||
##6 Side piece Cap texture on top and direction 3 (cloud origin)
|
|
||||||
##7 Corner piece Cap texture on top, directions 0 (sunset) and 1 (cloud direction)
|
|
||||||
##8 Side piece Cap texture on top and direction 0 (sunset)
|
|
||||||
##9 Corner piece Cap texture on top, directions 3 (cloud origin) and 0 (sunset)
|
|
||||||
##10 Stem piece Stem texture on all four sides, pores on top and bottom
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class HugeMushroom:
|
|
||||||
# blocktypes = [pc_blocktypes.HugeRedMushroom.ID, pc_blocktypes.HugeBrownMushroom.ID]
|
|
||||||
# Northeast = 1
|
|
||||||
# East = 2
|
|
||||||
# Southeast = 3
|
|
||||||
# South = 6
|
|
||||||
# Southwest = 9
|
|
||||||
# West = 8
|
|
||||||
# Northwest = 7
|
|
||||||
# North = 4
|
|
||||||
#
|
|
||||||
#generic8wayRotation(HugeMushroom)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#class Vines:
|
|
||||||
# blocktypes = [pc_blocktypes.Vines.ID]
|
|
||||||
#
|
|
||||||
# WestBit = 1
|
|
||||||
# NorthBit = 2
|
|
||||||
# EastBit = 4
|
|
||||||
# SouthBit = 8
|
|
||||||
#
|
|
||||||
# rotateLeft = arange(16, dtype='uint8')
|
|
||||||
# flipEastWest = arange(16, dtype='uint8')
|
|
||||||
# flipNorthSouth = arange(16, dtype='uint8')
|
|
||||||
#
|
|
||||||
#
|
|
||||||
##Hmm... Since each bit is a direction, we can rotate by shifting!
|
|
||||||
#Vines.rotateLeft = 0xf & ((Vines.rotateLeft >> 1) | (Vines.rotateLeft << 3))
|
|
||||||
## Wherever each bit is set, clear it and set the opposite bit
|
|
||||||
#EastWestBits = (Vines.EastBit | Vines.WestBit)
|
|
||||||
#Vines.flipEastWest[(Vines.flipEastWest & EastWestBits) > 0] ^= EastWestBits
|
|
||||||
#
|
|
||||||
#NorthSouthBits = (Vines.NorthBit | Vines.SouthBit)
|
|
||||||
#Vines.flipNorthSouth[(Vines.flipNorthSouth & NorthSouthBits) > 0] ^= NorthSouthBits
|
|
||||||
#
|
|
||||||
#rotationClasses.append(Vines)
|
|
||||||
|
|
||||||
|
|
||||||
def masterRotationTable(attrname):
|
|
||||||
# compute a blocktypes.id_limitx16 table mapping each possible blocktype/data combination to
|
|
||||||
# the resulting data when the block is rotated
|
|
||||||
table = zeros((blocktypes.id_limit, 16), dtype='uint8')
|
|
||||||
table[:] = arange(16, dtype='uint8')
|
|
||||||
for cls in rotationClasses:
|
|
||||||
if hasattr(cls, attrname):
|
|
||||||
blocktable = getattr(cls, attrname)
|
|
||||||
for blocktype in cls.blocktypes:
|
|
||||||
table[blocktype] = blocktable
|
|
||||||
|
|
||||||
return table
|
|
||||||
|
|
||||||
|
|
||||||
def rotationTypeTable():
|
|
||||||
table = {}
|
|
||||||
for cls in rotationClasses:
|
|
||||||
for b in cls.blocktypes:
|
|
||||||
table[b] = cls
|
|
||||||
|
|
||||||
return table
|
|
||||||
|
|
||||||
|
|
||||||
class BlockRotation:
|
|
||||||
rotateLeft = masterRotationTable("rotateLeft")
|
|
||||||
flipEastWest = masterRotationTable("flipEastWest")
|
|
||||||
flipNorthSouth = masterRotationTable("flipNorthSouth")
|
|
||||||
flipVertical = masterRotationTable("flipVertical")
|
|
||||||
typeTable = rotationTypeTable()
|
|
||||||
|
|
||||||
|
|
||||||
def SameRotationType(blocktype1, blocktype2):
|
|
||||||
#use different default values for typeTable.get() to make it return false when neither blocktype is present
|
|
||||||
return BlockRotation.typeTable.get(blocktype1.ID) == BlockRotation.typeTable.get(blocktype2.ID, BlockRotation)
|
|
||||||
|
|
||||||
|
|
||||||
def FlipVertical(blocks, data):
|
|
||||||
data[:] = BlockRotation.flipVertical[blocks, data]
|
|
||||||
|
|
||||||
|
|
||||||
def FlipNorthSouth(blocks, data):
|
|
||||||
data[:] = BlockRotation.flipNorthSouth[blocks, data]
|
|
||||||
|
|
||||||
|
|
||||||
def FlipEastWest(blocks, data):
|
|
||||||
data[:] = BlockRotation.flipEastWest[blocks, data]
|
|
||||||
|
|
||||||
|
|
||||||
def RotateLeft(blocks, data):
|
|
||||||
data[:] = BlockRotation.rotateLeft[blocks, data]
|
|
Reference in New Issue
Block a user