diff --git a/polymer/eduke32/Makefile b/polymer/eduke32/Makefile index d2cf10bfe..cb2018733 100644 --- a/polymer/eduke32/Makefile +++ b/polymer/eduke32/Makefile @@ -148,7 +148,16 @@ ifneq (0,$(LUNATIC)) EDITOROBJS+= $(OBJ)/lunatic_m32.$o $(LUNATIC_COMMON_OBJS) GAMEOBJS+= $(OBJ)/lunatic_game.$o $(LUNATIC_COMMON_OBJS) - GAMEOBJS+= $(OBJ)/../lpeg.a # TEMP + ifneq ($(PLATFORM),WINDOWS) + # On non-Windows, we expect to have liblpeg.a (or a symlink to it) in source/. + # On Windows, it will reside in platform/Windows/lib32 or lib64. + LIBDIRS+= -L$(realpath (OBJ)/..) + ifeq ($(realpath $(OBJ)/../liblpeg.a),) + # XXX: This cripples "make clean" etc. too, but IMO it's better than warning. + $(error "liblpeg.a not found in $(realpath $(OBJ)/..)") + endif + endif + LIBS+= -llpeg GAMEOBJS+= $(OBJ)/luaJIT_BC_con_lang.$o \ $(OBJ)/luaJIT_BC_lunacon.$o \ $(OBJ)/luaJIT_BC_randgen.$o \ diff --git a/polymer/eduke32/Makefile.common b/polymer/eduke32/Makefile.common index 25165473a..e5041426b 100644 --- a/polymer/eduke32/Makefile.common +++ b/polymer/eduke32/Makefile.common @@ -427,7 +427,7 @@ LUNATIC=0 LUAJIT=luajit # for LJ headers: -LUAJIT_WIN_SRC:= g:/mod/luajit-2.0/src +LUAJIT_WIN_SRC:= f:/g/mod/luajit-2.0/src ifneq ($(LUNATIC),0) # FIXME: Lunatic doesn't build with inlining because of wacky include diff --git a/polymer/eduke32/source/lunatic/defs_common.lua b/polymer/eduke32/source/lunatic/defs_common.lua index d2d8f54fe..64fed5c51 100644 --- a/polymer/eduke32/source/lunatic/defs_common.lua +++ b/polymer/eduke32/source/lunatic/defs_common.lua @@ -673,9 +673,11 @@ end ---=== Methods that are specific to sprites ===--- +local l_updatesector -- fwd-decl + function spritetype_mt.__index.setpos(spr, pos) -- setsprite() clone spr.x, spr.y, spr.z = pos.x, pos.y, pos.z - local newsect = updatesector(spr, spr.sectnum) + local newsect = l_updatesector(spr, spr.sectnum) if (newsect >= 0 and spr.sectnum ~= newsect) then ffiC.changespritesect(get_sprite_idx(spr), newsect) @@ -696,7 +698,7 @@ end -- e.g. for example because it's already there from "hitscan"). function tspritetype_mt.__index.setpos(tspr, pos) tspr.x, tspr.y, tspr.z = pos.x, pos.y, pos.z - local newsect = updatesector(tspr, tspr.sectnum) + local newsect = l_updatesector(tspr, tspr.sectnum) if (newsect >= 0 and tspr.sectnum ~= newsect) then tspr:set_sectnum(newsect) @@ -942,6 +944,7 @@ end --== ALL GLOBALS FROM HERE ON ARE EXPORTED UPWARDS (see create_globals() below) ==-- sector = setmtonce({}, sector_mt) +local sector = sector wall = setmtonce({}, wall_mt) sprite = setmtonce({}, sprite_mt) spriteext = creategtab(ffiC.spriteext, ffiC.MAXSPRITES, 'spriteext[]') @@ -1122,6 +1125,8 @@ function updatesector(pos, sectnum, flags) return us_retsect[0] end +l_updatesector = updatesector + function updatesectorz(pos, sectnum, flags) if (sectnum ~= -1) then check_sector_idx(sectnum) diff --git a/polymer/eduke32/source/lunatic/doc/how_to_build_lunatic.txt b/polymer/eduke32/source/lunatic/doc/how_to_build_lunatic.txt new file mode 100644 index 000000000..42bb8fdd5 --- /dev/null +++ b/polymer/eduke32/source/lunatic/doc/how_to_build_lunatic.txt @@ -0,0 +1,15 @@ + +Lunatic depends on the following: + +* LuaJIT 2.0.2 or later [http://luajit.org]. It is recommended to get the + latest git HEAD of the 2.0 branch, see http://luajit.org/download.html for + that. As of time of writing, LuaJIT 2.1 is in alpha, and has not been + successfully tested with Lunatic. LuaJIT is built with the following change + to src/luaconf.h: + #define LUAI_MAXCSTACK 64000 + (instead of the default 8000.) + +* LPeg 0.12 [http://www.inf.puc-rio.br/~roberto/lpeg], but with our patch + "lpeg-lunatic.patch" applied. It will allow to build a statically linked + library of LPeg, "liblpeg.a". On Windows, liblpeg.a is pre-compiled and + resides in platform/Windows/lib/{32,64} [TODO on release]. diff --git a/polymer/eduke32/source/lunatic/doc/lpeg-lunatic.patch b/polymer/eduke32/source/lunatic/doc/lpeg-lunatic.patch new file mode 100644 index 000000000..31eab27b7 --- /dev/null +++ b/polymer/eduke32/source/lunatic/doc/lpeg-lunatic.patch @@ -0,0 +1,73 @@ +diff --git a/lpcap.h b/lpcap.h +index c0a0e38..1bfc109 100644 +--- a/lpcap.h ++++ b/lpcap.h +@@ -18,7 +18,7 @@ typedef enum CapKind { + + typedef struct Capture { + const char *s; /* subject position */ +- short idx; /* extra info about capture (group name, arg index, etc.) */ ++ int idx; /* extra info about capture (group name, arg index, etc.) */ + byte kind; /* kind of capture */ + byte siz; /* size of full capture + 1 (0 = not a full capture) */ + } Capture; +diff --git a/makefile b/makefile +index 57a18fb..88e8a60 100644 +--- a/makefile ++++ b/makefile +@@ -1,5 +1,8 @@ + LIBNAME = lpeg +-LUADIR = /usr/include/lua5.1/ ++# Linux example: ++LUADIR = /usr/local/include/luajit-2.0 ++# Windows example (from MSYS bash): ++#LUADIR = /f/g/mod/luajit-2.0/src + + COPT = -O2 + # COPT = -DLPEG_DEBUG -g +@@ -19,10 +22,21 @@ CWARNS = -Wall -Wextra -pedantic \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wstrict-prototypes \ ++ -Werror-implicit-function-declaration \ + # -Wunreachable-code \ + ++# Example: ++# -------- ++# 1. Build shared lib (for LunaCON standalone) ++# $ make linux ++# 2. Remove shared-lib *.o ++# $ rm *.o ++# 3. Build static lib (for EDuke32/Lunatic) ++# $ PIC='' make liblpeg.a + +-CFLAGS = $(CWARNS) $(COPT) -ansi -I$(LUADIR) -fPIC ++PIC ?= -fPIC ++ ++CFLAGS = $(CWARNS) $(COPT) -ansi -I$(LUADIR) $(PIC) + CC = gcc + + FILES = lpvm.o lpcap.o lptree.o lpcode.o lpprint.o +@@ -38,13 +52,16 @@ macosx: + lpeg.so: $(FILES) + env $(CC) $(DLLFLAGS) $(FILES) -o lpeg.so + ++liblpeg.a: $(FILES) ++ $(AR) rc $@ $^ ++ + $(FILES): makefile + + test: test.lua re.lua lpeg.so + ./test.lua + + clean: +- rm -f $(FILES) lpeg.so ++ rm -f $(FILES) lpeg.so liblpeg.a + + + lpcap.o: lpcap.c lpcap.h lptypes.h +@@ -52,4 +69,3 @@ lpcode.o: lpcode.c lptypes.h lpcode.h lptree.h lpvm.h lpcap.h + lpprint.o: lpprint.c lptypes.h lpprint.h lptree.h lpvm.h lpcap.h + lptree.o: lptree.c lptypes.h lpcap.h lpcode.h lptree.h lpvm.h lpprint.h + lpvm.o: lpvm.c lpcap.h lptypes.h lpvm.h lpprint.h lptree.h +- diff --git a/polymer/eduke32/source/lunatic/doc/lunatic.txt b/polymer/eduke32/source/lunatic/doc/lunatic.txt index 602784647..758e533fb 100644 --- a/polymer/eduke32/source/lunatic/doc/lunatic.txt +++ b/polymer/eduke32/source/lunatic/doc/lunatic.txt @@ -243,6 +243,7 @@ sensitive_ walls and sprites. The number of times in a second each actor excecutes its code and updates its position (``game tics''). +////////// `gv.*` inventory indices:: `GET_STEROIDS`, `GET_SHIELD`, `GET_SCUBA`, `GET_HOLODUKE`, `GET_JETPACK`, `GET_DUMMY1`, `GET_ACCESS`, `GET_HEATS`, `GET_DUMMY2`, `GET_FIRSTAID`, @@ -253,14 +254,6 @@ position (``game tics''). `RPG_WEAPON`, `HANDBOMB_WEAPON`, `SHRINKER_WEAPON`, `DEVISTATOR_WEAPON`, `TRIPBOMB_WEAPON`, `FREEZE_WEAPON`, `HANDREMOTE_WEAPON`, `GROW_WEAPON`. `MAX_WEAPONS`. - -// TODO: the others, like EVENT_*. -////////// -[[gv_STAT]] `gv.*` sprite status numbers:: -`STAT_DEFAULT`, `STAT_ACTOR`, `STAT_ZOMBIEACTOR`, `STAT_EFFECTOR`, -`STAT_PROJECTILE`, `STAT_MISC`, `STAT_STANDABLE`, `STAT_LOCATOR`, -`STAT_ACTIVATOR`, `STAT_TRANSPORT`, `STAT_PLAYER`, `STAT_FX`, `STAT_FALLER`, -`STAT_DUMMYPLAYER`, `STAT_LIGHT`. ////////// [[gv_REND]] `gv.REND`:: @@ -1008,6 +1001,8 @@ Returns a boolean of whether the position `pos` (which can be anything indexable with `x` and `y`) is considered inside the sector with number `sectnum`, which must be valid. The `z` component is not taken into account. +===== Sector updating + A number of engine functions take a position `pos` and a starting sector number `sectnum` and try to find a sector that contains `pos`, assuming it started out in `sectnum`.footnote:[Note that this is different from CON's `updatesector`, @@ -1019,6 +1014,9 @@ and then attempt to search neighboring sectors. If the passed `sectnum` is `-1`, all sectors are searched in an unspecified order. On success, these functions return the sector number of the ``updated'' sector, otherwise `-1`. +// XXX: With breadth-first search, there is no all-sector search when passing +// -1. The above paragraph suggests otherwise. + [[updatesector]] `updatesector(pos, sectnum [, flags])`:: Searches for a sector containing `pos`, which can be anything indexable with diff --git a/polymer/eduke32/source/lunatic/xmath.lua b/polymer/eduke32/source/lunatic/xmath.lua index 1b6181bf1..11cbd8e5b 100644 --- a/polymer/eduke32/source/lunatic/xmath.lua +++ b/polymer/eduke32/source/lunatic/xmath.lua @@ -79,6 +79,8 @@ function cosb(ang) return dsintab[ksc_common(ang+512)] end +local cosb, sinb = cosb, sinb + ---=== Approximations to 2D and 3D Euclidean distances ===--- -- (also see common.c) @@ -282,6 +284,8 @@ function ivec3(...) end end +local vec2, vec3 = vec2, vec3 + ---=== MISCELLANEOUS MATH ===---