From 948b4f82fc0f3b26f0a51cf17afdc0a5ed9403fd Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sun, 26 Aug 2012 22:13:57 +0000 Subject: [PATCH] build.lua map loader: add the option of canonicalizing sprite order. This is mostly for debugging, since currently, Mapster32 restores sprites not in the same order as the original sprite index order. Also, expose this option from map2text.lua and mapdiff.sh. git-svn-id: https://svn.eduke32.com/eduke32@2968 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/lunatic/build.lua | 56 ++++++++++++++++++++- polymer/eduke32/source/lunatic/map2text.lua | 35 +++++++++++-- polymer/eduke32/source/lunatic/mapdiff.sh | 15 ++++-- 3 files changed, 97 insertions(+), 9 deletions(-) diff --git a/polymer/eduke32/source/lunatic/build.lua b/polymer/eduke32/source/lunatic/build.lua index 72a6862b1..2607ede08 100644 --- a/polymer/eduke32/source/lunatic/build.lua +++ b/polymer/eduke32/source/lunatic/build.lua @@ -5,11 +5,14 @@ local ffi = require "ffi" local io = require "io" local bit = require "bit" +local string = require "string" +local table = require "table" local error = error local assert = assert local print = print local setmetatable = setmetatable +local tostring = tostring module(...) @@ -130,6 +133,52 @@ local function get_numyaxbunches(map) return numbunches end +--== sprite canonicalizer ==-- +local function sprite2str(s) + local FMT = "%+11d_" + -- NOTE: this canonicalization isn't very useful except for debugging + -- copy-paste in the editor. + -- tostring(s): make sort stable + return string.format(FMT:rep(4).."%s", s.x, s.y, s.z, s.ang, tostring(s)) +end + +local function canonicalize_sprite_order(map) + local numsprites = map.numsprites + + map.spriten2o = {} -- mapping of new to old sprite index + + if (numsprites == 0) then + return + end + + local spriteidx = {} + + for i=0,numsprites-1 do -- 0->1 based indexing + spriteidx[i+1] = i + end + + table.sort(spriteidx, + function(i1, i2) + return sprite2str(map.sprite[i1]) < sprite2str(map.sprite[i2]) + end) + + -- deep-copied sprite structs + local spritedup = {} + + for i=0,numsprites-1 do + -- save sorting permutation (0-based -> 0-based) + map.spriten2o[i] = assert(spriteidx[i+1]) + + -- back up struct + spritedup[i] = ffi.new("spritetype") + ffi.copy(spritedup[i], map.sprite[i], ffi.sizeof("spritetype")) + end + + for i=0,numsprites-1 do -- do the actual rearrangement + map.sprite[i] = spritedup[spriteidx[i+1]] + end +end + --== LOADBOARD ==-- -- returns: -- on failure, nil, errmsg @@ -144,7 +193,7 @@ end -- { x=, y=, z=, ang=, sectnum= }, -- numbunches = , -- } -function loadboard(filename) +function loadboard(filename, do_canonicalize_sprite) local fh, errmsg = io.open(filename) if (fh==nil) then @@ -223,6 +272,11 @@ function loadboard(filename) end fh:close() + if (do_canonicalize_sprite) then + -- must do this before setting metatable + canonicalize_sprite_order(map) + end + map.sector = set_secwalspr_mt(map.sector, map.numsectors) map.wall = set_secwalspr_mt(map.wall, map.numwalls) map.sprite = set_secwalspr_mt(map.sprite, map.numsprites) diff --git a/polymer/eduke32/source/lunatic/map2text.lua b/polymer/eduke32/source/lunatic/map2text.lua index a8e654d22..f8d486f91 100755 --- a/polymer/eduke32/source/lunatic/map2text.lua +++ b/polymer/eduke32/source/lunatic/map2text.lua @@ -3,10 +3,29 @@ local B = require("build") local string = require("string") -local fn = arg[1] +local opt, fn +local do_canonicalize_sprite + +if (arg[1] and arg[1]:sub(1,1)=="-") then + opt = arg[1] + fn = arg[2] +else + fn = arg[1] +end + +if (opt) then + if (opt=="-c" or opt=="-C") then + -- -C means to canonicalize but without adding the new->old mapping + -- comment + do_canonicalize_sprite = opt + else + print("Error: unrecognized option "..opt) + return 1 + end +end if (fn==nil) then - print("Usage: map2text ") + print("Usage: map2text [-c/-C] ") return 1 end @@ -14,7 +33,7 @@ local function printf(fmt, ...) print(string.format(fmt, ...)) end -local map, errmsg = B.loadboard(fn) +local map, errmsg = B.loadboard(fn, do_canonicalize_sprite) if (map == nil) then printf("Couldn't load \"%s\": %s", fn, errmsg) return 1 @@ -68,13 +87,21 @@ local sprite_members = { local function print_members(map, struct, members) printf("%s = {", struct) for i=0,map["num"..struct.."s"]-1 do - printf("[%d]={", i) + local comment = "" + if (struct=="sprite" and do_canonicalize_sprite=="-c") then + comment = " --"..tostring(map.spriten2o[i]) + end + + printf("[%d]={%s", i, comment) + for j=1,#members do local member = members[j] printf("%s = %d", member, map[struct][i][member]) end + print("}") end + print("}") end diff --git a/polymer/eduke32/source/lunatic/mapdiff.sh b/polymer/eduke32/source/lunatic/mapdiff.sh index 0d1df26cf..f3354ae08 100755 --- a/polymer/eduke32/source/lunatic/mapdiff.sh +++ b/polymer/eduke32/source/lunatic/mapdiff.sh @@ -1,8 +1,10 @@ #!/bin/sh -DIFF="git diff --no-index --color-words" +DIFF="git diff -U2 --no-index --color-words" CMD="/usr/bin/env luajit ./map2text.lua" +opt="" + if [ `uname -s` != "Linux" ]; then # I think 'tempfile' isn't in POSIX. Feel free to use 'mktemp' or something # but absolutely test it before. @@ -10,16 +12,21 @@ if [ `uname -s` != "Linux" ]; then return 1 fi +if [ "$1" = "-c" -o "$1" = "-C" ]; then + opt="$1" + shift +fi + if [ -z "$1" -o -z "$2" ]; then - echo "Usage: ./mapdiff.sh " + echo "Usage: ./mapdiff.sh [-c] " exit 1 fi tf1=`tempfile` tf2=`tempfile` -$CMD "$1" > "$tf1" -$CMD "$2" > "$tf2" +$CMD $opt "$1" > "$tf1" +$CMD $opt "$2" > "$tf2" $DIFF "$tf1" "$tf2"