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"