KenBuild.

DONT_BUILD.

git-svn-id: https://svn.eduke32.com/eduke32@4555 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2014-07-24 14:01:44 +00:00
parent 4e5788a32d
commit 4f67f8f969
53 changed files with 17635 additions and 170 deletions

1
.gitignore vendored
View file

@ -29,3 +29,4 @@
/polymer/eduke32/build/obj
/polymer/eduke32/source/jaudiolib/obj
/polymer/eduke32/source/enet/obj
/polymer/eduke32/source/testgame/obj

View file

@ -4,7 +4,6 @@
include Makefile.common
DUKE3D_SRC=source
DUKE3D_INC=$(DUKE3D_SRC)
DUKE3D_RSRC=rsrc
@ -15,6 +14,19 @@ o=o
asm=nasm
obj=obj
COMPILERFLAGS += -I$(ENGINE_INC) -I$(DUKE3D_SRC)/jmact -I$(AUDIOLIB_ROOT)/include -I$(ENET_ROOT)/include
# EBacktrace
ifndef EBACKTRACEDLL
EBACKTRACEDLL = ebacktrace1.dll
ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
EBACKTRACEDLL = ebacktrace1-64.dll
endif
endif
EBACKTRACEDLL_TARGET:=$(EBACKTRACEDLL)
# BUILD Engine
@ -23,8 +35,7 @@ UTIL_LIBS= -lm # -lpthread
ENGINE_OBJ=$(ENGINE_ROOT)/$(obj)
ENGINE_OBJS=baselayer cache1d compat crc32 defs engine polymost texcache dxtfilter hightile textfont smalltextfont kplib lz4 osd pragmas scriptfile mutex xxhash
ENGINE_OBJS=baselayer cache1d compat crc32 defs engine polymost texcache dxtfilter hightile textfont smalltextfont kplib lz4 osd pragmas scriptfile mmulti_null mutex xxhash
ENGINE_EDITOR_OBJS=build config defs
ifeq (0,$(NOASM))
ENGINE_OBJS+= a
@ -75,6 +86,11 @@ ENGINE_OBJS_EXP:=$(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(ENGINE_OBJS)))
ENGINE_EDITOR_OBJS_EXP:=$(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(ENGINE_EDITOR_OBJS)))
# MACT
MACT_OBJ=file_lib control keyboard mouse joystick mathutil scriplib animlib
# AudioLib
AUDIOLIB_OBJS=drivers fx_man multivoc mix mixst pitch formats vorbis flac xa driver_nosound
@ -131,6 +147,12 @@ endif
ENET_OBJS_EXP:=$(addprefix $(ENET_OBJ)/,$(addsuffix .$o,$(ENET_OBJS)))
ifeq ($(NETCODE),0)
ENET_TARGET=
else
ENET_TARGET=$(ENET_OBJS_EXP)
endif
# Tools
@ -143,58 +165,62 @@ SDLUTILS=makesdlkeytrans
UTIL_OBJS_EXP:=$(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(UTIL_OBJS)))
# Duke Nukem 3D
# KenBuild (Test Game)
ifneq (0,$(RELEASE))
# Debugging disabled
COMMONFLAGS += $(F_NO_STACK_PROTECTOR)
else
# Debugging enabled
ifneq (0,$(KRANDDEBUG))
COMMONFLAGS += -fno-inline -fno-inline-functions -fno-inline-functions-called-once
endif
ifeq (1,$(SDL_TARGET))
COMPILERFLAGS += -DNOSDLPARACHUTE
endif
TESTGAME_ROOT=$(DUKE3D_SRC)/testgame
TESTGAME_SRC=$(TESTGAME_ROOT)/src
TESTGAME_RSRC=$(TESTGAME_ROOT)/rsrc
TESTGAME_OBJ=$(TESTGAME_ROOT)/$(obj)
TEST_CFLAGS=-I$(TESTGAME_SRC)
TESTGAME ?= testgame$(EXESUFFIX)
TESTEDITOR ?= testeditor$(EXESUFFIX)
TESTGAME_TARGET:=$(TESTGAME)
TESTEDITOR_TARGET:=$(TESTEDITOR)
TESTGAME_OBJS=game sound_stub common config
TESTEDITOR_OBJS=bstub common
ifeq ($(RENDERTYPE),SDL)
ifeq (1,$(HAVE_GTK2))
TESTGAME_OBJS+= game_banner startgtk.game
TESTEDITOR_OBJS+= editor_banner
endif
TESTGAME_OBJS+= game_icon
TESTEDITOR_OBJS+= build_icon
endif
ifeq ($(PLATFORM),WINDOWS)
TESTGAME_OBJS+= gameres startwin.game
TESTEDITOR_OBJS+= buildres
endif
COMPILERFLAGS += -I$(DUKE3D_INC) -I$(ENGINE_INC) -I$(DUKE3D_SRC)/jmact -I$(AUDIOLIB_ROOT)/include -I$(ENET_ROOT)/include
TESTGAME_OBJS_EXP:=$(addprefix $(TESTGAME_OBJ)/,$(addsuffix .$o,$(TESTGAME_OBJS)))
TESTEDITOR_OBJS_EXP:=$(addprefix $(TESTGAME_OBJ)/,$(addsuffix .$o,$(TESTEDITOR_OBJS)))
# Duke Nukem 3D
DUKE3D_CFLAGS=-I$(DUKE3D_INC)
# Game/editor-specific linker options
DUKE3D_LINKERFLAGS=
DUKE3D_EDITOR_LINKERFLAGS=
DUKE3D_OBJ=$(DUKE3D_SRC)/$(obj)
ifeq ($(NETCODE),0)
ENET_TARGET=
else
ENET_TARGET=$(ENET_OBJS_EXP)
endif
EDUKE32 ?= eduke32$(EXESUFFIX)
MAPSTER32 ?= mapster32$(EXESUFFIX)
EDUKE32_TARGET:=$(EDUKE32)
MAPSTER32_TARGET:=$(MAPSTER32)
ifndef EBACKTRACEDLL
EBACKTRACEDLL = ebacktrace1.dll
ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
EBACKTRACEDLL = ebacktrace1-64.dll
endif
endif
EBACKTRACEDLL_TARGET:=$(EBACKTRACEDLL)
COMMON_OBJS=common rev
COMMON_EDITOR_OBJS=common m32def m32exec m32vars mathutil rev
ifeq ($(SUBPLATFORM),LINUX)
LIBS+= -lrt
endif
MACT_OBJ=file_lib control keyboard mouse joystick mathutil scriplib animlib
DUKE3D_OBJS=game actors anim common rev config demo gamedef gameexec gamevars global input menus namesdyn net player premap savegame sector rts osdfuncs osdcmds grpscan sounds soundsdyn $(MACT_OBJ)
DUKE3D_EDITOR_OBJS=astub common rev m32def m32exec m32vars mathutil sounds_mapster32
DUKE3D_OBJS=game actors anim config demo gamedef gameexec gamevars global input menus namesdyn net player premap savegame sector rts osdfuncs osdcmds grpscan sounds soundsdyn $(MACT_OBJ)
DUKE3D_EDITOR_OBJS=astub sounds_mapster32
ifneq ($(USE_LIBVPX),0)
DUKE3D_OBJS+= animvpx
@ -259,18 +285,11 @@ ifneq (0,$(LUNATIC))
endif
endif
# PLATFORM SPECIFIC SETTINGS
ifeq ($(SUBPLATFORM),LINUX)
ifeq (0,$(CLANG))
COMMONFLAGS += -fno-pic
endif
LIBS += -lFLAC -lvorbisfile -lvorbis -logg
endif
ifeq ($(PLATFORM),DARWIN)
COMMONFLAGS += -fno-pic
LIBDIRS += -L$(AUDIOLIB_ROOT)/third-party/Apple/lib
LIBS += -lFLAC -lvorbisfile -lvorbis -logg -lm \
@ -287,7 +306,6 @@ ifeq ($(PLATFORM),DARWIN)
endif
ifeq ($(PLATFORM),WINDOWS)
COMMONFLAGS += -fno-pic
LIBS += -lFLAC -lvorbisfile -lvorbis -logg -lcompat-from-mingw-w64
LIBDIRS += -L$(AUDIOLIB_ROOT)/third-party/Windows/lib$(WINLIB)
DUKE3D_OBJS+= gameres winbits startwin.game
@ -316,6 +334,9 @@ ifeq ($(MIXERTYPE),SDL)
endif
COMMON_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(COMMON_OBJS)))
COMMON_EDITOR_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(COMMON_EDITOR_OBJS)))
DUKE3D_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(DUKE3D_OBJS)))
DUKE3D_EDITOR_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(DUKE3D_EDITOR_OBJS)))
@ -325,7 +346,7 @@ DUKE3D_EDITOR_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(DUKE3D_EDIT
ifeq ($(PRETTY_OUTPUT),1)
.SILENT:
endif
.PHONY: veryclean clean all cleanutils utils dxutils sdlutils printutils printsdlutils printdxutils rev rev_clean
.PHONY: veryclean clean all test cleanutils utils dxutils sdlutils printutils printsdlutils printdxutils rev rev_clean
# TARGETS
@ -337,6 +358,14 @@ ifneq (,$(MAPSTER32_TARGET))
@ls -l $(MAPSTER32)
endif
test: start $(TESTGAME_TARGET) $(TESTEDITOR_TARGET) finish
ifneq (,$(TESTGAME_TARGET))
@ls -l $(TESTGAME)
endif
ifneq (,$(TESTEDITOR_TARGET))
@ls -l $(TESTEDITOR)
endif
ebacktrace: start $(EBACKTRACEDLL_TARGET) finish
ifneq (,$(EBACKTRACEDLL_TARGET))
@ls -l $(EBACKTRACEDLL)
@ -357,7 +386,21 @@ dxutils: $(addsuffix $(EXESUFFIX),$(DXUTILS))
sdlutils: $(addsuffix $(EXESUFFIX),$(SDLUTILS))
@ls -l $^
$(EDUKE32): $(DUKE3D_OBJS_EXP) $(ENGINE_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(ENET_TARGET) $(DUKE3D_MISCDEPS)
$(TESTGAME): $(TESTGAME_OBJS_EXP) $(COMMON_OBJS_EXP) $(ENGINE_OBJS_EXP)
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(COMMONFLAGS) $(LINKERFLAGS) $(LIBDIRS) $(LIBS) $(STATICSTDCPP) $(RECIPE_RESULT_LINK)
ifneq ($(STRIP),)
$(STRIP) $(TESTGAME)
endif
$(TESTEDITOR): $(TESTEDITOR_OBJS_EXP) $(COMMON_EDITOR_OBJS_EXP) $(ENGINE_EDITOR_OBJS_EXP) $(ENGINE_OBJS_EXP)
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(COMMONFLAGS) $(LINKERFLAGS) $(LIBDIRS) $(LIBS) $(STATICSTDCPP) $(RECIPE_RESULT_LINK)
ifneq ($(STRIP),)
$(STRIP) $(TESTEDITOR)
endif
$(EDUKE32): $(DUKE3D_OBJS_EXP) $(COMMON_OBJS_EXP) $(ENGINE_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(ENET_TARGET) $(DUKE3D_MISCDEPS)
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(COMMONFLAGS) $(LINKERFLAGS) $(DUKE3D_LINKERFLAGS) $(LIBDIRS) $(LIBS) $(STATICSTDCPP) $(RECIPE_RESULT_LINK)
ifneq ($(STRIP),)
@ -369,7 +412,7 @@ ifeq ($(PLATFORM),DARWIN)
cp -f "$(EDUKE32)" "EDuke32.app/Contents/MacOS/"
endif
$(MAPSTER32): $(DUKE3D_EDITOR_OBJS_EXP) $(ENGINE_EDITOR_OBJS_EXP) $(ENGINE_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(DUKE3D_EDITOR_MISCDEPS)
$(MAPSTER32): $(DUKE3D_EDITOR_OBJS_EXP) $(COMMON_EDITOR_OBJS_EXP) $(ENGINE_EDITOR_OBJS_EXP) $(ENGINE_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(DUKE3D_EDITOR_MISCDEPS)
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(COMMONFLAGS) $(LINKERFLAGS) $(DUKE3D_EDITOR_LINKERFLAGS) $(LIBDIRS) $(LIBS) $(STATICSTDCPP) $(RECIPE_RESULT_LINK)
ifneq ($(STRIP),)
@ -381,6 +424,7 @@ ifeq ($(PLATFORM),DARWIN)
cp -f "$(MAPSTER32)" "Mapster32.app/Contents/MacOS/"
endif
include Makefile.deps
include $(ENGINE_ROOT)/Makefile.deps
@ -415,10 +459,6 @@ arttool$(EXESUFFIX): $(ENGINE_OBJ)/arttool.$o
$(ONESTEP_STATUS)
$(RECIPE_IF) $(L_CXX) $(CPPONLYFLAGS) -o $@ $^ $(COMMONFLAGS) $(LINKERFLAGS) $(LIBDIRS) $(LIBS) $(STATICSTDCPP) $(STDCPPLIB) $(UTIL_LIBS) $(RECIPE_RESULT_ONESTEP)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/%.c | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
#### Lunatic
# Create object files directly with luajit
@ -435,7 +475,7 @@ $(DUKE3D_OBJ)/luaJIT_BC_%.$o: source/lunatic/%.ilua
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/lunatic/%.c
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
# TODO: _m32
# List of exported symbols, OS X
@ -473,10 +513,6 @@ $(ENGINE_OBJ)/%.$o: $(ENGINE_SRC)/%.c | $(ENGINE_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(ENGINE_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/util/%.c | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(ENGINE_OBJ)/%.$o: $(ENGINE_SRC)/%.m | $(ENGINE_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(ENGINE_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
@ -489,10 +525,6 @@ $(ENGINE_OBJ)/%.$o: $(ENGINE_SRC)/misc/%.c | $(ENGINE_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(ENGINE_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(ENGINE_OBJ)/%.$o: $(ENGINE_SRC)/misc/%.rc | $(ENGINE_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(RC) -i $< -o $@ --include-dir=$(ENGINE_INC) --include-dir=$(ENGINE_SRC) $(RECIPE_RESULT_COMPILE)
$(ENGINE_OBJ)/%.$o: $(ENGINE_SRC)/util/%.c | $(ENGINE_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(ENGINE_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
@ -517,25 +549,45 @@ $(ENET_OBJ)/%.o: $(ENET_SRC)/%.c $(ENET_INC)/enet/*.h | $(ENET_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(ENET_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(TESTGAME_OBJ)/%.$o: $(TESTGAME_SRC)/%.c | $(TESTGAME_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(TESTGAME_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(TESTGAME_OBJ)/%.$o: $(TESTGAME_RSRC)/%.rc | $(TESTGAME_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(RC) -i $< -o $@ --include-dir=$(ENGINE_INC) --include-dir=$(TESTGAME_SRC) --include-dir=$(TESTGAME_RSRC) $(RECIPE_RESULT_COMPILE)
$(TESTGAME_OBJ)/%.$o: $(TESTGAME_RSRC)/%.c | $(TESTGAME_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(TESTGAME_CFLAGS) -Wno-pointer-sign -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/%.c | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/util/%.c | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/%.m | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/%.cpp | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(CXX) $(CPPONLYFLAGS) $(COMMONFLAGS) $(COMPILERFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(RECIPE_IF) $(CXX) $(CPPONLYFLAGS) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/jmact/%.c | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_SRC)/misc/%.rc | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(RC) -i $< -o $@ --include-dir=$(ENGINE_INC) --include-dir=$(DUKE3D_SRC) -DPOLYMER=$(POLYMER) $(RECIPE_RESULT_COMPILE)
$(RECIPE_IF) $(RC) -i $< -o $@ --include-dir=$(ENGINE_INC) --include-dir=$(DUKE3D_SRC) --include-dir=$(DUKE3D_RSRC) -DPOLYMER=$(POLYMER) $(RECIPE_RESULT_COMPILE)
$(DUKE3D_OBJ)/%.$o: $(DUKE3D_RSRC)/%.c | $(DUKE3D_OBJ)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) -Wno-pointer-sign -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(RECIPE_IF) $(COMPILER) $(COMMONFLAGS) $(COMPILERFLAGS) $(DUKE3D_CFLAGS) -Wno-pointer-sign -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(DUKE3D_RSRC)/game_banner.c: $(DUKE3D_RSRC)/game.bmp
echo "#include <gdk-pixbuf/gdk-pixdata.h>" > $@
@ -546,17 +598,20 @@ $(DUKE3D_RSRC)/editor_banner.c: $(DUKE3D_RSRC)/build.bmp
echo "extern const GdkPixdata startbanner_pixdata;" >> $@
gdk-pixbuf-csource --extern --struct --raw --name=startbanner_pixdata $^ | sed 's/load_inc//' >> $@
$(ENGINE_OBJ) $(AUDIOLIB_OBJ) $(ENET_OBJ) $(DUKE3D_OBJ):
$(ENGINE_OBJ) $(AUDIOLIB_OBJ) $(ENET_OBJ) $(DUKE3D_OBJ) $(TESTGAME_OBJ):
mkdir $@
# PHONIES
clean: $(UNDO_REV)
-rm -f $(EDUKE32) $(MAPSTER32) $(DUKE3D_OBJS_EXP) $(DUKE3D_EDITOR_OBJS_EXP) $(DUKE3D_MISCDEPS) $(DUKE3D_EDITOR_MISCDEPS) core*
-rm -f $(EDUKE32) $(MAPSTER32) $(COMMON_OBJS_EXP) $(DUKE3D_OBJS_EXP) $(COMMON_EDITOR_OBJS_EXP) $(DUKE3D_EDITOR_OBJS_EXP) $(DUKE3D_MISCDEPS) $(DUKE3D_EDITOR_MISCDEPS) core*
ifeq ($(PLATFORM),DARWIN)
-rm -rf EDuke32.app Mapster32.app
endif
cleantest:
-rm -f $(TESTGAME) $(TESTEDITOR) $(TESTGAME_OBJS_EXP) $(TESTEDITOR_OBJS_EXP)
cleanutils:
-rm -f $(addsuffix $(EXESUFFIX),$(UTILS) $(GAMEUTILS)) $(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(UTILS))) $(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(GAMEUTILS))) $(addsuffix $(EXESUFFIX),$(DXUTILS)) $(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(DXUTILS))) $(addsuffix $(EXESUFFIX),$(SDLUTILS)) $(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(SDLUTILS))) $(UTIL_OBJS_EXP)

View file

@ -43,10 +43,10 @@ ifeq ($(findstring clang,$(CC)),clang)
endif
ifneq (0,$(CLANG))
CC=clang -x c
CXX=clang -x c++
L_CC=clang
L_CXX=clang
override CC=clang -x c
override CXX=clang -x c++
override L_CC=clang
override L_CXX=clang
endif
CCFULLPATH=$(CC)
@ -341,6 +341,19 @@ ifeq ($(PLATFORM),DARWIN)
endif
ifneq (0,$(RELEASE))
# Debugging disabled
COMMONFLAGS += $(F_NO_STACK_PROTECTOR)
else
# Debugging enabled
ifneq (0,$(KRANDDEBUG))
COMMONFLAGS += -fno-inline -fno-inline-functions -fno-inline-functions-called-once
endif
ifeq (1,$(SDL_TARGET))
COMPILERFLAGS += -DNOSDLPARACHUTE
endif
endif
ifndef OPTOPT
ifeq ($(PLATFORM), WII)
OPTOPT=
@ -641,6 +654,11 @@ ifeq ($(SUBPLATFORM),LINUX)
override NOASM=1
endif
endif
LIBS+= -lrt
ifeq (0,$(CLANG))
COMMONFLAGS += -fno-pic
endif
endif
ifeq ($(PLATFORM),DARWIN)
COMPILERFLAGS+= -DUNDERSCORES
@ -685,6 +703,8 @@ ifeq ($(PLATFORM),DARWIN)
LINKERFLAGS += -read_only_relocs suppress
endif
endif
COMMONFLAGS += -fno-pic
endif
ifeq ($(PLATFORM),WINDOWS)
COMPILERFLAGS+= -DUNDERSCORES -DHAVE_INTTYPES -Iplatform/Windows/include
@ -723,6 +743,8 @@ ifeq ($(PLATFORM),WINDOWS)
override NOASM=1
endif
endif
COMMONFLAGS += -fno-pic
endif
ifeq ($(PLATFORM),BSD)
COMPILERFLAGS+= -I/usr/X11R6/include

View file

@ -117,7 +117,10 @@ void uninitsystem(void);
void system_getcvars(void);
extern int32_t flushlogwindow;
void initputs(const char *);
#define buildputs initputs
void initprintf(const char *, ...) ATTRIBUTE((format(printf,1,2)));
#define buildprintf initprintf
void debugprintf(const char *,...) ATTRIBUTE((format(printf,1,2)));
int32_t handleevents(void);

View file

@ -1078,7 +1078,7 @@ void E_MapArt_Setup(const char *filename);
void loadtile(int16_t tilenume);
int32_t qloadkvx(int32_t voxindex, const char *filename);
intptr_t allocatepermanenttile(int16_t tilenume, int32_t xsiz, int32_t ysiz);
//void copytilepiece(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, int32_t ysiz, int32_t tilenume2, int32_t sx2, int32_t sy2);
void copytilepiece(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, int32_t ysiz, int32_t tilenume2, int32_t sx2, int32_t sy2);
void makepalookup(int32_t palnum, const char *remapbuf, int8_t r, int8_t g, int8_t b, char dastat);
//void setvgapalette(void);
void setbasepaltable(uint8_t **basepaltable, uint8_t basepalcount);

View file

@ -47,6 +47,9 @@ enum
//// EXTERN DECLS
extern struct strllist *CommandPaths, *CommandGrps;
extern const char *s_buildRev;
extern const char *s_buildTimestamp;
extern const char *s_buildInfo;
//// FUNCTIONS
void G_AddGroup(const char *buffer);
@ -77,6 +80,8 @@ int32_t dist(const spritetype *s1, const spritetype *s2);
void COMMON_clearbackground(int32_t numcols, int32_t numrows);
extern void G_ExtPreInit(void);
// timer defs for profiling function chunks the simple way
#define EDUKE32_TMRDEF int32_t t[20], ti=0; const char *tmrstr=__func__; fprintf(stderr,"%s\n",tmrstr); t[ti++]=getticks();
#define EDUKE32_TMRTIC t[ti++]=getticks()

View file

@ -158,6 +158,7 @@ extern void SetFirstWall(int32_t sectnum, int32_t wallnum, int32_t alsoynw);
extern int32_t fixspritesectors(void);
extern void clearkeys(void);
extern const char *ExtGetVer(void);
extern int32_t ExtInit(void);
extern int32_t ExtPreInit(int32_t argc,const char **argv);
extern void ExtUnInit(void);

View file

@ -0,0 +1,29 @@
// mmulti.h
#ifndef __mmulti_h__
#define __mmulti_h__
#define MAXMULTIPLAYERS 16
extern int myconnectindex, numplayers;
extern int connecthead, connectpoint2[MAXMULTIPLAYERS];
extern unsigned char syncstate;
int initmultiplayersparms(int argc, char const * const argv[]);
int initmultiplayerscycle(void);
void initmultiplayers(int argc, char const * const argv[], unsigned char damultioption, unsigned char dacomrateoption, unsigned char dapriority);
void setpackettimeout(int datimeoutcount, int daresendagaincount);
void uninitmultiplayers(void);
void sendlogon(void);
void sendlogoff(void);
int getoutputcirclesize(void);
void setsocket(int newsocket);
void sendpacket(int other, unsigned char *bufptr, int messleng);
int getpacket(int *other, unsigned char *bufptr);
void flushpackets(void);
void genericmultifunction(int other, unsigned char *bufptr, int messleng, int command);
int isvalidipaddress(const char *st);
#endif // __mmulti_h__

View file

@ -254,6 +254,9 @@ void OSD_Draw(void);
// just like printf
void OSD_Printf(const char *fmt, ...) ATTRIBUTE((format(printf,1,2)));
// just like puts
void OSD_Puts(const char *str);
// executes buffered commands
void OSD_DispatchQueued(void);

View file

@ -29,7 +29,28 @@
static int32_t crctable[256];
static char kensig[64];
extern const char *ExtGetVer(void);
static const char *CallExtGetVer(void);
static int32_t CallExtInit(void);
static int32_t CallExtPreInit(int32_t argc,const char **argv);
static void CallExtUnInit(void);
static void CallExtPreCheckKeys(void);
static void CallExtAnalyzeSprites(int32_t, int32_t, int32_t, int32_t);
static void CallExtCheckKeys(void);
static void CallExtPreLoadMap(void);
static void CallExtSetupMapFilename(const char *mapname);
static void CallExtLoadMap(const char *mapname);
static int32_t CallExtPreSaveMap(void);
static void CallExtSaveMap(const char *mapname);
static const char *CallExtGetSectorCaption(int16_t sectnum);
static const char *CallExtGetWallCaption(int16_t wallnum);
static const char *CallExtGetSpriteCaption(int16_t spritenum);
static void CallExtShowSectorData(int16_t sectnum);
static void CallExtShowWallData(int16_t wallnum);
static void CallExtShowSpriteData(int16_t spritenum);
static void CallExtEditSectorData(int16_t sectnum);
static void CallExtEditWallData(int16_t wallnum);
static void CallExtEditSpriteData(int16_t spritenum);
// static const char *CallExtGetSectorType(int32_t lotag);
int8_t m32_clipping=2;
static int32_t m32_rotateang = 0;
@ -472,9 +493,9 @@ void M32_DrawRoomsAndMasks(void)
yax_preparedrawrooms();
drawrooms(pos.x,pos.y,pos.z,ang,horiz,cursectnum);
yax_drawrooms(ExtAnalyzeSprites, cursectnum, 0, 0);
yax_drawrooms(CallExtAnalyzeSprites, cursectnum, 0, 0);
ExtAnalyzeSprites(0,0,0,0);
CallExtAnalyzeSprites(0,0,0,0);
drawmasks();
M32_ResetFakeRORTiles();
@ -483,7 +504,7 @@ void M32_DrawRoomsAndMasks(void)
{
polymer_editorpick();
drawrooms(pos.x,pos.y,pos.z,ang,horiz,cursectnum);
ExtAnalyzeSprites(0,0,0,0);
CallExtAnalyzeSprites(0,0,0,0);
drawmasks();
M32_ResetFakeRORTiles();
}
@ -521,7 +542,7 @@ int32_t app_main(int32_t argc, const char **argv)
editstatus = 1;
newaspect_enable = 1;
if ((i = ExtPreInit(argc,argv)) < 0) return -1;
if ((i = CallExtPreInit(argc,argv)) < 0) return -1;
#ifdef _WIN32
backgroundidle = 1;
@ -564,7 +585,7 @@ int32_t app_main(int32_t argc, const char **argv)
Bstrcat(boardfilename, ".map");
//Bcanonicalisefilename(boardfilename,0);
if ((i = ExtInit()) < 0) return -1;
if ((i = CallExtInit()) < 0) return -1;
#ifdef STARTUP_SETUP_WINDOW
if (i || forcesetup || cmdsetup)
{
@ -677,7 +698,7 @@ int32_t app_main(int32_t argc, const char **argv)
setbrightness(0,0,0);
if (setgamemode(fullscreen, xdim2d, ydim2d, 8) < 0)
{
ExtUnInit();
CallExtUnInit();
uninitengine();
Bprintf("%d * %d not supported in this graphics mode\n",xdim2d,ydim2d);
Bexit(0);
@ -703,7 +724,7 @@ int32_t app_main(int32_t argc, const char **argv)
{
if (setgamemode(fullscreen, xdimgame, ydimgame, bppgame) < 0)
{
ExtUnInit();
CallExtUnInit();
uninitengine();
Bprintf("%d * %d not supported in this graphics mode\n",xdim,ydim);
Bexit(0);
@ -736,7 +757,7 @@ CANCEL:
synctics = totalclock-lockclock;
lockclock += synctics;
ExtPreCheckKeys();
CallExtPreCheckKeys();
M32_DrawRoomsAndMasks();
@ -752,7 +773,7 @@ CANCEL:
M32_drawdebug();
#endif
ExtCheckKeys();
CallExtCheckKeys();
if (keystatus[1])
@ -823,7 +844,7 @@ CANCEL:
}
ExtUnInit();
CallExtUnInit();
// clearfilenames();
uninitengine();
@ -1295,12 +1316,12 @@ void editinput(void)
{
case SEARCH_CEILING:
case SEARCH_FLOOR:
ExtShowSectorData(searchsector); break;
CallExtShowSectorData(searchsector); break;
case SEARCH_WALL:
case SEARCH_MASKWALL:
ExtShowWallData(searchwall); break;
CallExtShowWallData(searchwall); break;
case SEARCH_SPRITE:
ExtShowSpriteData(searchwall); break;
CallExtShowSpriteData(searchwall); break;
}
keystatus[0x3f] = keystatus[0x40] = 0;
@ -1311,12 +1332,12 @@ void editinput(void)
{
case SEARCH_CEILING:
case SEARCH_FLOOR:
ExtEditSectorData(searchsector); break;
CallExtEditSectorData(searchsector); break;
case SEARCH_WALL:
case SEARCH_MASKWALL:
ExtEditWallData(searchwall); break;
CallExtEditWallData(searchwall); break;
case SEARCH_SPRITE:
ExtEditSpriteData(searchwall); break;
CallExtEditSpriteData(searchwall); break;
}
keystatus[0x41] = keystatus[0x42] = 0;
@ -3285,7 +3306,7 @@ void overheadeditor(void)
draw2dgrid(pos.x,pos.y,pos.z,cursectnum,ang,zoom,grid);
ExtPreCheckKeys();
CallExtPreCheckKeys();
{
int32_t cx, cy;
@ -3342,7 +3363,7 @@ void overheadeditor(void)
YAX_SKIPSECTOR(i);
dabuffer = ExtGetSectorCaption(i);
dabuffer = CallExtGetSectorCaption(i);
if (dabuffer[0] == 0)
continue;
@ -3383,7 +3404,7 @@ void overheadeditor(void)
//Get average point of wall
// if ((dax > x3) && (dax < x4) && (day > y3) && (day < y4))
{
dabuffer = ExtGetWallCaption(i);
dabuffer = CallExtGetWallCaption(i);
if (dabuffer[0] == 0)
continue;
@ -3414,7 +3435,7 @@ void overheadeditor(void)
if ((!m32_sideview || !alwaysshowgray) && sprite[i].sectnum >= 0)
YAX_SKIPSECTOR(sprite[i].sectnum);
dabuffer = ExtGetSpriteCaption(i);
dabuffer = CallExtGetSpriteCaption(i);
if (dabuffer[0] != 0)
{
int32_t blocking = (sprite[i].cstat&1);
@ -3701,7 +3722,7 @@ void overheadeditor(void)
inputchecked = 1;
VM_OnEvent(EVENT_PREKEYS2D, -1);
ExtCheckKeys(); // TX 20050101, it makes more sense to have this here so keys can be overwritten with new functions in bstub.c
CallExtCheckKeys(); // TX 20050101, it makes more sense to have this here so keys can be overwritten with new functions in bstub.c
// Flip/mirror sector Ed Coolidge
if (keystatus[0x2d] || keystatus[0x15]) // X or Y (2D)
@ -3862,7 +3883,7 @@ void overheadeditor(void)
keystatus[88] = 0;
//__clearscreen_beforecapture__
Bsprintf(tempbuf, "Mapster32 %s", ExtGetVer());
Bsprintf(tempbuf, "Mapster32 %s", CallExtGetVer());
screencapture("captxxxx.tga", eitherSHIFT, tempbuf);
showframe(1);
@ -4011,16 +4032,16 @@ rotate_hlsect_out:
#if 1
if (keystatus[0x3f]) //F5
{
ExtShowSectorData(0);
CallExtShowSectorData(0);
}
if (keystatus[0x40]) //F6
{
if (pointhighlight >= 16384)
ExtShowSpriteData(pointhighlight-16384);
CallExtShowSpriteData(pointhighlight-16384);
else if (linehighlight >= 0)
ExtShowWallData(linehighlight);
CallExtShowWallData(linehighlight);
else
ExtShowWallData(0);
CallExtShowWallData(0);
}
if (keystatus[0x41]) //F7
{
@ -4031,7 +4052,7 @@ rotate_hlsect_out:
{
YAX_SKIPSECTOR(i);
ExtEditSectorData(i);
CallExtEditSectorData(i);
break;
}
}
@ -4040,9 +4061,9 @@ rotate_hlsect_out:
keystatus[0x42] = 0;
if (pointhighlight >= 16384)
ExtEditSpriteData(pointhighlight-16384);
CallExtEditSpriteData(pointhighlight-16384);
else if (linehighlight >= 0)
ExtEditWallData(linehighlight);
CallExtEditWallData(linehighlight);
}
#endif
@ -5543,11 +5564,11 @@ end_point_dragging:
if (cursectornum < numsectors)
{
if (pointhighlight >= 16384)
ExtEditSpriteData(pointhighlight-16384);
CallExtEditSpriteData(pointhighlight-16384);
else if ((linehighlight >= 0) && ((bstatus&1) || sectorofwall(linehighlight) == cursectornum))
ExtEditWallData(linehighlight);
CallExtEditWallData(linehighlight);
else if (cursectornum >= 0)
ExtEditSectorData(cursectornum);
CallExtEditSectorData(cursectornum);
}
bstatus &= ~6;
@ -7678,7 +7699,7 @@ CANCEL:
reset_default_mapstate();
Bstrcpy(boardfilename,"newboard.map");
ExtLoadMap(boardfilename);
CallExtLoadMap(boardfilename);
#if M32_UNDO
map_undoredo_free();
#endif
@ -7820,7 +7841,7 @@ CANCEL:
SaveBoardAndPrintMessage(selectedboardfilename);
Bstrcpy(boardfilename, selectedboardfilename);
ExtSetupMapFilename(boardfilename);
CallExtSetupMapFilename(boardfilename);
}
bad = 0;
}
@ -7880,7 +7901,7 @@ CANCEL:
goto CANCEL;
}
ExtUnInit();
CallExtUnInit();
// clearfilenames();
uninitengine();
@ -7916,7 +7937,7 @@ CANCEL:
if (setgamemode(fullscreen,xdimgame,ydimgame,bppgame) < 0)
{
initprintf("%d * %d not supported in this graphics mode\n",xdim,ydim);
ExtUnInit();
CallExtUnInit();
// clearfilenames();
uninitengine();
Bexit(1);
@ -8087,12 +8108,12 @@ const char *SaveBoard(const char *fn, uint32_t flags)
#endif
saveboard_savedtags = 0;
saveboard_fixedsprites = ExtPreSaveMap();
saveboard_fixedsprites = CallExtPreSaveMap();
ret = saveboard(f, &startpos, startang, startsectnum);
if ((flags&M32_SB_NOEXT)==0)
{
ExtSaveMap(f);
CallExtSaveMap(f);
saveboard_savedtags = !taglab_save(f);
}
@ -8115,7 +8136,7 @@ int32_t LoadBoard(const char *filename, uint32_t flags)
editorzrange[0] = INT32_MIN;
editorzrange[1] = INT32_MAX;
ExtPreLoadMap();
CallExtPreLoadMap();
i = loadboard(filename, (flags&4)|loadingflags, &pos, &ang, &cursectnum);
if (i == -2)
i = loadoldboard(filename,loadingflags, &pos, &ang, &cursectnum);
@ -8140,7 +8161,7 @@ int32_t LoadBoard(const char *filename, uint32_t flags)
loadmhk(0);
tagstat = taglab_load(boardfilename, loadingflags);
ExtLoadMap(boardfilename);
CallExtLoadMap(boardfilename);
{
char msgtail[64];
@ -8773,7 +8794,7 @@ static void clearministatbar16(void)
if (xdim >= 800)
{
Bsprintf(tempbuf, "Mapster32 %s", ExtGetVer());
Bsprintf(tempbuf, "Mapster32 %s", CallExtGetVer());
printext16(xdim2d-(Bstrlen(tempbuf)<<3)-3, ydim2d-STATUS2DSIZ2+10, editorcolors[4],-1, tempbuf, 0);
printext16(xdim2d-(Bstrlen(tempbuf)<<3)-2, ydim2d-STATUS2DSIZ2+9, editorcolors[12],-1, tempbuf, 0);
}
@ -9045,7 +9066,7 @@ int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, cha
inputchecked = 1;
if ((flags&8)==0)
ExtCheckKeys();
CallExtCheckKeys();
getnumber_clearline();
@ -10117,7 +10138,7 @@ void showsectordata(int16_t sectnum, int16_t small)
if (small)
{
_printmessage16("^10Sector %d %s ^O(F7 to edit)", sectnum, ExtGetSectorCaption(sectnum));
_printmessage16("^10Sector %d %s ^O(F7 to edit)", sectnum, CallExtGetSectorCaption(sectnum));
return;
}
@ -10187,7 +10208,7 @@ void showwalldata(int16_t wallnum, int16_t small)
if (small)
{
_printmessage16("^10Wall %d %s ^O(F8 to edit)", wallnum,
ExtGetWallCaption(wallnum));
CallExtGetWallCaption(wallnum));
return;
}
@ -10236,7 +10257,7 @@ void showspritedata(int16_t spritenum, int16_t small)
if (small)
{
_printmessage16("^10Sprite %d %s ^O(F8 to edit)",spritenum, ExtGetSpriteCaption(spritenum));
_printmessage16("^10Sprite %d %s ^O(F8 to edit)",spritenum, CallExtGetSpriteCaption(spritenum));
return;
}
@ -10688,7 +10709,7 @@ void test_map(int32_t mode)
}
Bstrcat(fullparam, param);
ExtPreSaveMap();
CallExtPreSaveMap();
if (mode)
saveboard(PLAYTEST_MAPNAME, &startpos, startang, startsectnum);
else
@ -10731,3 +10752,100 @@ void test_map(int32_t mode)
else
printmessage16("Position must be in valid player space to test map!");
}
// These will be more useful in the future...
static const char *CallExtGetVer(void)
{
return ExtGetVer();
}
static int32_t CallExtInit(void)
{
return ExtInit();
}
static int32_t CallExtPreInit(int32_t argc,const char **argv)
{
return ExtPreInit(argc, argv);
}
static void CallExtUnInit(void)
{
ExtUnInit();
}
static void CallExtPreCheckKeys(void)
{
ExtPreCheckKeys();
}
static void CallExtAnalyzeSprites(int32_t ourx, int32_t oury, int32_t oura, int32_t smoothr)
{
ExtAnalyzeSprites(ourx, oury, oura, smoothr);
VM_OnEvent(EVENT_ANALYZESPRITES, -1);
}
static void CallExtCheckKeys(void)
{
ExtCheckKeys();
}
static void CallExtPreLoadMap(void)
{
VM_OnEvent(EVENT_PRELOADMAP, -1);
ExtPreLoadMap();
}
static void CallExtSetupMapFilename(const char *mapname)
{
ExtSetupMapFilename(mapname);
}
static void CallExtLoadMap(const char *mapname)
{
ExtLoadMap(mapname);
VM_OnEvent(EVENT_LOADMAP, -1);
}
static int32_t CallExtPreSaveMap(void)
{
VM_OnEvent(EVENT_PRESAVEMAP, -1);
return ExtPreSaveMap();
}
static void CallExtSaveMap(const char *mapname)
{
ExtSaveMap(mapname);
VM_OnEvent(EVENT_SAVEMAP, -1);
}
static const char *CallExtGetSectorCaption(int16_t sectnum)
{
return ExtGetSectorCaption(sectnum);
}
static const char *CallExtGetWallCaption(int16_t wallnum)
{
return ExtGetWallCaption(wallnum);
}
static const char *CallExtGetSpriteCaption(int16_t spritenum)
{
return ExtGetSpriteCaption(spritenum);
}
static void CallExtShowSectorData(int16_t sectnum)
{
ExtShowSectorData(sectnum);
}
static void CallExtShowWallData(int16_t wallnum)
{
ExtShowWallData(wallnum);
}
static void CallExtShowSpriteData(int16_t spritenum)
{
ExtShowSpriteData(spritenum);
}
static void CallExtEditSectorData(int16_t sectnum)
{
ExtEditSectorData(sectnum);
}
static void CallExtEditWallData(int16_t wallnum)
{
ExtEditWallData(wallnum);
}
static void CallExtEditSpriteData(int16_t spritenum)
{
ExtEditSpriteData(spritenum);
}
#if 0
static const char *CallExtGetSectorType(int32_t lotag)
{
return ExtGetSectorType(lotag);
}
#endif

View file

@ -136,7 +136,7 @@ int32_t editorgridextent = 131072;
#define MAXYSIZ 256
#define MAXZSIZ 255
#define MAXVOXMIPS 5
static intptr_t voxoff[MAXVOXELS][MAXVOXMIPS];
intptr_t voxoff[MAXVOXELS][MAXVOXMIPS]; // used in KenBuild
static char voxlock[MAXVOXELS][MAXVOXMIPS];
int32_t voxscale[MAXVOXELS];
@ -11736,7 +11736,6 @@ intptr_t allocatepermanenttile(int16_t tilenume, int32_t xsiz, int32_t ysiz)
return waloff[tilenume];
}
#if 0
//
// copytilepiece
//
@ -11776,7 +11775,6 @@ void copytilepiece(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, in
}
}
}
#endif
//
// qloadkvx

View file

@ -0,0 +1,101 @@
// "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
// Ken Silverman's official web site: "http://www.advsys.net/ken"
// See the included license file "BUILDLIC.TXT" for license info.
//
// This file has been modified from Ken Silverman's original release
// by Jonathon Fowler (jf@jonof.id.au)
#include "compat.h"
#include "mmulti.h"
int myconnectindex, numplayers;
int connecthead, connectpoint2[MAXMULTIPLAYERS] = { -1 };
unsigned char syncstate = 0;
int isvalidipaddress (const char *st)
{
UNREFERENCED_PARAMETER(st);
return 0;
}
int initmultiplayersparms(int argc, char const * const argv[])
{
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
return 0;
}
int initmultiplayerscycle(void)
{
return 0;
}
void initmultiplayers(int argc, char const * const argv[], unsigned char damultioption, unsigned char dacomrateoption, unsigned char dapriority)
{
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
UNREFERENCED_PARAMETER(damultioption);
UNREFERENCED_PARAMETER(dacomrateoption);
UNREFERENCED_PARAMETER(dapriority);
numplayers = 1; myconnectindex = 0;
connecthead = 0; connectpoint2[0] = -1;
}
void setpackettimeout(int datimeoutcount, int daresendagaincount)
{
UNREFERENCED_PARAMETER(datimeoutcount);
UNREFERENCED_PARAMETER(daresendagaincount);
}
void uninitmultiplayers(void)
{
}
void sendlogon(void)
{
}
void sendlogoff(void)
{
}
int getoutputcirclesize(void)
{
return 0;
}
void setsocket(int newsocket)
{
UNREFERENCED_PARAMETER(newsocket);
}
void sendpacket(int other, unsigned char *bufptr, int messleng)
{
UNREFERENCED_PARAMETER(other);
UNREFERENCED_PARAMETER(bufptr);
UNREFERENCED_PARAMETER(messleng);
}
int getpacket (int *other, unsigned char *bufptr)
{
UNREFERENCED_PARAMETER(other);
UNREFERENCED_PARAMETER(bufptr);
return 0;
}
void flushpackets(void)
{
}
void genericmultifunction(int other, unsigned char *bufptr, int messleng, int command)
{
UNREFERENCED_PARAMETER(other);
UNREFERENCED_PARAMETER(bufptr);
UNREFERENCED_PARAMETER(messleng);
UNREFERENCED_PARAMETER(command);
}

View file

@ -1531,7 +1531,25 @@ void OSD_Draw(void)
//
// OSD_Printf() -- Print a string to the onscreen display
// OSD_Printf() -- Print a formatted string to the onscreen display
// and write it to the log file
//
void OSD_Printf(const char *fmt, ...)
{
static char tmpstr[8192];
va_list va;
va_start(va, fmt);
Bvsnprintf(tmpstr, sizeof(tmpstr), fmt, va);
va_end(va);
OSD_Puts(tmpstr);
}
//
// OSD_Puts() -- Print a string to the onscreen display
// and write it to the log file
//
@ -1543,19 +1561,16 @@ static inline void OSD_LineFeed(void)
Bmemset(osd->text.fmt, osd->draw.textpal, osd->draw.cols);
if (osd->text.lines < osd->text.maxlines) osd->text.lines++;
}
#define MAX_ERRORS 4096
void OSD_Printf(const char *fmt, ...)
void OSD_Puts(const char *tmpstr)
{
static char tmpstr[8192];
char *chp, p=osd->draw.textpal, s=osd->draw.textshade;
va_list va;
const char *chp;
char p=osd->draw.textpal, s=osd->draw.textshade;
mutex_lock(&osd->mutex);
va_start(va, fmt);
Bvsnprintf(tmpstr, 8192, fmt, va);
va_end(va);
if (tmpstr[0]==0)
{
mutex_unlock(&osd->mutex);
@ -1565,7 +1580,7 @@ void OSD_Printf(const char *fmt, ...)
if (tmpstr[0]=='^' && tmpstr[1]=='1' && tmpstr[2]=='0' && ++osd->log.errors > MAX_ERRORS)
{
if (osd->log.errors == MAX_ERRORS + 1)
Bstrcpy(tmpstr, OSD_ERROR "\nToo many errors. Logging errors stopped.\n");
tmpstr = "\nToo many errors. Logging errors stopped.\n";
else
{
osd->log.errors = MAX_ERRORS + 2;
@ -1578,15 +1593,15 @@ void OSD_Printf(const char *fmt, ...)
{
if (osdlog && (!osd->log.cutoff || osd->log.lines < osd->log.cutoff))
{
chp = Xstrdup(tmpstr);
Bfputs(OSD_StripColors(chp, tmpstr), osdlog);
Bprintf("%s", chp);
Bfree(chp);
char *chp2 = Xstrdup(tmpstr);
Bfputs(OSD_StripColors(chp2, tmpstr), osdlog);
Bprintf("%s", chp2);
Bfree(chp2);
}
}
else if (osd->log.lines == osd->log.cutoff)
{
Bfputs("\nMaximal log size reached. Logging stopped.\nSet the \"osd->log.cutoff\" console variable to a higher value if you need a longer log.\n", osdlog);
Bfputs("\nMaximal log size reached. Logging stopped.\nSet the \"osdlogcutoff\" console variable to a higher value if you need a longer log.\n", osdlog);
osd->log.lines = osd->log.cutoff + 1;
}

View file

@ -562,22 +562,32 @@ void system_getcvars(void)
#endif
//
// initprintf() -- prints a string to the intitialization window
// initprintf() -- prints a formatted string to the intitialization window
//
void initprintf(const char *f, ...)
{
va_list va;
char buf[2048];
static char dabuf[2048];
va_start(va, f);
Bvsnprintf(buf, sizeof(buf), f, va);
va_end(va);
initputs(buf);
}
//
// initputs() -- prints a string to the intitialization window
//
void initputs(const char *buf)
{
static char dabuf[2048];
#ifdef __ANDROID__
__android_log_print(ANDROID_LOG_INFO,"DUKE", "%s",buf);
#endif
OSD_Printf("%s", buf);
OSD_Puts(buf);
// Bprintf("%s", buf);
mutex_lock(&m_initprintf);
@ -603,7 +613,7 @@ void initprintf(const char *f, ...)
}
//
// debugprintf() -- prints a debug string to stderr
// debugprintf() -- prints a formatted debug string to stderr
//
void debugprintf(const char *f, ...)
{

View file

@ -609,20 +609,29 @@ void system_getcvars(void)
#endif
}
//
// initprintf() -- prints a string to the intitialization window
// initprintf() -- prints a formatted string to the intitialization window
//
void initprintf(const char *f, ...)
{
va_list va;
char buf[2048];
static char dabuf[2048];
va_start(va, f);
Bvsnprintf(buf, sizeof(buf), f, va);
va_end(va);
OSD_Printf("%s",buf);
initputs(buf);
}
//
// initputs() -- prints a string to the intitialization window
//
void initputs(const char *buf)
{
OSD_Puts(buf);
mutex_lock(&m_initprintf);
if ((Bstrlen(dabuf) + Bstrlen(buf) + 2) > sizeof(dabuf))
@ -644,7 +653,7 @@ void initprintf(const char *f, ...)
//
// debugprintf() -- sends a debug string to the debugger
// debugprintf() -- sends a formatted debug string to the debugger
//
void debugprintf(const char *f, ...)
{

View file

@ -729,16 +729,12 @@ void ExtLoadMap(const char *mapname)
#if M32_UNDO
map_undoredo_free();
#endif
VM_OnEvent(EVENT_LOADMAP, -1);
}
void ExtSaveMap(const char *mapname)
{
UNREFERENCED_PARAMETER(mapname);
saveboard("backup.map", &pos, ang, cursectnum);
VM_OnEvent(EVENT_SAVEMAP, -1);
}
@ -8456,8 +8452,6 @@ int32_t ExtPreSaveMap(void)
{
int32_t numfixedsprites;
VM_OnEvent(EVENT_PRESAVEMAP, -1);
numfixedsprites = fixspritesectors(); //Do this before saving!
updatesectorz(startpos.x,startpos.y,startpos.z,&startsectnum);
if (startsectnum < 0)
@ -10345,7 +10339,6 @@ static int32_t loadconsounds(const char *fn)
void ExtPreLoadMap(void)
{
VM_OnEvent(EVENT_PRELOADMAP, -1);
}
/// ^^^
@ -11125,8 +11118,6 @@ void ExtAnalyzeSprites(int32_t ourx, int32_t oury, int32_t oura, int32_t smoothr
break;
}
}
VM_OnEvent(EVENT_ANALYZESPRITES, -1);
}
#define MESSAGEX 3 // (xdimgame>>1)

View file

@ -69,8 +69,6 @@ extern void G_SetupGlobalPsky(void);
//////////
extern void G_ExtPreInit(void);
extern void G_AddSearchPaths(void);
extern void G_CleanupSearchPaths(void);

View file

@ -129,10 +129,7 @@ G_EXTERN int32_t g_screenCapture;
G_EXTERN int32_t g_noEnemies;
#ifndef __global_c__
G_EXTERN const char *s_buildRev;
G_EXTERN const char *s_buildDate;
G_EXTERN const char *s_buildTimestamp;
G_EXTERN const char *s_buildInfo;
G_EXTERN int32_t g_spriteGravity;
G_EXTERN int16_t g_spriteDeleteQueueSize;
G_EXTERN char EpisodeNames[MAXVOLUMES][33];

View file

@ -2,8 +2,8 @@
#include <commctrl.h>
#include "startwin.editor.h"
RSRC_ICON ICON "rsrc/build_icon.ico"
RSRC_BMP BITMAP "rsrc/build.bmp"
RSRC_ICON ICON "build_icon.ico"
RSRC_BMP BITMAP "build.bmp"
WIN_STARTWIN DIALOGEX DISCARDABLE 20, 40, 260, 200
STYLE DS_MODALFRAME | DS_CENTER | DS_SETFONT | DS_FIXEDSYS | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
@ -70,7 +70,7 @@ BEGIN
END
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
1 24 "rsrc/64/manifest.build.xml"
1 24 "64/manifest.build.xml"
#else
1 24 "rsrc/32/manifest.build.xml"
1 24 "32/manifest.build.xml"
#endif

View file

@ -2,8 +2,8 @@
#include <commctrl.h>
#include "startwin.game.h"
RSRC_ICON ICON "rsrc/game_icon.ico"
RSRC_BMP BITMAP "rsrc/game.bmp"
RSRC_ICON ICON "game_icon.ico"
RSRC_BMP BITMAP "game.bmp"
WIN_STARTWIN DIALOGEX DISCARDABLE 20, 40, 260, 200
STYLE DS_MODALFRAME | DS_CENTER | DS_SETFONT | DS_FIXEDSYS | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
@ -78,7 +78,7 @@ BEGIN
END
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
1 24 "rsrc/64/manifest.game.xml"
1 24 "64/manifest.game.xml"
#else
1 24 "rsrc/32/manifest.game.xml"
1 24 "32/manifest.game.xml"
#endif

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="EDuke32.KenBuild.Editor"
type="win32"
/>
<description>BUILD by Ken Silverman</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
</assembly>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="EDuke32.KenBuild.Game"
type="win32"
/>
<description>KenBuild</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
</assembly>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="amd64"
name="EDuke32.KenBuild.Editor"
type="win32"
/>
<description>BUILD by Ken Silverman</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="amd64"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
</assembly>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="amd64"
name="EDuke32.KenBuild.Game"
type="win32"
/>
<description>KenBuild</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="amd64"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
</assembly>

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

View file

@ -0,0 +1,38 @@
#include <windows.h>
#include <commctrl.h>
#include "startwin.editor.h"
RSRC_ICON ICON "build_icon.ico"
RSRC_BMP BITMAP "build.bmp"
WIN_STARTWIN DIALOGEX DISCARDABLE 20, 40, 260, 200
STYLE DS_MODALFRAME | DS_CENTER | DS_SETFONT | DS_FIXEDSYS | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
CAPTION "Startup"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", WIN_STARTWIN_BITMAP, "STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 32, 32
CONTROL "", WIN_STARTWIN_TABCTL, WC_TABCONTROL, WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 5, 250, 170
CONTROL "&Start", WIN_STARTWIN_START, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 154, 180, 48, 14
CONTROL "&Cancel", WIN_STARTWIN_CANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 207, 180, 48, 14
CONTROL "", WIN_STARTWIN_MESSAGES, "EDIT", ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VSCROLL, 0, 0, 32, 32
END
WIN_STARTWINPAGE_CONFIG DIALOGEX DISCARDABLE 20, 40, 279, 168
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
CAPTION "Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "&2D Video mode:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 8, 50, 8
CONTROL "", IDC2DVMODE, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 6, 80, 56
CONTROL "&Fullscreen", IDCFULLSCREEN, "BUTTON", BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 148, 8, 49, 10
CONTROL "&3D Video mode:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 24, 50, 8
CONTROL "", IDC3DVMODE, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 22, 80, 56
CONTROL "&Always show configuration on start", IDCALWAYSSHOW, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 118, 116, 140, 8
END
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
1 24 "64/manifest.build.xml"
#else
1 24 "32/manifest.build.xml"
#endif

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

View file

@ -0,0 +1,167 @@
/* GIMP RGBA C-Source image dump (game_icon.c) */
#include "compat.h"
#include "sdlappicon.h"
static uint8_t sdlappicon_pixels[] = {
"z_A\377\\J6\377\\J6\377\206t`\377\214zf\377\214zf\377\214zf\377\214zf\377"
"\214zf\377\214zf\377\214zf\377\214zf\377\214zf\377\214zf\377\214zf\377\214"
"zf\377\214zf\377\214zf\377\214zf\377\214zf\377\214zf\377\214zf\377\214zf"
"\377\214zf\377\214zf\377\214zf\377\214zf\377\214zf\377\206t`\377\\J6\377"
"\\J6\377z_A\377\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377fM3\377fM3\377t"
"tt\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377ttt\377fM3\377fM3\377\\J6\377\\J6\377fM3\377"
"fM3\377ttt\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377ttt\377fM3\377fM3\377\\J6\377\\J6\377"
"\40\40\40\377\40\40\40\377\\\\\\\377@@@\377\200\200\200\377ddd\377hhh\377"
"hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hh"
"h\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377ddd\377|||\377@@@\377\\\\"
"\\\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40\40\40\377\40\40\40\377"
"lll\377hhh\377\200\200\200\377hhh\377\200\200\200\377\200\200\200\377\200"
"\200\200\377lll\377jjj\377rrr\377lll\377lll\377vvv\377bbb\377lll\377\200"
"\200\200\377lll\377hhh\377ttt\377\200\200\200\377\200\200\200\377\200\200"
"\200\377ppp\377xxx\377hhh\377lll\377\40\40\40\377\40\40\40\377\\J6\377\\"
"J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200\377h"
"hh\377\200\200\200\377\200\200\200\377\200\200\200\377lll\377jjj\377rrr\377"
"jjj\377jjj\377\200\200\200\377lll\377lll\377\200\200\200\377lll\377|||\377"
"lll\377\200\200\200\377\200\200\200\377\200\200\200\377ppp\377xxx\377\200"
"\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40\40\40\377"
"\40\40\40\377ttt\377\200\200\200\377\200\200\200\377hhh\377\200\200\200\377"
"\200\200\200\377\200\200\200\377vvv\377lll\377|||\377ppp\377ppp\377vvv\377"
"lll\377vvv\377lll\377vvv\377lll\377~~~\377\200\200\200\377\200\200\200\377"
"\200\200\200\377ppp\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40"
"\40\377\\J6\377\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377"
"\200\200\200\377ddd\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377"
"hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hh"
"h\377ddd\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6"
"\377\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200"
"\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377ppp\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\"
"J6\377\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200"
"\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377ppp\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\"
"J6\377\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200"
"\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377ppp\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\"
"J6\377\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200"
"\377ddd\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377"
"hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377ddd\377xx"
"x\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40"
"\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200\377hhh\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377ppp\377"
"xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377"
"\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200\377hhh\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"ppp\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377\\"
"J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200\377h"
"hh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377ppp\377xxx\377\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377"
"\\J6\377\40\40\40\377\40\40\40\377ttt\377\200\200\200\377\200\200\200\377"
"lll\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hh"
"h\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377xxx\377"
"\200\200\200\377ttt\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40\40\40"
"\377\40\40\40\377ttt\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377ttt\377\40\40\40\377\40\40"
"\40\377\\J6\377\\J6\377\40\40\40\377\40\40\40\377fff\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377fff\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40\40\40\377\40"
"\40\40\377<<<\377fff\377ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377"
"ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377ttt\377tt"
"t\377ttt\377ttt\377ttt\377ttt\377fff\377<<<\377\40\40\40\377\40\40\40\377"
"\\J6\377\\J6\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\\J6\377\\J6\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377$$0\377>>>\377HHH\377DDD\377DDD\377"
"FFF\377LLL\377HHH\377HHH\377JJJ\377LLL\377LLL\377LLL\377LLL\377JJJ\377@@"
"@\377444\377444\377444\377444\377,,,\377\40\40\40\377\40\40\40\377\\J6\377"
"\\J6\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377<<<\377rrr\377ppp\377VVV\377PPP\377RRR\377jjj\377"
"xxx\377vvv\377ttt\377zzz\377|||\377xxx\377xxx\377zzz\377rrr\377PPP\377HH"
"H\377HHH\377HHH\377FFF\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377DDD\377lll\377lll\377000\377\40\40\40\377\40\40\40\377TTT\377"
"xxx\377ttt\377ttt\377xxx\377|||\377\200\200\200\377\200\200\200\377zzz\377"
"ttt\377PPP\377HHH\377HHH\377HHH\377HHH\377\40\40\40\377\40\40\40\377\\J6"
"\377\\J6\377(((\377```\377hhh\377ttt\377NNN\377VVV\377\40\40\40\377DDD\377"
"hhh\377lll\377000\377\40\40\40\377\40\40\40\377TTT\377vvv\377vvv\377vvv\377"
"|||\377xxx\377|||\377|||\377~~~\377vvv\377PPP\377HHH\377HHH\377HHH\377HH"
"H\377\40\40\40\377\40\40\40\377\\J6\377\\J6\377```\377\250\250\250\377~~"
"~\377\250\250\250\377lll\377|||\377\40\40\40\377DDD\377jjj\377lll\377000"
"\377\40\40\40\377\40\40\40\377TTT\377ttt\377xxx\377xxx\377~~~\377|||\377"
"xxx\377xxx\377\202\202\202\377|||\377PPP\377HHH\377HHH\377HHH\377HHH\377"
"\40\40\40\377\40\40\40\377\\J6\377\\J6\377|||\377\200\200\200\377@@@\377"
"\250\250\250\377\240\240\240\377|||\377\40\40\40\377FFF\377vvv\377rrr\377"
"000\377\40\40\40\377\40\40\40\377TTT\377vvv\377zzz\377xxx\377~~~\377|||\377"
"xxx\377|||\377\214\214\214\377~~~\377PPP\377HHH\377HHH\377HHH\377HHH\377"
"\"\"\"\377:0%\377\\J6\377\\J6\377```\377\250\250\250\377~~~\377\250\250\250"
"\377lll\377|||\377\40\40\40\377HHH\377xxx\377rrr\377000\377\40\40\40\377"
"\40\40\40\377XXX\377\200\200\200\377\200\200\200\377\200\200\200\377\210"
"\210\210\377\206\206\206\377~~~\377zzz\377\204\204\204\377ttt\377PPP\377"
"HHH\377HHH\377HHH\377HHH\3770+%\377T@*\377hQ8\377tX:\3770,(\377```\377hh"
"h\377ttt\377NNN\377VVV\377\40\40\40\377HHH\377xxx\377ppp\377000\377\40\40"
"\40\377\40\40\40\377XXX\377|||\377zzz\377xxx\377\202\202\202\377\200\200"
"\200\377\200\200\200\377|||\377\202\202\202\377ttt\377PPP\377HHH\377HHH\377"
"HHH\377HHH\377$$$\377L9&\377\\J6\377\230tL\377fM3\377($\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377($\40\377`VL\377ttt\377ppp\377XXX"
"\377XXX\377\\\\\\\377ttt\377|||\377ppp\377xxx\377|||\377xxx\377|||\377\206"
"\206\206\377\202\202\202\377xxx\377PPP\377HHH\377HHH\377HHH\377FFF\377\40"
"\40\40\377\40\40\40\377\\J6\377\230tL\377\230tL\377tX:\377\\J6\377\\J6\377"
"\\J6\377\\J6\377tX:\377\216sU\377\200nZ\377\204r^\377\204r^\377\212xd\377"
"\216|h\377\222\200l\377\214zf\377\210vb\377\210vb\377\210vb\377\210vb\377"
"\212xd\377\220~j\377\214zf\377\210vb\377tbN\377p^J\377p^J\377p^J\377jXD\377"
"\\J6\377\\J6\377z_A\377",
};
struct sdlappicon sdlappicon = {
32, 32,
sdlappicon_pixels
};

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,687 @@
/* GIMP RGBA C-Source image dump (game_icon.c) */
#include "compat.h"
#include "sdlappicon.h"
static uint8_t sdlappicon_pixels[] = {
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230t"
"L\0\40\40\40\377@0\40\377`H0\377`H0\377@0\40\377hhh\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377@0\40"
"\377`H0\377`H0\377@0\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377`H0"
"\377\230tL\0\230tL\0`H0\377hhh\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377hhh\377`H0\377\230tL\0\230tL\0`H"
"0\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377`H0\377\230tL\0\230tL\0`H"
"0\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377hhh\377`H0\377\230tL\0\230tL\0`H0\377\40\40\40\377\230"
"tL\0\230tL\0\40\40\40\377@0\40\377`H0\377`H0\377@0\40\377hhh\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"hhh\377@0\40\377`H0\377`H0\377@0\40\377\40\40\40\377\230tL\0\230tL\0\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377```\377"
"@@@\377```\377\200\200\200\377\200\200\200\377```\377```\377```\377```\377"
"```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377"
"```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377\200\200\200\377\200\200\200\377```\377"
"@@@\377```\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377hhh\377@@@\377\40\40\40\377@@@\377\200\200\200\377\200"
"\200\200\377```\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377"
"ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377pp"
"p\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377"
"ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377```\377pp"
"p\377\200\200\200\377@@@\377\40\40\40\377@@@\377hhh\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377```\377@@@\377"
"```\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377XXX\377XXX\377XXX\377ppp\377\200\200\200\377XXX\377\200"
"\200\200\377\200\200\200\377XXX\377\200\200\200\377XXX\377XXX\377XXX\377"
"\200\200\200\377XXX\377\200\200\200\377\200\200\200\377\200\200\200\377X"
"XX\377XXX\377XXX\377xxx\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377```\377ppp\377\200\200\200\377```\377@@@\377```\377hhh\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230t"
"L\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377XXX\377\200\200"
"\200\377xxx\377XXX\377\200\200\200\377XXX\377\200\200\200\377\200\200\200"
"\377XXX\377\200\200\200\377\200\200\200\377XXX\377\200\200\200\377\200\200"
"\200\377XXX\377\200\200\200\377\200\200\200\377\200\200\200\377XXX\377\200"
"\200\200\377ppp\377XXX\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377XXX\377XXX\377XXX\377ppp\377\200\200\200\377XXX\377\200\200\200"
"\377\200\200\200\377XXX\377\200\200\200\377\200\200\200\377XXX\377\200\200"
"\200\377\200\200\200\377XXX\377\200\200\200\377\200\200\200\377\200\200\200"
"\377XXX\377\200\200\200\377\200\200\200\377XXX\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377XXX\377\200\200\200\377xxx\377XXX\377"
"\200\200\200\377XXX\377xxx\377xxx\377XXX\377\200\200\200\377\200\200\200"
"\377XXX\377\200\200\200\377\200\200\200\377XXX\377\200\200\200\377\200\200"
"\200\377\200\200\200\377XXX\377\200\200\200\377ppp\377XXX\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377p"
"pp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377XXX\377XXX\377XXX\377ppp\377"
"\200\200\200\377hhh\377XXX\377XXX\377hhh\377\200\200\200\377XXX\377XXX\377"
"XXX\377\200\200\200\377XXX\377XXX\377XXX\377\200\200\200\377XXX\377XXX\377"
"XXX\377xxx\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377"
"ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377h"
"hh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230"
"tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377`"
"``\377```\377```\377```\377```\377```\377```\377```\377```\377```\377```"
"\377```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377"
"```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377```\377```\377```\377ppp\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"```\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377pp"
"p\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377"
"ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377pp"
"p\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377```\377ppp\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230t"
"L\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377"
"ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377h"
"hh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230"
"tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377p"
"pp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377"
"```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377"
"```\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377```\377ppp\377ppp\377ppp\377ppp\377ppp\377"
"ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377pp"
"p\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377"
"ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377pp"
"p\377ppp\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230"
"tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377p"
"pp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377ppp\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230t"
"L\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377```\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377```\377ppp\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377```\377```\377"
"```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377"
"```\377```\377```\377```\377```\377```\377```\377```\377```\377```\377``"
"`\377```\377```\377```\377```\377```\377```\377ppp\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377p"
"pp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp"
"\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377"
"ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377ppp\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377hhh\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230t"
"L\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200"
"\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377hhh\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377hhh\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377```\377xxx\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377xxx\377```\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377PPP\377ppp\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377ppp\377PPP\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377888\377```\377ppp\377xxx\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377\200\200\200\377\200\200\200\377xxx\377ppp\377```\377888\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0"
"\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377888\377PPP\377```\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh"
"\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377"
"hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hh"
"h\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377"
"hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377hhh\377```\377PPP\377888\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0"
"\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\37700`"
"\377PPP\377hhh\377ppp\377ppp\377hhh\377hhh\377hhh\377hhh\377hhh\377ppp\377"
"xxx\377xxx\377ppp\377ppp\377ppp\377ppp\377ppp\377xxx\377xxx\377xxx\377xx"
"x\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377ppp\377hhh\377XXX\377HHH\377"
"HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377@@@\377000\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377PPP\377hhh"
"\377xxx\377xxx\377ppp\377hhh\377```\377```\377```\377```\377hhh\377ppp\377"
"xxx\377xxx\377xxx\377xxx\377xxx\377ppp\377xxx\377xxx\377xxx\377xxx\377xx"
"x\377xxx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377xxx\377hhh\377XX"
"X\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377@@@\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230t"
"L\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377```\377"
"ppp\377xxx\377ppp\377hhh\377PPP\377@@@\377@@@\377@@@\377@@@\377@@@\377PP"
"P\377ppp\377xxx\377xxx\377xxx\377ppp\377ppp\377xxx\377xxx\377\200\200\200"
"\377\200\200\200\377\200\200\200\377xxx\377xxx\377xxx\377xxx\377xxx\377x"
"xx\377xxx\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH"
"\377HHH\377HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377hhh\377ppp\377ppp\377ppp\377hhh\377@@@\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377@@@\377hhh\377xxx\377xxx\377"
"xxx\377ppp\377ppp\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377xxx\377x"
"xx\377xxx\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH"
"\377HHH\377HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377hhh\377hhh\377hhh\377ppp\377hhh\377@@@\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377@@@\377hhh\377xxx\377xxx\377"
"xxx\377ppp\377ppp\377xxx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377xxx\377x"
"xx\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH"
"\377HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377\40\40\40\377@@@\377@@@\377"
"@@@\377@@@\377@@@\377@@@\377\40\40\40\377@@@\377@@@\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377hhh\377hhh\377hhh\377ppp\377hhh\377@@@\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377@@@\377"
"hhh\377xxx\377xxx\377xxx\377ppp\377ppp\377xxx\377xxx\377xxx\377xxx\377xx"
"x\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200"
"\200\200\377xxx\377xxx\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377"
"HHH\377HHH\377HHH\377HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377\40\40\40\377@@@\377hhh"
"\377\230\230\230\377\230\230\230\377\210\210\210\377\270\270\270\377\230"
"\230\230\377@@@\377\230\230\230\377\270\270\270\377@@@\377\40\40\40\377\40"
"\40\40\377\40\40\40\377hhh\377hhh\377hhh\377ppp\377hhh\377@@@\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377@@@\377hhh\377pp"
"p\377xxx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377"
"xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377"
"\200\200\200\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377"
"HHH\377HHH\377HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\230tL\0\230tL\0\40\40\40\377@@@\377hhh\377\230\230\230\377"
"\270\270\270\377\270\270\270\377\230\230\230\377\270\270\270\377\230\230"
"\230\377@@@\377\230\230\230\377\270\270\270\377@@@\377\40\40\40\377\40\40"
"\40\377\40\40\40\377hhh\377hhh\377hhh\377ppp\377hhh\377@@@\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377@@@\377hhh\377ppp\377"
"xxx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377\200\200"
"\200\377xxx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377"
"\200\200\200\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377"
"HHH\377HHH\377HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\230tL\0\230tL\0\40\40\40\377@@@\377\230\230\230\377\270\270"
"\270\377\230\230\230\377hhh\377@@@\377\270\270\270\377\230\230\230\377@@"
"@\377\230\230\230\377\270\270\270\377@@@\377\40\40\40\377\40\40\40\377\40"
"\40\40\377hhh\377hhh\377ppp\377ppp\377hhh\377@@@\377\40\40\40\377\40\40\40"
"\377\40\40\40\377\40\40\40\377\40\40\40\377@@@\377hhh\377ppp\377xxx\377x"
"xx\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377xxx\377"
"xxx\377xxx\377xxx\377xxx\377\200\200\200\377\210\210\210\377\210\210\210"
"\377xxx\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377"
"HHH\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\230tL\0\230tL\0\40\40\40\377@@@\377\270\270\270\377\230\230\230\377hhh\377"
"@@@\377@@@\377\270\270\270\377\230\230\230\377\250\250\250\377\230\230\230"
"\377\270\270\270\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377hhh\377"
"ppp\377xxx\377xxx\377hhh\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377@@@\377hhh\377ppp\377xxx\377xxx\377xxx\377xxx\377"
"xxx\377xxx\377\200\200\200\377\200\200\200\377xxx\377xxx\377xxx\377xxx\377"
"\200\200\200\377\210\210\210\377\220\220\220\377\210\210\210\377xxx\377X"
"XX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230"
"tL\0\40\40\40\377@@@\377\270\270\270\377\230\230\230\377hhh\377@@@\377@@"
"@\377\270\270\270\377\230\230\230\377\250\250\250\377\230\230\230\377\270"
"\270\270\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377ppp\377xxx\377"
"xxx\377xxx\377ppp\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377@@@\377hhh\377xxx\377xxx\377xxx\377\200\200\200\377x"
"xx\377xxx\377\200\200\200\377\200\200\200\377\200\200\200\377xxx\377xxx\377"
"xxx\377xxx\377\200\200\200\377\210\210\210\377\220\220\220\377\210\210\210"
"\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377"
"HHH\377\40\40\40\377(((\377XD,\377P<(\377\40\40\40\377\230tL\0\230tL\0\40"
"\40\40\377@@@\377\230\230\230\377\270\270\270\377\230\230\230\377hhh\377"
"@@@\377\270\270\270\377\230\230\230\377@@@\377\230\230\230\377\270\270\270"
"\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377ppp\377xxx\377xxx\377x"
"xx\377ppp\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377@@@\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377"
"\200\200\200\377\200\200\200\377\200\200\200\377\210\210\210\377\210\210"
"\210\377\210\210\210\377\200\200\200\377\200\200\200\377xxx\377xxx\377\200"
"\200\200\377\210\210\210\377\210\210\210\377\200\200\200\377ppp\377XXX\377"
"HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377\40\40\40"
"\377(((\377XD,\377P<(\377\40\40\40\377\230tL\0\230tL\0\40\40\40\377@@@\377"
"hhh\377\230\230\230\377\270\270\270\377\270\270\270\377\230\230\230\377\270"
"\270\270\377\230\230\230\377@@@\377\230\230\230\377\270\270\270\377@@@\377"
"\40\40\40\377\40\40\40\377\40\40\40\377ppp\377xxx\377xxx\377xxx\377hhh\377"
"@@@\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"@@@\377ppp\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\210\210\210\377\210\210\210\377\210"
"\210\210\377\210\210\210\377\200\200\200\377\200\200\200\377xxx\377xxx\377"
"\200\200\200\377\200\200\200\377xxx\377hhh\377XXX\377HHH\377HHH\377HHH\377"
"HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377\40\40\40\377XD,\377XD,\377P<("
"\377P<(\377\230tL\0\230tL\0@0\40\377\40\40\40\377@@@\377hhh\377\230\230\230"
"\377\230\230\230\377\210\210\210\377\270\270\270\377\230\230\230\377@@@\377"
"\230\230\230\377\270\270\270\377@@@\377\40\40\40\377\40\40\40\377\40\40\40"
"\377ppp\377xxx\377xxx\377xxx\377hhh\377@@@\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377@@@\377ppp\377\200\200\200\377\200"
"\200\200\377\200\200\200\377xxx\377xxx\377xxx\377\200\200\200\377\210\210"
"\210\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377"
"xxx\377xxx\377\200\200\200\377\200\200\200\377xxx\377hhh\377XXX\377HHH\377"
"HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377\40\40\40\377000"
"\377XD,\377P<(\377\40\40\40\377\230tL\0\230tL\0`H0\377@0\40\377\40\40\40"
"\377@@@\377@@@\377@@@\377@@@\377@@@\377@@@\377\40\40\40\377@@@\377@@@\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377ppp\377xxx\377xxx\377"
"xxx\377hhh\377@@@\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377@@@\377ppp\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377\200"
"\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200"
"\377\200\200\200\377\200\200\200\377\200\200\200\377\210\210\210\377\200"
"\200\200\377\200\200\200\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HH"
"H\377HHH\377HHH\377HHH\377HHH\377\40\40\40\377\40\40\40\377H4$\377@0\40\377"
"\40\40\40\377\230tL\0\230tL\0\230tL\0`H0\377@0\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377@0\40\377"
"ppp\377xxx\377xxx\377xxx\377hhh\377PPP\377@@@\377@@@\377@@@\377@@@\377@@"
"@\377PPP\377xxx\377\200\200\200\377xxx\377ppp\377ppp\377xxx\377xxx\377\200"
"\200\200\377xxx\377xxx\377xxx\377xxx\377\200\200\200\377\200\200\200\377"
"\210\210\210\377\210\210\210\377\200\200\200\377\200\200\200\377ppp\377X"
"XX\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377HHH\377\40"
"\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\230tL\0\230"
"tL\0\230tL\0\230tL\0`H0\377@0\40\377\40\40\40\377\40\40\40\377\40\40\40\377"
"\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40"
"\377\40\40\40\377@0\40\377`H0\377ppp\377ppp\377ppp\377ppp\377ppp\377hhh\377"
"hhh\377ppp\377ppp\377xxx\377xxx\377\200\200\200\377\210\210\210\377\200\200"
"\200\377xxx\377ppp\377ppp\377xxx\377xxx\377\200\200\200\377xxx\377xxx\377"
"xxx\377xxx\377\200\200\200\377\210\210\210\377\210\210\210\377\200\200\200"
"\377\200\200\200\377\200\200\200\377ppp\377XXX\377HHH\377HHH\377HHH\377H"
"HH\377HHH\377HHH\377HHH\377HHH\377@@@\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0"
"`H0\377@0\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\40\40\40\377\40\40\40\377@0\40\377`H0\377\230tL\0pp"
"p\377hhh\377hhh\377ppp\377ppp\377ppp\377ppp\377xxx\377\200\200\200\377\200"
"\200\200\377\210\210\210\377\210\210\210\377\220\220\220\377\210\210\210"
"\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377xxx\377"
"\200\200\200\377\210\210\210\377\210\210\210\377\200\200\200\377\200\200"
"\200\377\200\200\200\377ppp\377XXX\377HHH\377HHH\377HHH\377HHH\377HHH\377"
"HHH\377HHH\377HHH\377000\377\40\40\40\377\40\40\40\377\40\40\40\377\40\40"
"\40\377\40\40\40\377\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230tL\0\230"
"tL\0\230tL\0\230tL\0\230tL\0\230tL\0",
};
struct sdlappicon sdlappicon = {
64, 64,
sdlappicon_pixels
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,36 @@
#include <windows.h>
#include <commctrl.h>
#include "startwin.game.h"
RSRC_ICON ICON "game_icon.ico"
RSRC_BMP BITMAP "game.bmp"
WIN_STARTWIN DIALOGEX DISCARDABLE 20, 40, 260, 200
STYLE DS_MODALFRAME | DS_CENTER | DS_SETFONT | DS_FIXEDSYS | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
CAPTION "Startup"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", WIN_STARTWIN_BITMAP, "STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 32, 32
CONTROL "", WIN_STARTWIN_TABCTL, WC_TABCONTROL, WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 5, 250, 170
CONTROL "&Start", WIN_STARTWIN_START, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 154, 180, 48, 14
CONTROL "&Cancel", WIN_STARTWIN_CANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 207, 180, 48, 14
CONTROL "", WIN_STARTWIN_MESSAGES, "EDIT", ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VSCROLL, 0, 0, 32, 32
END
WIN_STARTWINPAGE_CONFIG DIALOGEX DISCARDABLE 20, 40, 279, 168
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
CAPTION "Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "&Video mode:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 8, 50, 8
CONTROL "", IDC3DVMODE, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 6, 80, 56
CONTROL "&Fullscreen", IDCFULLSCREEN, "BUTTON", BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 148, 8, 49, 10
CONTROL "&Always show configuration on start", IDCALWAYSSHOW, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 118, 116, 140, 8
END
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
1 24 "64/manifest.game.xml"
#else
1 24 "32/manifest.game.xml"
#endif

View file

@ -0,0 +1,285 @@
#import <Cocoa/Cocoa.h>
#include "compat.h"
#include "baselayer.h"
#include "build.h"
static struct {
int fullscreen;
int xdim3d, ydim3d, bpp3d;
int forcesetup;
} settings;
@interface StartupWinController : NSWindowController
{
NSMutableArray *modeslist3d;
IBOutlet NSButton *alwaysShowButton;
IBOutlet NSButton *fullscreenButton;
IBOutlet NSTextView *messagesView;
IBOutlet NSTabView *tabView;
IBOutlet NSPopUpButton *videoMode3DPUButton;
IBOutlet NSButton *cancelButton;
IBOutlet NSButton *startButton;
}
- (void)dealloc;
- (void)populateVideoModes:(BOOL)firstTime;
- (IBAction)alwaysShowClicked:(id)sender;
- (IBAction)fullscreenClicked:(id)sender;
- (IBAction)cancel:(id)sender;
- (IBAction)start:(id)sender;
- (void)setupRunMode;
- (void)setupMessagesMode;
- (void)putsMessage:(NSString *)str;
- (void)setTitle:(NSString *)str;
@end
@implementation StartupWinController
- (void)dealloc
{
[modeslist3d release];
[super dealloc];
}
- (void)populateVideoModes:(BOOL)firstTime
{
int i, mode3d, fullscreen = ([fullscreenButton state] == NSOnState);
int idx3d = -1;
int xdim, ydim, bpp;
if (firstTime) {
xdim = settings.xdim3d;
ydim = settings.ydim3d;
bpp = settings.bpp3d;
} else {
mode3d = [[modeslist3d objectAtIndex:[videoMode3DPUButton indexOfSelectedItem]] intValue];
if (mode3d >= 0) {
xdim = validmode[mode3d].xdim;
ydim = validmode[mode3d].ydim;
bpp = validmode[mode3d].bpp;
}
}
mode3d = checkvideomode(&xdim, &ydim, bpp, fullscreen, 1);
if (mode3d < 0) {
int i, cd[] = { 32, 24, 16, 15, 8, 0 };
for (i=0; cd[i]; ) { if (cd[i] >= bpp) i++; else break; }
for ( ; cd[i]; i++) {
mode3d = checkvideomode(&xdim, &ydim, cd[i], fullscreen, 1);
if (mode3d < 0) continue;
break;
}
}
[modeslist3d release];
[videoMode3DPUButton removeAllItems];
modeslist3d = [[NSMutableArray alloc] init];
for (i = 0; i < validmodecnt; i++) {
if (fullscreen == validmode[i].fs) {
if (i == mode3d) idx3d = [modeslist3d count];
[modeslist3d addObject:[NSNumber numberWithInt:i]];
[videoMode3DPUButton addItemWithTitle:[NSString stringWithFormat:@"%d %C %d %d-bpp",
validmode[i].xdim, 0xd7, validmode[i].ydim, validmode[i].bpp]];
}
}
if (idx3d >= 0) [videoMode3DPUButton selectItemAtIndex:idx3d];
}
- (IBAction)alwaysShowClicked:(id)sender
{
}
- (IBAction)fullscreenClicked:(id)sender
{
[self populateVideoModes:NO];
}
- (IBAction)cancel:(id)sender
{
[NSApp abortModal];
}
- (IBAction)start:(id)sender
{
int mode = [[modeslist3d objectAtIndex:[videoMode3DPUButton indexOfSelectedItem]] intValue];
if (mode >= 0) {
settings.xdim3d = validmode[mode].xdim;
settings.ydim3d = validmode[mode].ydim;
settings.bpp3d = validmode[mode].bpp;
settings.fullscreen = validmode[mode].fs;
}
settings.forcesetup = [alwaysShowButton state] == NSOnState;
[NSApp stopModal];
}
- (void)setupRunMode
{
getvalidmodes();
[fullscreenButton setState: (settings.fullscreen ? NSOnState : NSOffState)];
[alwaysShowButton setState: (settings.forcesetup ? NSOnState : NSOffState)];
[self populateVideoModes:YES];
// enable all the controls on the Configuration page
NSEnumerator *enumerator = [[[[tabView tabViewItemAtIndex:0] view] subviews] objectEnumerator];
NSControl *control;
while (control = [enumerator nextObject]) [control setEnabled:true];
[cancelButton setEnabled:true];
[startButton setEnabled:true];
[tabView selectTabViewItemAtIndex:0];
[NSCursor unhide]; // Why should I need to do this?
}
- (void)setupMessagesMode
{
[tabView selectTabViewItemAtIndex:1];
// disable all the controls on the Configuration page except "always show", so the
// user can enable it if they want to while waiting for something else to happen
NSEnumerator *enumerator = [[[[tabView tabViewItemAtIndex:0] view] subviews] objectEnumerator];
NSControl *control;
while (control = [enumerator nextObject]) {
if (control == alwaysShowButton) continue;
[control setEnabled:false];
}
[cancelButton setEnabled:false];
[startButton setEnabled:false];
}
- (void)putsMessage:(NSString *)str
{
NSRange end;
NSTextStorage *text = [messagesView textStorage];
BOOL shouldAutoScroll;
shouldAutoScroll = ((int)NSMaxY([messagesView bounds]) == (int)NSMaxY([messagesView visibleRect]));
end.location = [text length];
end.length = 0;
[text beginEditing];
[messagesView replaceCharactersInRange:end withString:str];
[text endEditing];
if (shouldAutoScroll) {
end.location = [text length];
end.length = 0;
[messagesView scrollRangeToVisible:end];
}
}
- (void)setTitle:(NSString *)str
{
[[self window] setTitle:str];
}
@end
static StartupWinController *startwin = nil;
int startwin_open(void)
{
if (startwin != nil) return 1;
startwin = [[StartupWinController alloc] initWithWindowNibName:@"startwin.game"];
if (startwin == nil) return -1;
[startwin setupMessagesMode];
[startwin showWindow:nil];
return 0;
}
int startwin_close(void)
{
if (startwin == nil) return 1;
[startwin close];
[startwin release];
startwin = nil;
return 0;
}
int startwin_puts(const char *s)
{
NSString *ns;
if (!s) return -1;
if (startwin == nil) return 1;
ns = [[NSString alloc] initWithCString:s];
[startwin putsMessage:ns];
[ns release];
return 0;
}
int startwin_settitle(const char *s)
{
NSString *ns;
if (!s) return -1;
if (startwin == nil) return 1;
ns = [[NSString alloc] initWithCString:s];
[startwin setTitle:ns];
[ns release];
return 0;
}
int startwin_idle(void *v)
{
if (startwin) [[startwin window] displayIfNeeded];
return 0;
}
extern int xdimgame, ydimgame, bppgame, forcesetup;
int startwin_run(void)
{
int retval;
if (startwin == nil) return 0;
settings.fullscreen = fullscreen;
settings.xdim3d = xdimgame;
settings.ydim3d = ydimgame;
settings.bpp3d = bppgame;
settings.forcesetup = forcesetup;
[startwin setupRunMode];
switch ([NSApp runModalForWindow:[startwin window]]) {
case NSRunStoppedResponse: retval = 1; break;
case NSRunAbortedResponse: retval = 0; break;
default: retval = -1;
}
[startwin setupMessagesMode];
if (retval) {
fullscreen = settings.fullscreen;
xdimgame = settings.xdim3d;
ydimgame = settings.ydim3d;
bppgame = settings.bpp3d;
forcesetup = settings.forcesetup;
}
return retval;
}

View file

@ -0,0 +1,613 @@
// "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
// Ken Silverman's official web site: "http://www.advsys.net/ken"
// See the included license file "BUILDLIC.TXT" for license info.
//
// This file has been modified from Ken Silverman's original release
// by Jonathon Fowler (jf@jonof.id.au)
#include "compat.h"
#include "build.h"
#include "editor.h"
#include "pragmas.h"
#include "baselayer.h"
#include "names.h"
#include "osd.h"
#include "cache1d.h"
#include "common.h"
#include "common_game.h"
const char* AppProperName = "Build Editor";
const char* AppTechnicalName = "testeditor";
static char tempbuf[256];
#define NUMOPTIONS 9
char option[NUMOPTIONS] = {0,0,0,0,0,0,1,0,0};
unsigned char keys[NUMBUILDKEYS] =
{
0xc8,0xd0,0xcb,0xcd,0x2a,0x9d,0x1d,0x39,
0x1e,0x2c,0xd1,0xc9,0x33,0x34,
0x9c,0x1c,0xd,0xc,0xf,0x45
};
static char levelname[BMAX_PATH] = "";
//static int hang = 0;
//static int rollangle = 0;
//Detecting 2D / 3D mode:
// qsetmode is 200 in 3D mode
// qsetmode is 350/480 in 2D mode
//
//You can read these variables when F5-F8 is pressed in 3D mode only:
//
// If (searchstat == 0) WALL searchsector=sector, searchwall=wall
// If (searchstat == 1) CEILING searchsector=sector
// If (searchstat == 2) FLOOR searchsector=sector
// If (searchstat == 3) SPRITE searchsector=sector, searchwall=sprite
// If (searchstat == 4) MASKED WALL searchsector=sector, searchwall=wall
//
// searchsector is the sector of the selected item for all 5 searchstat's
//
// searchwall is undefined if searchstat is 1 or 2
// searchwall is the wall if searchstat = 0 or 4
// searchwall is the sprite if searchstat = 3 (Yeah, I know - it says wall,
// but trust me, it's the sprite number)
int averagefps;
#define AVERAGEFRAMES 32
static unsigned int frameval[AVERAGEFRAMES];
static int framecnt = 0;
const char *defsfilename = "kenbuild.def";
const char *startwin_labeltext = "Starting Build Editor...";
int nextvoxid = 0;
int32_t ExtPreInit(int32_t argc,const char **argv)
{
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
wm_setapptitle("BUILD by Ken Silverman");
G_ExtPreInit();
OSD_SetLogFile("testeditor.log");
initprintf("KenBuild Editor %s %s\n", s_buildRev, s_buildInfo);
initprintf("Compiled %s\n", s_buildTimestamp);
return 0;
}
int ExtInit(void)
{
int i, rv = 0;
/*printf("------------------------------------------------------------------------------\n");
printf(" BUILD.EXE copyright(c) 1996 by Ken Silverman. You are granted the\n");
printf(" right to use this software for your personal use only. This is a\n");
printf(" special version to be used with \"Happy Fun KenBuild\" and may not work\n");
printf(" properly with other Build engine games. Please refer to license.doc\n");
printf(" for distribution rights\n");
printf("------------------------------------------------------------------------------\n");
getch();
*/
initgroupfile("stuff.dat");
bpp = 8;
if (loadsetup("build.cfg") < 0) buildputs("Configuration file not found, using defaults.\n"), rv = 1;
Bmemcpy((void *)buildkeys,(void *)keys,NUMBUILDKEYS); //Trick to make build use setup.dat keys
if (option[4] > 0) option[4] = 0;
if (initengine()) {
wm_msgbox("Build Engine Initialisation Error",
"There was a problem initialising the Build engine: %s", engineerrstr);
return -1;
}
initinput();
initmouse();
//You can load your own palette lookup tables here if you just
//copy the right code!
for(i=0;i<256;i++)
tempbuf[i] = ((i+32)&255); //remap colors for screwy palette sectors
makepalookup(16,tempbuf,0,0,0,1);
kensplayerheight = 32;
zmode = 0;
setbasepaltable(basepaltable, 1);
G_InitMultiPsky();
tiletovox[PLAYER] = nextvoxid++;
tiletovox[BROWNMONSTER] = nextvoxid++;
#ifdef _WIN32
// allowtaskswitching(0);
#endif
return rv;
}
void ExtUnInit(void)
{
uninitgroupfile();
writesetup("build.cfg");
}
//static int daviewingrange, daaspect, horizval1, horizval2;
void ExtPreCheckKeys(void)
{
int /*cosang, sinang, dx, dy, mindx,*/ i, j, k;
if (keystatus[0x3e]) //F4 - screen re-size
{
keystatus[0x3e] = 0;
//cycle through all vesa modes, then screen-buffer mode
if (keystatus[0x2a]|keystatus[0x36]) {
setgamemode(!fullscreen, xdim, ydim, bpp);
} else {
//cycle through all modes
j=-1;
// work out a mask to select the mode
for (i=0; i<validmodecnt; i++)
if ((validmode[i].xdim == xdim) &&
(validmode[i].ydim == ydim) &&
(validmode[i].fs == fullscreen) &&
(validmode[i].bpp == bpp))
{ j=i; break; }
for (k=0; k<validmodecnt; k++)
if (validmode[k].fs == fullscreen && validmode[k].bpp == bpp) break;
if (j==-1) j=k;
else {
j++;
if (j==validmodecnt) j=k;
}
setgamemode(fullscreen,validmode[j].xdim,validmode[j].ydim,bpp);
}
}
#if 0
if (keystatus[0x2a]|keystatus[0x36])
{
if (keystatus[0xcf]) hang = max(hang-1,-182);
if (keystatus[0xc7]) hang = min(hang+1,182);
}
else
{
if (keystatus[0xcf]) hang = max(hang-8,-182);
if (keystatus[0xc7]) hang = min(hang+8,182);
}
if (keystatus[0x4c]) { hang = 0; horiz = 100; }
if (hang != 0)
{
walock[4094] = 255;
// JBF 20031117: scale each dimension by a factor of 1.2, and work out
// the aspect of the screen. Anywhere you see 'i' below was the value
// '200' before I changed it. NOTE: This whole trick crashes in resolutions
// above 800x600. I'm not sure why, and fixing it is not something I intend
// to do in a real big hurry.
dx = (xdim + (xdim >> 3) + (xdim >> 4) + (xdim >> 6)) & (~7);
dy = (ydim + (ydim >> 3) + (ydim >> 4) + (ydim >> 6)) & (~7);
i = scale(320,ydim,xdim);
if (waloff[4094] == 0) allocache(&waloff[4094],/*240L*384L*/dx*dy,&walock[4094]);
setviewtotile(4094,/*240L,384L*/dy,dx);
cosang = sintable[(hang+512)&2047];
sinang = sintable[hang&2047];
dx = dmulscale1(320,cosang,i,sinang); mindx = dx;
dy = dmulscale1(-i,cosang,320,sinang);
horizval1 = dy*(320>>1)/dx-1;
dx = dmulscale1(320,cosang,-i,sinang); mindx = min(dx,mindx);
dy = dmulscale1(i,cosang,320,sinang);
horizval2 = dy*(320>>1)/dx+1;
daviewingrange = scale(65536,16384*(xdim>>1),mindx-16);
daaspect = scale(daviewingrange,scale(320,tilesizx[4094],tilesizy[4094]),horizval2+6-horizval1);
setaspect(daviewingrange,scale(daaspect,ydim*320,xdim*i));
horiz = 100-divscale15(horizval1+horizval2,daviewingrange);
}
#endif
}
#define MAXVOXMIPS 5
extern intptr_t voxoff[][MAXVOXMIPS];
void ExtAnalyzeSprites(int32_t ourx, int32_t oury, int32_t oura, int32_t smoothr)
{
int i, *longptr;
spritetype *tspr;
UNREFERENCED_PARAMETER(ourx);
UNREFERENCED_PARAMETER(oury);
UNREFERENCED_PARAMETER(oura);
UNREFERENCED_PARAMETER(smoothr);
for(i=0,tspr=&tsprite[0];i<spritesortcnt;i++,tspr++)
{
if (usevoxels && tiletovox[tspr->picnum] >= 0)
{
switch(tspr->picnum)
{
case PLAYER:
if (!voxoff[ tiletovox[PLAYER] ][0]) {
if (qloadkvx(tiletovox[PLAYER],"voxel000.kvx")) {
tiletovox[PLAYER] = -1;
break;
}
}
//tspr->cstat |= 48; tspr->picnum = tiletovox[tspr->picnum];
longptr = (int *)voxoff[ tiletovox[PLAYER] ][0];
tspr->xrepeat = scale(tspr->xrepeat,56,longptr[2]);
tspr->yrepeat = scale(tspr->yrepeat,56,longptr[2]);
tspr->shade -= 6;
break;
case BROWNMONSTER:
if (!voxoff[ tiletovox[BROWNMONSTER] ][0]) {
if (qloadkvx(tiletovox[BROWNMONSTER],"voxel001.kvx")) {
tiletovox[BROWNMONSTER] = -1;
break;
}
}
//tspr->cstat |= 48; tspr->picnum = tiletovox[tspr->picnum];
break;
}
}
tspr->shade += 6;
if (sector[tspr->sectnum].ceilingstat&1)
tspr->shade += sector[tspr->sectnum].ceilingshade;
else
tspr->shade += sector[tspr->sectnum].floorshade;
}
}
void ExtCheckKeys(void)
{
int i;//, p, y, dx, dy, cosang, sinang, bufplc, tsizy, tsizyup15;
int j;
if (qsetmode == 200) //In 3D mode
{
#if 0
if (hang != 0)
{
bufplc = waloff[4094]+(mulscale16(horiz-100,xdimenscale)+(tilesizx[4094]>>1))*tilesizy[4094];
setviewback();
cosang = sintable[(hang+512)&2047];
sinang = sintable[hang&2047];
dx = dmulscale1(xdim,cosang,ydim,sinang);
dy = dmulscale1(-ydim,cosang,xdim,sinang);
begindrawing();
tsizy = tilesizy[4094];
tsizyup15 = (tsizy<<15);
dx = mulscale14(dx,daviewingrange);
dy = mulscale14(dy,daaspect);
sinang = mulscale14(sinang,daviewingrange);
cosang = mulscale14(cosang,daaspect);
p = ylookup[windowy1]+frameplace+windowx2+1;
for(y=windowy1;y<=windowy2;y++)
{
i = divscale16(tsizyup15,dx);
stretchhline(0,(xdim>>1)*i+tsizyup15,xdim>>2,i,mulscale32(i,dy)*tsizy+bufplc,p);
dx -= sinang; dy += cosang; p += ylookup[1];
}
walock[4094] = 1;
Bsprintf(tempbuf,"%d",(hang*180)>>10);
printext256(0L,8L,31,-1,tempbuf,1);
enddrawing();
}
#endif
if (keystatus[0xa]) setaspect(viewingrange+(viewingrange>>8),yxaspect+(yxaspect>>8));
if (keystatus[0xb]) setaspect(viewingrange-(viewingrange>>8),yxaspect-(yxaspect>>8));
if (keystatus[0xc]) setaspect(viewingrange,yxaspect-(yxaspect>>8));
if (keystatus[0xd]) setaspect(viewingrange,yxaspect+(yxaspect>>8));
//if (keystatus[0x38]) setrollangle(rollangle+=((keystatus[0x2a]|keystatus[0x36])*6+2));
//if (keystatus[0xb8]) setrollangle(rollangle-=((keystatus[0x2a]|keystatus[0x36])*6+2));
//if (keystatus[0x1d]|keystatus[0x9d]) setrollangle(rollangle=0);
begindrawing();
i = frameval[framecnt&(AVERAGEFRAMES-1)];
j = frameval[framecnt&(AVERAGEFRAMES-1)] = getticks(); framecnt++;
if (i != j) averagefps = ((mul3(averagefps)+((AVERAGEFRAMES*1000)/(j-i)) )>>2);
Bsprintf((char *)tempbuf,"%d",averagefps);
printext256(0L,0L,31,-1,(char *)tempbuf,1);
enddrawing();
editinput();
}
else
{
}
}
void ExtCleanUp(void)
{
}
void ExtPreLoadMap(void)
{
}
void ExtSetupMapFilename(const char *mapname)
{
char title[256];
Bstrncpy(levelname, mapname, sizeof(levelname));
Bsnprintf(title, 256, "BUILD by Ken Silverman - %s", mapname);
wm_setapptitle(title);
}
void ExtLoadMap(const char *mapname)
{
ExtSetupMapFilename(mapname);
}
int32_t ExtPreSaveMap(void)
{
return 0;
}
void ExtSaveMap(const char *mapname)
{
UNREFERENCED_PARAMETER(mapname);
saveboard("backup.map", &pos, ang, cursectnum);
}
const char *ExtGetSectorCaption(short sectnum)
{
if ((sector[sectnum].lotag|sector[sectnum].hitag) == 0)
{
tempbuf[0] = 0;
}
else
{
Bsprintf((char *)tempbuf,"%hu,%hu",(unsigned short)sector[sectnum].hitag,
(unsigned short)sector[sectnum].lotag);
}
return((char *)tempbuf);
}
const char *ExtGetWallCaption(short wallnum)
{
if ((wall[wallnum].lotag|wall[wallnum].hitag) == 0)
{
tempbuf[0] = 0;
}
else
{
Bsprintf((char *)tempbuf,"%hu,%hu",(unsigned short)wall[wallnum].hitag,
(unsigned short)wall[wallnum].lotag);
}
return((char *)tempbuf);
}
const char *ExtGetSpriteCaption(short spritenum)
{
if ((sprite[spritenum].lotag|sprite[spritenum].hitag) == 0)
{
tempbuf[0] = 0;
}
else
{
Bsprintf((char *)tempbuf,"%hu,%hu",(unsigned short)sprite[spritenum].hitag,
(unsigned short)sprite[spritenum].lotag);
}
return((char *)tempbuf);
}
//printext16 parameters:
//printext16(int xpos, int ypos, short col, short backcol,
// char name[82], char fontsize)
// xpos 0-639 (top left)
// ypos 0-479 (top left)
// col 0-15
// backcol 0-15, -1 is transparent background
// name
// fontsize 0=8*8, 1=3*5
//drawline16 parameters:
// drawline16(int x1, int y1, int x2, int y2, char col)
// x1, x2 0-639
// y1, y2 0-143 (status bar is 144 high, origin is top-left of STATUS BAR)
// col 0-15
void ExtShowSectorData(short sectnum) //F5
{
int i;
if (qsetmode == 200) //In 3D mode
{
}
else
{
begindrawing();
clearmidstatbar16(); //Clear middle of status bar
Bsprintf((char *)tempbuf,"Sector %d",sectnum);
printext16(8,ydim16+32,11,-1,(char *)tempbuf,0);
printext16(8,ydim16+48,11,-1,"8*8 font: ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789",0);
printext16(8,ydim16+56,11,-1,"3*5 font: ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789",1);
i=ydim16; ydim16=ydim;
drawline16(320,i+68,344,i+80,4); //Draw house
drawline16(344,i+80,344,i+116,4);
drawline16(344,i+116,296,i+116,4);
drawline16(296,i+116,296,i+80,4);
drawline16(296,i+80,320,i+68,4);
ydim16=i;
enddrawing();
}
}
void ExtShowWallData(short wallnum) //F6
{
if (qsetmode == 200) //In 3D mode
{
}
else
{
begindrawing();
clearmidstatbar16(); //Clear middle of status bar
Bsprintf((char *)tempbuf,"Wall %d",wallnum);
printext16(8,ydim16+32,11,-1,(char *)tempbuf,0);
enddrawing();
}
}
void ExtShowSpriteData(short spritenum) //F6
{
if (qsetmode == 200) //In 3D mode
{
}
else
{
begindrawing();
clearmidstatbar16(); //Clear middle of status bar
Bsprintf((char *)tempbuf,"Sprite %d",spritenum);
printext16(8,ydim16+32,11,-1,(char *)tempbuf,0);
enddrawing();
}
}
void ExtEditSectorData(short sectnum) //F7
{
short nickdata;
if (qsetmode == 200) //In 3D mode
{
//Ceiling
if (searchstat == 1)
sector[searchsector].ceilingpicnum++; //Just a stupid example
//Floor
if (searchstat == 2)
sector[searchsector].floorshade++; //Just a stupid example
}
else //In 2D mode
{
Bsprintf((char *)tempbuf,"Sector (%d) Nick's variable: ",sectnum);
nickdata = 0;
nickdata = getnumber16((char *)tempbuf,nickdata,65536L,0);
printmessage16(" "); //Clear message box (top right of status bar)
ExtShowSectorData(sectnum);
}
}
void ExtEditWallData(short wallnum) //F8
{
short nickdata;
if (qsetmode == 200) //In 3D mode
{
}
else
{
Bsprintf((char *)tempbuf,"Wall (%d) Nick's variable: ",wallnum);
nickdata = 0;
nickdata = getnumber16((char *)tempbuf,nickdata,65536L,0);
printmessage16(" "); //Clear message box (top right of status bar)
ExtShowWallData(wallnum);
}
}
void ExtEditSpriteData(short spritenum) //F8
{
short nickdata;
if (qsetmode == 200) //In 3D mode
{
}
else
{
Bsprintf((char *)tempbuf,"Sprite (%d) Nick's variable: ",spritenum);
nickdata = 0;
nickdata = getnumber16((char *)tempbuf,nickdata,65536L,0);
printmessage16(" ");
printmessage16(" "); //Clear message box (top right of status bar)
ExtShowSpriteData(spritenum);
}
}
void faketimerhandler(void)
{
sampletimer();
}
void M32RunScript(const char *s) { UNREFERENCED_PARAMETER(s); }
void G_Polymer_UnInit(void) { }
void app_crashhandler(void)
{
if (levelname[0])
{
append_ext_UNSAFE(levelname, "_crash.map");
SaveBoard(levelname, M32_SB_NOEXT);
}
}
//Just thought you might want my getnumber16 code
/*
getnumber16(char namestart[80], short num, int maxnumber)
{
char buffer[80];
int j, k, n, danum, oldnum;
danum = (int)num;
oldnum = danum;
while ((keystatus[0x1c] != 2) && (keystatus[0x1] == 0)) //Enter, ESC
{
sprintf(&buffer,"%s%ld_ ",namestart,danum);
printmessage16(buffer);
for(j=2;j<=11;j++) //Scan numbers 0-9
if (keystatus[j] > 0)
{
keystatus[j] = 0;
k = j-1;
if (k == 10) k = 0;
n = (danum*10)+k;
if (n < maxnumber) danum = n;
}
if (keystatus[0xe] > 0) // backspace
{
danum /= 10;
keystatus[0xe] = 0;
}
if (keystatus[0x1c] == 1) //L. enter
{
oldnum = danum;
keystatus[0x1c] = 2;
asksave = 1;
}
}
keystatus[0x1c] = 0;
keystatus[0x1] = 0;
return((short)oldnum);
}
*/
/*
* vim:ts=4:
*/

View file

@ -0,0 +1,54 @@
#include "compat.h"
#include "build.h"
#include "names.h"
#include "common_game.h"
uint8_t *basepaltable[1] = {
palette
};
#define NUMPSKYMULTIS 2
EDUKE32_STATIC_ASSERT(NUMPSKYMULTIS <= MAXPSKYMULTIS);
EDUKE32_STATIC_ASSERT(PSKYOFF_MAX <= MAXPSKYTILES);
// Set up new-style multi-psky handling.
void Ken_InitMultiPsky(void)
{
int32_t i;
static int32_t inited;
if (inited)
return;
inited = 1;
multipskytile[0] = -1;
multipskytile[1] = DAYSKY;
multipskytile[2] = NIGHTSKY;
pskynummultis = NUMPSKYMULTIS;
// When adding other multi-skies, take care that the tileofs[] values are
// <= PSKYOFF_MAX. (It can be increased up to MAXPSKYTILES, but should be
// set as tight as possible.)
// The default sky properties (all others are implicitly zero):
multipsky[0].lognumtiles = 1;
multipsky[0].horizfrac = 65536;
// DAYSKY
multipsky[1].lognumtiles = 1;
multipsky[1].horizfrac = 65536;
// DAYSKY
multipsky[2].lognumtiles = 3;
multipsky[2].horizfrac = 65536;
for (i=0; i<pskynummultis; ++i)
{
int32_t j;
for (j=0; j<(1<<multipsky[i].lognumtiles); ++j)
Bassert(multipsky[i].tileofs[j] <= PSKYOFF_MAX);
}
}

View file

@ -0,0 +1,6 @@
#include "compat.h"
extern uint8_t *basepaltable[1];
extern void Ken_InitMultiPsky(void);

View file

@ -0,0 +1,286 @@
// Evil and Nasty Configuration File Reader for KenBuild
// by Jonathon Fowler
#include "compat.h"
#include "build.h"
#include "editor.h"
#include "osd.h"
#ifdef RENDERTYPEWIN
#include "winlayer.h"
#endif
#include "baselayer.h"
static int vesares[13][2] = {{320,200},{360,200},{320,240},{360,240},{320,400},
{360,400},{640,350},{640,400},{640,480},{800,600},
{1024,768},{1280,1024},{1600,1200}};
static int readconfig(BFILE *fp, const char *key, char *value, unsigned len)
{
char buf[1000], *k, *v, *eq;
int x=0;
if (len < 1) return 0;
Brewind(fp);
while (1) {
if (!Bfgets(buf, 1000, fp)) return 0;
if (buf[0] == ';') continue;
eq = Bstrchr(buf, '=');
if (!eq) continue;
k = buf;
v = eq+1;
while (*k == ' ' || *k == '\t') k++;
*(eq--) = 0;
while ((*eq == ' ' || *eq == '\t') && eq>=k) *(eq--) = 0;
if (Bstrcasecmp(k, key)) continue;
while (*v == ' ' || *k == '\t') v++;
eq = v + Bstrlen(v)-1;
while ((*eq == ' ' || *eq == '\t' || *eq == '\r' || *eq == '\n') && eq>=v) *(eq--) = 0;
value[--len] = 0;
do value[x] = v[x]; while (v[x++] != 0 && len-- > 0);
return x-1;
}
}
extern short brightness;
extern int fullscreen;
extern unsigned char option[8];
extern unsigned char keys[NUMBUILDKEYS];
extern double msens;
/*
* SETUP.DAT
* 0 = video mode (0:chained 1:vesa 2:screen buffered 3/4/5:tseng/paradise/s3 6:red-blue)
* 1 = sound (0:none)
* 2 = music (0:none)
* 3 = input (0:keyboard 1:+mouse)
* 4 = multiplayer (0:single 1-4:com 5-11:ipx)
* 5&0xf0 = com speed
* 5&0x0f = com irq
* 6&0xf0 = chained y-res
* 6&0x0f = chained x-res or vesa mode
* 7&0xf0 = sound samplerate
* 7&0x01 = sound quality
* 7&0x02 = 8/16 bit
* 7&0x04 = mono/stereo
*
* bytes 8 to 26 are key settings:
* 0 = Forward (0xc8)
* 1 = Backward (0xd0)
* 2 = Turn left (0xcb)
* 3 = Turn right (0xcd)
* 4 = Run (0x2a)
* 5 = Strafe (0x9d)
* 6 = Fire (0x1d)
* 7 = Use (0x39)
* 8 = Stand high (0x1e)
* 9 = Stand low (0x2c)
* 10 = Look up (0xd1)
* 11 = Look down (0xc9)
* 12 = Strafe left (0x33)
* 13 = Strafe right (0x34)
* 14 = 2D/3D switch (0x9c)
* 15 = View cycle (0x1c)
* 16 = 2D Zoom in (0xd)
* 17 = 2D Zoom out (0xc)
* 18 = Chat (0xf)
*/
int loadsetup(const char *fn)
{
BFILE *fp;
#define VL 32
char val[VL];
int i;
if ((fp = Bfopen(fn, "rt")) == NULL) return -1;
if (readconfig(fp, "forcesetup", val, VL) > 0) { if (Batoi(val) != 0) forcesetup = 1; else forcesetup = 0; }
if (readconfig(fp, "fullscreen", val, VL) > 0) { if (Batoi(val) != 0) fullscreen = 1; else fullscreen = 0; }
if (readconfig(fp, "resolution", val, VL) > 0) {
i = Batoi(val) & 0x0f;
if ((unsigned)i<13) { xdimgame = xdim2d = vesares[i][0]; ydimgame = ydim2d = vesares[i][1]; }
}
if (readconfig(fp, "xdim", val, VL) > 0) xdimgame = xdim2d = Batoi(val);
if (readconfig(fp, "ydim", val, VL) > 0) ydimgame = xdim2d = Batoi(val);
if (readconfig(fp, "samplerate", val, VL) > 0) option[7] = (Batoi(val) & 0x0f) << 4;
if (readconfig(fp, "music", val, VL) > 0) { if (Batoi(val) != 0) option[2] = 1; else option[2] = 0; }
if (readconfig(fp, "mouse", val, VL) > 0) { if (Batoi(val) != 0) option[3] = 1; else option[3] = 0; }
if (readconfig(fp, "bpp", val, VL) > 0) bppgame = Batoi(val);
if (readconfig(fp, "renderer", val, VL) > 0) { i = Batoi(val); setrendermode(i); }
if (readconfig(fp, "brightness", val, VL) > 0) brightness = min(max(Batoi(val),0),15);
#ifdef RENDERTYPEWIN
if (readconfig(fp, "maxrefreshfreq", val, VL) > 0) maxrefreshfreq = Batoi(val);
#endif
option[0] = 1; // vesa all the way...
option[1] = 1; // sound all the way...
option[4] = 0; // no multiplayer
option[5] = 0;
if (readconfig(fp, "keyforward", val, VL) > 0) keys[0] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keybackward", val, VL) > 0) keys[1] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyturnleft", val, VL) > 0) keys[2] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyturnright", val, VL) > 0) keys[3] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyrun", val, VL) > 0) keys[4] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keystrafe", val, VL) > 0) keys[5] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyfire", val, VL) > 0) keys[6] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyuse", val, VL) > 0) keys[7] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keystandhigh", val, VL) > 0) keys[8] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keystandlow", val, VL) > 0) keys[9] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keylookup", val, VL) > 0) keys[10] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keylookdown", val, VL) > 0) keys[11] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keystrafeleft", val, VL) > 0) keys[12] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keystraferight", val, VL) > 0) keys[13] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "key2dmode", val, VL) > 0) keys[14] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyviewcycle", val, VL) > 0) keys[15] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "key2dzoomin", val, VL) > 0) keys[16] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "key2dzoomout", val, VL) > 0) keys[17] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keychat", val, VL) > 0) keys[18] = Bstrtol(val, NULL, 16);
if (readconfig(fp, "keyconsole", val, VL) > 0) { keys[19] = Bstrtol(val, NULL, 16); OSD_CaptureKey(keys[19]); }
if (readconfig(fp, "mousesensitivity", val, VL) > 0) msens = Bstrtod(val, NULL);
Bfclose(fp);
return 0;
}
int writesetup(const char *fn)
{
BFILE *fp;
fp = Bfopen(fn,"wt");
if (!fp) return -1;
Bfprintf(fp,
"; Always show configuration options on startup\n"
"; 0 - No\n"
"; 1 - Yes\n"
"forcesetup = %d\n"
"\n"
"; Video mode selection\n"
"; 0 - Windowed\n"
"; 1 - Fullscreen\n"
"fullscreen = %d\n"
"\n"
"; Video resolution\n"
"xdim = %d\n"
"ydim = %d\n"
"\n"
"; 3D-mode colour depth\n"
"bpp = %d\n"
"\n"
#ifdef USE_OPENGL
"; OpenGL mode options\n"
"glusetexcache = %d\n"
"\n"
#endif
#ifdef RENDERTYPEWIN
"; Maximum OpenGL mode refresh rate (Windows only, in Hertz)\n"
"maxrefreshfreq = %d\n"
"\n"
#endif
"; 3D mode brightness setting\n"
"; 0 - lowest\n"
"; 15 - highest\n"
"brightness = %d\n"
"\n"
"; Sound sample frequency\n"
"; 0 - 6 KHz\n"
"; 1 - 8 KHz\n"
"; 2 - 11.025 KHz\n"
"; 3 - 16 KHz\n"
"; 4 - 22.05 KHz\n"
"; 5 - 32 KHz\n"
"; 6 - 44.1 KHz\n"
"samplerate = %d\n"
"\n"
"; Music playback\n"
"; 0 - Off\n"
"; 1 - On\n"
"music = %d\n"
"\n"
"; Enable mouse\n"
"; 0 - No\n"
"; 1 - Yes\n"
"mouse = %d\n"
"\n"
"; Mouse sensitivity\n"
"mousesensitivity = %g\n"
"\n"
"; Key Settings\n"
"; Here's a map of all the keyboard scan codes: NOTE: values are listed in hex!\n"
"; +---------------------------------------------------------------------------------------------+\n"
"; | 01 3B 3C 3D 3E 3F 40 41 42 43 44 57 58 46 |\n"
"; |ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 SCROLL |\n"
"; | |\n"
"; |29 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E D2 C7 C9 45 B5 37 4A |\n"
"; | ` '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' - = BACK INS HOME PGUP NUMLK KP/ KP* KP- |\n"
"; | |\n"
"; | 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 2B D3 CF D1 47 48 49 4E |\n"
"; |TAB Q W E R T Y U I O P [ ] \\ DEL END PGDN KP7 KP8 KP9 KP+ |\n"
"; | |\n"
"; | 3A 1E 1F 20 21 22 23 24 25 26 27 28 1C 4B 4C 4D |\n"
"; |CAPS A S D F G H J K L ; ' ENTER KP4 KP5 KP6 9C |\n"
"; | KPENTER|\n"
"; | 2A 2C 2D 2E 2F 30 31 32 33 34 35 36 C8 4F 50 51 |\n"
"; |LSHIFT Z X C V B N M , . / RSHIFT UP KP1 KP2 KP3 |\n"
"; | |\n"
"; | 1D 38 39 B8 9D CB D0 CD 52 53 |\n"
"; |LCTRL LALT SPACE RALT RCTRL LEFT DOWN RIGHT KP0 KP. |\n"
"; +---------------------------------------------------------------------------------------------+\n"
"\n"
"keyforward = %X\n"
"keybackward = %X\n"
"keyturnleft = %X\n"
"keyturnright = %X\n"
"keyrun = %X\n"
"keystrafe = %X\n"
"keyfire = %X\n"
"keyuse = %X\n"
"keystandhigh = %X\n"
"keystandlow = %X\n"
"keylookup = %X\n"
"keylookdown = %X\n"
"keystrafeleft = %X\n"
"keystraferight = %X\n"
"key2dmode = %X\n"
"keyviewcycle = %X\n"
"key2dzoomin = %X\n"
"key2dzoomout = %X\n"
"keychat = %X\n"
"keyconsole = %X\n"
"\n",
forcesetup, fullscreen, xdimgame, ydimgame, bppgame,
#ifdef USE_OPENGL
glusetexcache,
#endif
#ifdef RENDERTYPEWIN
maxrefreshfreq,
#endif
brightness, option[7]>>4, option[2],
option[3], msens,
keys[0], keys[1], keys[2], keys[3], keys[4], keys[5],
keys[6], keys[7], keys[8], keys[9], keys[10], keys[11],
keys[12], keys[13], keys[14], keys[15], keys[16], keys[17],
keys[18], keys[19]
);
Bfclose(fp);
return 0;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,55 @@
// game.h
void operatesector(short dasector);
void operatesprite(short dasprite);
int changehealth(short snum, short deltahealth);
void changenumbombs(short snum, short deltanumbombs);
void changenummissiles(short snum, short deltanummissiles);
void changenumgrabbers(short snum, short deltanumgrabbers);
void drawstatusflytime(short snum);
void drawstatusbar(short snum);
void prepareboard(char *daboardfilename);
void checktouchsprite(short snum, short sectnum);
void checkgrabbertouchsprite(short snum, short sectnum);
void shootgun(short snum, const vec3_t *vector, short daang, int dahoriz, short dasectnum, char guntype);
void analyzesprites(int dax, int day);
void tagcode(void);
void statuslistcode(void);
void activatehitag(short dahitag);
void bombexplode(int i);
void processinput(short snum);
void view(short snum, vec3_t *v, short *vsectnum, short ang, int horiz);
void drawscreen(short snum, int dasmoothratio);
void movethings(void);
void fakedomovethings(void);
void fakedomovethingscorrect(void);
void domovethings(void);
void getinput(void);
void initplayersprite(short snum);
void playback(void);
void setup3dscreen(void);
void findrandomspot(int *x, int *y, short *sectnum);
void warp(int *x, int *y, int *z, short *daang, short *dasector);
void warpsprite(short spritenum);
void initlava(void);
void movelava(char *dapic);
void doanimations(void);
int getanimationgoal(int *animptr);
int setanimation(int *animptr, int thegoal, int thevel, int theacc);
void checkmasterslaveswitch(void);
int testneighborsectors(short sect1, short sect2);
int loadgame(void);
int savegame(void);
void faketimerhandler(void);
void getpackets(void);
void drawoverheadmap(int cposx, int cposy, int czoom, short cang);
int movesprite(short spritenum, int dx, int dy, int dz, int ceildist, int flordist, int clipmask);
void waitforeverybody(void);
void searchmap(short startsector);
void setinterpolation(int *posptr);
void stopinterpolation(int *posptr);
void updateinterpolations(void);
void dointerpolations(void);
void restoreinterpolations(void);
void printext(int x, int y, char *buffer, short tilenum /*, char invisiblecol*/);
void drawtilebackground (/*int thex, int they,*/ short tilenum, signed char shade, int cx1, int cy1, int cx2, int cy2, char dapalnum);

View file

@ -0,0 +1,49 @@
//Be careful when changing this file - it is parsed by Editart and Build.
#define SWITCH1ON 15
#define SLIME 34
#define BACKGROUND 37
#define KENPICTURE 48
#define BUILDDISK 49
#define SWITCH2ON 66
#define SWITCH2OFF 69
#define ALPHABET 73
#define NO 74
#define DEMOSIGN 75
#define COIN 76
#define COINSTACK 77
#define GIFTBOX 78
#define DIAMONDS 79
#define EVILALGRAVE 83
#define STATUSBAR 87
#define DAYSKY 89
#define WATERFOUNTAIN 90
#define USEWATERFOUNTAIN 91
#define NIGHTSKY 93
#define BULLET 98
#define BOMB 100
#define CANNON 101
#define GUNONBOTTOM 102
#define BOMBEMITTER 103
#define EXPLOSION 105
#define SPLASH 106
#define BROWNMONSTER 110
#define SKELETON 113
#define AL 114
#define EVILAL 115
#define PLAYER 120
#define SWITCH3OFF 146
#define SWITCH3ON 147
#define AIRPLANE 148
#define SPIRAL 149
#define COMPASS 150
#define FOOTPRINT 156
#define STATUSBARFILL8 160
#define STATUSBARFILL4 161
#define BOUNCYMAT 162
#define MIRROR 165
#define FLOORMIRROR 166
#define GRABBER 167
#define GRABCANNON 168
#define MISSILE 169
#define LAUNCHER 171
#define MIRRORLABEL 4000

View file

@ -0,0 +1,64 @@
#include "compat.h"
void initsb(char dadigistat, char damusistat, int dasamplerate, char danumspeakers, char dabytespersample, char daintspersec, char daquality)
{
UNREFERENCED_PARAMETER(dadigistat);
UNREFERENCED_PARAMETER(damusistat);
UNREFERENCED_PARAMETER(dasamplerate);
UNREFERENCED_PARAMETER(danumspeakers);
UNREFERENCED_PARAMETER(dabytespersample);
UNREFERENCED_PARAMETER(daintspersec);
UNREFERENCED_PARAMETER(daquality);
}
void uninitsb(void)
{
}
void setears(int daposx, int daposy, int daxvect, int dayvect)
{
UNREFERENCED_PARAMETER(daposx);
UNREFERENCED_PARAMETER(daposy);
UNREFERENCED_PARAMETER(daxvect);
UNREFERENCED_PARAMETER(dayvect);
}
void wsayfollow(char *dafilename, int dafreq, int davol, int *daxplc, int *dayplc, char followstat)
{
UNREFERENCED_PARAMETER(dafilename);
UNREFERENCED_PARAMETER(dafreq);
UNREFERENCED_PARAMETER(davol);
UNREFERENCED_PARAMETER(daxplc);
UNREFERENCED_PARAMETER(dayplc);
UNREFERENCED_PARAMETER(followstat);
}
void wsay(char *dafilename, int dafreq, int volume1, int volume2)
{
UNREFERENCED_PARAMETER(dafilename);
UNREFERENCED_PARAMETER(dafreq);
UNREFERENCED_PARAMETER(volume1);
UNREFERENCED_PARAMETER(volume2);
}
void loadwaves(void)
{
}
void loadsong(char *filename)
{
UNREFERENCED_PARAMETER(filename);
}
void musicon(void)
{
}
void musicoff(void)
{
}
void refreshaudio(void)
{
}

View file

@ -0,0 +1,544 @@
/* NOTE: Glade will generate code for a dialogue box which you should
* then patch into this file whenever you make a change to the Glade
* template.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <gdk-pixbuf/gdk-pixdata.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#ifndef LINKED_GTK
# include "dynamicgtk.h"
#endif
#include "baselayer.h"
#include "compat.h"
#include "build.h"
#define TAB_CONFIG 0
#define TAB_MESSAGES 1
static struct {
int fullscreen;
int xdim3d, ydim3d, bpp3d;
int forcesetup;
} settings;
extern int gtkenabled;
static GtkWidget *startwin = NULL;
static int retval = -1, mode = TAB_MESSAGES;
// -- SUPPORT FUNCTIONS -------------------------------------------------------
#define GLADE_HOOKUP_OBJECT(component,widget,name) \
g_object_set_data_full (G_OBJECT (component), name, \
gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
g_object_set_data (G_OBJECT (component), name, widget)
#define lookup_widget(x,w) \
(GtkWidget*) g_object_get_data(G_OBJECT(x), w)
static GdkPixbuf *load_banner(void)
{
extern const GdkPixdata startbanner_pixdata;
return gdk_pixbuf_from_pixdata(&startbanner_pixdata, FALSE, NULL);
}
static void SetPage(int n)
{
if (!gtkenabled || !startwin) return;
mode = n;
gtk_notebook_set_current_page(GTK_NOTEBOOK(lookup_widget(startwin,"tabs")), n);
// each control in the config page vertical layout plus the start button should be made (in)sensitive
if (n == TAB_CONFIG) n = TRUE; else n = FALSE;
gtk_widget_set_sensitive(lookup_widget(startwin,"startbutton"), n);
gtk_container_foreach(GTK_CONTAINER(lookup_widget(startwin,"configvlayout")),
(GtkCallback)gtk_widget_set_sensitive, (gpointer)n);
}
static void on_vmode3dcombo_changed(GtkComboBox *, gpointer);
static void PopulateForm(void)
{
int mode3d, i;
GtkListStore *modes3d;
GtkTreeIter iter;
GtkComboBox *box3d;
char buf[64];
mode3d = checkvideomode(&settings.xdim3d, &settings.ydim3d, settings.bpp3d, settings.fullscreen, 1);
if (mode3d < 0) {
int i, cd[] = { 32, 24, 16, 15, 8, 0 };
for (i=0; cd[i]; ) { if (cd[i] >= settings.bpp3d) i++; else break; }
for ( ; cd[i]; i++) {
mode3d = checkvideomode(&settings.xdim3d, &settings.ydim3d, cd[i], settings.fullscreen, 1);
if (mode3d < 0) continue;
settings.bpp3d = cd[i];
break;
}
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(startwin,"fullscreencheck")), settings.fullscreen);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(startwin,"alwaysshowcheck")), settings.forcesetup);
box3d = GTK_COMBO_BOX(lookup_widget(startwin,"vmode3dcombo"));
modes3d = GTK_LIST_STORE(gtk_combo_box_get_model(box3d));
gtk_list_store_clear(modes3d);
for (i=0; i<validmodecnt; i++) {
if (validmode[i].fs != settings.fullscreen) continue;
// all modes get added to the 3D mode list
Bsprintf(buf, "%ld x %ld %dbpp", validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
gtk_list_store_append(modes3d, &iter);
gtk_list_store_set(modes3d, &iter, 0,buf, 1,i, -1);
if (i == mode3d) {
g_signal_handlers_block_by_func(box3d, on_vmode3dcombo_changed, NULL);
gtk_combo_box_set_active_iter(box3d, &iter);
g_signal_handlers_unblock_by_func(box3d, on_vmode3dcombo_changed, NULL);
}
}
}
// -- EVENT CALLBACKS AND CREATION STUFF --------------------------------------
static void on_vmode3dcombo_changed(GtkComboBox *combobox, gpointer user_data)
{
GtkTreeModel *data;
GtkTreeIter iter;
int val;
if (!gtk_combo_box_get_active_iter(combobox, &iter)) return;
if (!(data = gtk_combo_box_get_model(combobox))) return;
gtk_tree_model_get(data, &iter, 1, &val, -1);
settings.xdim3d = validmode[val].xdim;
settings.ydim3d = validmode[val].ydim;
}
static void on_fullscreencheck_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
settings.fullscreen = (gtk_toggle_button_get_active(togglebutton) == TRUE);
PopulateForm();
}
static void on_alwaysshowcheck_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
settings.forcesetup = (gtk_toggle_button_get_active(togglebutton) == TRUE);
}
static void on_cancelbutton_clicked(GtkButton *button, gpointer user_data)
{
if (mode == TAB_CONFIG) { retval = 0; gtk_main_quit(); }
else quitevent++;
}
static void on_startbutton_clicked(GtkButton *button, gpointer user_data)
{
retval = 1;
gtk_main_quit();
}
static gboolean on_startwin_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
if (mode == TAB_CONFIG) { retval = 0; gtk_main_quit(); }
else quitevent++;
return TRUE; // FALSE would let the event go through. we want the game to decide when to close
}
static GtkWidget *create_window(void)
{
GtkWidget *startwin;
GtkWidget *hlayout;
GtkWidget *banner;
GtkWidget *vlayout;
GtkWidget *tabs;
GtkWidget *configvlayout;
GtkWidget *configlayout;
GtkWidget *vmode3dlabel;
GtkWidget *vmode3dcombo;
GtkWidget *fullscreencheck;
GtkWidget *alwaysshowcheck;
GtkWidget *configtab;
GtkWidget *messagesscroll;
GtkWidget *messagestext;
GtkWidget *messagestab;
GtkWidget *buttons;
GtkWidget *cancelbutton;
GtkWidget *cancelbuttonalign;
GtkWidget *cancelbuttonlayout;
GtkWidget *cancelbuttonicon;
GtkWidget *cancelbuttonlabel;
GtkWidget *startbutton;
GtkWidget *startbuttonalign;
GtkWidget *startbuttonlayout;
GtkWidget *startbuttonicon;
GtkWidget *startbuttonlabel;
GtkAccelGroup *accel_group;
accel_group = gtk_accel_group_new ();
// Basic window
startwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (startwin), apptitle); // NOTE: use global app title
gtk_window_set_position (GTK_WINDOW (startwin), GTK_WIN_POS_CENTER);
gtk_window_set_resizable (GTK_WINDOW (startwin), FALSE);
gtk_window_set_type_hint (GTK_WINDOW (startwin), GDK_WINDOW_TYPE_HINT_DIALOG);
// Horizontal layout of banner and controls
hlayout = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hlayout);
gtk_container_add (GTK_CONTAINER (startwin), hlayout);
// Banner
{
GdkPixbuf *pixbuf = load_banner();
banner = gtk_image_new_from_pixbuf(pixbuf);
g_object_unref((gpointer)pixbuf);
}
gtk_widget_show (banner);
gtk_box_pack_start (GTK_BOX (hlayout), banner, FALSE, FALSE, 0);
gtk_misc_set_alignment (GTK_MISC (banner), 0.5, 0);
// Vertical layout of tab control and start+cancel buttons
vlayout = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vlayout);
gtk_box_pack_start (GTK_BOX (hlayout), vlayout, TRUE, TRUE, 0);
// Tab control
tabs = gtk_notebook_new ();
gtk_widget_show (tabs);
gtk_box_pack_start (GTK_BOX (vlayout), tabs, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (tabs), 4);
// Vertical layout of config page main body
configvlayout = gtk_vbox_new (FALSE, 0);
gtk_widget_show (configvlayout);
gtk_container_add (GTK_CONTAINER (tabs), configvlayout);
// Fixed-position layout of config page controls
configlayout = gtk_fixed_new ();
gtk_widget_show (configlayout);
gtk_box_pack_start (GTK_BOX (configvlayout), configlayout, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (configlayout), 6);
// 3D video mode label
vmode3dlabel = gtk_label_new_with_mnemonic ("_Video mode:");
gtk_widget_show (vmode3dlabel);
gtk_fixed_put (GTK_FIXED (configlayout), vmode3dlabel, 0, 0);
gtk_widget_set_size_request (vmode3dlabel, 88, 29);
gtk_misc_set_alignment (GTK_MISC (vmode3dlabel), 0, 0.5);
// 3D video mode combo
{
GtkListStore *list = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
GtkCellRenderer *cell;
vmode3dcombo = gtk_combo_box_new_with_model (GTK_TREE_MODEL(list));
g_object_unref(G_OBJECT(list));
cell = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(vmode3dcombo), cell, FALSE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(vmode3dcombo), cell, "text", 0, NULL);
}
gtk_widget_show (vmode3dcombo);
gtk_fixed_put (GTK_FIXED (configlayout), vmode3dcombo, 88, 0);
gtk_widget_set_size_request (vmode3dcombo, 150, 29);
gtk_widget_add_accelerator (vmode3dcombo, "grab_focus", accel_group,
GDK_V, GDK_MOD1_MASK,
GTK_ACCEL_VISIBLE);
// Fullscreen checkbox
fullscreencheck = gtk_check_button_new_with_mnemonic ("_Fullscreen");
gtk_widget_show (fullscreencheck);
gtk_fixed_put (GTK_FIXED (configlayout), fullscreencheck, 248, 0);
gtk_widget_set_size_request (fullscreencheck, 85, 29);
gtk_widget_add_accelerator (fullscreencheck, "grab_focus", accel_group,
GDK_F, GDK_MOD1_MASK,
GTK_ACCEL_VISIBLE);
// Always show config checkbox
alwaysshowcheck = gtk_check_button_new_with_mnemonic ("_Always show configuration on start");
gtk_widget_show (alwaysshowcheck);
gtk_box_pack_start (GTK_BOX (configvlayout), alwaysshowcheck, FALSE, FALSE, 0);
gtk_widget_add_accelerator (alwaysshowcheck, "grab_focus", accel_group,
GDK_A, GDK_MOD1_MASK,
GTK_ACCEL_VISIBLE);
// Configuration tab
configtab = gtk_label_new ("Configuration");
gtk_widget_show (configtab);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (tabs), gtk_notebook_get_nth_page (GTK_NOTEBOOK (tabs), 0), configtab);
// Messages scrollable area
messagesscroll = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (messagesscroll);
gtk_container_add (GTK_CONTAINER (tabs), messagesscroll);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (messagesscroll), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
// Messages text area
messagestext = gtk_text_view_new ();
gtk_widget_show (messagestext);
gtk_container_add (GTK_CONTAINER (messagesscroll), messagestext);
gtk_text_view_set_editable (GTK_TEXT_VIEW (messagestext), FALSE);
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (messagestext), GTK_WRAP_WORD);
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (messagestext), FALSE);
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (messagestext), 2);
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (messagestext), 2);
// Messages tab
messagestab = gtk_label_new ("Messages");
gtk_widget_show (messagestab);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (tabs), gtk_notebook_get_nth_page (GTK_NOTEBOOK (tabs), 1), messagestab);
// Dialogue box buttons layout
buttons = gtk_hbutton_box_new ();
gtk_widget_show (buttons);
gtk_box_pack_start (GTK_BOX (vlayout), buttons, FALSE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (buttons), 3);
gtk_button_box_set_layout (GTK_BUTTON_BOX (buttons), GTK_BUTTONBOX_END);
// Cancel button
cancelbutton = gtk_button_new ();
gtk_widget_show (cancelbutton);
gtk_container_add (GTK_CONTAINER (buttons), cancelbutton);
GTK_WIDGET_SET_FLAGS (cancelbutton, GTK_CAN_DEFAULT);
gtk_widget_add_accelerator (cancelbutton, "grab_focus", accel_group,
GDK_C, GDK_MOD1_MASK,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (cancelbutton, "clicked", accel_group,
GDK_Escape, 0,
GTK_ACCEL_VISIBLE);
cancelbuttonalign = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (cancelbuttonalign);
gtk_container_add (GTK_CONTAINER (cancelbutton), cancelbuttonalign);
cancelbuttonlayout = gtk_hbox_new (FALSE, 2);
gtk_widget_show (cancelbuttonlayout);
gtk_container_add (GTK_CONTAINER (cancelbuttonalign), cancelbuttonlayout);
cancelbuttonicon = gtk_image_new_from_stock ("gtk-cancel", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (cancelbuttonicon);
gtk_box_pack_start (GTK_BOX (cancelbuttonlayout), cancelbuttonicon, FALSE, FALSE, 0);
cancelbuttonlabel = gtk_label_new_with_mnemonic ("_Cancel");
gtk_widget_show (cancelbuttonlabel);
gtk_box_pack_start (GTK_BOX (cancelbuttonlayout), cancelbuttonlabel, FALSE, FALSE, 0);
// Start button
startbutton = gtk_button_new ();
gtk_widget_show (startbutton);
gtk_container_add (GTK_CONTAINER (buttons), startbutton);
GTK_WIDGET_SET_FLAGS (startbutton, GTK_CAN_DEFAULT);
gtk_widget_add_accelerator (startbutton, "grab_focus", accel_group,
GDK_S, GDK_MOD1_MASK,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (startbutton, "clicked", accel_group,
GDK_Return, 0,
GTK_ACCEL_VISIBLE);
startbuttonalign = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (startbuttonalign);
gtk_container_add (GTK_CONTAINER (startbutton), startbuttonalign);
startbuttonlayout = gtk_hbox_new (FALSE, 2);
gtk_widget_show (startbuttonlayout);
gtk_container_add (GTK_CONTAINER (startbuttonalign), startbuttonlayout);
startbuttonicon = gtk_image_new_from_stock ("gtk-execute", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (startbuttonicon);
gtk_box_pack_start (GTK_BOX (startbuttonlayout), startbuttonicon, FALSE, FALSE, 0);
startbuttonlabel = gtk_label_new_with_mnemonic ("_Start");
gtk_widget_show (startbuttonlabel);
gtk_box_pack_start (GTK_BOX (startbuttonlayout), startbuttonlabel, FALSE, FALSE, 0);
// Wire up the signals
g_signal_connect ((gpointer) startwin, "delete_event",
G_CALLBACK (on_startwin_delete_event),
NULL);
g_signal_connect ((gpointer) vmode3dcombo, "changed",
G_CALLBACK (on_vmode3dcombo_changed),
NULL);
g_signal_connect ((gpointer) fullscreencheck, "toggled",
G_CALLBACK (on_fullscreencheck_toggled),
NULL);
g_signal_connect ((gpointer) alwaysshowcheck, "toggled",
G_CALLBACK (on_alwaysshowcheck_toggled),
NULL);
g_signal_connect ((gpointer) cancelbutton, "clicked",
G_CALLBACK (on_cancelbutton_clicked),
NULL);
g_signal_connect ((gpointer) startbutton, "clicked",
G_CALLBACK (on_startbutton_clicked),
NULL);
// Associate labels with their controls
gtk_label_set_mnemonic_widget (GTK_LABEL (vmode3dlabel), vmode3dcombo);
/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (startwin, startwin, "startwin");
GLADE_HOOKUP_OBJECT (startwin, hlayout, "hlayout");
GLADE_HOOKUP_OBJECT (startwin, banner, "banner");
GLADE_HOOKUP_OBJECT (startwin, vlayout, "vlayout");
GLADE_HOOKUP_OBJECT (startwin, tabs, "tabs");
GLADE_HOOKUP_OBJECT (startwin, configvlayout, "configvlayout");
GLADE_HOOKUP_OBJECT (startwin, configlayout, "configlayout");
GLADE_HOOKUP_OBJECT (startwin, vmode3dlabel, "vmode3dlabel");
GLADE_HOOKUP_OBJECT (startwin, vmode3dcombo, "vmode3dcombo");
GLADE_HOOKUP_OBJECT (startwin, fullscreencheck, "fullscreencheck");
GLADE_HOOKUP_OBJECT (startwin, alwaysshowcheck, "alwaysshowcheck");
GLADE_HOOKUP_OBJECT (startwin, configtab, "configtab");
GLADE_HOOKUP_OBJECT (startwin, messagesscroll, "messagesscroll");
GLADE_HOOKUP_OBJECT (startwin, messagestext, "messagestext");
GLADE_HOOKUP_OBJECT (startwin, messagestab, "messagestab");
GLADE_HOOKUP_OBJECT (startwin, buttons, "buttons");
GLADE_HOOKUP_OBJECT (startwin, cancelbutton, "cancelbutton");
GLADE_HOOKUP_OBJECT (startwin, cancelbuttonalign, "cancelbuttonalign");
GLADE_HOOKUP_OBJECT (startwin, cancelbuttonlayout, "cancelbuttonlayout");
GLADE_HOOKUP_OBJECT (startwin, cancelbuttonicon, "cancelbuttonicon");
GLADE_HOOKUP_OBJECT (startwin, cancelbuttonlabel, "cancelbuttonlabel");
GLADE_HOOKUP_OBJECT (startwin, startbutton, "startbutton");
GLADE_HOOKUP_OBJECT (startwin, startbuttonalign, "startbuttonalign");
GLADE_HOOKUP_OBJECT (startwin, startbuttonlayout, "startbuttonlayout");
GLADE_HOOKUP_OBJECT (startwin, startbuttonicon, "startbuttonicon");
GLADE_HOOKUP_OBJECT (startwin, startbuttonlabel, "startbuttonlabel");
gtk_window_add_accel_group (GTK_WINDOW (startwin), accel_group);
return startwin;
}
// -- BUILD ENTRY POINTS ------------------------------------------------------
int startwin_open(void)
{
if (!gtkenabled) return 0;
if (startwin) return 1;
startwin = create_window();
if (startwin) {
SetPage(TAB_MESSAGES);
gtk_widget_show(startwin);
gtk_main_iteration_do(FALSE);
return 0;
}
return -1;
}
int startwin_close(void)
{
if (!gtkenabled) return 0;
if (!startwin) return 1;
gtk_widget_destroy (startwin);
startwin = NULL;
return 0;
}
int startwin_puts(const char *str)
{
GtkWidget *textview;
GtkTextBuffer *textbuffer;
GtkTextIter enditer;
GtkTextMark *mark;
const char *aptr, *bptr;
if (!gtkenabled || !str) return 0;
if (!startwin) return 1;
if (!(textview = lookup_widget(startwin, "messagestext"))) return -1;
textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
gtk_text_buffer_get_end_iter(textbuffer, &enditer);
for (aptr = bptr = str; *aptr != 0; ) {
switch (*bptr) {
case '\b':
if (bptr > aptr)
gtk_text_buffer_insert(textbuffer, &enditer, (const gchar *)aptr, (gint)(bptr-aptr)-1);
#if GTK_CHECK_VERSION(2,6,0)
gtk_text_buffer_backspace(textbuffer, &enditer, FALSE, TRUE);
#else
{
GtkTextIter iter2 = enditer;
gtk_text_iter_backward_cursor_position(&iter2);
//FIXME: this seems be deleting one too many chars somewhere!
if (!gtk_text_iter_equal(&iter2, &enditer))
gtk_text_buffer_delete_interactive(textbuffer, &iter2, &enditer, TRUE);
}
#endif
aptr = ++bptr;
break;
case 0:
if (bptr > aptr)
gtk_text_buffer_insert(textbuffer, &enditer, (const gchar *)aptr, (gint)(bptr-aptr));
aptr = bptr;
break;
case '\r': // FIXME
default:
bptr++;
break;
}
}
mark = gtk_text_buffer_create_mark(textbuffer, NULL, &enditer, 1);
gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(textview), mark, 0.0, FALSE, 0.0, 1.0);
gtk_text_buffer_delete_mark(textbuffer, mark);
return 0;
}
int startwin_settitle(const char *title)
{
if (!gtkenabled) return 0;
if (!startwin) return 1;
gtk_window_set_title (GTK_WINDOW (startwin), title);
return 0;
}
int startwin_idle(void *s)
{
if (!gtkenabled) return 0;
//if (!startwin) return 1;
gtk_main_iteration_do (FALSE);
return 0;
}
extern int xdimgame, ydimgame, bppgame, forcesetup;
int startwin_run(void)
{
if (!gtkenabled) return 0;
if (!startwin) return 1;
SetPage(TAB_CONFIG);
settings.fullscreen = fullscreen;
settings.xdim3d = xdimgame;
settings.ydim3d = ydimgame;
settings.bpp3d = bppgame;
settings.forcesetup = forcesetup;
PopulateForm();
gtk_main();
SetPage(TAB_MESSAGES);
if (retval) {
fullscreen = settings.fullscreen;
xdimgame = settings.xdim3d;
ydimgame = settings.ydim3d;
bppgame = settings.bpp3d;
forcesetup = settings.forcesetup;
}
return retval;
}

View file

@ -0,0 +1,421 @@
#ifndef _WIN32
#error Only for Windows
#endif
#include "compat.h"
#include "build.h"
#include "winlayer.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#define _WIN32_IE 0x0600
#include <commctrl.h>
#include <stdio.h>
#include "startwin.game.h"
#define TAB_CONFIG 0
#define TAB_MESSAGES 1
static struct {
int fullscreen;
int xdim3d, ydim3d, bpp3d;
int forcesetup;
} settings;
static HWND startupdlg = NULL;
static HWND pages[2] = { NULL, NULL};
static int done = -1, mode = TAB_CONFIG;
static void PopulateForm(void)
{
int i,j;
char buf[64];
int mode3d;
HWND hwnd3d;
hwnd3d = GetDlgItem(pages[TAB_CONFIG], IDC3DVMODE);
mode3d = checkvideomode(&settings.xdim3d, &settings.ydim3d, settings.bpp3d, settings.fullscreen, 1);
if (mode3d < 0) {
int cd[] = { 32, 24, 16, 15, 8, 0 };
for (i=0; cd[i]; ) { if (cd[i] >= settings.bpp3d) i++; else break; }
for ( ; cd[i]; i++) {
mode3d = checkvideomode(&settings.xdim3d, &settings.ydim3d, cd[i], settings.fullscreen, 1);
if (mode3d < 0) continue;
settings.bpp3d = cd[i];
break;
}
}
Button_SetCheck(GetDlgItem(pages[TAB_CONFIG], IDCFULLSCREEN), (settings.fullscreen ? BST_CHECKED : BST_UNCHECKED));
Button_SetCheck(GetDlgItem(pages[TAB_CONFIG], IDCALWAYSSHOW), (settings.forcesetup ? BST_CHECKED : BST_UNCHECKED));
ComboBox_ResetContent(hwnd3d);
for (i=0; i<validmodecnt; i++) {
if (validmode[i].fs != settings.fullscreen) continue;
// all modes get added to the 3D mode list
Bsprintf(buf, "%d x %d %dbpp", validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
j = ComboBox_AddString(hwnd3d, buf);
ComboBox_SetItemData(hwnd3d, j, i);
if (i == mode3d) ComboBox_SetCurSel(hwnd3d, j);
}
}
static INT_PTR CALLBACK ConfigPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCFULLSCREEN:
settings.fullscreen = !settings.fullscreen;
PopulateForm();
return TRUE;
case IDC3DVMODE:
if (HIWORD(wParam) == CBN_SELCHANGE) {
int i;
i = ComboBox_GetCurSel((HWND)lParam);
if (i != CB_ERR) i = ComboBox_GetItemData((HWND)lParam, i);
if (i != CB_ERR) {
settings.xdim3d = validmode[i].xdim;
settings.ydim3d = validmode[i].ydim;
settings.bpp3d = validmode[i].bpp;
}
}
return TRUE;
case IDCALWAYSSHOW:
settings.forcesetup = IsDlgButtonChecked(hwndDlg, IDCALWAYSSHOW) == BST_CHECKED;
return TRUE;
default: break;
}
break;
default: break;
}
return FALSE;
}
static void SetPage(int n)
{
HWND tab;
int cur;
tab = GetDlgItem(startupdlg, WIN_STARTWIN_TABCTL);
cur = (int)SendMessage(tab, TCM_GETCURSEL,0,0);
ShowWindow(pages[cur],SW_HIDE);
SendMessage(tab, TCM_SETCURSEL, n, 0);
ShowWindow(pages[n],SW_SHOW);
mode = n;
SetFocus(GetDlgItem(startupdlg, WIN_STARTWIN_TABCTL));
}
static void EnableConfig(int n)
{
//EnableWindow(GetDlgItem(startupdlg, WIN_STARTWIN_CANCEL), n);
EnableWindow(GetDlgItem(startupdlg, WIN_STARTWIN_START), n);
EnableWindow(GetDlgItem(pages[TAB_CONFIG], IDCFULLSCREEN), n);
EnableWindow(GetDlgItem(pages[TAB_CONFIG], IDC3DVMODE), n);
}
static INT_PTR CALLBACK startup_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hbmp = NULL;
HDC hdc;
switch (uMsg) {
case WM_INITDIALOG: {
HWND hwnd;
RECT r, rdlg, chrome, rtab, rcancel, rstart;
int xoffset = 0, yoffset = 0;
// Fetch the positions (in screen coordinates) of all the windows we need to tweak
ZeroMemory(&chrome, sizeof(chrome));
AdjustWindowRect(&chrome, GetWindowLong(hwndDlg, GWL_STYLE), FALSE);
GetWindowRect(hwndDlg, &rdlg);
GetWindowRect(GetDlgItem(hwndDlg, WIN_STARTWIN_TABCTL), &rtab);
GetWindowRect(GetDlgItem(hwndDlg, WIN_STARTWIN_CANCEL), &rcancel);
GetWindowRect(GetDlgItem(hwndDlg, WIN_STARTWIN_START), &rstart);
// Knock off the non-client area of the main dialogue to give just the client area
rdlg.left -= chrome.left; rdlg.top -= chrome.top;
rdlg.right -= chrome.right; rdlg.bottom -= chrome.bottom;
// Translate them to client-relative coordinates wrt the main dialogue window
rtab.right -= rtab.left - 1; rtab.bottom -= rtab.top - 1;
rtab.left -= rdlg.left; rtab.top -= rdlg.top;
rcancel.right -= rcancel.left - 1; rcancel.bottom -= rcancel.top - 1;
rcancel.left -= rdlg.left; rcancel.top -= rdlg.top;
rstart.right -= rstart.left - 1; rstart.bottom -= rstart.top - 1;
rstart.left -= rdlg.left; rstart.top -= rdlg.top;
// And then convert the main dialogue coordinates to just width/length
rdlg.right -= rdlg.left - 1; rdlg.bottom -= rdlg.top - 1;
rdlg.left = 0; rdlg.top = 0;
// Load the bitmap into the bitmap control and fetch its dimensions
hbmp = LoadBitmap((HINSTANCE)win_gethinstance(), MAKEINTRESOURCE(RSRC_BMP));
hwnd = GetDlgItem(hwndDlg,WIN_STARTWIN_BITMAP);
SendMessage(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);
GetClientRect(hwnd, &r);
xoffset = r.right;
yoffset = r.bottom - rdlg.bottom;
// Shift and resize the controls that require it
rtab.left += xoffset; rtab.bottom += yoffset;
rcancel.left += xoffset; rcancel.top += yoffset;
rstart.left += xoffset; rstart.top += yoffset;
rdlg.right += xoffset;
rdlg.bottom += yoffset;
// Move the controls to their new positions
MoveWindow(GetDlgItem(hwndDlg, WIN_STARTWIN_TABCTL), rtab.left, rtab.top, rtab.right, rtab.bottom, FALSE);
MoveWindow(GetDlgItem(hwndDlg, WIN_STARTWIN_CANCEL), rcancel.left, rcancel.top, rcancel.right, rcancel.bottom, FALSE);
MoveWindow(GetDlgItem(hwndDlg, WIN_STARTWIN_START), rstart.left, rstart.top, rstart.right, rstart.bottom, FALSE);
// Move the main dialogue to the centre of the screen
hdc = GetDC(NULL);
rdlg.left = (GetDeviceCaps(hdc, HORZRES) - rdlg.right) / 2;
rdlg.top = (GetDeviceCaps(hdc, VERTRES) - rdlg.bottom) / 2;
ReleaseDC(NULL, hdc);
MoveWindow(hwndDlg, rdlg.left + chrome.left, rdlg.top + chrome.left,
rdlg.right + (-chrome.left+chrome.right), rdlg.bottom + (-chrome.top+chrome.bottom), TRUE);
// Add tabs to the tab control
{
TCITEM tab;
hwnd = GetDlgItem(hwndDlg, WIN_STARTWIN_TABCTL);
ZeroMemory(&tab, sizeof(tab));
tab.mask = TCIF_TEXT;
tab.pszText = TEXT("Configuration");
SendMessage(hwnd, TCM_INSERTITEM, (WPARAM)0, (LPARAM)&tab);
tab.mask = TCIF_TEXT;
tab.pszText = TEXT("Messages");
SendMessage(hwnd, TCM_INSERTITEM, (WPARAM)1, (LPARAM)&tab);
// Work out the position and size of the area inside the tab control for the pages
ZeroMemory(&r, sizeof(r));
GetClientRect(hwnd, &r);
SendMessage(hwnd, TCM_ADJUSTRECT, FALSE, (LPARAM)&r);
r.right -= r.left-1;
r.bottom -= r.top-1;
r.top += rtab.top;
r.left += rtab.left;
// Create the pages and position them in the tab control, but hide them
pages[TAB_CONFIG] = CreateDialog((HINSTANCE)win_gethinstance(),
MAKEINTRESOURCE(WIN_STARTWINPAGE_CONFIG), hwndDlg, ConfigPageProc);
pages[TAB_MESSAGES] = GetDlgItem(hwndDlg, WIN_STARTWIN_MESSAGES);
SetWindowPos(pages[TAB_CONFIG], hwnd,r.left,r.top,r.right,r.bottom,SWP_HIDEWINDOW);
SetWindowPos(pages[TAB_MESSAGES], hwnd,r.left,r.top,r.right,r.bottom,SWP_HIDEWINDOW);
// Tell the editfield acting as the console to exclude the width of the scrollbar
GetClientRect(pages[TAB_MESSAGES],&r);
r.right -= GetSystemMetrics(SM_CXVSCROLL)+4;
r.left = r.top = 0;
SendMessage(pages[TAB_MESSAGES], EM_SETRECTNP,0,(LPARAM)&r);
SetFocus(GetDlgItem(hwndDlg, WIN_STARTWIN_START));
}
return FALSE;
}
case WM_NOTIFY: {
LPNMHDR nmhdr = (LPNMHDR)lParam;
int cur;
if (nmhdr->idFrom != WIN_STARTWIN_TABCTL) break;
cur = (int)SendMessage(nmhdr->hwndFrom, TCM_GETCURSEL,0,0);
switch (nmhdr->code) {
case TCN_SELCHANGING: {
if (cur < 0 || !pages[cur]) break;
ShowWindow(pages[cur],SW_HIDE);
return TRUE;
}
case TCN_SELCHANGE: {
if (cur < 0 || !pages[cur]) break;
ShowWindow(pages[cur],SW_SHOW);
return TRUE;
}
}
break;
}
case WM_CLOSE:
if (mode == TAB_CONFIG) done = 0;
else quitevent++;
return TRUE;
case WM_DESTROY:
if (hbmp) {
DeleteObject(hbmp);
hbmp = NULL;
}
if (pages[TAB_CONFIG]) {
DestroyWindow(pages[TAB_CONFIG]);
pages[TAB_CONFIG] = NULL;
}
startupdlg = NULL;
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case WIN_STARTWIN_CANCEL:
if (mode == TAB_CONFIG) done = 0;
else quitevent++;
return TRUE;
case WIN_STARTWIN_START: done = 1; return TRUE;
}
return FALSE;
case WM_CTLCOLORSTATIC:
if ((HWND)lParam == pages[TAB_MESSAGES])
return (BOOL)GetSysColorBrush(COLOR_WINDOW);
break;
default: break;
}
return FALSE;
}
int startwin_open(void)
{
INITCOMMONCONTROLSEX icc;
if (startupdlg) return 1;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&icc);
startupdlg = CreateDialog((HINSTANCE)win_gethinstance(), MAKEINTRESOURCE(WIN_STARTWIN), NULL, startup_dlgproc);
if (startupdlg) {
SetPage(TAB_MESSAGES);
EnableConfig(0);
return 0;
}
return -1;
}
int startwin_close(void)
{
if (!startupdlg) return 1;
DestroyWindow(startupdlg);
startupdlg = NULL;
return 0;
}
int startwin_puts(const char *buf)
{
const char *p = NULL, *q = NULL;
char workbuf[1024];
static int newline = 0;
int curlen, linesbefore, linesafter;
HWND edctl;
int vis;
if (!startupdlg) return 1;
edctl = pages[TAB_MESSAGES];
if (!edctl) return -1;
vis = ((int)SendMessage(GetDlgItem(startupdlg, WIN_STARTWIN_TABCTL), TCM_GETCURSEL,0,0) == TAB_MESSAGES);
if (vis) SendMessage(edctl, WM_SETREDRAW, FALSE,0);
curlen = SendMessage(edctl, WM_GETTEXTLENGTH, 0,0);
SendMessage(edctl, EM_SETSEL, (WPARAM)curlen, (LPARAM)curlen);
linesbefore = SendMessage(edctl, EM_GETLINECOUNT, 0,0);
p = buf;
while (*p) {
if (newline) {
SendMessage(edctl, EM_REPLACESEL, 0, (LPARAM)"\r\n");
newline = 0;
}
q = p;
while (*q && *q != '\n') q++;
memcpy(workbuf, p, q-p);
if (*q == '\n') {
if (!q[1]) {
newline = 1;
workbuf[q-p] = 0;
} else {
workbuf[q-p] = '\r';
workbuf[q-p+1] = '\n';
workbuf[q-p+2] = 0;
}
p = q+1;
} else {
workbuf[q-p] = 0;
p = q;
}
SendMessage(edctl, EM_REPLACESEL, 0, (LPARAM)workbuf);
}
linesafter = SendMessage(edctl, EM_GETLINECOUNT, 0,0);
SendMessage(edctl, EM_LINESCROLL, 0, linesafter-linesbefore);
if (vis) SendMessage(edctl, WM_SETREDRAW, TRUE,0);
return 0;
}
int startwin_settitle(const char *str)
{
if (!startupdlg) return 1;
SetWindowText(startupdlg, str);
return 0;
}
int startwin_idle(void *v)
{
if (!startupdlg || !IsWindow(startupdlg)) return 0;
if (IsDialogMessage(startupdlg, (MSG*)v)) return 1;
return 0;
}
extern int xdimgame, ydimgame, bppgame, forcesetup;
int startwin_run(void)
{
MSG msg;
if (!startupdlg) return 1;
done = -1;
SetPage(TAB_CONFIG);
EnableConfig(1);
settings.fullscreen = fullscreen;
settings.xdim3d = xdimgame;
settings.ydim3d = ydimgame;
settings.bpp3d = bppgame;
settings.forcesetup = forcesetup;
PopulateForm();
while (done < 0) {
switch (GetMessage(&msg, NULL, 0,0)) {
case 0: done = 1; break;
case -1: return -1;
default:
if (IsWindow(startupdlg) && IsDialogMessage(startupdlg, &msg)) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
break;
}
}
SetPage(TAB_MESSAGES);
EnableConfig(0);
if (done) {
fullscreen = settings.fullscreen;
xdimgame = settings.xdim3d;
ydimgame = settings.ydim3d;
bppgame = settings.bpp3d;
forcesetup = settings.forcesetup;
}
return done;
}

View file

@ -0,0 +1,17 @@
// resource ids
#define WIN_STARTWIN 1000
#define WIN_STARTWINPAGE_CONFIG 2000
#define WIN_STARTWIN_BITMAP 100 // banner bitmap
#define WIN_STARTWIN_TABCTL 101
#define WIN_STARTWIN_CANCEL IDCANCEL
#define WIN_STARTWIN_START IDOK
#define WIN_STARTWIN_MESSAGES 104 // output list box
#define RSRC_ICON 100
#define RSRC_BMP 200
// config page
#define IDCFULLSCREEN 100
#define IDC3DVMODE 101
#define IDCALWAYSSHOW 102