Skip to content

Instantly share code, notes, and snippets.

@kevinburke
Created April 22, 2014 17:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevinburke/11188314 to your computer and use it in GitHub Desktop.
Save kevinburke/11188314 to your computer and use it in GitHub Desktop.
track_properties.go
package main
import (
"encoding/hex"
"fmt"
"os"
"strings"
)
func hasBit(n int, pos uint) bool {
val := n & (1 << pos)
return (val > 0)
}
var table1 = []string{
"ELEM_FLAT",
"ELEM_END_STATION",
"ELEM_BEGIN_STATION",
"ELEM_MIDDLE_STATION",
"ELEM_25_DEG_UP",
"ELEM_60_DEG_UP",
"ELEM_FLAT_TO_25_DEG_UP",
"ELEM_25_DEG_UP_TO_60_DEG_UP",
"ELEM_60_DEG_UP_TO_25_DEG_UP",
"ELEM_25_DEG_UP_TO_FLAT",
"ELEM_25_DEG_DOWN",
"ELEM_60_DEG_DOWN",
"ELEM_FLAT_TO_25_DEG_DOWN",
"ELEM_25_DEG_DOWN_TO_60_DEG_DOWN",
"ELEM_60_DEG_DOWN_TO_25_DEG_DOWN",
"ELEM_25_DEG_DOWN_TO_FLAT",
"ELEM_LEFT_QUARTER_TURN_5_TILES",
"ELEM_RIGHT_QUARTER_TURN_5_TILES",
"ELEM_FLAT_TO_LEFT_BANK",
"ELEM_FLAT_TO_RIGHT_BANK",
"ELEM_LEFT_BANK_TO_FLAT",
"ELEM_RIGHT_BANK_TO_FLAT",
"ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES",
"ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES",
"ELEM_LEFT_BANK_TO_25_DEG_UP",
"ELEM_RIGHT_BANK_TO_25_DEG_UP",
"ELEM_25_DEG_UP_TO_LEFT_BANK",
"ELEM_25_DEG_UP_TO_RIGHT_BANK",
"ELEM_LEFT_BANK_TO_25_DEG_DOWN",
"ELEM_RIGHT_BANK_TO_25_DEG_DOWN",
"ELEM_25_DEG_DOWN_TO_LEFT_BANK",
"ELEM_25_DEG_DOWN_TO_RIGHT_BANK",
"ELEM_LEFT_BANK",
"ELEM_RIGHT_BANK",
"ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP",
"ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP",
"ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN",
"ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN",
"ELEM_S_BEND_LEFT",
"ELEM_S_BEND_RIGHT",
"ELEM_LEFT_VERTICAL_LOOP",
"ELEM_RIGHT_VERTICAL_LOOP",
"ELEM_LEFT_QUARTER_TURN_3_TILES",
"ELEM_RIGHT_QUARTER_TURN_3_TILES",
"ELEM_LEFT_QUARTER_TURN_3_TILES_BANK",
"ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK",
"ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP",
"ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP",
"ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN",
"ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN",
"ELEM_LEFT_QUARTER_TURN_1_TILE",
"ELEM_RIGHT_QUARTER_TURN_1_TILE",
"ELEM_LEFT_TWIST_DOWN_TO_UP",
"ELEM_RIGHT_TWIST_DOWN_TO_UP",
"ELEM_LEFT_TWIST_UP_TO_DOWN",
"ELEM_RIGHT_TWIST_UP_TO_DOWN",
"ELEM_HALF_LOOP_UP",
"ELEM_HALF_LOOP_DOWN",
"ELEM_LEFT_CORKSCREW_UP",
"ELEM_RIGHT_CORKSCREW_UP",
"ELEM_LEFT_CORKSCREW_DOWN",
"ELEM_RIGHT_CORKSCREW_DOWN",
"ELEM_FLAT_TO_60_DEG_UP",
"ELEM_60_DEG_UP_TO_FLAT",
"ELEM_FLAT_TO_60_DEG_DOWN",
"ELEM_60_DEG_DOWN_TO_FLAT",
"ELEM_TOWER_BASE",
"ELEM_TOWER_SECTION",
"ELEM_FLAT_COVERED",
"ELEM_25_DEG_UP_COVERED",
"ELEM_60_DEG_UP_COVERED",
"ELEM_FLAT_TO_25_DEG_UP_COVERED",
"ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED",
"ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED",
"ELEM_25_DEG_UP_TO_FLAT_COVERED",
"ELEM_25_DEG_DOWN_COVERED",
"ELEM_60_DEG_DOWN_COVERED",
"ELEM_FLAT_TO_25_DEG_DOWN_COVERED",
"ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED",
"ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED",
"ELEM_25_DEG_DOWN_TO_FLAT_COVERED",
"ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED",
"ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED",
"ELEM_S_BEND_LEFT_COVERED",
"ELEM_S_BEND_RIGHT_COVERED",
"ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED",
"ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED",
"ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL",
"ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL",
"ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL",
"ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL",
"ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE",
"ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE",
"ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE",
"ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE",
"ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP",
"ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP",
"ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN",
"ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN",
"ELEM_BRAKES",
"ELEM_ROTATION_CONTROL_TOGGLE",
"ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP",
"ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP",
"ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP",
"ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN",
"ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN",
"ELEM_LEFT_QUARTER_HELIX_LARGE_UP",
"ELEM_RIGHT_QUARTER_HELIX_LARGE_UP",
"ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN",
"ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN",
"ELEM_25_DEG_UP_LEFT_BANKED",
"ELEM_25_DEG_UP_RIGHT_BANKED",
"ELEM_WATERFALL",
"ELEM_RAPIDS",
"ELEM_ON_RIDE_PHOTO",
"ELEM_25_DEG_DOWN_LEFT_BANKED",
"ELEM_25_DEG_DOWN_RIGHT_BANKED",
"ELEM_WATER_SPLASH",
"ELEM_FLAT_TO_60_DEG_UP_LONG_BASE",
"ELEM_60_DEG_UP_TO_FLAT_LONG_BASE",
"ELEM_WHIRLPOOL",
"ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE",
"ELEM_60_DEG_UP_TO_FLAT_LONG_BASE",
"ELEM_CABLE_LIFT_HILL",
"ELEM_REVERSE_WHOA_BELLY_SLOPE",
"ELEM_REVERSE_WHOA_BELLY_VERTICAL",
"ELEM_90_DEG_UP",
"ELEM_90_DEG_DOWN",
"ELEM_60_DEG_UP_TO_90_DEG_UP",
"ELEM_90_DEG_DOWN_TO_60_DEG_DOWN",
"ELEM_90_DEG_UP_TO_60_DEG_UP",
"ELEM_60_DEG_DOWN_TO_90_DEG_DOWN",
"ELEM_BRAKE_FOR_DROP",
"ELEM_LEFT_EIGHTH_TO_DIAG",
"ELEM_RIGHT_EIGHTH_TO_DIAG",
"ELEM_LEFT_EIGHTH_TO_ORTHOGONAL",
"ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL",
"ELEM_LEFT_EIGHTH_BANK_TO_DIAG",
"ELEM_RIGHT_EIGHTH_BANK_TO_DIAG",
"ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL",
"ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL",
"ELEM_DIAG_FLAT",
"ELEM_DIAG_25_DEG_UP",
"ELEM_DIAG_60_DEG_UP",
"ELEM_DIAG_FLAT_TO_25_DEG_UP",
"ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP",
"ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP",
"ELEM_DIAG_25_DEG_UP_TO_FLAT",
"ELEM_DIAG_25_DEG_DOWN",
"ELEM_DIAG_60_DEG_DOWN",
"ELEM_DIAG_FLAT_TO_25_DEG_DOWN",
"ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN",
"ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN",
"ELEM_DIAG_25_DEG_DOWN_TO_FLAT",
"ELEM_DIAG_FLAT_TO_60_DEG_UP",
"ELEM_DIAG_60_DEG_UP_TO_FLAT",
"ELEM_DIAG_FLAT_TO_60_DEG_DOWN",
"ELEM_DIAG_60_DEG_DOWN_TO_FLAT",
"ELEM_DIAG_FLAT_TO_LEFT_BANK",
"ELEM_DIAG_FLAT_TO_RIGHT_BANK",
"ELEM_DIAG_LEFT_BANK_TO_FLAT",
"ELEM_DIAG_RIGHT_BANK_TO_FLAT",
"ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP",
"ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP",
"ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK",
"ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK",
"ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN",
"ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN",
"ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK",
"ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK",
"ELEM_DIAG_LEFT_BANK",
"ELEM_DIAG_RIGHT_BANK",
"ELEM_LOG_FLUME_REVERSER",
"ELEM_SPINNING_TUNNEL",
"ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN",
"ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN",
"ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP",
"ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP",
"ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP",
"ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP",
"ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK",
"ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK",
"ELEM_POWERED_LIFT",
"ELEM_LEFT_LARGE_HALF_LOOP_UP",
"ELEM_RIGHT_LARGE_HALF_LOOP_UP",
"ELEM_RIGHT_LARGE_HALF_LOOP_DOWN",
"ELEM_LEFT_LARGE_HALF_LOOP_DOWN",
}
var table = []string{
"flat",
"end station",
"begin station",
"middle station",
"25 degree up",
"60 degree up",
"flat to 25 degree up",
"25 degree up to 60 degree up",
"60 degree up to 25 degree up",
"25 degree up to flat",
"25 degree down",
"60 dergee down", // 0b
"flat to 25 degree down",
"25 degree down to 60 degree down",
"50 degree down to 25 degree down",
"25 degree down to flat", // 0f
"left 1/4 5 tile turn",
"right 1/4 5 tile turn",
"flat to l bank",
"flat to R bank",
"L bank to flat",
"R bank to flat",
"L 1/4 D5 bank",
"R 1/4 D5 bank", // 17
"L bank to 25 degree up",
"R bank to 25 degree up",
"25 degree up to L bank",
"25 degree up to R bank",
"L bank to 25 degree down", // 1c
"R bank to 25 degree down",
"25 degree down to L bank",
"25 degree down to R bank",
"L bank",
"R bank", // 21
"L 1/4 D5 25 degree up",
"R 1/4 D5 25 degree up",
"L 1/4 D5 25 degree down",
"R 1/4 D5 25 degree down",
}
func main() {
f, err := os.Open(os.Getenv("HOME") + "/code/OpenRCT2/openrct2.exe")
if err != nil {
panic(err)
}
defer f.Close()
b := make([]byte, 1800)
f.ReadAt(b, 0x00597c9d)
c := make([]byte, 1800)
f.ReadAt(c, 0x0059849d)
for i := 0; i < len(table1); i++ {
fmt.Printf("%s ", hex.EncodeToString([]byte{byte(i)}))
fmt.Println(table1[i])
fmt.Println(strings.Repeat("=", len(table1[i])))
fmt.Println(" 0 1 2 3 4 5 6 7 ")
fmt.Println(b[i*8 : i*8+8])
fmt.Println(c[i*8 : i*8+8])
printValues(i, b)
fmt.Println("")
}
}
func printValues(i int, b []byte) {
if b[i*8+2] == 0 {
fmt.Println("- starts flat")
}
if b[i*8+2] == 2 {
fmt.Println("- starts at 25 degrees up")
}
if b[i*8+2] == 4 {
fmt.Println("- starts at 60 degrees up")
}
if b[i*8+2] == 6 {
fmt.Println("- starts at 25 degrees down")
}
if b[i*8+2] == 8 {
fmt.Println("- starts at 60 degrees down")
}
if b[i*8+1] == 0 {
fmt.Println("- ends flat")
}
if b[i*8+1] == 2 {
fmt.Println("- ends at 25 degrees up")
}
if b[i*8+1] == 4 {
fmt.Println("- ends at 60 degrees up")
}
if b[i*8+1] == 6 {
fmt.Println("- ends at 25 degrees down")
}
if b[i*8+1] == 8 {
fmt.Println("- ends at 60 degrees down")
}
if b[i*8+4] == 2 {
fmt.Println("- starts with left bank")
}
if b[i*8+4] == 4 {
fmt.Println("- starts with right bank")
}
if b[i*8+3] == 2 {
fmt.Println("- ends with left bank")
}
if b[i*8+3] == 4 {
fmt.Println("- ends with right bank")
}
}
// keys
// byte 0:
// value 2: end station
// value 7: vertical loop
// value 13: s bend
// 17: twist
// 18: half loop
// 19: corkscrew
// 20: tower base
// 21: small helix
// 22: large helix
// 23: unbanked large helix
// 24: brakes
// 26: on ride photo
// 27: water splash
// 29: barrel roll
// 30: powered lift
// 31: half loop
// 33: log flume reverser
// 36: whoa belly
// 43: lift hill
// 46: spinning tunnel
// 47: rotation control toggle
// 52: rapids (rct2 only)
// 152: waterfall/whirlpool
// 172: brake for drop
// byte 1:
// 2: ends at 25 degree up
// 4: ends at 60 degree up
// 6: ends at 25 degree down
// 8: ends at 60 degree down
// 10: 90 degree up (tower, whoa belly)
// 18: 90 degree down
// byte 2:
// 2: starts at 25 degree up
// 4: starts at 60 degree up
// 6: starts at 25 degree down
// 8: starts at 60 degree down
// 10: 90 degree up (also tower, whoa belly)
// 18: 90 degree down
// byte 3:
// 2: ends with left bank
// 4: ends with right bank
// 15: ends upside down
// byte 4:
// 2: starts with L bank
// 4: starts with R bank
// 15: starts upside down
// byte 5:
// 64: half loop up
// 192: half loop down
// 208: something relating to vertical loops. same for both L and R
// 224: corkscrew down
// odd things:
// - no instruction for diagonal
// - no instruction for direction change
// - no instruction for diameter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment