From d7fff51d7d3bc7f3c0d44d58f91ba2ba3b4a7951 Mon Sep 17 00:00:00 2001 From: Travis Bradshaw Date: Tue, 31 Jan 2012 17:08:50 -0600 Subject: [PATCH] Source release of Wolfenstein 3D Classic Platinum for iOS, 2.1 --- __MACOSX/wolf3d/._README.txt | Bin 0 -> 167 bytes __MACOSX/wolf3d/._readme_iWolf_v1x.txt | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/._wolfiphone.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._fileio.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._files.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._filesystem.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._openal_main.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._opengl_draw.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._opengl_local.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._opengl_main.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._sound.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._sound_local.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._sound_sfx_id.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._sound_stream.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._texture_manager.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._texture_manager.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._unix_file.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/env/._video.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._.DS_Store | Bin 0 -> 82 bytes .../code/iphone/._CreditsViewController.h | Bin 0 -> 171 bytes .../code/iphone/._CreditsViewController.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._EAGLView.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._EAGLView.m | Bin 0 -> 171 bytes .../code/iphone/._EpisodeViewController.h | Bin 0 -> 171 bytes .../code/iphone/._EpisodeViewController.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._Info.plist | Bin 0 -> 220 bytes .../code/iphone/._LegalViewController.h | Bin 0 -> 171 bytes .../code/iphone/._LegalViewController.m | Bin 0 -> 171 bytes .../code/iphone/._LevelSelectViewController.h | Bin 0 -> 171 bytes .../code/iphone/._LevelSelectViewController.m | Bin 0 -> 171 bytes .../code/iphone/._MainMenuViewController.h | Bin 0 -> 171 bytes .../code/iphone/._MainMenuViewController.m | Bin 0 -> 171 bytes .../code/iphone/._MissionTableViewCell.h | Bin 0 -> 171 bytes .../code/iphone/._MissionTableViewCell.m | Bin 0 -> 171 bytes .../code/iphone/._SettingsViewController.h | Bin 0 -> 171 bytes .../code/iphone/._SettingsViewController.m | Bin 0 -> 171 bytes .../code/iphone/._SkillViewController.h | Bin 0 -> 171 bytes .../code/iphone/._SkillViewController.m | Bin 0 -> 171 bytes .../code/iphone/._TriviaViewController.h | Bin 0 -> 171 bytes .../code/iphone/._TriviaViewController.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._UIFontButton.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._UIFontButton.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._UIFontLabel.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._UIFontLabel.m | Bin 0 -> 171 bytes .../code/iphone/._UITableViewScrolling.h | Bin 0 -> 171 bytes .../code/iphone/._UITableViewScrolling.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._WolfSlider.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._WolfSlider.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._gles_glue.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._gles_glue.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._hud.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_alerts.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_alerts.m | Bin 0 -> 171 bytes .../wolf3d/code/iphone/._iphone_downloadSOD.m | Bin 0 -> 171 bytes .../code/iphone/._iphone_downloadUserMap.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_loop.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_main.c | Bin 0 -> 171 bytes .../wolf3d/code/iphone/._iphone_mapselector.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_menus.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_qgl.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_store.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_store.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_sys.m | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._iphone_wolf.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/iphone/._main.m | Bin 0 -> 171 bytes .../wolf3d/code/iphone/._wolf3dAppDelegate.h | Bin 0 -> 171 bytes .../wolf3d/code/iphone/._wolf3dAppDelegate.m | Bin 0 -> 171 bytes .../code/iphone/._wolf3dViewController.h | Bin 0 -> 171 bytes .../code/iphone/._wolf3dViewController.m | Bin 0 -> 171 bytes .../wolf3d/code/iphone/._wolf3d_Prefix.pch | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/wolf/._wolf_ai_com.c | Bin 0 -> 171 bytes .../wolf3d/code/wolf/._wolf_client_main.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/wolf/._wolf_local.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/wolf/._wolf_math.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/wolf/._wolf_opengl.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/wolf/._wolf_player.c | Bin 0 -> 171 bytes __MACOSX/wolf3d/code/wolf/._wolf_renderer.h | Bin 0 -> 171 bytes __MACOSX/wolf3d/scripts/._scrubBase.pl | Bin 0 -> 167 bytes wolf3d/COPYING.txt | 345 + wolf3d/README.txt | 22 + wolf3d/code/env/fileio.c | 8 +- wolf3d/code/env/files.c | 15 +- wolf3d/code/env/filesystem.h | 2 + wolf3d/code/env/openal_main.c | 13 +- wolf3d/code/env/opengl_draw.c | 18 +- wolf3d/code/env/opengl_local.h | 1 + wolf3d/code/env/opengl_main.c | 15 +- wolf3d/code/env/sound.c | 54 +- wolf3d/code/env/sound_local.h | 2 + wolf3d/code/env/sound_sfx_id.c | 8 +- wolf3d/code/env/sound_stream.c | 36 +- wolf3d/code/env/texture_manager.c | 80 +- wolf3d/code/env/texture_manager.h | 3 + wolf3d/code/env/unix_file.c | 2 +- wolf3d/code/env/video.h | 2 + wolf3d/code/iphone/.DS_Store | Bin 0 -> 6148 bytes wolf3d/code/iphone/CreditsView.xib | 1483 ++ wolf3d/code/iphone/CreditsViewController.h | 34 + wolf3d/code/iphone/CreditsViewController.m | 116 + wolf3d/code/iphone/EAGLView.h | 23 +- wolf3d/code/iphone/EAGLView.m | 395 +- wolf3d/code/iphone/EpisodeCell.xib | 698 + wolf3d/code/iphone/EpisodeView.xib | 935 ++ wolf3d/code/iphone/EpisodeViewController.h | 42 + wolf3d/code/iphone/EpisodeViewController.m | 355 + wolf3d/code/iphone/Info.plist | 43 +- wolf3d/code/iphone/LegalView.xib | 657 + wolf3d/code/iphone/LegalViewController.h | 32 + wolf3d/code/iphone/LegalViewController.m | 82 + wolf3d/code/iphone/LevelSelectView.xib | 976 ++ .../code/iphone/LevelSelectViewController.h | 49 + .../code/iphone/LevelSelectViewController.m | 314 + wolf3d/code/iphone/MainMenuView.xib | 1034 ++ wolf3d/code/iphone/MainMenuViewController.h | 67 + wolf3d/code/iphone/MainMenuViewController.m | 192 + wolf3d/code/iphone/MissionTableViewCell.h | 31 + wolf3d/code/iphone/MissionTableViewCell.m | 59 + .../Resources-iPad/CreditsView~ipad.xib | 1482 ++ .../Resources-iPad/EpisodeCell~ipad.xib | 678 + .../Resources-iPad/EpisodeView~ipad.xib | 938 ++ .../iphone/Resources-iPad/LegalView~ipad.xib | 639 + .../Resources-iPad/LevelSelectView~ipad.xib | 898 ++ .../Resources-iPad/MainMenuView~ipad.xib | 1017 ++ .../Resources-iPad/SettingsView~ipad.xib | 1675 ++ .../iphone/Resources-iPad/SkillView~ipad.xib | 1250 ++ .../iphone/Resources-iPad/TriviaView~ipad.xib | 1323 ++ wolf3d/code/iphone/SettingsView.xib | 1684 ++ wolf3d/code/iphone/SettingsViewController.h | 56 + wolf3d/code/iphone/SettingsViewController.m | 282 + wolf3d/code/iphone/SkillView.xib | 1250 ++ wolf3d/code/iphone/SkillViewController.h | 41 + wolf3d/code/iphone/SkillViewController.m | 134 + wolf3d/code/iphone/TriviaView.xib | 1327 ++ wolf3d/code/iphone/TriviaViewController.h | 43 + wolf3d/code/iphone/TriviaViewController.m | 139 + wolf3d/code/iphone/UIFontButton.h | 30 + wolf3d/code/iphone/UIFontButton.m | 34 + wolf3d/code/iphone/UIFontLabel.h | 30 + wolf3d/code/iphone/UIFontLabel.m | 34 + wolf3d/code/iphone/UITableViewScrolling.h | 35 + wolf3d/code/iphone/UITableViewScrolling.m | 74 + wolf3d/code/iphone/WolfSlider.h | 31 + wolf3d/code/iphone/WolfSlider.m | 40 + wolf3d/code/iphone/gles_glue.c | 20 +- wolf3d/code/iphone/gles_glue.h | 1 + wolf3d/code/iphone/hud.c | 247 +- wolf3d/code/iphone/iphone_alerts.h | 17 +- wolf3d/code/iphone/iphone_alerts.m | 42 +- wolf3d/code/iphone/iphone_downloadSOD.m | 203 +- wolf3d/code/iphone/iphone_downloadUserMap.m | 16 +- wolf3d/code/iphone/iphone_loop.c | 444 +- wolf3d/code/iphone/iphone_main.c | 57 +- wolf3d/code/iphone/iphone_mapselector.c | 67 +- wolf3d/code/iphone/iphone_menus.c | 902 +- wolf3d/code/iphone/iphone_qgl.h | 13 +- wolf3d/code/iphone/iphone_store.h | 69 + wolf3d/code/iphone/iphone_store.m | 350 + wolf3d/code/iphone/iphone_sys.m | 286 +- wolf3d/code/iphone/iphone_wolf.h | 127 +- wolf3d/code/iphone/main.m | 24 +- wolf3d/code/iphone/untgz.c | 703 + .../wolf3d.xcodeproj/greghodges.mode1v3 | 171 +- .../wolf3d.xcodeproj/greghodges.pbxuser | 668 +- .../iphone/wolf3d.xcodeproj/project.pbxproj | 849 +- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | 13352 ++++++++++++++++ .../WorkspaceSettings.xcsettings | 8 + .../wolf3d.xcodeproj/ryan.gerleve.mode1v3 | 1621 ++ .../wolf3d.xcodeproj/ryan.gerleve.pbxuser | 3284 ++++ .../xcdebugger/Breakpoints.xcbkptlist | 19 + .../xcschemes/wolf3d.xcscheme | 76 + .../xcschemes/xcschememanagement.plist | 22 + wolf3d/code/iphone/wolf3dAppDelegate.h | 37 +- wolf3d/code/iphone/wolf3dAppDelegate.m | 273 +- wolf3d/code/iphone/wolf3dViewController.h | 48 + wolf3d/code/iphone/wolf3dViewController.m | 237 + wolf3d/code/iphone/wolf3d_Prefix.pch | 23 + wolf3d/code/wolf/wolf_ai_com.c | 3 + wolf3d/code/wolf/wolf_client_main.c | 4 +- wolf3d/code/wolf/wolf_level.c | 8 +- wolf3d/code/wolf/wolf_local.h | 3 + wolf3d/code/wolf/wolf_main.c | 2 +- wolf3d/code/wolf/wolf_opengl.c | 69 +- wolf3d/code/wolf/wolf_player.c | 6 +- wolf3d/code/wolf/wolf_powerups.c | 14 +- wolf3d/code/wolf/wolf_renderer.h | 1 + wolf3d/code/wolfiphone.h | 34 +- wolf3d/readme_iWolf_v1x.txt | 22 + wolf3d/scripts/scrubBase.pl | 16 - wolf3d/wolfextractor/adlib/adlib.c | 359 + wolf3d/wolfextractor/adlib/adlib.h | 90 + wolf3d/wolfextractor/adlib/fmopl.c | 1032 ++ wolf3d/wolfextractor/adlib/fmopl.h | 134 + wolf3d/wolfextractor/filesys/file.c | 383 + wolf3d/wolfextractor/filesys/file.h | 118 + wolf3d/wolfextractor/filesys/unix/glob.c | 183 + wolf3d/wolfextractor/filesys/unix/glob.h | 21 + wolf3d/wolfextractor/filesys/unix/unix_file.c | 337 + wolf3d/wolfextractor/filesys/win32/win_file.c | 398 + wolf3d/wolfextractor/hq2x.c | 2917 ++++ wolf3d/wolfextractor/hq2x.h | 32 + wolf3d/wolfextractor/loaders/tga.c | 531 + wolf3d/wolfextractor/loaders/tga.h | 55 + wolf3d/wolfextractor/loaders/wav.c | 144 + wolf3d/wolfextractor/loaders/wav.h | 39 + wolf3d/wolfextractor/mac/mac.c | 1083 ++ wolf3d/wolfextractor/mac/mac.h | 53 + wolf3d/wolfextractor/main.c | 391 + wolf3d/wolfextractor/makefile | 191 + wolf3d/wolfextractor/makefile.freebsd | 190 + wolf3d/wolfextractor/memory/memory.c | 198 + wolf3d/wolfextractor/memory/memory.h | 67 + wolf3d/wolfextractor/ogg_static.lib | Bin 0 -> 26736 bytes wolf3d/wolfextractor/pak.c | 640 + wolf3d/wolfextractor/string/com_string.c | 359 + wolf3d/wolfextractor/string/com_string.h | 79 + wolf3d/wolfextractor/vorbis_static.lib | Bin 0 -> 257718 bytes wolf3d/wolfextractor/vorbisenc_inter.c | 302 + wolf3d/wolfextractor/vorbisenc_static.lib | Bin 0 -> 1134596 bytes wolf3d/wolfextractor/wolf/wl6_name.c | 760 + wolf3d/wolfextractor/wolf/wolf_aud.c | 507 + wolf3d/wolfextractor/wolf/wolf_def.h | 919 ++ wolf3d/wolfextractor/wolf/wolf_gfx.c | 1707 ++ wolf3d/wolfextractor/wolf/wolf_map.c | 692 + wolf3d/wolfextractor/wolf/wolf_pal.c | 263 + wolf3d/wolfextractor/wolf/wolf_pm.c | 943 ++ wolf3d/wolfextractor/wolfextractor.dsp | 257 + wolf3d/wolfextractor/wolfextractor.dsw | 29 + wolf3d/wolfextractor/wolfextractor.ncb | Bin 0 -> 12774400 bytes wolf3d/wolfextractor/wolfextractor.sln | 20 + wolf3d/wolfextractor/wolfextractor.suo | Bin 0 -> 23040 bytes wolf3d/wolfextractor/wolfextractor.vcproj | 814 + .../wolfextractor.vcproj.EDEN.johnc.user | 65 + wolf3d/wolfextractor/zip/zip.h | 104 + wolf3d/wolfextractor/zip/zipfile.c | 267 + 235 files changed, 64159 insertions(+), 1386 deletions(-) create mode 100644 __MACOSX/wolf3d/._README.txt create mode 100644 __MACOSX/wolf3d/._readme_iWolf_v1x.txt create mode 100644 __MACOSX/wolf3d/code/._wolfiphone.h create mode 100644 __MACOSX/wolf3d/code/env/._fileio.c create mode 100644 __MACOSX/wolf3d/code/env/._files.c create mode 100644 __MACOSX/wolf3d/code/env/._filesystem.h create mode 100644 __MACOSX/wolf3d/code/env/._openal_main.c create mode 100644 __MACOSX/wolf3d/code/env/._opengl_draw.c create mode 100644 __MACOSX/wolf3d/code/env/._opengl_local.h create mode 100644 __MACOSX/wolf3d/code/env/._opengl_main.c create mode 100644 __MACOSX/wolf3d/code/env/._sound.c create mode 100644 __MACOSX/wolf3d/code/env/._sound_local.h create mode 100644 __MACOSX/wolf3d/code/env/._sound_sfx_id.c create mode 100644 __MACOSX/wolf3d/code/env/._sound_stream.c create mode 100644 __MACOSX/wolf3d/code/env/._texture_manager.c create mode 100644 __MACOSX/wolf3d/code/env/._texture_manager.h create mode 100644 __MACOSX/wolf3d/code/env/._unix_file.c create mode 100644 __MACOSX/wolf3d/code/env/._video.h create mode 100644 __MACOSX/wolf3d/code/iphone/._.DS_Store create mode 100644 __MACOSX/wolf3d/code/iphone/._CreditsViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._CreditsViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._EAGLView.h create mode 100644 __MACOSX/wolf3d/code/iphone/._EAGLView.m create mode 100644 __MACOSX/wolf3d/code/iphone/._EpisodeViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._EpisodeViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._Info.plist create mode 100644 __MACOSX/wolf3d/code/iphone/._LegalViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._LegalViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._LevelSelectViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._LevelSelectViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._MainMenuViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._MainMenuViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._MissionTableViewCell.h create mode 100644 __MACOSX/wolf3d/code/iphone/._MissionTableViewCell.m create mode 100644 __MACOSX/wolf3d/code/iphone/._SettingsViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._SettingsViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._SkillViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._SkillViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._TriviaViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._TriviaViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._UIFontButton.h create mode 100644 __MACOSX/wolf3d/code/iphone/._UIFontButton.m create mode 100644 __MACOSX/wolf3d/code/iphone/._UIFontLabel.h create mode 100644 __MACOSX/wolf3d/code/iphone/._UIFontLabel.m create mode 100644 __MACOSX/wolf3d/code/iphone/._UITableViewScrolling.h create mode 100644 __MACOSX/wolf3d/code/iphone/._UITableViewScrolling.m create mode 100644 __MACOSX/wolf3d/code/iphone/._WolfSlider.h create mode 100644 __MACOSX/wolf3d/code/iphone/._WolfSlider.m create mode 100644 __MACOSX/wolf3d/code/iphone/._gles_glue.c create mode 100644 __MACOSX/wolf3d/code/iphone/._gles_glue.h create mode 100644 __MACOSX/wolf3d/code/iphone/._hud.c create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_alerts.h create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_alerts.m create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_downloadSOD.m create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_downloadUserMap.m create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_loop.c create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_main.c create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_mapselector.c create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_menus.c create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_qgl.h create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_store.h create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_store.m create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_sys.m create mode 100644 __MACOSX/wolf3d/code/iphone/._iphone_wolf.h create mode 100644 __MACOSX/wolf3d/code/iphone/._main.m create mode 100644 __MACOSX/wolf3d/code/iphone/._wolf3dAppDelegate.h create mode 100644 __MACOSX/wolf3d/code/iphone/._wolf3dAppDelegate.m create mode 100644 __MACOSX/wolf3d/code/iphone/._wolf3dViewController.h create mode 100644 __MACOSX/wolf3d/code/iphone/._wolf3dViewController.m create mode 100644 __MACOSX/wolf3d/code/iphone/._wolf3d_Prefix.pch create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_ai_com.c create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_client_main.c create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_local.h create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_math.c create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_opengl.c create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_player.c create mode 100644 __MACOSX/wolf3d/code/wolf/._wolf_renderer.h create mode 100644 __MACOSX/wolf3d/scripts/._scrubBase.pl create mode 100644 wolf3d/COPYING.txt create mode 100644 wolf3d/README.txt create mode 100644 wolf3d/code/iphone/.DS_Store create mode 100644 wolf3d/code/iphone/CreditsView.xib create mode 100644 wolf3d/code/iphone/CreditsViewController.h create mode 100644 wolf3d/code/iphone/CreditsViewController.m create mode 100644 wolf3d/code/iphone/EpisodeCell.xib create mode 100644 wolf3d/code/iphone/EpisodeView.xib create mode 100644 wolf3d/code/iphone/EpisodeViewController.h create mode 100644 wolf3d/code/iphone/EpisodeViewController.m create mode 100644 wolf3d/code/iphone/LegalView.xib create mode 100644 wolf3d/code/iphone/LegalViewController.h create mode 100644 wolf3d/code/iphone/LegalViewController.m create mode 100644 wolf3d/code/iphone/LevelSelectView.xib create mode 100644 wolf3d/code/iphone/LevelSelectViewController.h create mode 100644 wolf3d/code/iphone/LevelSelectViewController.m create mode 100644 wolf3d/code/iphone/MainMenuView.xib create mode 100644 wolf3d/code/iphone/MainMenuViewController.h create mode 100644 wolf3d/code/iphone/MainMenuViewController.m create mode 100644 wolf3d/code/iphone/MissionTableViewCell.h create mode 100644 wolf3d/code/iphone/MissionTableViewCell.m create mode 100644 wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/EpisodeCell~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib create mode 100644 wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib create mode 100644 wolf3d/code/iphone/SettingsView.xib create mode 100644 wolf3d/code/iphone/SettingsViewController.h create mode 100644 wolf3d/code/iphone/SettingsViewController.m create mode 100644 wolf3d/code/iphone/SkillView.xib create mode 100644 wolf3d/code/iphone/SkillViewController.h create mode 100644 wolf3d/code/iphone/SkillViewController.m create mode 100644 wolf3d/code/iphone/TriviaView.xib create mode 100644 wolf3d/code/iphone/TriviaViewController.h create mode 100644 wolf3d/code/iphone/TriviaViewController.m create mode 100644 wolf3d/code/iphone/UIFontButton.h create mode 100644 wolf3d/code/iphone/UIFontButton.m create mode 100644 wolf3d/code/iphone/UIFontLabel.h create mode 100644 wolf3d/code/iphone/UIFontLabel.m create mode 100644 wolf3d/code/iphone/UITableViewScrolling.h create mode 100644 wolf3d/code/iphone/UITableViewScrolling.m create mode 100644 wolf3d/code/iphone/WolfSlider.h create mode 100644 wolf3d/code/iphone/WolfSlider.m create mode 100644 wolf3d/code/iphone/iphone_store.h create mode 100644 wolf3d/code/iphone/iphone_store.m create mode 100644 wolf3d/code/iphone/untgz.c create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.mode1v3 create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.pbxuser create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/wolf3d.xcscheme create mode 100644 wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 wolf3d/code/iphone/wolf3dViewController.h create mode 100644 wolf3d/code/iphone/wolf3dViewController.m create mode 100644 wolf3d/readme_iWolf_v1x.txt create mode 100644 wolf3d/wolfextractor/adlib/adlib.c create mode 100644 wolf3d/wolfextractor/adlib/adlib.h create mode 100644 wolf3d/wolfextractor/adlib/fmopl.c create mode 100644 wolf3d/wolfextractor/adlib/fmopl.h create mode 100644 wolf3d/wolfextractor/filesys/file.c create mode 100644 wolf3d/wolfextractor/filesys/file.h create mode 100644 wolf3d/wolfextractor/filesys/unix/glob.c create mode 100644 wolf3d/wolfextractor/filesys/unix/glob.h create mode 100644 wolf3d/wolfextractor/filesys/unix/unix_file.c create mode 100644 wolf3d/wolfextractor/filesys/win32/win_file.c create mode 100644 wolf3d/wolfextractor/hq2x.c create mode 100644 wolf3d/wolfextractor/hq2x.h create mode 100644 wolf3d/wolfextractor/loaders/tga.c create mode 100644 wolf3d/wolfextractor/loaders/tga.h create mode 100644 wolf3d/wolfextractor/loaders/wav.c create mode 100644 wolf3d/wolfextractor/loaders/wav.h create mode 100644 wolf3d/wolfextractor/mac/mac.c create mode 100644 wolf3d/wolfextractor/mac/mac.h create mode 100644 wolf3d/wolfextractor/main.c create mode 100644 wolf3d/wolfextractor/makefile create mode 100644 wolf3d/wolfextractor/makefile.freebsd create mode 100644 wolf3d/wolfextractor/memory/memory.c create mode 100644 wolf3d/wolfextractor/memory/memory.h create mode 100644 wolf3d/wolfextractor/ogg_static.lib create mode 100644 wolf3d/wolfextractor/pak.c create mode 100644 wolf3d/wolfextractor/string/com_string.c create mode 100644 wolf3d/wolfextractor/string/com_string.h create mode 100644 wolf3d/wolfextractor/vorbis_static.lib create mode 100644 wolf3d/wolfextractor/vorbisenc_inter.c create mode 100644 wolf3d/wolfextractor/vorbisenc_static.lib create mode 100644 wolf3d/wolfextractor/wolf/wl6_name.c create mode 100644 wolf3d/wolfextractor/wolf/wolf_aud.c create mode 100644 wolf3d/wolfextractor/wolf/wolf_def.h create mode 100644 wolf3d/wolfextractor/wolf/wolf_gfx.c create mode 100644 wolf3d/wolfextractor/wolf/wolf_map.c create mode 100644 wolf3d/wolfextractor/wolf/wolf_pal.c create mode 100644 wolf3d/wolfextractor/wolf/wolf_pm.c create mode 100644 wolf3d/wolfextractor/wolfextractor.dsp create mode 100644 wolf3d/wolfextractor/wolfextractor.dsw create mode 100644 wolf3d/wolfextractor/wolfextractor.ncb create mode 100644 wolf3d/wolfextractor/wolfextractor.sln create mode 100644 wolf3d/wolfextractor/wolfextractor.suo create mode 100644 wolf3d/wolfextractor/wolfextractor.vcproj create mode 100644 wolf3d/wolfextractor/wolfextractor.vcproj.EDEN.johnc.user create mode 100644 wolf3d/wolfextractor/zip/zip.h create mode 100644 wolf3d/wolfextractor/zip/zipfile.c diff --git a/__MACOSX/wolf3d/._README.txt b/__MACOSX/wolf3d/._README.txt new file mode 100644 index 0000000000000000000000000000000000000000..c8ef17d26fc4f1fe9316414daa22931f1df515bc GIT binary patch literal 167 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aVZdk_{)Kq2;dkJ62z3Nas;Rpq+<>c vbE9cvM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`e@CMIX*mE;#^SQ`KU^cWTt literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/._readme_iWolf_v1x.txt b/__MACOSX/wolf3d/._readme_iWolf_v1x.txt new file mode 100644 index 0000000000000000000000000000000000000000..5a667fae6a28ef1f9362b0847011619f2279fe1e GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3NQUFv6(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PQ3q5C(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P9t~6q(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P9s^Vg(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P9uHIs(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUI$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUIbJM(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUIJ7K(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUJ6tS(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUJX$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUJFzT(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUI$bP(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PUJq0X(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P-T+hz(lG~! z`GFW2FakMHaq;B*T)o7Cf}B*nkkpD2*SzHXl+3(zpn}qpG+hg8Lt_&oLvu?D696?c B6?y;w literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/env/._texture_manager.h b/__MACOSX/wolf3d/code/env/._texture_manager.h new file mode 100644 index 0000000000000000000000000000000000000000..27b01ade0b5d43d9718125fdc50672e3670df141 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P-Uw6*(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P-U?I-(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P-U(C+(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}u>uf-_(4Dn2M%x+Dgyuy>I7i` literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._CreditsViewController.h b/__MACOSX/wolf3d/code/iphone/._CreditsViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..aa1151514a6d9919664155e9c25b67a4203be243 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PJ_)E4q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;I@1-5 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._CreditsViewController.m b/__MACOSX/wolf3d/code/iphone/._CreditsViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..fcb90ed252c235aa97ee1ac7a2bf65f0cd143879 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PJ{hPKq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;J0lg1 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._EAGLView.h b/__MACOSX/wolf3d/code/iphone/._EAGLView.h new file mode 100644 index 0000000000000000000000000000000000000000..0ce169582287b95c1934d4955ec0fcc7ea7d3f25 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PJ_D!}q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;JhK&& literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._EAGLView.m b/__MACOSX/wolf3d/code/iphone/._EAGLView.m new file mode 100644 index 0000000000000000000000000000000000000000..daea6941e6725d6ac7933c124d17247f1830d9c2 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PJ`<=Eq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Jp&b! literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._EpisodeViewController.h b/__MACOSX/wolf3d/code/iphone/._EpisodeViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..280f1d072887bac4c620bb142de02a86160332d2 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PJ_o22qyt3r yqiJJAh>IuZ=jtUE6y&7pg``%LxaKA2r)1`(0~M5(r0H5%8ycG!8Jb&Km;eAh^A(l= literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._EpisodeViewController.m b/__MACOSX/wolf3d/code/iphone/._EpisodeViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..2a43dad88d3379b0cc09c37ab2f2b2717470818e GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PJ{PDIq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;K0_6k literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._Info.plist b/__MACOSX/wolf3d/code/iphone/._Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..2c437f74b93960400e5dad3b0fa8452c55ff595b GIT binary patch literal 220 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@hTt&@$UdJ5x_AdB#0?neJM~WNXG&o zwgF;fzzF0l0AirHRC0c$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz7?nxq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;MZ*=Z literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._LegalViewController.m b/__MACOSX/wolf3d/code/iphone/._LegalViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..0f6dc166dbb98758f4ea2a9a038566b1fec9d60f GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz741pq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;MiUjV literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._LevelSelectViewController.h b/__MACOSX/wolf3d/code/iphone/._LevelSelectViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..47ae26b981b7e6449fa6f3e2fd0f321214137239 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz5}Qfq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Mza;N literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._LevelSelectViewController.m b/__MACOSX/wolf3d/code/iphone/._LevelSelectViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..4b1fa12900f97268c2ef22dc483fe68eed153096 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz7wbvq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;M*|hJ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._MainMenuViewController.h b/__MACOSX/wolf3d/code/iphone/._MainMenuViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..f9592ccaa40a6d8f1ed754431c26885cf2b3af8c GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6Yojq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;NAnf7 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._MainMenuViewController.m b/__MACOSX/wolf3d/code/iphone/._MainMenuViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..2ad11800715b2c01372dab43934a895c1c0236d9 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz89zzq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;NJAC3 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._MissionTableViewCell.h b/__MACOSX/wolf3d/code/iphone/._MissionTableViewCell.h new file mode 100644 index 0000000000000000000000000000000000000000..b35249daab21b5d216e3bbf1f52dafeabe2d5481 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz7MDrq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;NRt(~ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._MissionTableViewCell.m b/__MACOSX/wolf3d/code/iphone/._MissionTableViewCell.m new file mode 100644 index 0000000000000000000000000000000000000000..199994612302976a90e5df19a9c3ac4966b21ac9 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz8|O*q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;NaGc` literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._SettingsViewController.h b/__MACOSX/wolf3d/code/iphone/._SettingsViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..251f4fc4fb2bd178eedb8338a8b536b1bbec5f73 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Peg>!%q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;O!F1S literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._SettingsViewController.m b/__MACOSX/wolf3d/code/iphone/._SettingsViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..284c8ffa630665f888c05a2488baa08741960e61 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Peio<{q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;O+yvO literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._SkillViewController.h b/__MACOSX/wolf3d/code/iphone/._SkillViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..a4c95297847f926d9cdcebc5b0ecd7735b92ca0c GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pejcb4q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;P2&~G literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._SkillViewController.m b/__MACOSX/wolf3d/code/iphone/._SkillViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..e8215df1d0bc5b4d8a1c045dde3f896c9e704425 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PegUWyq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;PBRtC literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._TriviaViewController.h b/__MACOSX/wolf3d/code/iphone/._TriviaViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..4b49e4eed25c8052a3b9f69ce998d20530b59884 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PehH`)q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;PSX|4 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._TriviaViewController.m b/__MACOSX/wolf3d/code/iphone/._TriviaViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..543339f33a246a0bd5e8956a2e178f1ed7a57f51 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pei^6~q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Pa_r0 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._UIFontButton.h b/__MACOSX/wolf3d/code/iphone/._UIFontButton.h new file mode 100644 index 0000000000000000000000000000000000000000..ace627433e4256d36aa67c025e47bfc1c27c4658 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Peg&u$q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;PjeN{ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._UIFontButton.m b/__MACOSX/wolf3d/code/iphone/._UIFontButton.m new file mode 100644 index 0000000000000000000000000000000000000000..b18b658693758495dee04517fe78810ddad6ca07 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Peif(`q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Ps0_@ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._UIFontLabel.h b/__MACOSX/wolf3d/code/iphone/._UIFontLabel.h new file mode 100644 index 0000000000000000000000000000000000000000..29e2a0e8a1e648b016cf68c07face1dd3d7c9aca GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PehsJ;q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;P!ko< literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._UIFontLabel.m b/__MACOSX/wolf3d/code/iphone/._UIFontLabel.m new file mode 100644 index 0000000000000000000000000000000000000000..0a251c55f35aa271a6ef616553ca156930480be4 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PejTV3q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;P-7L* literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._UITableViewScrolling.h b/__MACOSX/wolf3d/code/iphone/._UITableViewScrolling.h new file mode 100644 index 0000000000000000000000000000000000000000..b0f3b5810961c5689d2e79c94e9ccfe0b138a666 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pegmi!q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;P_q@% literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._UITableViewScrolling.m b/__MACOSX/wolf3d/code/iphone/._UITableViewScrolling.m new file mode 100644 index 0000000000000000000000000000000000000000..c53a4195a9cab916c7ff1f75017e1e159540ee6b GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PeiNt^q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Q3Dmz literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._WolfSlider.h b/__MACOSX/wolf3d/code/iphone/._WolfSlider.h new file mode 100644 index 0000000000000000000000000000000000000000..368a74ba630f32f348e176a5710e264b278c1b35 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{u`(iq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;TcZ{A literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._WolfSlider.m b/__MACOSX/wolf3d/code/iphone/._WolfSlider.m new file mode 100644 index 0000000000000000000000000000000000000000..63d54784ca61ce8be586e593b9b6cf48fee08a23 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{s*WOq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Tk{q6 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._gles_glue.c b/__MACOSX/wolf3d/code/iphone/._gles_glue.c new file mode 100644 index 0000000000000000000000000000000000000000..4e2c4ec4d1f0076e8caadb01d6ecf7ea32291228 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6hukq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;KhqVQ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._gles_glue.h b/__MACOSX/wolf3d/code/iphone/._gles_glue.h new file mode 100644 index 0000000000000000000000000000000000000000..6b8b61f70c655c0e70128f42b1096df4a8c79af8 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz8I(!q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;KqD2M literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._hud.c b/__MACOSX/wolf3d/code/iphone/._hud.c new file mode 100644 index 0000000000000000000000000000000000000000..0d38daa6c80da9e6be3e217c494ed74c3bf80aee GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz67Wgq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;KywwI literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_alerts.h b/__MACOSX/wolf3d/code/iphone/._iphone_alerts.h new file mode 100644 index 0000000000000000000000000000000000000000..a364c34dd6be866320046d96fa7a29ea02103c9d GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6_`oq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;K@%0A literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_alerts.m b/__MACOSX/wolf3d/code/iphone/._iphone_alerts.m new file mode 100644 index 0000000000000000000000000000000000000000..cdeb0b3740236df045d615f078ba0e67944c4fbb GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz8t6&q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;L1Pu6 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_downloadSOD.m b/__MACOSX/wolf3d/code/iphone/._iphone_downloadSOD.m new file mode 100644 index 0000000000000000000000000000000000000000..7bedaa77a7b01bb5054aba37a0246db8a3fae82d GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz5=Keq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;L9-R2 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_downloadUserMap.m b/__MACOSX/wolf3d/code/iphone/._iphone_downloadUserMap.m new file mode 100644 index 0000000000000000000000000000000000000000..422c8bb786768e6d090b7f0d445933be78c25c96 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz7nVuq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;LIV|} literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_loop.c b/__MACOSX/wolf3d/code/iphone/._iphone_loop.c new file mode 100644 index 0000000000000000000000000000000000000000..570dc667fdb5a489daeabedcd900f8934eedfa05 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6z)mq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;LQ@r_ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_main.c b/__MACOSX/wolf3d/code/iphone/._iphone_main.c new file mode 100644 index 0000000000000000000000000000000000000000..b502cd87e5082a541b47e37c5e4f54b6b6312f64 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P4pI%mbAXs1 xO&cRZTs%2HS1+-kASYEXB($Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6Piiq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Lh}`- literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_menus.c b/__MACOSX/wolf3d/code/iphone/._iphone_menus.c new file mode 100644 index 0000000000000000000000000000000000000000..038c0f3cc19b5285942d96cab949091acfc0242b GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz80tyq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Lqip( literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_qgl.h b/__MACOSX/wolf3d/code/iphone/._iphone_qgl.h new file mode 100644 index 0000000000000000000000000000000000000000..3f25766cbfc53a20ca3dd2510c3c0a78167a9aaa GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz7D7qq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Lz5M# literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_store.h b/__MACOSX/wolf3d/code/iphone/._iphone_store.h new file mode 100644 index 0000000000000000000000000000000000000000..b53f114ff7d2039cff5e0fc9d03c2ec71889281e GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz5%Edq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;L^Bnt literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_store.m b/__MACOSX/wolf3d/code/iphone/._iphone_store.m new file mode 100644 index 0000000000000000000000000000000000000000..92cdb0f4b94e5e58cc81aa733c9b0824b7e88233 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz7ePtq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;M1vKp literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_sys.m b/__MACOSX/wolf3d/code/iphone/._iphone_sys.m new file mode 100644 index 0000000000000000000000000000000000000000..6d38f6f97ac2ab6cc0d587c410d5058ecf10c795 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6q!lq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;MAH?l literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._iphone_wolf.h b/__MACOSX/wolf3d/code/iphone/._iphone_wolf.h new file mode 100644 index 0000000000000000000000000000000000000000..938decc98c8c1106966cd3be46517feb139ffc65 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz8R<#q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;MI#lh literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._main.m b/__MACOSX/wolf3d/code/iphone/._main.m new file mode 100644 index 0000000000000000000000000000000000000000..2dc0ff36177faae9860ebab44c23fedc77774951 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pz6+=nq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;M^hEF literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._wolf3dAppDelegate.h b/__MACOSX/wolf3d/code/iphone/._wolf3dAppDelegate.h new file mode 100644 index 0000000000000000000000000000000000000000..9b290c3d1674026f0139ffc55a63125511afa365 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{u!tgq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;StAwg literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._wolf3dAppDelegate.m b/__MACOSX/wolf3d/code/iphone/._wolf3dAppDelegate.m new file mode 100644 index 0000000000000000000000000000000000000000..9863f24713df770ce0fd11565c05272e8e2e3c46 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{spKMq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;S#uTc literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._wolf3dViewController.h b/__MACOSX/wolf3d/code/iphone/._wolf3dViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..536bd85f7dc19e73e7900ed24c044ad90ff947c0 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{tc)Uq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;S`!uU literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._wolf3dViewController.m b/__MACOSX/wolf3d/code/iphone/._wolf3dViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..25ca8a2dfb927b991083d01b2450e156320ace71 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{vD_kq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;T4NRQ literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/iphone/._wolf3d_Prefix.pch b/__MACOSX/wolf3d/code/iphone/._wolf3d_Prefix.pch new file mode 100644 index 0000000000000000000000000000000000000000..8fd8429415497ff4f511a43798bf6bc2866e815a GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P{t2iQq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;Sko2k literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/wolf/._wolf_ai_com.c b/__MACOSX/wolf3d/code/wolf/._wolf_ai_com.c new file mode 100644 index 0000000000000000000000000000000000000000..4e333a66ee15501e03dd1270c0972a015b71c79a GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PkqlG{(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PkpWZ+(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pkpol;(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3Pkq1-?(lG~! y`O&m7BE-d$^K$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PQ2$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3PQ3zBD(lG~! y`O&m7BE-d$^K(1 literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/code/wolf/._wolf_renderer.h b/__MACOSX/wolf3d/code/wolf/._wolf_renderer.h new file mode 100644 index 0000000000000000000000000000000000000000..227b30728422d0598ac1bee316d076a647943dc7 GIT binary patch literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62z3P0n!E1F$akG x(X=rl#Kn{IbM+Dn3UX5QLQ*SAT=SCiQ!?|?feK1X(sV7X4UJ8V49zVqOaL=f6?6aq literal 0 HcmV?d00001 diff --git a/__MACOSX/wolf3d/scripts/._scrubBase.pl b/__MACOSX/wolf3d/scripts/._scrubBase.pl new file mode 100644 index 0000000000000000000000000000000000000000..d64c7c5bb3c4f80624d68cd2a6e845f2ec53d263 GIT binary patch literal 167 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aVZdk_{)Kq2;dkJ62z3Xz!Inwq+<>c vbE9cvM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`e@CMIX*mE;#^SQ`KU?=}_! literal 0 HcmV?d00001 diff --git a/wolf3d/COPYING.txt b/wolf3d/COPYING.txt new file mode 100644 index 0000000..b3f64f0 --- /dev/null +++ b/wolf3d/COPYING.txt @@ -0,0 +1,345 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. \ No newline at end of file diff --git a/wolf3d/README.txt b/wolf3d/README.txt new file mode 100644 index 0000000..d4b2232 --- /dev/null +++ b/wolf3d/README.txt @@ -0,0 +1,22 @@ +WOLF3D iOS v2.1 GPL source release +=============================================== + +This file contains the following sections: + +GENERAL NOTES +LICENSE + +GENERAL NOTES +============= + +WOLF3D iOS v2.1 is a free release, and can be downloaded from +http://idsoftware.com/idstuff/wolf3d/wolf3d_ios_v21_src.zip + +This source release does not contain any game data, the game data remains subject to the original EULA and applicable law. + + +LICENSE +======= + +See COPYING.txt for the GNU GENERAL PUBLIC LICENSE. If COPYING.txt does not accompany, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + diff --git a/wolf3d/code/env/fileio.c b/wolf3d/code/env/fileio.c index de8917b..e5c9e2c 100644 --- a/wolf3d/code/env/fileio.c +++ b/wolf3d/code/env/fileio.c @@ -109,12 +109,17 @@ PUBLIC W32 FS_FileSeek( filehandle_t *fhandle, SW32 offset, W32 origin ) return 1; } + /* Commenting this out to avoid a warning - note that this is probably not what was + intended! + // offset is negative if( (fhandle->filesize + offset) < 0 ) { return 1; } + */ + // offset is negative fhandle->ptrCurrent = fhandle->ptrEnd + offset; break; @@ -223,7 +228,6 @@ PUBLIC filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes ) // high performance file mapping path, avoiding stdio fd = open( netpath, O_RDONLY ); if ( fd == -1 ) { -// return NULL; //if it couldn't be found in that path then check again in the document directory //gsh //pathBase = FS_ForceGamedir(); @@ -231,7 +235,7 @@ PUBLIC filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes ) pathBase = iphoneDocDirectory; my_snprintf( netpath, sizeof( netpath ), "%s/%s", pathBase, filename ); fd = open( netpath, O_RDONLY ); - if ( fd == -1 ) { //okay, couldn't find it there either... return null + if ( fd == -1 ) { return NULL; } } diff --git a/wolf3d/code/env/files.c b/wolf3d/code/env/files.c index cb9fba4..7c552fd 100644 --- a/wolf3d/code/env/files.c +++ b/wolf3d/code/env/files.c @@ -172,7 +172,16 @@ PRIVATE char **FS_ListFiles( char *findname, int *numfiles, unsigned musthave, u */ PUBLIC void FS_InitFilesystem( void ) { - char *p; - p = getenv("CWD"); - sprintf( fs_gamedir, "%s/base", p ); +#define BASE_DIRECTORY "/base" + + int length = SysIPhoneGetPathToMainBundleLength(); + + // Make sure the path will fit. + int fullPathLength = length + strlen( BASE_DIRECTORY ) + 1; + + assert( fullPathLength < MAX_OSPATH ); + + SysIPhoneGetPathToMainBundle( fs_gamedir, length + 1 ); + + strcpy( fs_gamedir + length, BASE_DIRECTORY ); } diff --git a/wolf3d/code/env/filesystem.h b/wolf3d/code/env/filesystem.h index b158fec..10a1cf8 100644 --- a/wolf3d/code/env/filesystem.h +++ b/wolf3d/code/env/filesystem.h @@ -39,6 +39,8 @@ #ifndef __FILESYSTEM_H__ #define __FILESYSTEM_H__ +#include "arch.h" + #define MAX_GAMEPATH 256 // max length of a game pathname #define MAX_OSPATH 256 // max length of a filesystem pathname diff --git a/wolf3d/code/env/openal_main.c b/wolf3d/code/env/openal_main.c index ff3d2d0..328a49c 100644 --- a/wolf3d/code/env/openal_main.c +++ b/wolf3d/code/env/openal_main.c @@ -76,12 +76,16 @@ W16 numSoundDevices, numDefaultSoundDevice; PRIVATE void Sound_Device_getDeviceList( void ) { char deviceName[ 256 ]; - + ALboolean isExtensionPresent = AL_FALSE; + my_strlcpy( deviceName, s_device->string, sizeof( deviceName ) ); - if( pfalcIsExtensionPresent( NULL, (ALubyte*)"ALC_ENUMERATION_EXT") == AL_TRUE ) + isExtensionPresent = pfalcIsExtensionPresent( NULL, (ALubyte*)"ALC_ENUMERATION_EXT"); + ALC_CheckErrors(); + if( isExtensionPresent == AL_TRUE ) { // try out enumeration extension deviceList = (char *)pfalcGetString( NULL, ALC_DEVICE_SPECIFIER ); + ALC_CheckErrors(); for( numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices ) { sound_devices[ numSoundDevices ] = NULL; @@ -200,12 +204,14 @@ PUBLIC _boolean Sound_Device_Setup( void ) if( Context ) { pfalcDestroyContext( Context ); + ALC_CheckErrors(); Context = NULL; } if( Device ) { pfalcCloseDevice( Device ); + ALC_CheckErrors(); Device = NULL; } @@ -230,7 +236,9 @@ PUBLIC void Sound_Device_Shutdown( void ) if( Context ) { pfalcMakeContextCurrent( NULL ); + ALC_CheckErrors(); pfalcDestroyContext( Context ); + ALC_CheckErrors(); Context = NULL; } @@ -238,6 +246,7 @@ PUBLIC void Sound_Device_Shutdown( void ) if( Device ) { pfalcCloseDevice( Device ); + ALC_CheckErrors(); Device = NULL; } diff --git a/wolf3d/code/env/opengl_draw.c b/wolf3d/code/env/opengl_draw.c index 8ee9aa8..62ec23e 100644 --- a/wolf3d/code/env/opengl_draw.c +++ b/wolf3d/code/env/opengl_draw.c @@ -93,20 +93,20 @@ PUBLIC void R_Draw_Character( int x, int y, int num, font_t *myfont ) R_Bind( myfont->texfont->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglTexCoord2f( fcol, frow ); pfglVertex2i( x, y ); + pfglTexCoord2f( fcol, frow+myfont->hFrac ); + pfglVertex2i( x, (y+sh*scale) ); + pfglTexCoord2f( fcol+myfont->wFrac, frow ); pfglVertex2i( x+myfont->nMaxWidth*scale, y ); pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac ); pfglVertex2i( x+myfont->nMaxWidth*scale, (y+sh*scale) ); - - pfglTexCoord2f( fcol, frow+myfont->hFrac ); - pfglVertex2i( x, (y+sh*scale) ); @@ -146,12 +146,12 @@ PUBLIC void R_Draw_StretchPic( int x, int y, int w, int h, const char *pic ) R_Bind( gl->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y ); + pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); pfglTexCoord2f( 1.0f, 0.0f ); pfglVertex2i( x+w, y ); pfglTexCoord2f( 1.0f, 1.0f ); pfglVertex2i( x+w, y+h ); - pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); pfglEnd(); } @@ -186,7 +186,7 @@ PUBLIC void R_Draw_Fill( int x, int y, int w, int h, colour3_t c ) c4[3] = 255; R_Draw_Blend( x, y, w, h, c4 ); #else - if ( revLand->value ) { + if ( deviceOrientation == ORIENTATION_LANDSCAPE_RIGHT ) { qglScissor( x, y, w, h ); } else { qglScissor( x, 320-(y+h), w, h ); @@ -203,12 +203,12 @@ PUBLIC void R_Draw_Blend( int x, int y, int w, int h, colour4_t c ) pfglDisable( GL_TEXTURE_2D ); pfglColor4ubv( c ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglVertex2i( x, y ); + pfglVertex2i( x, y+h ); pfglVertex2i( x+w, y ); pfglVertex2i( x+w, y+h ); - pfglVertex2i( x, y+h ); pfglEnd(); diff --git a/wolf3d/code/env/opengl_local.h b/wolf3d/code/env/opengl_local.h index 5d2e650..a4f738a 100644 --- a/wolf3d/code/env/opengl_local.h +++ b/wolf3d/code/env/opengl_local.h @@ -131,6 +131,7 @@ typedef struct const char *version_string; const char *extensions_string; _boolean Version_1_2; + bool framebuffer_discard; } glconfig_t; diff --git a/wolf3d/code/env/opengl_main.c b/wolf3d/code/env/opengl_main.c index 729d0ab..a5dbf9d 100644 --- a/wolf3d/code/env/opengl_main.c +++ b/wolf3d/code/env/opengl_main.c @@ -284,7 +284,6 @@ PUBLIC void R_Init() int err; int a, b; - Com_Printf( "\n------ Display Initialization ------\n" ); Com_Printf( "Initializing OpenGL Subsystem\n" ); @@ -294,9 +293,6 @@ PUBLIC void R_Init() // set our "safe" modes gl_state.prev_mode = 0; - viddef.width = 480; - viddef.height = 320; - // get various GL strings gl_config.vendor_string = (char *)pfglGetString( GL_VENDOR ); Com_Printf( "GL_VENDOR: %s\n", gl_config.vendor_string ); @@ -316,7 +312,6 @@ PUBLIC void R_Init() my_strlcpy( vendor_buffer, gl_config.vendor_string, sizeof( vendor_buffer ) ); (void)my_strlwr( vendor_buffer ); - sscanf( gl_config.version_string, "%d.%d", &a, &b ); if( a >= 1 && b >= 2 ) { @@ -326,6 +321,14 @@ PUBLIC void R_Init() pfglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glMaxTexSize ); Com_Printf( "GL_MAX_TEXTURE_SIZE: %d\n", glMaxTexSize); + if ( strstr( gl_config.extensions_string, "GL_EXT_discard_framebuffer" ) != 0 ) { + gl_config.framebuffer_discard = true; + } else { + gl_config.framebuffer_discard = false; + } + + InitImmediateModeGL(); + GL_SetDefaultState(); TM_Init(); @@ -359,7 +362,7 @@ PUBLIC void PrintGLError( W32 err, const char *from ) return; } - if( from != "" ) + if( strlen(from) != 0 ) { Com_Printf( "\n\n\nGL Error: %s\n", from ); } diff --git a/wolf3d/code/env/sound.c b/wolf3d/code/env/sound.c index bd7ecc2..5282838 100644 --- a/wolf3d/code/env/sound.c +++ b/wolf3d/code/env/sound.c @@ -95,6 +95,7 @@ PRIVATE void Sound_AllocChannels( void ) for( i = 0, ch = s_channels ; i < MAX_CHANNELS ; ++i, ++ch ) { pfalGenSources( 1, &ch->sourceName ); + AL_CheckErrors(); if( pfalGetError() != AL_NO_ERROR ) { @@ -123,6 +124,7 @@ PRIVATE int Sound_ChannelState( channel_t *ch ) int state; pfalGetSourcei( ch->sourceName, AL_SOURCE_STATE, &state ); + AL_CheckErrors(); return state; } @@ -133,9 +135,16 @@ PRIVATE void Sound_PlayChannel( channel_t *ch, sfx_t *sfx ) ch->sfx = sfx; pfalSourcei( ch->sourceName, AL_BUFFER, sfx->bufferNum ); + AL_CheckErrors(); + pfalSourcei( ch->sourceName, AL_LOOPING, ch->loopSound ); + AL_CheckErrors(); + pfalSourcei( ch->sourceName, AL_SOURCE_RELATIVE, AL_FALSE ); + AL_CheckErrors(); + pfalSourcePlay( ch->sourceName ); + AL_CheckErrors(); } @@ -147,12 +156,15 @@ PRIVATE void Sound_StopChannel( channel_t *ch ) // Only deleting the entire source seems to work. pfalSourceStop( ch->sourceName ); + AL_CheckErrors(); // pfalSourceStopv( 1, &ch->sourceName ); // pfalSourcei( ch->sourceName, AL_BUFFER, 0 ); // pfalSourceRewind( ch->sourceName ); #if 1 pfalDeleteSources( 1, &ch->sourceName ); + AL_CheckErrors(); pfalGenSources( 1, &ch->sourceName ); + AL_CheckErrors(); #endif } @@ -165,14 +177,18 @@ PRIVATE void Sound_SpatializeChannel( channel_t *ch ) if( ch->entNum == 0 || ! ch->distanceMult ) { pfalSourcefv( ch->sourceName, AL_POSITION, s_listener.position ); + AL_CheckErrors(); pfalSourcefv( ch->sourceName, AL_VELOCITY, s_listener.velocity ); + AL_CheckErrors(); } else { if( ch->fixedPosition ) { pfalSource3f( ch->sourceName, AL_POSITION, ch->position[1], ch->position[2], -ch->position[0] ); + AL_CheckErrors(); pfalSource3f( ch->sourceName, AL_VELOCITY, 0, 0, 0 ); + AL_CheckErrors(); } /* else { @@ -195,17 +211,23 @@ PRIVATE void Sound_SpatializeChannel( channel_t *ch ) if( ch->distanceMult ) { pfalSourcef( ch->sourceName, AL_REFERENCE_DISTANCE, s_minDistance->value * ch->distanceMult ); + AL_CheckErrors(); } else { pfalSourcef( ch->sourceName, AL_REFERENCE_DISTANCE, s_maxDistance->value ); + AL_CheckErrors(); } pfalSourcef( ch->sourceName, AL_MAX_DISTANCE, s_maxDistance->value ); + AL_CheckErrors(); // Update volume and rolloff factor pfalSourcef( ch->sourceName, AL_GAIN, s_sfxVolume->value * ch->volume ); + AL_CheckErrors(); + pfalSourcef( ch->sourceName, AL_ROLLOFF_FACTOR, s_rolloffFactor->value ); + AL_CheckErrors(); } @@ -572,15 +594,26 @@ PUBLIC void Sound_Update( const vec3_t position, const vec3_t velocity, const ve vectorSet( &s_listener.orientation[3], up[1], -up[2], -up[0] ); pfalListenerfv( AL_POSITION, s_listener.position ); + AL_CheckErrors(); + pfalListenerfv( AL_VELOCITY, s_listener.velocity ); + AL_CheckErrors(); + pfalListenerfv( AL_ORIENTATION, s_listener.orientation ); + AL_CheckErrors(); + pfalListenerf( AL_GAIN, (s_activeApp) ? s_masterVolume->value : 0.0); + AL_CheckErrors(); // Set state pfalDistanceModel( AL_INVERSE_DISTANCE_CLAMPED ); + AL_CheckErrors(); pfalDopplerFactor( s_dopplerFactor->value ); + AL_CheckErrors(); + pfalDopplerVelocity( s_dopplerVelocity->value ); + AL_CheckErrors(); // Stream background track Sound_StreamBGTrack(); @@ -639,9 +672,26 @@ PUBLIC void Sound_Activate( _boolean active ) } pfalListenerf( AL_GAIN, ( active ) ? s_masterVolume->value : 0.0 ); + AL_CheckErrors(); +} +void AL_CheckErrors() { +#if 0 +#ifdef DEBUG + ALenum error = alGetError(); + if ( error != AL_NO_ERROR ) { + printf( "OpenAL error (al)! %d\n", error); + } +#endif +#endif } +void ALC_CheckErrors() { + //ALenum error = alcGetError(); + //if ( error != AL_NO_ERROR ) { + // printf( "OpenAL error (alc)! %d\n", error); + //} +} ///////////////////////////////////////////////////////////////////// // @@ -690,14 +740,14 @@ PRIVATE void Sound_Register( void ) { s_initSound = Cvar_Get( "s_initSound", "1", CVAR_INIT ); - s_masterVolume = Cvar_Get( "s_masterVolume", "0.3", CVAR_ARCHIVE ); //gsh changed this from "1.0" to "0.3" for the volume hack... otherwise it's too loud + s_masterVolume = Cvar_Get( "s_masterVolume", "0.6", CVAR_ARCHIVE ); //gsh changed this from "1.0" to "0.3" for the volume hack... otherwise it's too loud s_sfxVolume = Cvar_Get( "s_sfxVolume", "1.0", CVAR_ARCHIVE ); s_musicVolume = Cvar_Get( "s_musicVolume", "1.0", CVAR_ARCHIVE ); s_minDistance = Cvar_Get( "s_minDistance", "0.0", CVAR_ARCHIVE ); s_maxDistance = Cvar_Get( "s_maxDistance", "1.0", CVAR_ARCHIVE ); s_rolloffFactor = Cvar_Get( "s_rolloffFactor", "1.0", CVAR_ARCHIVE ); s_dopplerFactor = Cvar_Get( "s_dopplerFactor", "1.0", CVAR_ARCHIVE ); - s_dopplerVelocity = Cvar_Get( "s_dopplerVelocity", "0.0", CVAR_ARCHIVE ); + s_dopplerVelocity = Cvar_Get( "s_dopplerVelocity", "1.0", CVAR_ARCHIVE ); Cmd_AddCommand( "play", Sound_Play_f ); Cmd_AddCommand( "stopsound", Sound_StopSound_f ); diff --git a/wolf3d/code/env/sound_local.h b/wolf3d/code/env/sound_local.h index ad798b2..ec19e2c 100644 --- a/wolf3d/code/env/sound_local.h +++ b/wolf3d/code/env/sound_local.h @@ -106,6 +106,8 @@ extern sfx_t *Sound_FindSound( const char *name ); extern _boolean Sound_Device_Setup( void ); extern void Sound_Device_Shutdown( void ); +void AL_CheckErrors(); +void ALC_CheckErrors(); #endif /* __SOUND_LOCAL_H__ */ diff --git a/wolf3d/code/env/sound_sfx_id.c b/wolf3d/code/env/sound_sfx_id.c index 6175529..7e757f4 100644 --- a/wolf3d/code/env/sound_sfx_id.c +++ b/wolf3d/code/env/sound_sfx_id.c @@ -96,7 +96,10 @@ PRIVATE void Sound_UploadSound( W8 *data, int sample_size, int channels, sfx_t * // Upload the sound pfalGenBuffers( 1, &sfx->bufferNum ); + AL_CheckErrors(); + pfalBufferData( sfx->bufferNum, sfx->format, data, size, sfx->rate ); + AL_CheckErrors(); } else { @@ -121,7 +124,10 @@ PRIVATE void Sound_UploadSound( W8 *data, int sample_size, int channels, sfx_t * // Upload the sound pfalGenBuffers( 1, &sfx->bufferNum ); + AL_CheckErrors(); + pfalBufferData( sfx->bufferNum, sfx->format, d, size * 2, sfx->rate ); + AL_CheckErrors(); free( d ); } } @@ -163,7 +169,7 @@ PUBLIC _boolean Sound_LoadSound( sfx_t *sfx ) if ( ! LoadOggInfo( name, &data, &info ) ) { sfx->defaulted = true; - Com_Printf( "Could not find sound (%s)\n", name ); + //Com_Printf( "Could not find sound (%s)\n", name ); return false; } diff --git a/wolf3d/code/env/sound_stream.c b/wolf3d/code/env/sound_stream.c index 0a8a845..b101730 100644 --- a/wolf3d/code/env/sound_stream.c +++ b/wolf3d/code/env/sound_stream.c @@ -284,17 +284,23 @@ PUBLIC void Sound_StreamBGTrack( void ) // Unqueue and delete any processed buffers pfalGetSourcei( s_streamingChannel->sourceName, AL_BUFFERS_PROCESSED, &processed ); + AL_CheckErrors(); + if( processed > 0 ) { while (processed--) { pfalSourceUnqueueBuffers( s_streamingChannel->sourceName, 1, &buffer ); + AL_CheckErrors(); + //printf( "OpenAL unqueued %d, about to delete it!\n", buffer); pfalDeleteBuffers( 1, &buffer ); + AL_CheckErrors(); } } // Make sure we always have at least 4 buffers in the queue pfalGetSourcei( s_streamingChannel->sourceName, AL_BUFFERS_QUEUED, &queued ); + AL_CheckErrors(); while( queued < 4 ) { size = 0; @@ -340,20 +346,29 @@ PUBLIC void Sound_StreamBGTrack( void ) // Upload and queue the new buffer pfalGenBuffers( 1, &buffer ); + AL_CheckErrors(); + pfalBufferData( buffer, bgTrack.format, data, size, bgTrack.rate ); + AL_CheckErrors(); + pfalSourceQueueBuffers( s_streamingChannel->sourceName, 1, &buffer ); + AL_CheckErrors(); queued++; } // Update volume pfalSourcef( s_streamingChannel->sourceName, AL_GAIN, s_musicVolume->value ); + AL_CheckErrors(); // If not playing, then do so pfalGetSourcei( s_streamingChannel->sourceName, AL_SOURCE_STATE, &state ); + AL_CheckErrors(); + if( state != AL_PLAYING ) { pfalSourcePlay(s_streamingChannel->sourceName); + AL_CheckErrors(); } } @@ -390,17 +405,28 @@ PUBLIC void Sound_StartStreaming( void ) // hmmm... pfalDeleteSources( 1, &s_streamingChannel->sourceName ); + AL_CheckErrors(); + pfalGenSources( 1, &s_streamingChannel->sourceName ); + AL_CheckErrors(); // Set up the source pfalSourcei( s_streamingChannel->sourceName, AL_BUFFER, 0 ); + AL_CheckErrors(); pfalSourcei( s_streamingChannel->sourceName, AL_LOOPING, AL_FALSE ); + AL_CheckErrors(); pfalSourcei( s_streamingChannel->sourceName, AL_SOURCE_RELATIVE, AL_TRUE ); + AL_CheckErrors(); pfalSourcefv( s_streamingChannel->sourceName, AL_POSITION, vec3_origin ); + AL_CheckErrors(); pfalSourcefv( s_streamingChannel->sourceName, AL_VELOCITY, vec3_origin ); + AL_CheckErrors(); pfalSourcef( s_streamingChannel->sourceName, AL_REFERENCE_DISTANCE, 1.0 ); + AL_CheckErrors(); pfalSourcef( s_streamingChannel->sourceName, AL_MAX_DISTANCE, 1.0 ); + AL_CheckErrors(); pfalSourcef( s_streamingChannel->sourceName, AL_ROLLOFF_FACTOR, 0.0 ); + AL_CheckErrors(); } /* @@ -433,22 +459,30 @@ PUBLIC void Sound_StopStreaming( void ) pfalSourceStop( s_streamingChannel->sourceName ); + AL_CheckErrors(); pfalGetSourcei( s_streamingChannel->sourceName, AL_BUFFERS_PROCESSED, &processed ); + AL_CheckErrors(); if( processed > 0 ) { while( processed-- ) { pfalSourceUnqueueBuffers( s_streamingChannel->sourceName, 1, &buffer ); + AL_CheckErrors(); pfalDeleteBuffers( 1, &buffer ); + AL_CheckErrors(); } } pfalSourcei( s_streamingChannel->sourceName, AL_BUFFER, 0 ); - + AL_CheckErrors(); + // hmmm... pfalDeleteSources( 1, &s_streamingChannel->sourceName ); + AL_CheckErrors(); + pfalGenSources( 1, &s_streamingChannel->sourceName ); + AL_CheckErrors(); s_streamingChannel = NULL; } diff --git a/wolf3d/code/env/texture_manager.c b/wolf3d/code/env/texture_manager.c index d960d1d..5886557 100644 --- a/wolf3d/code/env/texture_manager.c +++ b/wolf3d/code/env/texture_manager.c @@ -349,6 +349,19 @@ PUBLIC texture_t *TM_LoadTexture( const char *name, W8 *data, int width, int hei TM_ResampleTexture( data, tex->width, tex->height, scaled, scaled_width, scaled_height, tex->bytes, INTERPOLATION_NONE ); } + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, WrapToGL( tex->WrapS ) ); + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, WrapToGL( tex->WrapT ) ); + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MinFilterToGL( tex->MipMap, tex->MinFilter ) ); + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MagFilterToGL( tex->MagFilter ) ); + +#ifdef IPHONE + if ( type == TT_Wall ) { + pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f ); + } else { + pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f ); + } +#endif + { // upload base image GLenum internalFormat[] = { GL_LUMINANCE, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA }; @@ -379,20 +392,6 @@ PUBLIC texture_t *TM_LoadTexture( const char *name, W8 *data, int width, int hei if ( scaled != data ) { Z_Free( scaled ); } - - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, WrapToGL( tex->WrapS ) ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, WrapToGL( tex->WrapT ) ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MinFilterToGL( tex->MipMap, tex->MinFilter ) ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MagFilterToGL( tex->MagFilter ) ); - -#ifdef IPHONE - if ( type == TT_Wall ) { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f ); - } else { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0 ); - } -#endif - return tex; } @@ -486,7 +485,8 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type ) // load the texture from disk // data = NULL; - if( strcmp( name + len - 4, ".tga" ) ) { + const char* const extension = name + len - 4; + if( strcmp( extension, ".tga" ) && strcmp( extension, ".png" ) ) { return r_notexture; } @@ -537,6 +537,23 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type ) tx->maxS = (float)ph->srcWidth / ph->uploadWidth; tx->maxT = (float)ph->srcHeight / ph->uploadHeight; unsigned char *s = (unsigned char *)(ph+1); + + if ( noMips ) { + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + } else { + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); + } + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + + if ( type == TT_Wall ) { + pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f ); + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); + } else { + pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f ); + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + } + pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + while( 1 ) { int size = (w*h*fi->bpp)/8; if ( fi->bpp < 16 ) { @@ -568,26 +585,27 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type ) } } FS_CloseFile( fh ); - if ( noMips ) { - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - } else { - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); - } - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - if ( type == TT_Wall ) { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - } else { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0 ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - } - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); return tx; } - // load a normal TGA - LoadTGA( name, &data, &width, &height, &bytes ); + // load a normal PNG or TGA. Prioritize PNGs, if not found, fall back to TGA. + size_t filenameLength = strlen( name ); + char * pngName = MM_MALLOC( filenameLength ); + strcpy( pngName, name ); + strcpy( pngName + filenameLength - 3, "png" ); + + // Try to load a PNG version. + LoadPNG( pngName, &data, &width, &height, &bytes ); + + MM_FREE( pngName ); + pngName = NULL; + + // Try finding a TGA if the PNG load failed. + if ( ( data == NULL ) && strcmp( extension, ".tga" ) == 0 ) { + LoadTGA( name, &data, &width, &height, &bytes ); + } + if ( data ) { tex = TM_LoadTexture( name, data, width, height, type, bytes ); MM_FREE( data ); diff --git a/wolf3d/code/env/texture_manager.h b/wolf3d/code/env/texture_manager.h index 576f02b..4c4ec45 100644 --- a/wolf3d/code/env/texture_manager.h +++ b/wolf3d/code/env/texture_manager.h @@ -39,6 +39,9 @@ #ifndef __TEXTURE_MANAGER_H__ #define __TEXTURE_MANAGER_H__ +#include "arch.h" +#include "filesystem.h" + #define MAX_TEXTURES 1024 diff --git a/wolf3d/code/env/unix_file.c b/wolf3d/code/env/unix_file.c index adc34ba..475fb5d 100644 --- a/wolf3d/code/env/unix_file.c +++ b/wolf3d/code/env/unix_file.c @@ -133,7 +133,7 @@ PUBLIC char *FS_FindFirst( const char *path, W32 musthave, W32 canthave ) { struct dirent *d; char *p; - p; + (void)p; if( fdir ) { diff --git a/wolf3d/code/env/video.h b/wolf3d/code/env/video.h index 8d12592..6141e38 100644 --- a/wolf3d/code/env/video.h +++ b/wolf3d/code/env/video.h @@ -42,6 +42,8 @@ #ifndef __VIDEO_H__ #define __VIDEO_H__ +#include "arch.h" + typedef struct vrect_s { int x, y, width, height; diff --git a/wolf3d/code/iphone/.DS_Store b/wolf3d/code/iphone/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 256 + {480, 320} + + NO + YES + 1 + YES + IBCocoaTouchFramework + + NSImage + credits_bg.png + + + + + 292 + {{21, 265}, {32, 32}} + + 1 + NO + IBCocoaTouchFramework + + NSImage + back_arrow.png + + + + + 292 + {{20, 242}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 301 + {{3, 237}, {69, 69}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 292 + + YES + + + 292 + {{94, 733}, {271, 116}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Wolfenstein 3D and Spear of Destiny originally created by id Software + + Helvetica-Bold + 20 + 16 + + + + + 1 + MCAwIDAAA + + {1, 1} + 1 + 10 + 4 + 1 + 0 + + + + 292 + {{99, 20}, {275, 59}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Wolfenstein 3D Classic Platinum + + Helvetica-Bold + 22 + 16 + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 87}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Programming + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 294}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Art + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 421}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Audio + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 910}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Programming + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 1024}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Design + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 1174}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Art + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 1303}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Audio + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 532}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Production + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{87, 639}, {307, 36}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + QA Testing + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{184, 140}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + John Carmack + + Helvetica + 17 + 16 + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 954}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + John Carmack + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1068}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + John Ramero + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1094}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Tom Hall + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{178, 1218}, {121, 23}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Adrian Carmack + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1246}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Kevin Cloud + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1351}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Bobby Prince + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{185, 338}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + John Burnett + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{185, 367}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Mike Horton + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{171, 465}, {137, 26}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Christian Antkow + + + + + {1, 1} + 1 + NO + 10 + 1 + + + + 292 + {{171, 576}, {137, 26}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Rafael Brown + + + + + {1, 1} + 1 + NO + 10 + 1 + + + + 292 + {{172, 683}, {137, 26}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Sean Palomino + + + + + {1, 1} + 1 + NO + 10 + 1 + + + + 292 + {{184, 169}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Jeff Farrand + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{184, 198}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Ryan Gerleve + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{184, 234}, {111, 21}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Greg Hodges + + + + + {1, 1} + 1 + 10 + 1 + + + {{83, 320}, {460, 1400}} + + + 3 + MCAwAA + + NO + + 3 + + IBCocoaTouchFramework + + + {480, 320} + + + 3 + MAA + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 6 + + + + creditsRoll + + + + 20 + + + + back: + + + 7 + + 21 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 8 + + + + + 12 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Credtis text roll + + + 40 + + + + + 13 + + + + + 39 + + + + + 38 + + + + + 37 + + + + + 36 + + + + + 35 + + + + + 34 + + + + + 33 + + + + + 32 + + + + + 31 + + + + + 30 + + + + + 29 + + + + + 28 + + + + + 27 + + + + + 26 + + + + + 25 + + + + + 24 + + + + + 23 + + + + + 22 + + + + + 19 + + + + + 18 + + + + + 17 + + + + + 16 + + + + + 15 + + + + + 14 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 12.IBEditorWindowLastContentRect + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 18.IBPluginDependency + 18.IBViewBoundsToFrameTransform + 19.IBPluginDependency + 19.IBViewBoundsToFrameTransform + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 24.IBPluginDependency + 24.IBViewBoundsToFrameTransform + 25.IBPluginDependency + 25.IBViewBoundsToFrameTransform + 26.IBPluginDependency + 26.IBViewBoundsToFrameTransform + 27.IBPluginDependency + 27.IBViewBoundsToFrameTransform + 28.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 29.IBPluginDependency + 29.IBViewBoundsToFrameTransform + 30.IBPluginDependency + 30.IBViewBoundsToFrameTransform + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 34.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 36.IBPluginDependency + 36.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 37.IBViewBoundsToFrameTransform + 38.IBPluginDependency + 38.IBViewBoundsToFrameTransform + 39.IBPluginDependency + 39.IBViewBoundsToFrameTransform + 40.IBPluginDependency + 40.IBViewBoundsToFrameTransform + 8.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + CreditsViewController + UIResponder + {{522, 817}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw4aAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIUAABDg4AAA + + {{387, 0}, {475, 1156}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxK7AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCkgAAxFPAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCqgAAwuwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABCrgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM4AABDDAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQAAAw2QAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQAAAw4CAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQAAAw48AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABDkwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM5AABDyQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM5AABD14AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABD0oAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMrAABEBEAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABEFQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMrAABEIAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAwz4AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM7AABDTAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAw0UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKqAABEgAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAxATAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEboAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAw8oAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEhYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEiMAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEmEAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDOQAAwyQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEmEAAA + + + P4AAAL+AAAAAAAAAw58AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUBAAABDbQAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 40 + + + + YES + + CreditsViewController + UIViewController + + back: + id + + + back: + + back: + id + + + + creditsRoll + UIView + + + creditsRoll + + creditsRoll + UIView + + + + IBProjectSource + CreditsViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + credits_bg.png + + + YES + {65, 63} + {4, 4} + {960, 640} + + + 141 + + diff --git a/wolf3d/code/iphone/CreditsViewController.h b/wolf3d/code/iphone/CreditsViewController.h new file mode 100644 index 0000000..16bf0b9 --- /dev/null +++ b/wolf3d/code/iphone/CreditsViewController.h @@ -0,0 +1,34 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + + +@interface CreditsViewController : UIViewController { + @private + IBOutlet UIView* creditsRoll; +} + +- (IBAction)back:(id)sender; + +@end diff --git a/wolf3d/code/iphone/CreditsViewController.m b/wolf3d/code/iphone/CreditsViewController.m new file mode 100644 index 0000000..bf90572 --- /dev/null +++ b/wolf3d/code/iphone/CreditsViewController.m @@ -0,0 +1,116 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "CreditsViewController.h" +#import + +#define CREDITS_ANIMATION_POINTS_PER_SECOND ( 320.0f / 6.0f ) // Six seconds to scroll up + // an iPhone screen. + +@interface CreditsViewController () + + @property (nonatomic, retain) UIView* creditsRoll; + +@end + +@implementation CreditsViewController + +@synthesize creditsRoll; + +// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +/* +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization. + } + return self; +} +*/ + +/* +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView { +} +*/ + + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + // This is the starting position of the credits text. + CGPoint startPoint = self.creditsRoll.center; + + // Set up the end point. We can stop the animation as soon as the bottom of the credits + // get to the top of the screen. + CGPoint endPoint = startPoint; + + endPoint.y = -self.creditsRoll.bounds.size.height; + + // Start credits animation + CABasicAnimation *theAnimation; + + theAnimation=[CABasicAnimation animationWithKeyPath:@"position"]; + + CGFloat pointDistance = endPoint.y - startPoint.y; + + theAnimation.duration= fabs( pointDistance ) * ( 1.0f / CREDITS_ANIMATION_POINTS_PER_SECOND ); + + theAnimation.fromValue=[NSValue valueWithCGPoint:startPoint]; + theAnimation.toValue=[NSValue valueWithCGPoint:endPoint]; + + [self.creditsRoll.layer addAnimation:theAnimation forKey:@"animatePosition"]; +} + + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + self.creditsRoll = nil; +} + + +- (void)dealloc { + [super dealloc]; +} + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +@end diff --git a/wolf3d/code/iphone/EAGLView.h b/wolf3d/code/iphone/EAGLView.h index dd2c39a..57734a0 100644 --- a/wolf3d/code/iphone/EAGLView.h +++ b/wolf3d/code/iphone/EAGLView.h @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -41,20 +44,17 @@ Note that setting the view non-opaque will only work if the EAGL surface has an UITextField *textField; @private + EAGLContext *context; + /* The pixel dimensions of the backbuffer */ - GLint backingWidth; - GLint backingHeight; - - EAGLContext *context; + GLint framebufferWidth; + GLint framebufferHeight; /* OpenGL names for the renderbuffer and framebuffers used to render to this view */ - GLuint viewRenderbuffer, viewFramebuffer; + GLuint defaultFramebuffer, colorRenderbuffer; /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ GLuint depthRenderbuffer; - - NSTimer *animationTimer; - NSTimeInterval animationInterval; //gsh... an attempt at hacking the volume button #ifdef VOLUMEHACK @@ -66,8 +66,9 @@ Note that setting the view non-opaque will only work if the EAGL surface has an } -@property NSTimeInterval animationInterval; +@property (nonatomic, retain) EAGLContext *context; -- (void)drawView; +- (void)setFramebuffer; +- (BOOL)presentFramebuffer; @end diff --git a/wolf3d/code/iphone/EAGLView.m b/wolf3d/code/iphone/EAGLView.m index 7fde3ec..cd3f59f 100644 --- a/wolf3d/code/iphone/EAGLView.m +++ b/wolf3d/code/iphone/EAGLView.m @@ -1,11 +1,25 @@ -// -// EAGLView.m -// wolf3d -// -// Created by Cass Everitt on 2/20/09. -// Copyright Id Software 2009. All rights reserved. -// - +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ #import @@ -16,8 +30,6 @@ #include "wolfiphone.h" - - //gsh //#define NOTIFYLISTEN //uncomment to receive notifications @@ -60,218 +72,235 @@ - (void)handleServerDied; @end AVSystemController *SharedAVSystemController; -EAGLView *eaglview; +EAGLView *eaglview = nil; // A class extension to declare private methods -@interface EAGLView () - -@property (nonatomic, retain) EAGLContext *context; -@property (nonatomic, assign) NSTimer *animationTimer; - -- (void) destroyFramebuffer; -- (void) swapBuffers; - +@interface EAGLView (PrivateMethods) +- (void)createFramebuffer; +- (void)deleteFramebuffer; @end - @implementation EAGLView -@synthesize context; -@synthesize animationTimer; -@synthesize animationInterval; - +@dynamic context; // You must implement this method + (Class)layerClass { return [CAEAGLLayer class]; } - //The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: -- (id)initWithCoder:(NSCoder*)coder { - self = [super initWithCoder:coder]; +- (id)initWithFrame:(CGRect)aRect { + self = [super initWithFrame:aRect]; eaglview = self; + + if ( self ) { + [self setMultipleTouchEnabled:YES]; - // Get the layer - CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; - - eaglLayer.opaque = YES; - eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: - - [NSNumber numberWithBool:NO], - kEAGLDrawablePropertyRetainedBacking, - - kEAGLColorFormatRGB565, - /* kEAGLColorFormatRGBA8, */ - kEAGLDrawablePropertyColorFormat, - - nil]; - - context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; - assert( context ); - - if ( ![EAGLContext setCurrentContext:context]) { - [self release]; - return nil; - } - self.multipleTouchEnabled = true; - - [EAGLContext setCurrentContext:context]; - - glGenFramebuffersOES(1, &viewFramebuffer); - glGenRenderbuffersOES(1, &viewRenderbuffer); - - glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); - glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); - [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; - glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); - - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); - - glGenRenderbuffersOES(1, &depthRenderbuffer); - glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); - glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); - glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); - - if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { - NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); - } - - glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); + // Support rendering at native resolution on devices with Retina displays. + if( [self respondsToSelector:@selector(contentScaleFactor)] ) { + self.contentScaleFactor = deviceScale; + } -#if 0 - // set swapinterval if possible - void *eglSwapInterval; - eglSwapInterval = dlsym( RTLD_DEFAULT, "eglSwapInterval" ); - if ( eglSwapInterval ) { - ((void(*)(int))eglSwapInterval)( 2 ); - } -#endif + // Get the layer + CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; + + eaglLayer.opaque = TRUE; + eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: + + [NSNumber numberWithBool:NO], + kEAGLDrawablePropertyRetainedBacking, + kEAGLColorFormatRGB565, + kEAGLDrawablePropertyColorFormat, + nil]; + + + + //self.multipleTouchEnabled = true; #ifdef VOLUMEHACK - //------------------- - // Volume Button Hack - //gsh - // Note: MediaPlayer framework required for this trick - //create a MPVolumeView to hack the volume button - CGRect frame = CGRectMake(0, -30, 180, 10); //put this thing offscreen - volumeView = [[[MPVolumeView alloc] initWithFrame:frame] autorelease]; - [volumeView sizeToFit]; - [self addSubview:volumeView]; - - // Find the volume view slider - for (UIView *view in [volumeView subviews]){ - if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) { - volumeViewSlider = (UISlider *)view; + //------------------- + // Volume Button Hack + //gsh + // Note: MediaPlayer framework required for this trick + //create a MPVolumeView to hack the volume button + CGRect frame = CGRectMake(0, -30, 180, 10); //put this thing offscreen + volumeView = [[[MPVolumeView alloc] initWithFrame:frame] autorelease]; + [volumeView sizeToFit]; + [self addSubview:volumeView]; + + // Find the volume view slider + for (UIView *view in [volumeView subviews]){ + if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) { + volumeViewSlider = (UISlider *)view; + } } - } - - //listen for volume changes - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(volumeListener:) - name:@"AVSystemController_SystemVolumeDidChangeNotification" - object:nil]; + + //listen for volume changes + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(volumeListener:) + name:@"AVSystemController_SystemVolumeDidChangeNotification" + object:nil]; //--------------------- #endif #ifdef NOTIFYLISTEN //gsh - //this is a general purpose listener - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationListener:) - name:nil - object:nil]; + //this is a general purpose listener + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationListener:) + name:nil + object:nil]; #endif - - // with swapinterval, we want to update as fast as possible - float interval = 1.0 / 30.0f; - self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:interval - target:self - selector:@selector(drawView) - userInfo:nil repeats:YES]; - + } + return self; } -//gsh -- (void)viewDidLoad { - - Com_Printf("\n---------------\nviewDidLoad() called\n---------------\n\n"); +- (void)setContext:(EAGLContext *)newContext +{ + if (context != newContext) + { + [self deleteFramebuffer]; + + [context release]; + context = [newContext retain]; + + [EAGLContext setCurrentContext:nil]; + } } -- (void)drawView { +- (void)createFramebuffer +{ + if (context && !defaultFramebuffer) + { + [EAGLContext setCurrentContext:context]; - [ (wolf3dAppDelegate *)[UIApplication sharedApplication].delegate restartAccelerometerIfNeeded]; - -#if 0 - //------------------ - // Volume button hack - { - if ( SharedAVSystemController ) { - float newVolume; - NSString *categoryName; - static float activeVolume = 0.9; - if ([SharedAVSystemController getActiveCategoryVolume:&newVolume andName:&categoryName]) { - if (activeVolume < newVolume) { - [SharedAVSystemController setActiveCategoryVolumeTo:activeVolume]; - Com_Printf( "Volume up: %i\n", Sys_Milliseconds() ); - } - } + // Create default framebuffer object. + glGenFramebuffersOES(1, &defaultFramebuffer); + glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); + + // Create color render buffer and allocate backing store. + glGenRenderbuffersOES(1, &colorRenderbuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); + + [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer]; + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &framebufferWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &framebufferHeight); + + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); + + // Create the depth render buffer and allocate backing store. + glGenRenderbuffersOES(1, &depthRenderbuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, framebufferWidth, framebufferHeight); + + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); + + if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { + NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); } - } -#endif - -#ifdef VOLUMEHACK - //------------------ - // volume hack + + // We can bind the color buffer here to avoid doing it every frame. + glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); + } +} - - //check for volume adjustments gsh - if ( menuState == IPM_CONTROLS) - { - if (lastFramesVolume != s_masterVolume->value) +- (void)deleteFramebuffer +{ + if (context) + { + [EAGLContext setCurrentContext:context]; + + if (defaultFramebuffer) + { + glDeleteFramebuffersOES(1, &defaultFramebuffer); + defaultFramebuffer = 0; + } + + if (colorRenderbuffer) + { + glDeleteRenderbuffersOES(1, &colorRenderbuffer); + colorRenderbuffer = 0; + } + + if (depthRenderbuffer) { - lastFramesVolume = s_masterVolume->value; - [volumeViewSlider setValue:lastFramesVolume animated:NO]; - [volumeViewSlider _commitVolumeChange]; + glDeleteFramebuffersOES(1, &depthRenderbuffer); + depthRenderbuffer = 0; } - } -#endif - - iphoneFrame(); // swapBuffers() will be called from here + } } - -- (void)swapBuffers { -// glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); - loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].beforeSwap = Sys_Milliseconds(); - [context presentRenderbuffer:GL_RENDERBUFFER_OES]; - loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].afterSwap = Sys_Milliseconds(); +- (void)setFramebuffer +{ + if (context) + { + [EAGLContext setCurrentContext:context]; + + if (!defaultFramebuffer) + [self createFramebuffer]; + + //glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); + + //glViewport(0, 0, framebufferWidth, framebufferHeight); + } } -- (void)layoutSubviews { - [self drawView]; +- (BOOL)presentFramebuffer +{ + BOOL success = FALSE; + + if (context) + { + [EAGLContext setCurrentContext:context]; + + //glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); + + if ( gl_config.framebuffer_discard ) { + const GLenum discards[] = {GL_DEPTH_ATTACHMENT_OES}; + glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES,1,discards); + } + + + loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].beforeSwap = Sys_Milliseconds(); + success = [context presentRenderbuffer:GL_RENDERBUFFER_OES]; + loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].afterSwap = Sys_Milliseconds(); + } + + return success; } - -- (void)destroyFramebuffer { - glDeleteFramebuffersOES(1, &viewFramebuffer); - viewFramebuffer = 0; - glDeleteRenderbuffersOES(1, &viewRenderbuffer); - viewRenderbuffer = 0; - glDeleteRenderbuffersOES(1, &depthRenderbuffer); - depthRenderbuffer = 0; +- (void)layoutSubviews { + //float widthRatio = ( self.bounds.size.width * deviceScale ) / REFERENCE_WIDTH; + //float heightRatio = ( self.bounds.size.height * deviceScale ) / REFERENCE_HEIGHT; + + [self deleteFramebuffer]; + + /* + if ( widthRatio < heightRatio ) { + screenScale = widthRatio; + } else { + screenScale = heightRatio; + } + + // Set the global width and height so the game code can access it. + // since the game runs in landscape, we must switch width and height. + viddef.width = self.bounds.size.width * deviceScale; + viddef.height = self.bounds.size.height * deviceScale; + */ + // Need to re-arrange the HUD now that the screen changed. + if ( controlScheme ) { + HudSetForScheme( controlScheme->value ); + } } -- (void)dealloc { - if ([EAGLContext currentContext] == context) { - [EAGLContext setCurrentContext:nil]; - } - - [context release]; +- (void)dealloc { + [self deleteFramebuffer]; + [context release]; + [super dealloc]; } @@ -287,7 +316,7 @@ - (void) handleTouches:(NSSet*)touches withEvent:(UIEvent*)event { NSSet *t = [event allTouches]; for (UITouch *myTouch in t) { - CGPoint touchLocation = [myTouch locationInView:nil]; + CGPoint touchLocation = [myTouch locationInView:self]; points[ 2 * touchCount + 0 ] = touchLocation.x; points[ 2 * touchCount + 1 ] = touchLocation.y; // ( h - 1 ) - touchLocation.y; @@ -434,10 +463,6 @@ void SysIPhoneSetConsoleTextField( const char * str) { eaglview->textField.text = [ NSString stringWithUTF8String: str ]; } -void SysIPhoneSwapBuffers() { - [eaglview swapBuffers]; -} - void SysIPhoneOpenURL( const char *url ) { Com_Printf( "OpenURL char *: %s\n", url ); @@ -445,14 +470,6 @@ void SysIPhoneOpenURL( const char *url ) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString: nss]]; } -void SysIPhoneSetUIKitOrientation( int isLandscapeRight ) { - if ( isLandscapeRight ) { - [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight; - } else { - [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; - } -} - void SysIPhoneLoadJPG( W8* jpegData, int jpegBytes, W8 **pic, W16 *width, W16 *height, W16 *bytes ) { CFDataRef data; int dataBytes = 0; diff --git a/wolf3d/code/iphone/EpisodeCell.xib b/wolf3d/code/iphone/EpisodeCell.xib new file mode 100644 index 0000000..cedbbab --- /dev/null +++ b/wolf3d/code/iphone/EpisodeCell.xib @@ -0,0 +1,698 @@ + + + + 1056 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 1298 + + YES + + + 1280 + + YES + + + -2147482332 + {{0, 2}, {328, 100}} + + 3 + NO + 2 + IBCocoaTouchFramework + + NSImage + highlight_bracket.png + + + + + 1316 + {{4, 6}, {319, 92}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + episode_bracket.png + + + + + 1316 + {{13, 32}, {260, 3}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + episode_divider.png + + + + + 1316 + {{12, 10}, {314, 34}} + + NO + YES + 7 + 1 + NO + 2 + IBCocoaTouchFramework + Episode Number + + POSITYPE-idSettler_v10.2 + 20 + 16 + + + 3 + MC42NjY2NjY2NjY3AA + + + 3 + MC4zMzMzMzMzMzMzAA + + 1 + 10 + + + + 1316 + {{12, 37}, {323, 41}} + + NO + YES + 9 + 2 + NO + 2 + IBCocoaTouchFramework + Episode Name + + POSITYPE-idSettler_v10.2 + 32 + 16 + + + 3 + MQA + + + 1 + NO + 10 + + + + 1316 + {{12, 64}, {323, 41}} + + NO + YES + 9 + 2 + NO + 2 + IBCocoaTouchFramework + + + + + 1 + NO + 10 + + + {336, 103} + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {336, 103} + + + 1 + MSAxIDEAA + + 2 + IBCocoaTouchFramework + 1 + + 0 + MyIdentifier + + + + + YES + + + episodeCell + + + + 7 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + + + + 3 + + + + + 4 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + 3.IBViewBoundsToFrameTransform + 4.CustomClassName + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + EpisodeViewController + UIResponder + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAwtgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AQAAAABAAAAAA + + {{614, 707}, {672, 206}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCsAAAwjQAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUDgAABCHAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJgAABCMAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AQAAAABAoAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 11 + + + + YES + + EpisodeViewController + UIViewController + + YES + + YES + back: + next: + setEpisode: + + + YES + id + id + id + + + + YES + + YES + back: + next: + setEpisode: + + + YES + + back: + id + + + next: + id + + + setEpisode: + id + + + + + YES + + YES + episodeCell + episodeList + + + YES + UITableViewCell + UITableView + + + + YES + + YES + episodeCell + episodeList + + + YES + + episodeCell + UITableViewCell + + + episodeList + UITableView + + + + + IBProjectSource + EpisodeViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UITableViewCell + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITableViewCell.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + episode_bracket.png + episode_divider.png + highlight_bracket.png + + + YES + {606, 168} + {387, 3} + {623, 189} + + + 141 + + diff --git a/wolf3d/code/iphone/EpisodeView.xib b/wolf3d/code/iphone/EpisodeView.xib new file mode 100644 index 0000000..a1b52fa --- /dev/null +++ b/wolf3d/code/iphone/EpisodeView.xib @@ -0,0 +1,935 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 274 + {480, 320} + + NO + YES + 1 + YES + IBCocoaTouchFramework + + NSImage + wolf_bg.png + + + + + 274 + {{25, 259}, {32, 32}} + + 1 + NO + IBCocoaTouchFramework + + NSImage + back_arrow.png + + + + + 274 + {{422, 259}, {32, 32}} + + 1 + NO + IBCocoaTouchFramework + + NSImage + next_arrow.png + + + + + 274 + {{24, 240}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 274 + {{421, 240}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + NEXT + + + + 1 + 10 + 5 + + + + 274 + {{81, 8}, {128, 31}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Episode Select + + POSITYPE-idSettler_v10.2 + 24 + 16 + + + + 1 + 10 + 5 + + + + 274 + {{20, 231}, {52, 62}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 274 + {{416, 231}, {50, 62}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 274 + {{220, 299}, {46, 24}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + down_arrow.png + + + + + 274 + {{220, 11}, {46, 24}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + up_arrow.png + + + + + 274 + {{79.5, 35}, {336, 260}} + + + 3 + MCAwAA + + YES + IBCocoaTouchFramework + YES + NO + 2 + 0 + YES + 103 + + + {480, 320} + + + 1 + MCAwIDAAA + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 13 + + + + back: + + + 7 + + 36 + + + + episodeList + + + + 62 + + + + dataSource + + + + 63 + + + + delegate + + + + 64 + + + + next: + + + 7 + + 65 + + + + pageDown: + + + 7 + + 66 + + + + pageUp: + + + 7 + + 67 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 35 + + + + + 28 + + + + + 49 + + + + + 51 + + + + + 53 + + + + + 54 + + + + + 55 + + + + + 61 + + + Episode List + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 31.CustomClassName + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.CustomClassName + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 49.IBPluginDependency + 49.IBViewBoundsToFrameTransform + 51.IBPluginDependency + 51.IBViewBoundsToFrameTransform + 53.IBPluginDependency + 53.IBViewBoundsToFrameTransform + 54.CustomClassName + 54.IBPluginDependency + 54.IBViewBoundsToFrameTransform + 55.IBPluginDependency + 55.IBViewBoundsToFrameTransform + 61.IBPluginDependency + + + YES + EpisodeViewController + UIResponder + {{647, 827}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw58AAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIEAABDbQAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK4AABBUAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw2cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCFAAAw5KAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUNcAABDlYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDNgAAw5SAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIUAABDg4AAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIEAABDbQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD0oAAw2cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 67 + + + + YES + + EpisodeViewController + UIViewController + + YES + + YES + back: + next: + pageDown: + pageUp: + setEpisode: + + + YES + id + id + id + id + id + + + + YES + + YES + back: + next: + pageDown: + pageUp: + setEpisode: + + + YES + + back: + id + + + next: + id + + + pageDown: + id + + + pageUp: + id + + + setEpisode: + id + + + + + YES + + YES + episodeCell + episodeList + + + YES + UITableViewCell + UITableView + + + + YES + + YES + episodeCell + episodeList + + + YES + + episodeCell + UITableViewCell + + + episodeList + UITableView + + + + + IBProjectSource + EpisodeViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UITableViewCell + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITableViewCell.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + down_arrow.png + next_arrow.png + up_arrow.png + wolf_bg.png + + + YES + {65, 63} + {4, 4} + {80, 36} + {65, 63} + {80, 36} + {480, 320} + + + 141 + + diff --git a/wolf3d/code/iphone/EpisodeViewController.h b/wolf3d/code/iphone/EpisodeViewController.h new file mode 100644 index 0000000..6b081b6 --- /dev/null +++ b/wolf3d/code/iphone/EpisodeViewController.h @@ -0,0 +1,42 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + + +@interface EpisodeViewController : UIViewController { + IBOutlet UITableView *episodeList; + + UITableViewCell* episodeCell; +} + +@property (nonatomic, assign) IBOutlet UITableViewCell *episodeCell; + +- (IBAction)setEpisode:(id)sender; +- (IBAction)back:(id)sender; +- (IBAction)next:(id)sender; + +- (IBAction)pageDown:(id)sender; +- (IBAction)pageUp:(id)sender; + +@end diff --git a/wolf3d/code/iphone/EpisodeViewController.m b/wolf3d/code/iphone/EpisodeViewController.m new file mode 100644 index 0000000..149ba66 --- /dev/null +++ b/wolf3d/code/iphone/EpisodeViewController.m @@ -0,0 +1,355 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "EpisodeViewController.h" +#import "LevelSelectViewController.h" + +#import "wolfiphone.h" + +#define TOTAL_EPISODES 10 + +static const char * const EpisodeNames[TOTAL_EPISODES][2] = { + { "Episode 1", "Escape from Wolfenstein" }, + { "Episode 2", "Operation: Eisenfaust" }, + { "Episode 3", "Die, Fuhrer, Die!" }, + { "Episode 4", "A Dark Secret" }, + { "Episode 5", "Trail of the Madman" }, + { "Episode 6", "Confrontation" }, + { "Spear of Destiny", "Tunnels" }, + { "Spear of Destiny", "Dungeons" }, + { "Spear of Destiny", "Castle" }, + { "Spear of Destiny", "Ramparts" } +}; + + +// A class extension to declare private methods +@interface EpisodeViewController (PrivateMethods) +- (void)startLevelSelect; +- (void)setCellSelected:(BOOL)selected atIndexPath:(NSIndexPath*)indexPath; +- (void)setCellSelected:(BOOL)selected cell:(UITableViewCell*)cell; +- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath; +- (void)scrollToRow:(int)row; +@end + +@interface EpisodeViewController () + +@property (nonatomic, retain) UITableView *episodeList; + +@end + +@implementation EpisodeViewController + +@synthesize episodeList; +@synthesize episodeCell; + +// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +/* +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization. + } + return self; +} +*/ + +/* +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView { +} +*/ + + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + // TODO: Select the current episode. Haven't yet figured out a good way to get the table + // view to load with a default row selected, so for now always select episode 1. + int initialEpisode = 0; + + NSIndexPath *initialPath = [NSIndexPath indexPathForRow:initialEpisode inSection:0]; + + [self.episodeList selectRowAtIndexPath:initialPath animated:YES scrollPosition:UITableViewScrollPositionNone]; + [self handleSelectionAtIndexPath:initialPath]; +} + + + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + + [self.episodeList release]; + self.episodeList = nil; +} + + +- (void)dealloc { + [super dealloc]; +} + +// Sets the current episode with the sender's tag. IF the user selects a platinum episode but +// only has the lite version of the app, prompt him to buy the platinum version. +- (IBAction)setEpisode:(id)sender { + NSInteger requestedEpisode = [sender tag]; + + if ( SysIPhoneGetContentVersion() == CONTENT_PLATINUM || requestedEpisode == 0 ) { + Cvar_SetValue( episode->name, [sender tag] ); + [self startLevelSelect]; + } else { + // Prompt user to buy platinum version + iphonePromptToBuyPlatinum(); + } +} + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +- (IBAction)next:(id)sender { + LevelSelectViewController *lsc = [[LevelSelectViewController alloc] initWithNibName:@"LevelSelectView" bundle:nil]; + [self.navigationController pushViewController:lsc animated:YES]; + [lsc release]; +} + + +- (IBAction)pageDown:(id)sender { + // If the user taps the page down button, we want to scroll the table view so that the first + // non-visible row becomes visible. To do this, we can get the array of visible index paths, + // find the maximum row within the array, and scroll to the row just after that. + + NSArray* visibleIndexPaths = [self.episodeList indexPathsForVisibleRows]; + + int maxRow = 0; + + for ( NSIndexPath* path in visibleIndexPaths ) { + maxRow = maxRow < path.row ? path.row: maxRow; + } + + const int rowToMakeVisible = maxRow + 1; + + [self scrollToRow:rowToMakeVisible]; + +} + + +- (IBAction)pageUp:(id)sender { + + // If the user taps the page up button, we want to scroll the table view so that the first + // non-visible row becomes visible. To do this, we can get the array of visible index paths, + // find the minimum row within the array, and scroll to the row just before that. + + NSArray* visibleIndexPaths = [self.episodeList indexPathsForVisibleRows]; + + int minRow = TOTAL_EPISODES - 1; + + for ( NSIndexPath* path in visibleIndexPaths ) { + minRow = minRow < path.row ? minRow: path.row; + } + + const int rowToMakeVisible = minRow - 1; + + [self scrollToRow:rowToMakeVisible]; + +} + +- (void)scrollToRow:(int)row { + const int clampedRowMax = row < TOTAL_EPISODES? row: TOTAL_EPISODES-1; + const int clampedRow = clampedRowMax < 0? 0: clampedRowMax; + + NSIndexPath* pathToMakeVisible = [NSIndexPath indexPathForRow:clampedRow inSection:0]; + + [self.episodeList scrollToRowAtIndexPath:pathToMakeVisible atScrollPosition:UITableViewScrollPositionNone animated:YES]; +} + +- (void)startLevelSelect { + +} + + + + + + +/* +======================== + +UITableView interface + +======================== +*/ + +- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath { + + // Prompt for In-App Purchase when the user selects a level that is not currently available. + if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) { + if ( indexPath.row > 0 ) { + iphonePromptToBuyPlatinum(); + return; + } + } + + Cvar_SetValue( episode->name, indexPath.row ); + + [self setCellSelected:YES atIndexPath:indexPath]; + + /* + int episodeIndex = episode->value; + int levelIndex = indexPath.row; + + + + + realEpisode = episodeIndex; + realMap = levelIndex; + + if ( episodeIndex >= NUM_ORIGINAL_EPISODES ) { + switch (episodeIndex) + { + case 6: + if (levelIndex == 5) { + realEpisode = 7; + realMap = 8; + } + break; + case 7: + realEpisode = 6; + realMap += 5; + break; + case 8: + realEpisode = 7; + if (levelIndex == 6) + realMap = 9; + break; + case 9: + if ( levelIndex == 0) { realEpisode = 7; realMap = 6; } + if ( levelIndex == 1) { realEpisode = 7; realMap = 7; } + if ( levelIndex == 2) { realEpisode = 8; realMap = 0; } + break; + default: + break; + } + } + */ +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return TOTAL_EPISODES; +} + +static CGRect maximumNameLabelFrame = { { 0.0, 0.0 }, { 0.0, 0.0 } }; + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *MyIdentifier = @"MyIdentifier"; + UITableViewCell *cell = (UITableViewCell*)[self.episodeList dequeueReusableCellWithIdentifier:MyIdentifier]; + + if (cell == nil) { + //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; + [[NSBundle mainBundle] loadNibNamed:@"EpisodeCell" owner:self options:nil]; + + if ( episodeCell == nil ) { + // Couldn't create from nib file, load a default cell. + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; + } else { + cell = episodeCell; + self.episodeCell = nil; + + // Save the good label size here before it gets modified by the code below. + UILabel *episodeNameLabel; + episodeNameLabel = (UILabel *)[cell viewWithTag:2]; + + maximumNameLabelFrame = episodeNameLabel.frame; + } + } + + cell.selectionStyle = UITableViewCellSelectionStyleNone; + + BOOL isCellSelected = ( episode->value == indexPath.row)? YES: NO; + + [self setCellSelected:isCellSelected cell:cell]; + + UILabel *episodeNumberLabel; + episodeNumberLabel = (UILabel *)[cell viewWithTag:1]; + episodeNumberLabel.text = [NSString stringWithCString:EpisodeNames[indexPath.row][0] encoding:NSASCIIStringEncoding]; + + UILabel *episodeNameLabel; + episodeNameLabel = (UILabel *)[cell viewWithTag:2]; + NSString* episodeNameText = [NSString stringWithCString:EpisodeNames[indexPath.row][1] encoding:NSASCIIStringEncoding]; + + CGSize expectedLabelSize = [episodeNameText sizeWithFont:episodeNameLabel.font + constrainedToSize:maximumNameLabelFrame.size + lineBreakMode:episodeNameLabel.lineBreakMode]; + + //adjust the label the the new height. + CGRect newFrame = maximumNameLabelFrame; + newFrame.size.height = expectedLabelSize.height; + episodeNameLabel.frame = newFrame; + + episodeNameLabel.text = episodeNameText; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + + [self handleSelectionAtIndexPath:indexPath]; +} + +- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { + [self setCellSelected:NO atIndexPath:indexPath]; +} + +- (void)setCellSelected:(BOOL)selected atIndexPath:(NSIndexPath*)indexPath { + // Get the cell that was selected. + UITableViewCell * cell = [episodeList cellForRowAtIndexPath:indexPath]; + + [self setCellSelected:selected cell:cell]; +} + +- (void)setCellSelected:(BOOL)selected cell:(UITableViewCell*)cell { + // Get the "selected" image + UIView * selectionFrame = [cell viewWithTag:3]; + + // Show the selected image + selectionFrame.hidden = !selected; + + +} + +@end diff --git a/wolf3d/code/iphone/Info.plist b/wolf3d/code/iphone/Info.plist index 1835ef8..87d0c63 100644 --- a/wolf3d/code/iphone/Info.plist +++ b/wolf3d/code/iphone/Info.plist @@ -2,16 +2,18 @@ - - CFBundleDevelopmentRegion English CFBundleDisplayName - ${PRODUCT_NAME}+ + Wolf 3D CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIconFile - ${PRODUCT_NAME}_icon.png + CFBundleIconFiles + + WOLF_57 + WOLF_114 + WOLF_72 + CFBundleIdentifier com.idsoftware.${PRODUCT_NAME:identifier} CFBundleInfoDictionaryVersion @@ -20,30 +22,33 @@ ${PRODUCT_NAME} CFBundlePackageType APPL + CFBundleShortVersionString + CFBundleSignature ???? - CFBundleURLTypes - - - CFBundleURLName - com.idsoftware.wolf3dp - CFBundleURLSchemes - - wolf3dp - - - CFBundleVersion - 1.2 + 2.1 LSRequiresIPhoneOS - NSMainNibFile - MainWindow + UIAppFonts + + POSITYPE-idSettler10v2.otf + UIInterfaceOrientation UIInterfaceOrientationLandscapeLeft UIPrerenderedIcon UIStatusBarHidden + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationPortrait + diff --git a/wolf3d/code/iphone/LegalView.xib b/wolf3d/code/iphone/LegalView.xib new file mode 100644 index 0000000..b9545d6 --- /dev/null +++ b/wolf3d/code/iphone/LegalView.xib @@ -0,0 +1,657 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {480, 320} + + NO + IBCocoaTouchFramework + + NSImage + credits_bg.png + + + + + 292 + {{245, 14}, {134, 52}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Legal + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + 3 + MQA + + + + 1 + MCAwIDAAA + + {2, 2} + 1 + 10 + 1 + + + + 292 + {{20, 265}, {32, 32}} + + 1 + NO + IBCocoaTouchFramework + + NSImage + back_arrow.png + + + + + 292 + {{20, 243}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + + 1 + 10 + 5 + + + + 301 + {{6, 239}, {69, 69}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 292 + {{185, 59}, {255, 242}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Wolfenstein® 3D Classic Platinum© 2009-2011 id Software LLC, a ZeniMax Media company. Wolfenstein, id, id Software, id Tech and related logos are registered trademarks or trademarks of id Software LLC in the U.S. and/or other countries. Bethesda, Bethesda Softworks, ZeniMax and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the U.S. and/or other countries. All Rights Reserved. + + POSITYPE-idSettler_v10.2 + 14 + 16 + + + 1 + MSAxIDEAA + + 1 + + + + + 1 + 10 + 12 + 1 + 0 + + + + 292 + {{163, 69}, {298, 7}} + + NO + IBCocoaTouchFramework + + NSImage + settings_divider.png + + + + {480, 320} + + + 3 + MAA + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + back: + + + 7 + + 12 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 7 + + + + + 10 + + + + + 11 + + + + + 9 + + + + + 18 + + + + + 19 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 18.IBPluginDependency + 19.IBPluginDependency + 4.CustomClassName + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + LegalViewController + UIResponder + {{369, 805}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABChgAAw5EAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABChgAAw4SAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDLQAAwpQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw58AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUDAAABDbwAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 19 + + + + YES + + LegalViewController + UIViewController + + back: + id + + + back: + + back: + id + + + + IBProjectSource + LegalViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + credits_bg.png + settings_divider.png + + + YES + {65, 63} + {4, 4} + {960, 640} + {597, 13} + + + 141 + + diff --git a/wolf3d/code/iphone/LegalViewController.h b/wolf3d/code/iphone/LegalViewController.h new file mode 100644 index 0000000..89e11d3 --- /dev/null +++ b/wolf3d/code/iphone/LegalViewController.h @@ -0,0 +1,32 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ +#import + + +@interface LegalViewController : UIViewController { + +} + +- (IBAction)back:(id)sender; + +@end diff --git a/wolf3d/code/iphone/LegalViewController.m b/wolf3d/code/iphone/LegalViewController.m new file mode 100644 index 0000000..4d27604 --- /dev/null +++ b/wolf3d/code/iphone/LegalViewController.m @@ -0,0 +1,82 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "LegalViewController.h" + + +@implementation LegalViewController + +// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +/* +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization. + } + return self; +} +*/ + +/* +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView { +} +*/ + +/* +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; +} +*/ + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + + +- (void)dealloc { + [super dealloc]; +} + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +@end diff --git a/wolf3d/code/iphone/LevelSelectView.xib b/wolf3d/code/iphone/LevelSelectView.xib new file mode 100644 index 0000000..01cfd72 --- /dev/null +++ b/wolf3d/code/iphone/LevelSelectView.xib @@ -0,0 +1,976 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 256 + {480, 320} + + NO + YES + 1 + YES + IBCocoaTouchFramework + + NSImage + episode_bg.png + + + + + 292 + {{32, 260}, {32, 32}} + + 1 + NO + IBCocoaTouchFramework + + NSImage + back_arrow.png + + + + + 292 + {{421, 260}, {32, 32}} + + 1 + NO + IBCocoaTouchFramework + + NSImage + next_arrow.png + + + + + 292 + {{31, 237}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 292 + {{420, 237}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + PLAY + + + + 1 + 10 + 5 + + + + 292 + {{92, 13}, {102, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + MISSION + + POSITYPE-idSettler_v10.2 + 24 + 16 + + + + 1 + 10 + + + + 301 + {{23, 238}, {52, 56}} + + + 3 + MC42NjY2NjY2NjY3IDAAA + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 301 + {{412, 238}, {52, 56}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 274 + {{92, 42}, {297, 246}} + + + 3 + MCAwAA + + YES + IBCocoaTouchFramework + YES + NO + 2 + 0 + YES + 38 + + + + 274 + {{217, 296}, {46, 24}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + down_arrow.png + + + + + 274 + {{217, 8}, {46, 24}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + up_arrow.png + + + + {480, 320} + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 4 + + + + next: + + + 7 + + 24 + + + + back: + + + 7 + + 25 + + + + dataSource + + + + 35 + + + + delegate + + + + 36 + + + + missionList + + + + 37 + + + + pageDown: + + + 7 + + 56 + + + + pageUp: + + + 7 + + 57 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 20 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 34 + + + Mission List + + + 54 + + + + + 55 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBUserGuides + 14.CustomClassName + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.CustomClassName + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 16.CustomClassName + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 20.IBPluginDependency + 20.IBViewBoundsToFrameTransform + 21.IBPluginDependency + 21.IBViewBoundsToFrameTransform + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 54.IBPluginDependency + 54.IBViewBoundsToFrameTransform + 55.IBPluginDependency + 55.IBViewBoundsToFrameTransform + + + YES + LevelSelectViewController + UIResponder + {{299, 832}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + YES + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIEAABDbQAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK4AABBUAAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCuAAAw4QAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBuAAAw5GAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIUAABDg4AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDzgAAw5GAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPSgABDg4AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUNhAABDmAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUNhAABBgAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 57 + + + + YES + + LevelSelectViewController + UIViewController + + YES + + YES + back: + next: + pageDown: + pageUp: + selectDifficulty1: + selectDifficulty2: + selectDifficulty3: + selectDifficulty4: + + + YES + id + id + id + id + id + id + id + id + + + + YES + + YES + back: + next: + pageDown: + pageUp: + selectDifficulty1: + selectDifficulty2: + selectDifficulty3: + selectDifficulty4: + + + YES + + back: + id + + + next: + id + + + pageDown: + id + + + pageUp: + id + + + selectDifficulty1: + id + + + selectDifficulty2: + id + + + selectDifficulty3: + id + + + selectDifficulty4: + id + + + + + YES + + YES + difficultyBox + difficultyText1 + difficultyText2 + difficultyText3 + difficultyText4 + missionList + + + YES + UIView + UIView + UIView + UIView + UIView + UITableView + + + + YES + + YES + difficultyBox + difficultyText1 + difficultyText2 + difficultyText3 + difficultyText4 + missionList + + + YES + + difficultyBox + UIView + + + difficultyText1 + UIView + + + difficultyText2 + UIView + + + difficultyText3 + UIView + + + difficultyText4 + UIView + + + missionList + UITableView + + + + + IBProjectSource + LevelSelectViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + down_arrow.png + episode_bg.png + next_arrow.png + up_arrow.png + + + YES + {65, 63} + {4, 4} + {80, 36} + {480, 320} + {65, 63} + {80, 36} + + + 141 + + diff --git a/wolf3d/code/iphone/LevelSelectViewController.h b/wolf3d/code/iphone/LevelSelectViewController.h new file mode 100644 index 0000000..c9ee4e4 --- /dev/null +++ b/wolf3d/code/iphone/LevelSelectViewController.h @@ -0,0 +1,49 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + +// This object manages the level selection screen. The actual level objects are presented in +// a UITableView, so this controller adopts the protocols for being the delegate and data source +// for the table. +@interface LevelSelectViewController : + UIViewController { + +@private + IBOutlet UITableView *missionList; + + int realEpisode; + int realMap; + +} + +- (IBAction)back:(id)sender; +- (IBAction)next:(id)sender; + +- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath; + +- (IBAction)pageUp:(id)sender; +- (IBAction)pageDown:(id)sender; + + +@end diff --git a/wolf3d/code/iphone/LevelSelectViewController.m b/wolf3d/code/iphone/LevelSelectViewController.m new file mode 100644 index 0000000..8f8b07a --- /dev/null +++ b/wolf3d/code/iphone/LevelSelectViewController.m @@ -0,0 +1,314 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "LevelSelectViewController.h" +#import "wolf3dAppDelegate.h" +#import "wolfiphone.h" +#import "MissionTableViewCell.h" +#import "UITableViewScrolling.h" + +#define NUM_ORIGINAL_EPISODES 6 +#define NUM_SPEAR_EPISODES 4 + +#define MAX_SPEAR_MAPS_PER_EPISODE 7 + +extern int returnButtonFrameNum; + + +static int numLevelsTable[] = { + 10, 10, 10, 10, 10, 10, // All six classic episodes have 10 levels + // Spear of Destiny episodes + 6, // Tunnels + 5, // Dungeon + 7, // Castle + 3 }; // Ramparts + + +// Private properties and methods +@interface LevelSelectViewController () + +@property (nonatomic, retain) UITableView *missionList; + +@end + +@implementation LevelSelectViewController + +@synthesize missionList; + +// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +/* +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization. + } + return self; +} +*/ + +/* +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView { +} +*/ + + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.missionList reloadData]; + + // Select the first row by default + int levelToSelect = 0; + + if ( (int)episode->value == currentMap.episode ) { + levelToSelect = currentMap.map; + } + + NSIndexPath *ip=[NSIndexPath indexPathForRow:levelToSelect inSection:0]; + [self.missionList selectRowAtIndexPath:ip animated:YES scrollPosition:UITableViewScrollPositionNone]; + [self handleSelectionAtIndexPath:ip]; +} + + +/* +======================== + +UITableView interface + +======================== +*/ + +- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath { + int episodeIndex = episode->value; + int levelIndex = indexPath.row; + + // Prompt for In-App Purchase when the user selects a level that is not currently available. + if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) { + if ( levelIndex >= 3 ) { + iphonePromptToBuyPlatinum(); + return; + } + } + + + realEpisode = episodeIndex; + realMap = levelIndex; + + if ( episodeIndex >= NUM_ORIGINAL_EPISODES ) { + switch (episodeIndex) + { + case 6: + if (levelIndex == 5) { + realEpisode = 7; + realMap = 8; + } + break; + case 7: + realEpisode = 6; + realMap += 5; + break; + case 8: + realEpisode = 7; + if (levelIndex == 6) + realMap = 9; + break; + case 9: + if ( levelIndex == 0) { realEpisode = 7; realMap = 6; } + if ( levelIndex == 1) { realEpisode = 7; realMap = 7; } + if ( levelIndex == 2) { realEpisode = 8; realMap = 0; } + break; + default: + break; + } + } +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + // Return the number of levels based on the episode + int episodeIndex = episode->value; + + + + return numLevelsTable[ episodeIndex ]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *MyIdentifier = @"MyIdentifier"; + MissionTableViewCell *cell = (MissionTableViewCell*)[self.missionList dequeueReusableCellWithIdentifier:MyIdentifier]; + if (cell == nil) { + cell = [[[MissionTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; + } + + // Cell configuration + cell.selectionStyle = UITableViewCellSelectionStyleNone; + + // Cell text configuration + NSString* levelName = [NSString stringWithFormat:@"Level %d", indexPath.row + 1 ]; + + int episodeIndex = episode->value; + int levelIndex = indexPath.row; + + if ( episodeIndex < NUM_ORIGINAL_EPISODES ) { + // Wolfenstein episodes are the first six, and they all follow the pattern of 8 levels, + // one boss level, and one secret level. + if ( levelIndex == 8 ) { + levelName = @"Boss"; + } else if ( levelIndex == 9 ) { + levelName = @"Secret"; + } + } else { + // These are the Spear of Destiny levels. + + // Level name lookup + static const char* const spearLevelNameTable[ NUM_SPEAR_EPISODES ][ MAX_SPEAR_MAPS_PER_EPISODE ] = { + { "Level 1", "Level 2", "Level 3", "Level 4", "Boss", "Secret", NULL }, + { "Level 1", "Level 2", "Level 3", "Level 4", "Boss", NULL, NULL }, + { "Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Boss", "Secret" }, + { "Ramparts", "Death Knight", "Dungeon Dimension", NULL, NULL, NULL, NULL } }; + + const char * spearLevelName = ""; + + int spearEpisode = episodeIndex - NUM_ORIGINAL_EPISODES; + + if ( 0 <= spearEpisode && spearEpisode < NUM_SPEAR_EPISODES ) { + spearLevelName = spearLevelNameTable[ spearEpisode ][ levelIndex ]; + } + + levelName = [NSString stringWithCString:spearLevelName encoding:NSASCIIStringEncoding ]; + } + + cell.textLabel.text = levelName; + + cell.textLabel.textColor = [UIColor lightGrayColor]; + cell.textLabel.highlightedTextColor = [UIColor colorWithRed:98.0/255.0 green:149.0/255.0 blue:212.0/255.0 alpha:1.0]; + + return cell; +} + +- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell + forRowAtIndexPath:(NSIndexPath *)indexPath { + + int fontSize = 32; + + if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) { + fontSize = 48; + } + + cell.textLabel.font = [UIFont fontWithName:@"POSITYPE idSettler v10.2" + size:fontSize]; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + + [self handleSelectionAtIndexPath:indexPath]; +} + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + + self.missionList = nil; + +} + + +- (void)dealloc { + [super dealloc]; +} + + +- (IBAction)next:(id)sender { + + int levelNum = realEpisode*10+realMap; + int ch = currentMap.mapFlags[ (int)skill->value ][levelNum]; + + // don't let them go to the secret level unless they earned it + if ( (int)episode->value >= NUM_ORIGINAL_EPISODES ) { + if ( (levelNum == 78 || levelNum == 79) && !( ch & MF_TRIED ) ) { + return; + } + } else { + if ( realMap == 9 && !( ch & MF_TRIED ) ) { + return; + } + } + + wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + + [app stopMenuMusic]; + + [app showOpenGL]; + + + PL_NewGame( &Player ); + iphonePreloadBeforePlay(); + + int clampedSkill = skill->value; + if ( clampedSkill < 0 ) { + clampedSkill = 0; + } + if ( clampedSkill > 3 ) { + clampedSkill = 3; + } + + iphoneStartMap( realEpisode, realMap, clampedSkill ); + iphoneFrameNum = 0; + returnButtonFrameNum = 100; + + Sound_StartBGTrack( levelData.musicName, levelData.musicName); +} + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +- (IBAction)pageDown:(id)sender { + UITableViewScrollingPageDown( self.missionList, numLevelsTable[(int)episode->value] ); +} + + +- (IBAction)pageUp:(id)sender { + UITableViewScrollingPageUp( self.missionList, numLevelsTable[(int)episode->value] ); +} + + +@end + + diff --git a/wolf3d/code/iphone/MainMenuView.xib b/wolf3d/code/iphone/MainMenuView.xib new file mode 100644 index 0000000..c90d0ca --- /dev/null +++ b/wolf3d/code/iphone/MainMenuView.xib @@ -0,0 +1,1034 @@ + + + + 800 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 1298 + + + + 1298 + {480, 320} + + + YES + 1 + YES + 2 + IBCocoaTouchFramework + + NSImage + main_bg.png + + + + + 1343 + {{291, 243}, {157, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + + POSITYPE-idSettler_v10.2 + 42 + 16 + + {2, 2} + Resume + + 3 + MC4zMzMzMzMzMzMzAA + + + 3 + MQA + + + 1 + MCAwIDAAA + + + + + 1343 + {{40, 98}, {187, 50}} + + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + New Game + + + + + + + 1343 + {{48, 147}, {152, 50}} + + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + Settings + + + + + + + 1343 + {{63, 194}, {110, 50}} + + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + About + + + + + + + -2147482305 + {{48, 147}, {134, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + Legal + + + + + + + -2147482305 + {{40, 98}, {134, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + Credits + + + + + + + -2147482305 + {{40, 98}, {181, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + id Games + + + + + + + -2147482305 + {{48, 147}, {211, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + id Software + + + + + + + -2147482305 + {{63, 194}, {134, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + Trivia + + + + + + + -2147482305 + {{74, 243}, {134, 50}} + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + Back + + + + + + + 1343 + {{74, 243}, {120, 50}} + + + NO + 2 + IBCocoaTouchFramework + 0 + + {2, 2} + Extras + + + + + + + 1316 + {{425, 245}, {30, 30}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + star_icon.png + + + + {480, 320} + + + + 3 + MAA + + + 3 + + 2 + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + resume: + + + 7 + + 9 + + + + newGame: + + + 7 + + 10 + + + + settings: + + + 7 + + 11 + + + + about: + + + 7 + + 12 + + + + extras: + + + 7 + + 13 + + + + legal: + + + 7 + + 34 + + + + aboutButton + + + + 35 + + + + extrasButton + + + + 37 + + + + legalButton + + + + 38 + + + + newGameButton + + + + 39 + + + + resumeButton + + + + 40 + + + + settingsButton + + + + 41 + + + + backButton + + + + 44 + + + + back: + + + 7 + + 45 + + + + creditsButton + + + + 50 + + + + credits: + + + 7 + + 51 + + + + idGamesButton + + + + 58 + + + + idSoftwareButton + + + + 59 + + + + triviaButton + + + + 60 + + + + idGames: + + + 7 + + 61 + + + + idSoftware: + + + 7 + + 62 + + + + trivia: + + + 7 + + 63 + + + + resumeStar + + + + 65 + + + + + + 0 + + + + + + 1 + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 16 + + + + + 32 + + + + + 42 + + + + + 47 + + + + + 52 + + + + + 54 + + + + + 56 + + + + + 64 + + + + + + + MainMenuViewController + UIResponder + {{440, 404}, {960, 640}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAADDcAAAwx4AAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJAAABDEwAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDkYAAw5GAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDgYAAwxkAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIgAABCxAAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCIAAAwwkAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDagAAwrYAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDawAAwsIAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCVAAAw0gAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI8AABDEwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDHAAAwq4AAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJYAABDQgAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKSAABDbwAAA + + + + + + + 65 + + + + + MainMenuViewController + UIViewController + + id + id + id + id + id + id + id + id + id + id + id + id + + + + about: + id + + + back: + id + + + credits: + id + + + extras: + id + + + idGames: + id + + + idSoftware: + id + + + legal: + id + + + newGame: + id + + + oldNewGame: + id + + + resume: + id + + + settings: + id + + + trivia: + id + + + + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIView + UIButton + UIButton + + + + aboutButton + UIButton + + + backButton + UIButton + + + creditsButton + UIButton + + + extrasButton + UIButton + + + idGamesButton + UIButton + + + idSoftwareButton + UIButton + + + legalButton + UIButton + + + newGameButton + UIButton + + + resumeButton + UIButton + + + resumeStar + UIView + + + settingsButton + UIButton + + + triviaButton + UIButton + + + + IBProjectSource + MainMenuViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + wolf3d.xcodeproj + 3 + + {960, 640} + {41, 39} + + 141 + + diff --git a/wolf3d/code/iphone/MainMenuViewController.h b/wolf3d/code/iphone/MainMenuViewController.h new file mode 100644 index 0000000..fc430d4 --- /dev/null +++ b/wolf3d/code/iphone/MainMenuViewController.h @@ -0,0 +1,67 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + +@interface MainMenuViewController : UIViewController { + +@private + // Main menu + IBOutlet UIButton *resumeButton; + IBOutlet UIButton *newGameButton; + IBOutlet UIButton *settingsButton; + IBOutlet UIButton *aboutButton; + IBOutlet UIButton *extrasButton; + IBOutlet UIView* resumeStar; + + + // About menu + IBOutlet UIButton *creditsButton; + IBOutlet UIButton *legalButton; + + // Extras menu + IBOutlet UIButton *idGamesButton; + IBOutlet UIButton *idSoftwareButton; + IBOutlet UIButton *triviaButton; + + // Shared + IBOutlet UIButton *backButton; +} + +- (IBAction)resume:(id)sender; +- (IBAction)newGame:(id)sender; +- (IBAction)settings:(id)sender; +- (IBAction)about:(id)sender; +- (IBAction)extras:(id)sender; + +- (IBAction)credits:(id)sender; +- (IBAction)legal:(id)sender; +- (IBAction)back:(id)sender; + +- (IBAction)idGames:(id)sender; +- (IBAction)idSoftware:(id)sender; +- (IBAction)trivia:(id)sender; + +- (IBAction)oldNewGame:(id)sender; + +@end diff --git a/wolf3d/code/iphone/MainMenuViewController.m b/wolf3d/code/iphone/MainMenuViewController.m new file mode 100644 index 0000000..7251192 --- /dev/null +++ b/wolf3d/code/iphone/MainMenuViewController.m @@ -0,0 +1,192 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "MainMenuViewController.h" +#import "wolf3dAppDelegate.h" +#import "wolfiphone.h" + +#import "SkillViewController.h" +#import "CreditsViewController.h" +#import "LegalViewController.h" +#import "TriviaViewController.h" +#import "SettingsViewController.h" + +@interface MainMenuViewController () + + @property (nonatomic, retain) IBOutlet UIButton *resumeButton; + @property (nonatomic, retain) IBOutlet UIButton *newGameButton; + @property (nonatomic, retain) IBOutlet UIButton *settingsButton; + @property (nonatomic, retain) IBOutlet UIButton *aboutButton; + @property (nonatomic, retain) IBOutlet UIButton *extrasButton; + @property (nonatomic, retain) IBOutlet UIView *resumeStar; + + @property (nonatomic, retain) IBOutlet UIButton *creditsButton; + @property (nonatomic, retain) IBOutlet UIButton *legalButton; + + @property (nonatomic, retain) IBOutlet UIButton *idGamesButton; + @property (nonatomic, retain) IBOutlet UIButton *idSoftwareButton; + @property (nonatomic, retain) IBOutlet UIButton *triviaButton; + + @property (nonatomic, retain) IBOutlet UIButton *backButton; + + - (void) setMainHidden:(BOOL)hide; + - (void) setAboutHidden:(BOOL)hide; + - (void) setExtrasHidden:(BOOL)hide; + +@end + +@implementation MainMenuViewController + +@synthesize resumeButton, newGameButton, settingsButton, aboutButton, extrasButton, resumeStar; +@synthesize creditsButton, legalButton; +@synthesize idGamesButton, idSoftwareButton, triviaButton; +@synthesize backButton; + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + + self.resumeButton = nil; + self.newGameButton = nil; + self.settingsButton = nil; + self.aboutButton = nil; + self.extrasButton = nil; + self.resumeStar = nil; + + self.idGamesButton = nil; + self.idSoftwareButton = nil; + self.triviaButton = nil; + + self.creditsButton = nil; + self.legalButton = nil; + + self.backButton = nil; +} + +- (IBAction)resume:(id)sender { + wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + [app showOpenGL]; + iphoneResume(); +} + + +- (IBAction)newGame:(id)sender { + SkillViewController *svc = [[SkillViewController alloc] initWithNibName:@"SkillView" bundle:nil]; + [self.navigationController pushViewController:svc animated:YES]; + [svc release]; +} + +- (IBAction)settings:(id)sender { + SettingsViewController *evc = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil]; + [self.navigationController pushViewController:evc animated:YES]; + [evc release]; +} + +- (IBAction)about:(id)sender { + [self setMainHidden:YES]; + [self setAboutHidden:NO]; +} + +- (IBAction)extras:(id)sender { + [self setMainHidden:YES]; + [self setExtrasHidden:NO]; +} + +- (IBAction)credits:(id)sender { + CreditsViewController *cvc = [[CreditsViewController alloc] initWithNibName:@"CreditsView" bundle:nil]; + [self.navigationController pushViewController:cvc animated:YES]; + [cvc release]; +} + +- (IBAction)legal:(id)sender { + LegalViewController *lvc = [[LegalViewController alloc] initWithNibName:@"LegalView" bundle:nil]; + [self.navigationController pushViewController:lvc animated:YES]; + [lvc release]; +} + +- (IBAction)idGames:(id)sender { + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.com/apps/idsoftware"]]; +} + +- (IBAction)idSoftware:(id)sender { + currentYesNoBox = YESNO_GO_TO_WEBSITE; + iphoneYesNoBox("Website", "This will navigate you to idsoftware.com. Continue?"); +} + +- (IBAction)trivia:(id)sender { + TriviaViewController *tvc = [[TriviaViewController alloc] initWithNibName:@"TriviaView" bundle:nil]; + [self.navigationController pushViewController:tvc animated:YES]; + [tvc release]; + + //menuState = IPM_TRIVIA; + //wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + //[app showOpenGL]; +} + +- (IBAction)back:(id)sender { + [self setAboutHidden:YES]; + [self setExtrasHidden:YES]; + [self setMainHidden:NO]; +} + +- (void)setMainHidden:(BOOL)hide { + // Set the main menu visibility + [self.resumeButton setHidden:hide]; + [self.newGameButton setHidden:hide]; + [self.settingsButton setHidden:hide]; + [self.aboutButton setHidden:hide]; + [self.extrasButton setHidden:hide]; + [self.resumeStar setHidden:hide]; + +} + +- (void)setAboutHidden:(BOOL)hide { + // Set the about menu visibility + [self.creditsButton setHidden:hide]; + [self.legalButton setHidden:hide]; + [self.backButton setHidden:hide]; +} + +- (void)setExtrasHidden:(BOOL)hide { + // Set the extras menu visibility + [self.idGamesButton setHidden:hide]; + [self.idSoftwareButton setHidden:hide]; + [self.triviaButton setHidden:hide]; + [self.backButton setHidden:hide]; +} + + +// REMOVE WHEN NEW MENU IS READY +- (IBAction)oldNewGame:(id)sender { + menuState = IPM_SKILL; + wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + [app showOpenGL]; +} + + +@end \ No newline at end of file diff --git a/wolf3d/code/iphone/MissionTableViewCell.h b/wolf3d/code/iphone/MissionTableViewCell.h new file mode 100644 index 0000000..ae0c041 --- /dev/null +++ b/wolf3d/code/iphone/MissionTableViewCell.h @@ -0,0 +1,31 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + + +@interface MissionTableViewCell : UITableViewCell { + +} + +@end diff --git a/wolf3d/code/iphone/MissionTableViewCell.m b/wolf3d/code/iphone/MissionTableViewCell.m new file mode 100644 index 0000000..ca6c6b3 --- /dev/null +++ b/wolf3d/code/iphone/MissionTableViewCell.m @@ -0,0 +1,59 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "MissionTableViewCell.h" + + +@implementation MissionTableViewCell + +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; + if (self) { + // Initialization code. + } + return self; +} + + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state. + if ( selected ) { + self.textLabel.highlighted = YES; + } else { + self.textLabel.highlighted = NO; + } + + [self setNeedsDisplay]; + +} + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib new file mode 100644 index 0000000..eca309b --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib @@ -0,0 +1,1482 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 274 + {1024, 768} + + NO + YES + YES + IBIPadFramework + + NSImage + credits_bg.png + + + + + 292 + {{26, 45}, {63, 65}} + + 1 + NO + IBIPadFramework + + NSImage + back_arrow.png + + + + + 292 + {{23, 16}, {99, 43}} + + NO + YES + 7 + NO + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 301 + {{22, 11}, {70, 100}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 292 + + YES + + + 292 + {{55, 794}, {379, 55}} + + NO + YES + 7 + NO + IBIPadFramework + Wolfenstein 3D and Spear of Destiny originally created by id Software + + Helvetica-Bold + 20 + 16 + + + + + 1 + MCAwIDAAA + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{73, 20}, {344, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Wolfenstein 3D Classic Platinum + + Helvetica-Bold + 22 + 16 + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 87}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Programming + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 294}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Art + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 421}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Audio + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 910}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Programming + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 1024}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Design + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 1174}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Art + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{85, 1303}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Audio + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{86, 532}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + Production + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{87, 639}, {307, 36}} + + NO + YES + 7 + NO + IBIPadFramework + QA Testing + + + + + {1, 1} + 1 + 10 + 2 + 1 + 0 + + + + 292 + {{184, 140}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + John Carmack + + Helvetica + 17 + 16 + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 954}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + John Carmack + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1068}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + John Ramero + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1094}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Tom Hall + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{178, 1218}, {121, 23}} + + NO + YES + 7 + NO + IBIPadFramework + Adrian Carmack + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1246}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Kevin Cloud + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{183, 1351}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Bobby Prince + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{185, 338}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + John Burnett + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{185, 367}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Mike Horton + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{171, 465}, {137, 26}} + + NO + YES + 7 + NO + IBIPadFramework + Christian Antkow + + + + + {1, 1} + 1 + NO + 10 + 1 + + + + 292 + {{171, 576}, {137, 26}} + + NO + YES + 7 + NO + IBIPadFramework + Rafael Brown + + + + + {1, 1} + 1 + NO + 10 + 1 + + + + 292 + {{172, 683}, {137, 26}} + + NO + YES + 7 + NO + IBIPadFramework + Sean Palomino + + + + + {1, 1} + 1 + NO + 10 + 1 + + + + 292 + {{184, 169}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Jeff Farrand + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{184, 198}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Ryan Gerleve + + + + + {1, 1} + 1 + 10 + 1 + + + + 292 + {{184, 234}, {111, 21}} + + NO + YES + 7 + NO + IBIPadFramework + Greg Hodges + + + + + {1, 1} + 1 + 10 + 1 + + + {{442, 768}, {460, 1400}} + + + 3 + MCAwAA + + NO + + 3 + + IBIPadFramework + + + {1024, 768} + + + 3 + MAA + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 6 + + + + creditsRoll + + + + 20 + + + + back: + + + 7 + + 21 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 8 + + + + + 12 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Credtis text roll + + + 40 + + + + + 13 + + + + + 39 + + + + + 38 + + + + + 37 + + + + + 36 + + + + + 35 + + + + + 34 + + + + + 33 + + + + + 32 + + + + + 31 + + + + + 30 + + + + + 29 + + + + + 28 + + + + + 27 + + + + + 26 + + + + + 25 + + + + + 24 + + + + + 23 + + + + + 22 + + + + + 19 + + + + + 18 + + + + + 17 + + + + + 16 + + + + + 15 + + + + + 14 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 12.IBEditorWindowLastContentRect + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 18.IBPluginDependency + 18.IBViewBoundsToFrameTransform + 19.IBPluginDependency + 19.IBViewBoundsToFrameTransform + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 24.IBPluginDependency + 24.IBViewBoundsToFrameTransform + 25.IBPluginDependency + 25.IBViewBoundsToFrameTransform + 26.IBPluginDependency + 26.IBViewBoundsToFrameTransform + 27.IBPluginDependency + 27.IBViewBoundsToFrameTransform + 28.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 29.IBPluginDependency + 29.IBViewBoundsToFrameTransform + 30.IBPluginDependency + 30.IBViewBoundsToFrameTransform + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 34.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 36.IBPluginDependency + 36.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 37.IBViewBoundsToFrameTransform + 38.IBPluginDependency + 38.IBViewBoundsToFrameTransform + 39.IBPluginDependency + 39.IBViewBoundsToFrameTransform + 40.IBPluginDependency + 40.IBViewBoundsToFrameTransform + 8.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + CreditsViewController + UIResponder + {{174, 377}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDkgAAw/aAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDkoAAxAHAAA + + {{387, 0}, {475, 1156}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxK7AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCkgAAxFPAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCqgAAwuwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABCrgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM4AABDDAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQAAAw2QAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQAAAw4CAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQAAAw48AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABDkwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM5AABDyQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM5AABD14AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABD0oAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMrAABEBEAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKsAABEFQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMrAABEIAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAwz4AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM7AABDTAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAw0UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKqAABEgAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAxATAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEboAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrgAAw8oAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEhYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEiMAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEmEAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDOQAAwyQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUM3AABEmEAAA + + + P4AAAL+AAAAAAAAAw58AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGwAABBoAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 40 + + + + YES + + CreditsViewController + UIViewController + + back: + id + + + back: + + back: + id + + + + creditsRoll + UIView + + + creditsRoll + + creditsRoll + UIView + + + + IBProjectSource + CreditsViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + credits_bg.png + + + YES + {65, 63} + {4, 4} + {960, 640} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/EpisodeCell~ipad.xib b/wolf3d/code/iphone/Resources-iPad/EpisodeCell~ipad.xib new file mode 100644 index 0000000..5ed5a76 --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/EpisodeCell~ipad.xib @@ -0,0 +1,678 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 1298 + + YES + + + 1280 + + YES + + + -2147482332 + {{1, 5}, {610, 180}} + + 3 + NO + 1 + IBIPadFramework + + NSImage + highlight_bracket.png + + + + + 1316 + {{6, 13}, {598, 163}} + + NO + 1 + IBIPadFramework + + NSImage + episode_bracket.png + + + + + 1316 + {{13, 61}, {387, 3}} + + NO + 1 + IBIPadFramework + + NSImage + episode_divider.png + + + + + 1316 + {{18, 24}, {586, 52}} + + NO + YES + 7 + 1 + NO + 1 + IBIPadFramework + Episode Number + + POSITYPE-idSettler_v10.2 + 44 + 16 + + + 3 + MC42NjY2NjY2NjY3AA + + + 3 + MC4zMzMzMzMzMzMzAA + + 1 + 10 + + + + 1316 + {{17, 67}, {586, 75}} + + NO + YES + 9 + 2 + NO + 1 + IBIPadFramework + Episode Name + + POSITYPE-idSettler_v10.2 + 64 + 16 + + + 3 + MQA + + + 1 + NO + 10 + + + {618, 189} + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {618, 189} + + + 1 + MSAxIDEAA + + 1 + IBIPadFramework + 1 + + 0 + MyIdentifier + + + + + YES + + + episodeCell + + + + 7 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + + + 3 + + + + + 4 + + + + + 8 + + + + + 9 + + + + + 11 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + 3.IBViewBoundsToFrameTransform + 4.CustomClassName + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + EpisodeViewController + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AQAAAABAAAAAA + + {{415, 957}, {618, 189}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCsAAAwjQAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUDgAABCHAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJgAABCMAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AQAAAABAoAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 11 + + + + YES + + EpisodeViewController + UIViewController + + YES + + YES + back: + next: + pageDown: + pageUp: + setEpisode: + + + YES + id + id + id + id + id + + + + YES + + YES + back: + next: + pageDown: + pageUp: + setEpisode: + + + YES + + back: + id + + + next: + id + + + pageDown: + id + + + pageUp: + id + + + setEpisode: + id + + + + + YES + + YES + episodeCell + episodeList + + + YES + UITableViewCell + UITableView + + + + YES + + YES + episodeCell + episodeList + + + YES + + episodeCell + UITableViewCell + + + episodeList + UITableView + + + + + IBProjectSource + EpisodeViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UITableViewCell + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITableViewCell.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + episode_bracket.png + episode_divider.png + highlight_bracket.png + + + YES + {606, 168} + {387, 3} + {623, 189} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib new file mode 100644 index 0000000..f192f9a --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib @@ -0,0 +1,938 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 274 + {1024, 768} + + NO + YES + YES + IBIPadFramework + + NSImage + episode_bg.png + + + + + 274 + {{68, 87}, {63, 65}} + + 1 + NO + IBIPadFramework + + NSImage + back_arrow.png + + + + + 274 + {{66, 58}, {99, 43}} + + NO + YES + 7 + NO + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 274 + {{899, 87}, {63, 65}} + + 1 + NO + IBIPadFramework + + NSImage + next_arrow.png + + + + + 274 + {{897, 58}, {99, 43}} + + NO + YES + 7 + NO + IBIPadFramework + NEXT + + + + 1 + 10 + 5 + + + + 274 + {{191, 47}, {214, 57}} + + NO + YES + 7 + NO + IBIPadFramework + EPISODE + + POSITYPE-idSettler_v10.2 + 48 + 16 + + + + 1 + 10 + 5 + + + + 274 + {{205, 104}, {625, 577}} + + + 3 + MCAwAA + + YES + IBIPadFramework + YES + NO + 2 + 0 + YES + 189 + + + + 274 + {{63, 49}, {73, 105}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 274 + {{893, 50}, {73, 105}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 274 + {{478, 715}, {80, 36}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + down_arrow.png + + + + + 274 + {{478, 37}, {80, 36}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + up_arrow.png + + + + {1024, 768} + + + 1 + MCAwIDAAA + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 13 + + + + back: + + + 7 + + 36 + + + + dataSource + + + + 51 + + + + delegate + + + + 52 + + + + episodeList + + + + 53 + + + + pageUp: + + + 7 + + 54 + + + + pageDown: + + + 7 + + 55 + + + + next: + + + 7 + + 58 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 28 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 35 + + + + + 48 + + + + + 49 + + + + + 50 + + + Episode List + + + 56 + + + + + 59 + + + + + 60 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 31.CustomClassName + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.CustomClassName + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 48.IBPluginDependency + 48.IBViewBoundsToFrameTransform + 49.IBPluginDependency + 49.IBViewBoundsToFrameTransform + 50.IBPluginDependency + 50.IBViewBoundsToFrameTransform + 56.IBPluginDependency + 56.IBViewBoundsToFrameTransform + 59.IBPluginDependency + 59.IBViewBoundsToFrameTransform + 60.CustomClassName + 60.IBPluginDependency + 60.IBViewBoundsToFrameTransform + + + YES + EpisodeViewController + UIResponder + {{179, 382}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxD+AAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKEAABCaAAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDtgAAw4QAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCaAAAw56AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKIAABCrgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD+wAAw7GAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD+wAAw7GAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUNNAABC4AAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEX0AAw8eAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCkgAAwxYAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCjgAAwsYAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 60 + + + + YES + + EpisodeViewController + UIViewController + + YES + + YES + back: + next: + pageDown: + pageUp: + setEpisode: + + + YES + id + id + id + id + id + + + + YES + + YES + back: + next: + pageDown: + pageUp: + setEpisode: + + + YES + + back: + id + + + next: + id + + + pageDown: + id + + + pageUp: + id + + + setEpisode: + id + + + + + YES + + YES + episodeCell + episodeList + + + YES + UITableViewCell + UITableView + + + + YES + + YES + episodeCell + episodeList + + + YES + + episodeCell + UITableViewCell + + + episodeList + UITableView + + + + + IBProjectSource + EpisodeViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UITableViewCell + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITableViewCell.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + down_arrow.png + episode_bg.png + next_arrow.png + up_arrow.png + + + YES + {65, 63} + {4, 4} + {80, 36} + {480, 320} + {65, 63} + {80, 36} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib new file mode 100644 index 0000000..6ffcd43 --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib @@ -0,0 +1,639 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 292 + {1024, 768} + + NO + IBIPadFramework + + NSImage + credits_bg.png + + + + + 292 + {{26, 45}, {63, 65}} + + 1 + NO + IBIPadFramework + + NSImage + back_arrow.png + + + + + 292 + {{22.5, 15.5}, {99, 43}} + + NO + YES + 7 + NO + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 301 + {{21, 10}, {75, 102}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 292 + {{396, -27}, {556, 510}} + + NO + YES + 7 + NO + IBIPadFramework + Wolfenstein® 3D Classic Platinum© 2009-2011 id Software LLC, a ZeniMax Media company. Wolfenstein, id, id Software, id Tech and related logos are registered trademarks or trademarks of id Software LLC in the U.S. and/or other countries. Bethesda, Bethesda Softworks, ZeniMax and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the U.S. and/or other countries. All Rights Reserved. + + POSITYPE-idSettler_v10.2 + 22 + 16 + + + 1 + MSAxIDEAA + + 1 + + + + + 1 + MCAwIDAAA + + 1 + 10 + 10 + 1 + 0 + + + + 292 + {{607, 44}, {134, 54}} + + NO + YES + 7 + NO + IBIPadFramework + Legal + + POSITYPE-idSettler_v10.2 + 44 + 16 + + + + + {2, 2} + 1 + 10 + 1 + + + {1024, 768} + + + 3 + MAA + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + back: + + + 7 + + 12 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 7 + + + + + 10 + + + + + 11 + + + + + 9 + + + + + 17 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 4.CustomClassName + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + LegalViewController + UIResponder + {{140, 350}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw5OAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw4cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPGAADBAAAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD3oAAw8wAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxD+AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCGAAAxCBAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 17 + + + + YES + + LegalViewController + UIViewController + + back: + id + + + back: + + back: + id + + + + IBProjectSource + LegalViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + credits_bg.png + + + YES + {65, 63} + {4, 4} + {960, 640} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib new file mode 100644 index 0000000..0d28b71 --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib @@ -0,0 +1,898 @@ + + + + 1056 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 256 + {1024, 768} + + NO + YES + YES + IBIPadFramework + + NSImage + episode_bg.png + + + + + 292 + {{61, 87}, {65, 63}} + + 1 + NO + IBIPadFramework + + NSImage + back_arrow.png + + + + + 292 + {{900, 87}, {65, 63}} + + 1 + NO + IBIPadFramework + + NSImage + next_arrow.png + + + + + 292 + {{60, 56}, {99, 43}} + + NO + YES + 7 + NO + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + 3 + MQA + + + 1 + 10 + 5 + + + + 292 + {{899, 56}, {93, 43}} + + NO + YES + 7 + NO + IBIPadFramework + PLAY + + + + 1 + 10 + 5 + + + + 292 + {{190, 48}, {186, 52}} + + NO + YES + 7 + NO + IBIPadFramework + MISSION + + POSITYPE-idSettler_v10.2 + 44 + 16 + + + + 1 + 10 + + + + 274 + {{204, 104}, {625, 593}} + + + 3 + MCAwAA + + YES + IBIPadFramework + YES + NO + 2 + 0 + YES + 50 + + + + 274 + {{472, 712}, {80, 36}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + NSImage + down_arrow.png + + + + + 274 + {{472, 37}, {80, 36}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + NSImage + up_arrow.png + + + + + 301 + {{896, 45}, {73, 105}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 301 + {{58, 46}, {75, 108}} + + + 3 + MC42NjY2NjY2NjY3IDAAA + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + {1024, 768} + + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 4 + + + + next: + + + 7 + + 24 + + + + back: + + + 7 + + 25 + + + + dataSource + + + + 35 + + + + delegate + + + + 36 + + + + missionList + + + + 37 + + + + pageDown: + + + 7 + + 56 + + + + pageUp: + + + 7 + + 57 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 21 + + + + + 23 + + + + + 34 + + + Mission List + + + 54 + + + + + 55 + + + + + 22 + + + + + 20 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBUserGuides + 14.CustomClassName + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.CustomClassName + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 16.CustomClassName + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 20.IBPluginDependency + 20.IBViewBoundsToFrameTransform + 21.IBPluginDependency + 21.IBViewBoundsToFrameTransform + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 54.IBPluginDependency + 54.IBViewBoundsToFrameTransform + 55.IBPluginDependency + 55.IBViewBoundsToFrameTransform + + + YES + LevelSelectViewController + UIResponder + {{218, 349}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + YES + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABChgAAxCoAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDtgAAw4QAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEY4AAxCoAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEXMAAww0AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCiAAAxDbAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEYAAAw6AAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEY8AAxDbAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD7AAAxAkAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD7AAAw4IAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 57 + + + + YES + + LevelSelectViewController + UIViewController + + YES + + YES + back: + next: + pageDown: + pageUp: + + + YES + id + id + id + id + + + + YES + + YES + back: + next: + pageDown: + pageUp: + + + YES + + back: + id + + + next: + id + + + pageDown: + id + + + pageUp: + id + + + + + missionList + UITableView + + + missionList + + missionList + UITableView + + + + IBProjectSource + LevelSelectViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + down_arrow.png + episode_bg.png + next_arrow.png + up_arrow.png + + + YES + {65, 63} + {4, 4} + {80, 36} + {480, 320} + {65, 63} + {80, 36} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib new file mode 100644 index 0000000..7954dad --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib @@ -0,0 +1,1017 @@ + + + + 800 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + + + 274 + {1024, 768} + + + YES + YES + IBIPadFramework + + NSImage + main_bg.png + + + + + 319 + {{660, 610.5}, {239, 75}} + + NO + IBIPadFramework + 0 + 0 + + POSITYPE-idSettler_v10.2 + 64 + 16 + + {2, 2} + Resume + + 3 + MC4zMzMzMzMzMzMzAA + + + 3 + MQA + + + 1 + MCAwIDAAA + + + + + 319 + {{88, 269}, {322, 75}} + + + NO + IBIPadFramework + 0 + + {2, 2} + New Game + + + + + + + 319 + {{105, 383}, {232, 75}} + + + NO + IBIPadFramework + 0 + + {2, 2} + Settings + + + + + + + 319 + {{137, 499}, {168, 75}} + + + NO + IBIPadFramework + 0 + + {2, 2} + About + + + + + + + -2147483329 + {{105, 383}, {157, 75}} + + NO + IBIPadFramework + 0 + + {2, 2} + Legal + + + + + + + -2147483329 + {{88, 269}, {203, 75}} + + NO + IBIPadFramework + 0 + + {2, 2} + Credits + + + + + + + -2147483329 + {{168, 611}, {143, 75}} + + NO + IBIPadFramework + 0 + + {2, 2} + Back + + + + + + + 319 + {{168, 611}, {182, 75}} + + + NO + IBIPadFramework + 0 + + {2, 2} + Extras + + + + + + + -2147483329 + {{90, 269}, {275, 75}} + + NO + IBIPadFramework + 0 + + {2, 2} + id Games + + + + + + + -2147483329 + {{105, 383}, {321, 75}} + + NO + IBIPadFramework + 0 + + {2, 2} + id Software + + + + + + + -2147483329 + {{131, 499}, {157, 75}} + + NO + IBIPadFramework + 0 + + {2, 2} + Trivia + + + + + + + 274 + {{864, 619}, {41, 39}} + + YES + YES + IBIPadFramework + + NSImage + star_icon.png + + + + {1024, 768} + + + + 3 + MAA + + + 3 + + IBIPadFramework + + + + + + + view + + + + 3 + + + + resume: + + + 7 + + 9 + + + + newGame: + + + 7 + + 10 + + + + settings: + + + 7 + + 11 + + + + about: + + + 7 + + 12 + + + + extras: + + + 7 + + 13 + + + + legal: + + + 7 + + 34 + + + + aboutButton + + + + 35 + + + + extrasButton + + + + 37 + + + + legalButton + + + + 38 + + + + newGameButton + + + + 39 + + + + resumeButton + + + + 40 + + + + settingsButton + + + + 41 + + + + backButton + + + + 44 + + + + back: + + + 7 + + 45 + + + + creditsButton + + + + 50 + + + + idGamesButton + + + + 57 + + + + idSoftwareButton + + + + 58 + + + + triviaButton + + + + 59 + + + + idGames: + + + 7 + + 60 + + + + idSoftware: + + + 7 + + 61 + + + + trivia: + + + 7 + + 62 + + + + credits: + + + 7 + + 63 + + + + resumeStar + + + + 65 + + + + + + 0 + + + + + + 1 + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 16 + + + + + 32 + + + + + 42 + + + + + 47 + + + + + 54 + + + + + 55 + + + + + 56 + + + + + 64 + + + + + + + MainMenuViewController + UIResponder + {{138, 377}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJAAABDEwAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUOTAABDYgAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDgYAAwxkAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCVAAAw0gAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCIAAAwwkAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABELEAAw8aAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEKIAAw8aAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEMkAAw8aAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI8AABDEwAAA + + + AURWgABEGsAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJYAABDQgAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKSAABDbwAAA + + + + + + + 65 + + + + + MainMenuViewController + UIViewController + + id + id + id + id + id + id + id + id + id + id + id + id + + + + about: + id + + + back: + id + + + credits: + id + + + extras: + id + + + idGames: + id + + + idSoftware: + id + + + legal: + id + + + newGame: + id + + + oldNewGame: + id + + + resume: + id + + + settings: + id + + + trivia: + id + + + + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIView + UIButton + UIButton + + + + aboutButton + UIButton + + + backButton + UIButton + + + creditsButton + UIButton + + + extrasButton + UIButton + + + idGamesButton + UIButton + + + idSoftwareButton + UIButton + + + legalButton + UIButton + + + newGameButton + UIButton + + + resumeButton + UIButton + + + resumeStar + UIView + + + settingsButton + UIButton + + + triviaButton + UIButton + + + + IBProjectSource + MainMenuViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + ../wolf3d.xcodeproj + 3 + + {480, 320} + {41, 39} + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib new file mode 100644 index 0000000..3c21dbb --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib @@ -0,0 +1,1675 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 1298 + + YES + + + 1316 + {1024, 768} + + + NO + 1 + IBIPadFramework + + NSImage + credits_bg.png + + + + + 1316 + {{413, 29}, {562, 192}} + + NO + 1 + IBIPadFramework + + NSImage + settings_line_art.png + + + + + 1316 + {{929, 692}, {65, 63}} + + 1 + NO + 1 + IBIPadFramework + + NSImage + next_arrow.png + + + + + 1316 + {{415.5, 692}, {65, 63}} + + NO + 1 + IBIPadFramework + + NSImage + adv_btn.png + + + + + 1316 + {{397, 668}, {597, 13}} + + NO + 1 + IBIPadFramework + + NSImage + settings_divider.png + + + + + 1316 + {{397, 311}, {597, 13}} + + NO + 1 + IBIPadFramework + + + + + 1316 + {{543, 375}, {307, 46}} + + + NO + YES + 7 + NO + 1 + IBIPadFramework + SENSITIVITY: + + POSITYPE-idSettler_v10.2 + 38 + 16 + + + 3 + MC42NjY2NjY2NjY3AA + + + 3 + MQA + + 1 + 10 + 2 + + + + 1316 + {{621, 264}, {160, 56}} + + + NO + YES + 7 + NO + 1 + IBIPadFramework + Preset + + POSITYPE-idSettler_v10.2 + 44 + 16 + + + + 1 + NO + 10 + + + + 1316 + {{406, 458}, {444, 46}} + + + NO + YES + 7 + NO + 1 + IBIPadFramework + TILT MOVE SPEED: + + + + 1 + 10 + 2 + + + + 1316 + {{409, 545}, {436, 47}} + + + NO + YES + 4 + NO + 1 + IBIPadFramework + TILT TURN SPEED: + + + + 1 + 10 + 2 + + + + 1316 + {{557, 632}, {288, 41}} + + + NO + YES + 7 + NO + 1 + IBIPadFramework + HUD ALPHA: + + + + 1 + 10 + 2 + + + + 1316 + {{422, 596}, {535, 23}} + + + NO + 1 + IBIPadFramework + 0 + 0 + 0.5 + + + + 1316 + {{422, 512}, {535, 23}} + + + NO + 1 + IBIPadFramework + 0 + 0 + 0.5 + 500 + 3000 + + + + 1316 + {{422, 422}, {535, 23}} + + + NO + 1 + IBIPadFramework + 0 + 0 + 0.5 + 5000 + 30000 + + + + 1316 + {{422, 332}, {535, 23}} + + + NO + 1 + IBIPadFramework + 0 + 0 + 0.5 + + + + 1316 + {{828, 727}, {93, 41}} + + + NO + YES + 7 + NO + 1 + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 34 + 16 + + + + 1 + 10 + 2 + 5 + + + + 1316 + {{486, 727}, {152, 41}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + Advanced + + + + 1 + 10 + 5 + + + + 1325 + {{828, 691}, {166, 66}} + + + NO + NO + 1 + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 1325 + {{415, 689}, {223, 66}} + + NO + NO + 1 + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 1316 + {{898, 97}, {66, 80}} + + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + right_chevron.png + + + + + 1316 + {{421, 97}, {66, 80}} + + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + left_chevron.png + + + + + 1316 + {{860, 371}, {123, 37}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + 100% + + + + 1 + 10 + + + + 1316 + {{860, 456}, {123, 37}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + 100% + + + + 1 + 10 + + + + 1316 + {{860, 542}, {123, 37}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + 100% + + + + 1 + 10 + + + + 1316 + {{860, 628}, {123, 35}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + 100% + + + + 1 + 10 + + + + 1316 + {{519, 19}, {348, 236}} + + 1 + NO + 1 + IBIPadFramework + + NSImage + iphone_preset_1.png + + + + + -2147482332 + {{519, 19}, {348, 236}} + + 2 + NO + 1 + IBIPadFramework + + NSImage + iphone_preset_2.png + + + + + -2147482332 + {{519, 19}, {348, 236}} + + 3 + NO + 1 + IBIPadFramework + + NSImage + iphone_preset_3.png + + + + + -2147482332 + {{519, 19}, {348, 236}} + + 4 + NO + 1 + IBIPadFramework + + NSImage + iphone_preset_4.png + + + + {1024, 768} + + + 1 + MCAwIDAAA + + + 3 + + 1 + IBIPadFramework + + + + + YES + + + view + + + + 22 + + + + SensitivityValChanged + + + 13 + + 23 + + + + TiltMoveSpeedValChanged + + + 13 + + 24 + + + + TiltTurnSpeedValChanged + + + 13 + + 25 + + + + HudAlphaValChanged + + + 13 + + 26 + + + + hudAlphaSlider + + + + 27 + + + + sensitivitySlider + + + + 28 + + + + tiltTurnSpeedSlider + + + + 30 + + + + tiltMoveSpeedSlider + + + + 31 + + + + back: + + + 7 + + 32 + + + + AdvancedPressed + + + 7 + + 64 + + + + hudAlphaLabel + + + + 72 + + + + sensitivityLabel + + + + 73 + + + + tiltMoveSpeedLabel + + + + 74 + + + + tiltTurnSpeedLabel + + + + 75 + + + + nextPreset + + + 7 + + 80 + + + + previousPreset + + + 7 + + 81 + + + + presetLabel + + + + 82 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 46 + + + + + 57 + + + + + 58 + + + + + 60 + + + + + 62 + + + + + 65 + + + + + 66 + + + + + 67 + + + + + 68 + + + + + 69 + + + + + 70 + + + + + 71 + + + + + 76 + + + + + 77 + + + + + 78 + + + + + 79 + + + + + 83 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 13.CustomClassName + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 46.CustomClassName + 46.IBPluginDependency + 46.IBViewBoundsToFrameTransform + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 57.IBPluginDependency + 57.IBViewBoundsToFrameTransform + 58.IBPluginDependency + 58.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 60.IBPluginDependency + 60.IBViewBoundsToFrameTransform + 62.IBPluginDependency + 62.IBViewBoundsToFrameTransform + 65.IBPluginDependency + 65.IBViewBoundsToFrameTransform + 66.IBPluginDependency + 66.IBViewBoundsToFrameTransform + 67.IBPluginDependency + 67.IBViewBoundsToFrameTransform + 68.IBPluginDependency + 68.IBViewBoundsToFrameTransform + 69.IBPluginDependency + 69.IBViewBoundsToFrameTransform + 7.CustomClassName + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 70.IBPluginDependency + 70.IBViewBoundsToFrameTransform + 71.IBPluginDependency + 71.IBViewBoundsToFrameTransform + 76.IBPluginDependency + 76.IBViewBoundsToFrameTransform + 77.IBPluginDependency + 77.IBViewBoundsToFrameTransform + 78.IBPluginDependency + 78.IBViewBoundsToFrameTransform + 79.IBPluginDependency + 79.IBViewBoundsToFrameTransform + 8.CustomClassName + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + 83.CustomClassName + 83.IBPluginDependency + 83.IBViewBoundsToFrameTransform + 9.CustomClassName + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + SettingsViewController + UIResponder + {{265, 386}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDzIAAxAzAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEC0AAxCNAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABENEAAxDxAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEWQAAxEEAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEDAAAxDrAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxD+AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEDIAAw+KAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEJ8AAw5YAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEDIAAw88AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDj4AAxDjAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEWwAAwzYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEDIAAw7wAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDugAAw46AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDsIAAxDXAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDwAAAw/oAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDbwAAw6CAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDLAAAw0MAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEYsAAw9MAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEYsAAxAAAAA + + WolfSlider + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEDIAAw6qAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEYsAAxBEAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEVwAAxCHAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABA4AAAxBlAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBmAAAxBSAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBmAAAxBcAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDfAAAw1EAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEK0AAw9MAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEWkAAxD9AAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEE0AAxAAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 83 + + + + YES + + SettingsViewController + UIViewController + + YES + + YES + AdvancedPressed + ControlScheme1Pressed + ControlScheme2Pressed + ControlScheme3Pressed + ControlScheme4Pressed + HudAlphaValChanged + SensitivityValChanged + TiltMoveSpeedValChanged + TiltTurnSpeedValChanged + back: + nextPreset + previousPreset + + + YES + id + id + id + id + id + id + id + id + id + id + id + id + + + + YES + + YES + AdvancedPressed + ControlScheme1Pressed + ControlScheme2Pressed + ControlScheme3Pressed + ControlScheme4Pressed + HudAlphaValChanged + SensitivityValChanged + TiltMoveSpeedValChanged + TiltTurnSpeedValChanged + back: + nextPreset + previousPreset + + + YES + + AdvancedPressed + id + + + ControlScheme1Pressed + id + + + ControlScheme2Pressed + id + + + ControlScheme3Pressed + id + + + ControlScheme4Pressed + id + + + HudAlphaValChanged + id + + + SensitivityValChanged + id + + + TiltMoveSpeedValChanged + id + + + TiltTurnSpeedValChanged + id + + + back: + id + + + nextPreset + id + + + previousPreset + id + + + + + YES + + YES + controlScheme1Button + controlScheme2Button + controlScheme3Button + controlScheme4Button + hudAlphaLabel + hudAlphaSlider + presetLabel + sensitivityLabel + sensitivitySlider + tiltMoveSpeedLabel + tiltMoveSpeedSlider + tiltTurnSpeedLabel + tiltTurnSpeedSlider + + + YES + UIButton + UIButton + UIButton + UIButton + UILabel + UISlider + UILabel + UILabel + UISlider + UILabel + UISlider + UILabel + UISlider + + + + YES + + YES + controlScheme1Button + controlScheme2Button + controlScheme3Button + controlScheme4Button + hudAlphaLabel + hudAlphaSlider + presetLabel + sensitivityLabel + sensitivitySlider + tiltMoveSpeedLabel + tiltMoveSpeedSlider + tiltTurnSpeedLabel + tiltTurnSpeedSlider + + + YES + + controlScheme1Button + UIButton + + + controlScheme2Button + UIButton + + + controlScheme3Button + UIButton + + + controlScheme4Button + UIButton + + + hudAlphaLabel + UILabel + + + hudAlphaSlider + UISlider + + + presetLabel + UILabel + + + sensitivityLabel + UILabel + + + sensitivitySlider + UISlider + + + tiltMoveSpeedLabel + UILabel + + + tiltMoveSpeedSlider + UISlider + + + tiltTurnSpeedLabel + UILabel + + + tiltTurnSpeedSlider + UISlider + + + + + IBProjectSource + SettingsViewController.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + WolfSlider + UISlider + + IBProjectSource + WolfSlider.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISlider + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISlider.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + adv_btn.png + button_highlight.png + credits_bg.png + iphone_preset_1.png + iphone_preset_2.png + iphone_preset_3.png + iphone_preset_4.png + left_chevron.png + next_arrow.png + right_chevron.png + settings_divider.png + settings_line_art.png + + + YES + {56, 55} + {4, 4} + {960, 640} + {306, 208} + {306, 208} + {306, 208} + {306, 208} + {66, 80} + {65, 63} + {66, 80} + {597, 13} + {562, 192} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib new file mode 100644 index 0000000..be18a19 --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib @@ -0,0 +1,1250 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 1298 + + YES + + + 1298 + {1024, 768} + + NO + YES + 2 + YES + 1 + IBIPadFramework + + NSImage + wolf_bg.png + + + + + 1316 + {{200, 70}, {623, 174}} + + NO + 1 + IBIPadFramework + + NSImage + highlight_bracket.png + + + + + 1316 + {{209, 80}, {606, 151}} + + 1 + NO + 1 + IBIPadFramework + + NSImage + episode_bracket.png + + + + + 1316 + {{209, 252.5}, {606, 151}} + + 2 + NO + 1 + IBIPadFramework + + + + + 1316 + {{208, 423.5}, {606, 151}} + + 3 + NO + 1 + IBIPadFramework + + + + + 1316 + {{208, 595.5}, {606, 151}} + + 4 + NO + 1 + IBIPadFramework + + + + + 1316 + {{207, 29}, {302, 52}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + Difficulty Select + + POSITYPE-idSettler_v10.2 + 44 + 16 + + + 3 + MQA + + + 1 + 10 + + + + 1298 + {{68, 78}, {65, 63}} + + 1 + NO + 1 + IBIPadFramework + + NSImage + back_arrow.png + + + + + 1298 + {{67, 48}, {99, 43}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + + 1 + 10 + 5 + + + + 1316 + {{891, 78}, {65, 63}} + + 1 + NO + 1 + IBIPadFramework + + NSImage + next_arrow.png + + + + + 1316 + {{890, 47}, {97, 43}} + + NO + YES + 7 + NO + 1 + IBIPadFramework + NEXT + + + + 1 + 10 + 5 + + + + 1325 + {{882, 42}, {78, 101}} + + NO + NO + 1 + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 1298 + {{62, 42}, {81, 99}} + + NO + NO + 1 + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 1298 + {{316, 80}, {488, 151}} + + NO + NO + 1 + 1 + IBIPadFramework + 0 + + Helvetica-Bold + 48 + 16 + + Can I Play, Daddy? + + + + + + + 1298 + {{316, 253}, {498, 150}} + + NO + NO + 1 + 1 + IBIPadFramework + 0 + + Don't Hurt Me + + + + + + + 1298 + {{310, 424}, {504, 150}} + + NO + NO + 1 + 1 + IBIPadFramework + 0 + + Bring 'Em On! + + + + + + + 1298 + {{310, 596}, {504, 150}} + + NO + NO + 1 + 1 + IBIPadFramework + 3 + + 0 + I am Death Incarnate! + + + + + + + 1298 + {{229, 102}, {79, 107}} + + NO + NO + 1 + 1 + IBIPadFramework + 2 + + Helvetica-Bold + 24 + 16 + + NO + + + + + NSImage + difficulty_head1.png + + + + + 1298 + {{224.5, 274.5}, {79, 107}} + + NO + NO + 1 + 1 + IBIPadFramework + 2 + + NO + + + + + NSImage + difficulty_head2.png + + + + + 1298 + {{224.5, 446.5}, {79, 107}} + + NO + NO + 1 + 1 + IBIPadFramework + 2 + + NO + + + + + NSImage + difficulty_head3.png + + + + + 1298 + {{224, 618}, {79, 107}} + + NO + NO + 1 + 1 + IBIPadFramework + 2 + + NO + + + + + NSImage + difficulty_head4.png + + + + {1024, 768} + + + 3 + MQA + + 2 + + + + 3 + + 1 + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + back: + + + 7 + + 29 + + + + BringEmOn: + + + 7 + + 30 + + + + canIPlayDaddy: + + + 7 + + 31 + + + + dontHurtMe: + + + 7 + + 32 + + + + IAmDeathIncarnate: + + + 7 + + 33 + + + + next: + + + 7 + + 34 + + + + selectionFrame + + + + 37 + + + + canIPlayDaddy: + + + 7 + + 41 + + + + dontHurtMe: + + + 7 + + 44 + + + + BringEmOn: + + + 7 + + 47 + + + + IAmDeathIncarnate: + + + 7 + + 50 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 9 + + + + + 10 + + + + + 8 + + + + + 7 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 24 + + + + + 35 + + + + + 40 + + + + + 42 + + + + + 45 + + + + + 48 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 21.CustomClassName + 21.IBPluginDependency + 21.IBViewBoundsToFrameTransform + 22.CustomClassName + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.CustomClassName + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 24.CustomClassName + 24.IBPluginDependency + 24.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 4.IBViewBoundsToFrameTransform + 40.IBPluginDependency + 40.IBViewBoundsToFrameTransform + 42.IBPluginDependency + 42.IBViewBoundsToFrameTransform + 45.IBPluginDependency + 45.IBViewBoundsToFrameTransform + 48.IBPluginDependency + 48.IBViewBoundsToFrameTransform + 5.CustomClassName + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 8.IBEditorWindowLastContentRect + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + SkillViewController + UIResponder + {{141, 378}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABELEAAw/9AAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDdgAAwngAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDUQAAw9EAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDtQAAw/UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDq4AAxDKAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDq4AAxFAAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDzQAAw56AAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUOeAABDfQAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUObAABD1AAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUObAABEFQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDswAAw/2AAA + + + P4AAAL+AAAAAAAAAxD+AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDagAAwzUAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDKAAAw88AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDOAAAw/mAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDGAAAxBjAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDk4AAw/+AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDlAAAxAVAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAxAVAAA + + {{323, 1045}, {52, 56}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEaYAAw/8AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABELIAAxAVAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 50 + + + + YES + + SkillViewController + UIViewController + + YES + + YES + BringEmOn: + IAmDeathIncarnate: + back: + canIPlayDaddy: + dontHurtMe: + next: + + + YES + id + id + id + id + id + id + + + + YES + + YES + BringEmOn: + IAmDeathIncarnate: + back: + canIPlayDaddy: + dontHurtMe: + next: + + + YES + + BringEmOn: + id + + + IAmDeathIncarnate: + id + + + back: + id + + + canIPlayDaddy: + id + + + dontHurtMe: + id + + + next: + id + + + + + selectionFrame + UIView + + + selectionFrame + + selectionFrame + UIView + + + + IBProjectSource + SkillViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + difficulty_head1.png + difficulty_head2.png + difficulty_head3.png + difficulty_head4.png + episode_bracket.png + highlight_bracket.png + next_arrow.png + wolf_bg.png + + + YES + {65, 63} + {4, 4} + {64, 87} + {60, 82} + {60, 78} + {59, 79} + {606, 168} + {623, 189} + {65, 63} + {480, 320} + + + 141 + + diff --git a/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib new file mode 100644 index 0000000..2d8bfed --- /dev/null +++ b/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib @@ -0,0 +1,1323 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 274 + {1024, 768} + + NO + IBIPadFramework + + NSImage + wolf_bg.png + + + + + 292 + {{435, 20}, {159, 77}} + + NO + YES + 7 + NO + IBIPadFramework + Trivia + + POSITYPE-idSettler_v10.2 + 48 + 16 + + + 3 + MQA + + + + 1 + MCAwIDAAA + + {2, 2} + 1 + 10 + 1 + + + + 274 + {{155, 140}, {713, 400}} + + NO + YES + 7 + 1 + NO + IBIPadFramework + ORIGINAL WOLF: The original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as "The Nocturnal Missions", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together. + + Helvetica + 30 + 16 + + + + + {2, 2} + 0 + 10 + 11 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 2 + NO + IBIPadFramework + BJ, THE MAN: William Joseph Blazkowicz was born August 15, 1911, to Polish immigrants. Blazkowicz was a top spy for the Allied Forces, eventually receiving the Congressional Medal of Honor. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 3 + NO + IBIPadFramework + BOX ART: Ken Rieger was the talented illustrator who created the cover art for Spear of Destiny, Wolfenstein3D and Commander Keen. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 4 + NO + IBIPadFramework + THE REAL SPEAR: The Spear of Destiny, also known as The Spear or The Holy Lance, is believed to have been the weapon used to pierce the side of Jesus Christ at the Crucifixion. The Spear soon became a symbol of God's favor and those who possessed it were believed to be invincible. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 5 + NO + IBIPadFramework + THE SPEAR AND HITLER: Hitler is believed to have acquired the Spear at the beginning of WWII. Near the end of that war, it is rumored that General Patton discovered the Spear and that the downfall of Germany began that day. It is fabled that the U.S. was destined to succeed Germany as the New World Power once ownership of the Spear changed hands. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 6 + NO + IBIPadFramework + DEATH DIMENSION: It is said that Hitler made a pact with the Angel of Death, promising the souls of his Nazi soldiers, to protect the Spear of Destiny. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 7 + NO + IBIPadFramework + GOD MODE: In the game, if you can access god mode, BJ's eyes will glow with eerie golden light. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 8 + NO + IBIPadFramework + A PRINCE: Robert Prince, wrote the music for Commander Keen, Wolfenstein 3-D, and Doom. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{142, 140}, {740, 400}} + + NO + YES + 7 + 9 + NO + IBIPadFramework + DELAYED DEVELOPMENT: It is rumored that work on Spear of Destiny was hindered by the development team's time spent playing Fatal Fury (which Jay Wilbur called 'Fatal Productivity'), and Street Fighter II. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{142, 140}, {740, 400}} + + NO + YES + 7 + 10 + NO + IBIPadFramework + A MATTER OF DEGREES: John Carmack is known for his innovations in 3D graphics and rocketry but what is less known is that this self-taught engineer has no degrees - he dropped out of school after one semester. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{162, 140}, {700, 400}} + + NO + YES + 7 + 11 + NO + IBIPadFramework + THE CARMACK: John Carmack, one of the founders of id Software, preferred to work at a pizza joint and make games rather than go to college. His favorite programming food is pizza and diet coke. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{142, 140}, {740, 400}} + + NO + YES + 7 + 12 + NO + IBIPadFramework + DREAMING IN DIGITAL: Doom was reported to cause gamers to dream in pixels and lower productivity. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{212, 140}, {600, 400}} + + NO + YES + 7 + 13 + NO + IBIPadFramework + KEEPING IT IN THE FAMILY: BJ is Commander Keen's grandfather. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{242, 140}, {540, 400}} + + NO + YES + 7 + 14 + NO + IBIPadFramework + WHAT'S IN A NAME: The original name for Doom was "It's Green and Pissed" + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483374 + {{192, 140}, {640, 400}} + + NO + YES + 9 + 15 + NO + IBIPadFramework + GIBS: Gibs, pronounced with a hard 'g', is sometimes confused as 'jibs' due to its pronunciation. The term came from the imagery of flying chicken giblets, or gibs for short. + + + + + {2, 2} + 1 + NO + 10 + 7 + 1 + 0 + + + + -2147483374 + {{155, 140}, {713, 400}} + + NO + YES + 7 + 16 + NO + IBIPadFramework + WOLFENSTEIN 3D: The game was originally designed to have more complex gameplay. Though dragging bodies, stealth kills and uniforms were already programmed, it was decided that they slowed down the pace of the game and were removed. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + 292 + {{34, 66}, {63, 65}} + + NO + IBIPadFramework + + NSImage + back_arrow.png + + + + + 292 + {{31.5, 33.5}, {99, 43}} + + NO + YES + 7 + NO + IBIPadFramework + BACK + + POSITYPE-idSettler_v10.2 + 36 + 16 + + + + 1 + 10 + 5 + + + + 319 + {{693, 510}, {99, 57}} + + NO + IBIPadFramework + 0 + 0 + + {2, 2} + Next + + 3 + MC4zMzMzMzMzMzMzAA + + + + + + + 319 + {{440, 510}, {187, 57}} + + NO + IBIPadFramework + 0 + 0 + + {2, 2} + Previous + + + + + + + 301 + {{31, 27}, {72, 107}} + + NO + NO + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + {1024, 768} + + + 3 + MAA + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + nextTrivia: + + + 7 + + 18 + + + + previousTrivia: + + + 7 + + 19 + + + + firstTrivia + + + + 24 + + + + lastTrivia + + + + 43 + + + + back: + + + 7 + + 47 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 5 + + + + + 16 + + + + + 17 + + + + + 20 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + 40 + + + + + 44 + + + + + 45 + + + + + 46 + + + + + 48 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 16.CustomClassName + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 17.CustomClassName + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 20.IBPluginDependency + 20.IBViewBoundsToFrameTransform + 26.IBPluginDependency + 26.IBViewBoundsToFrameTransform + 27.IBPluginDependency + 27.IBViewBoundsToFrameTransform + 28.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 29.IBPluginDependency + 29.IBViewBoundsToFrameTransform + 30.IBPluginDependency + 30.IBViewBoundsToFrameTransform + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 34.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 36.IBPluginDependency + 36.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 37.IBViewBoundsToFrameTransform + 38.IBPluginDependency + 38.IBViewBoundsToFrameTransform + 39.IBPluginDependency + 39.IBViewBoundsToFrameTransform + 40.IBPluginDependency + 40.IBViewBoundsToFrameTransform + 44.CustomClassName + 44.IBPluginDependency + 44.IBViewBoundsToFrameTransform + 45.IBPluginDependency + 45.IBViewBoundsToFrameTransform + 46.IBPluginDependency + 46.IBViewBoundsToFrameTransform + 48.IBPluginDependency + 48.IBViewBoundsToFrameTransform + 5.CustomClassName + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + + + YES + TriviaViewController + UIResponder + {{196, 385}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEZMAAxDXAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABELYAAxDXAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGgAABCaAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHIAABCfAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHwAABCiAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHIAABCfAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIMAABCkgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIgAABCnAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw2MAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJIAABCsAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDkIAAw/cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB0AAAw9mAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHQAABCNAAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMtAABBoAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 48 + + + + YES + + TriviaViewController + UIViewController + + YES + + YES + back: + nextTrivia: + previousTrivia: + + + YES + id + id + id + + + + YES + + YES + back: + nextTrivia: + previousTrivia: + + + YES + + back: + id + + + nextTrivia: + id + + + previousTrivia: + id + + + + + YES + + YES + firstTrivia + lastTrivia + + + YES + UIView + UIView + + + + YES + + YES + firstTrivia + lastTrivia + + + YES + + firstTrivia + UIView + + + lastTrivia + UIView + + + + + IBProjectSource + TriviaViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + wolf_bg.png + + + YES + {65, 63} + {4, 4} + {480, 320} + + + 141 + + diff --git a/wolf3d/code/iphone/SettingsView.xib b/wolf3d/code/iphone/SettingsView.xib new file mode 100644 index 0000000..f3579d9 --- /dev/null +++ b/wolf3d/code/iphone/SettingsView.xib @@ -0,0 +1,1684 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 1298 + + YES + + + 1316 + {480, 320} + + + NO + 2 + IBCocoaTouchFramework + + NSImage + credits_bg.png + + + + + 1316 + {{172.5, 5}, {281, 96}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + settings_line_art.png + + + + + 1316 + {{431.5, 281}, {31, 32}} + + + 1 + NO + 2 + IBCocoaTouchFramework + + NSImage + next_arrow.png + + + + + 1316 + {{158.5, 281}, {31, 32}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + adv_btn.png + + + + + 1316 + {{165, 270}, {298, 6}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + settings_divider.png + + + + + 1316 + {{166.5, 107.5}, {298, 6}} + + NO + 2 + IBCocoaTouchFramework + + + + + 1316 + {{213, 134}, {192, 30}} + + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + SENSITIVITY: + + POSITYPE-idSettler_v10.2 + 17 + 16 + + + 3 + MC42NjY2NjY2NjY3AA + + + 3 + MQA + + 1 + 10 + 2 + + + + 1316 + {{274, 83}, {79, 33}} + + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + Preset + + POSITYPE-idSettler_v10.2 + 22 + 16 + + + + 1 + 10 + + + + 1316 + {{213, 171}, {192, 30}} + + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + TILT MOVE SPEED: + + + + 1 + 10 + 2 + + + + 1316 + {{210, 210}, {195, 30}} + + + NO + YES + 4 + NO + 2 + IBCocoaTouchFramework + TILT TURN SPEED: + + + + 1 + 10 + 2 + + + + 1316 + {{210, 248}, {195, 30}} + + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + HUD ALPHA: + + + + 1 + 10 + 2 + + + + 1316 + {{177, 229}, {274, 23}} + + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + 0.5 + + + + 1316 + {{177, 190}, {274, 23}} + + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + 0.5 + 500 + 3000 + + + + 1316 + {{177, 152}, {274, 23}} + + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + 0.5 + 5000 + 30000 + + + + 1316 + {{177, 117}, {274, 23}} + + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + 0.5 + + + + 1316 + {{375, 295}, {53, 29}} + + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + + 1 + 10 + 2 + 5 + + + + 1316 + {{194, 302}, {84, 19}} + + NO + 2 + IBCocoaTouchFramework + 2 + + Advanced + + + + 3 + MC41AA + + + + + 1325 + {{375, 278}, {91, 40}} + + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + button_highlight.png + + + + + 1325 + {{157, 279}, {117, 40}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 1316 + {{385, 21}, {40, 49}} + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + right_chevron.png + + + + + 1316 + {{196, 21}, {40, 49}} + + NO + 2 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + left_chevron.png + + + + + 1316 + {{406, 135}, {42, 21}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + 100% + + + + 1 + 10 + + + + 1316 + {{406.5, 171.5}, {42, 21}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + 100% + + + + 1 + 10 + + + + 1316 + {{406, 211}, {42, 21}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + 100% + + + + 1 + 10 + + + + 1316 + {{406.5, 248.5}, {42, 21}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + 100% + + + + 1 + 10 + + + + 1316 + {{252, 3.5}, {118, 79}} + + 1 + NO + 2 + IBCocoaTouchFramework + + NSImage + iphone_preset_1.png + + + + + -2147482332 + {{252, 3.5}, {118, 79}} + + 2 + NO + 2 + IBCocoaTouchFramework + + NSImage + iphone_preset_2.png + + + + + -2147482332 + {{252, 3.5}, {118, 79}} + + 3 + NO + 2 + IBCocoaTouchFramework + + NSImage + iphone_preset_3.png + + + + + -2147482332 + {{252, 3.5}, {118, 79}} + + 4 + NO + 2 + IBCocoaTouchFramework + + NSImage + iphone_preset_4.png + + + + {480, 320} + + + 1 + MCAwIDAAA + + + 3 + + 2 + IBCocoaTouchFramework + + + + + YES + + + view + + + + 22 + + + + SensitivityValChanged + + + 13 + + 23 + + + + TiltMoveSpeedValChanged + + + 13 + + 24 + + + + TiltTurnSpeedValChanged + + + 13 + + 25 + + + + HudAlphaValChanged + + + 13 + + 26 + + + + hudAlphaSlider + + + + 27 + + + + sensitivitySlider + + + + 28 + + + + tiltTurnSpeedSlider + + + + 30 + + + + tiltMoveSpeedSlider + + + + 31 + + + + back: + + + 7 + + 32 + + + + AdvancedPressed + + + 7 + + 47 + + + + AdvancedPressed + + + 7 + + 64 + + + + hudAlphaLabel + + + + 72 + + + + sensitivityLabel + + + + 73 + + + + tiltMoveSpeedLabel + + + + 74 + + + + tiltTurnSpeedLabel + + + + 75 + + + + nextPreset + + + 7 + + 80 + + + + previousPreset + + + 7 + + 81 + + + + presetLabel + + + + 82 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 45 + + + + + 46 + + + + + 57 + + + + + 58 + + + + + 60 + + + + + 62 + + + + + 65 + + + + + 66 + + + + + 67 + + + + + 68 + + + + + 69 + + + + + 70 + + + + + 71 + + + + + 76 + + + + + 77 + + + + + 78 + + + + + 79 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 13.CustomClassName + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 45.CustomClassName + 45.IBPluginDependency + 45.IBViewBoundsToFrameTransform + 46.CustomClassName + 46.IBPluginDependency + 46.IBViewBoundsToFrameTransform + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 57.IBPluginDependency + 57.IBViewBoundsToFrameTransform + 58.IBPluginDependency + 58.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 60.IBPluginDependency + 60.IBViewBoundsToFrameTransform + 62.IBPluginDependency + 62.IBViewBoundsToFrameTransform + 65.IBPluginDependency + 65.IBViewBoundsToFrameTransform + 66.IBPluginDependency + 66.IBViewBoundsToFrameTransform + 67.IBPluginDependency + 67.IBViewBoundsToFrameTransform + 68.IBPluginDependency + 68.IBViewBoundsToFrameTransform + 69.IBPluginDependency + 69.IBViewBoundsToFrameTransform + 7.CustomClassName + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 70.IBPluginDependency + 70.IBViewBoundsToFrameTransform + 71.IBPluginDependency + 76.IBPluginDependency + 76.IBViewBoundsToFrameTransform + 77.IBPluginDependency + 77.IBViewBoundsToFrameTransform + 78.IBPluginDependency + 78.IBViewBoundsToFrameTransform + 79.IBPluginDependency + 79.IBViewBoundsToFrameTransform + 8.CustomClassName + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + 9.CustomClassName + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + SettingsViewController + UIResponder + {{313, 508}, {960, 640}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDRwAAw2uAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDRwAAw4nAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDvQAAw56AAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD1wAAw40AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBYAAAw5gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw58AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDZwAAw3oAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUNCAABDlgAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDegAAwtIAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDZwAAw1cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCQAAAw5gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDtoAAwnwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDLwAAw1sAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDQoAAwn4AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABAoAAAw56AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMlAABDhwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABC+QAAwnIAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw2EAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPSgABDDAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPSwABDMIAAA + + WolfSlider + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDZwAAwxQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPSgABDWAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUN8AABAYAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGgAABBUAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGgAABC1gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw4qAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDSgAAwxcAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDSgAAwz+AAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 82 + + + + YES + + SettingsViewController + UIViewController + + YES + + YES + AdvancedPressed + ControlScheme1Pressed + ControlScheme2Pressed + ControlScheme3Pressed + ControlScheme4Pressed + HudAlphaValChanged + SensitivityValChanged + TiltMoveSpeedValChanged + TiltTurnSpeedValChanged + back: + nextPreset + previousPreset + + + YES + id + id + id + id + id + id + id + id + id + id + id + id + + + + YES + + YES + AdvancedPressed + ControlScheme1Pressed + ControlScheme2Pressed + ControlScheme3Pressed + ControlScheme4Pressed + HudAlphaValChanged + SensitivityValChanged + TiltMoveSpeedValChanged + TiltTurnSpeedValChanged + back: + nextPreset + previousPreset + + + YES + + AdvancedPressed + id + + + ControlScheme1Pressed + id + + + ControlScheme2Pressed + id + + + ControlScheme3Pressed + id + + + ControlScheme4Pressed + id + + + HudAlphaValChanged + id + + + SensitivityValChanged + id + + + TiltMoveSpeedValChanged + id + + + TiltTurnSpeedValChanged + id + + + back: + id + + + nextPreset + id + + + previousPreset + id + + + + + YES + + YES + controlScheme1Button + controlScheme2Button + controlScheme3Button + controlScheme4Button + hudAlphaLabel + hudAlphaSlider + presetLabel + sensitivityLabel + sensitivitySlider + tiltMoveSpeedLabel + tiltMoveSpeedSlider + tiltTurnSpeedLabel + tiltTurnSpeedSlider + + + YES + UIButton + UIButton + UIButton + UIButton + UILabel + UISlider + UILabel + UILabel + UISlider + UILabel + UISlider + UILabel + UISlider + + + + YES + + YES + controlScheme1Button + controlScheme2Button + controlScheme3Button + controlScheme4Button + hudAlphaLabel + hudAlphaSlider + presetLabel + sensitivityLabel + sensitivitySlider + tiltMoveSpeedLabel + tiltMoveSpeedSlider + tiltTurnSpeedLabel + tiltTurnSpeedSlider + + + YES + + controlScheme1Button + UIButton + + + controlScheme2Button + UIButton + + + controlScheme3Button + UIButton + + + controlScheme4Button + UIButton + + + hudAlphaLabel + UILabel + + + hudAlphaSlider + UISlider + + + presetLabel + UILabel + + + sensitivityLabel + UILabel + + + sensitivitySlider + UISlider + + + tiltMoveSpeedLabel + UILabel + + + tiltMoveSpeedSlider + UISlider + + + tiltTurnSpeedLabel + UILabel + + + tiltTurnSpeedSlider + UISlider + + + + + IBProjectSource + SettingsViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + WolfSlider + UISlider + + IBProjectSource + WolfSlider.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISlider + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISlider.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + adv_btn.png + button_highlight.png + credits_bg.png + iphone_preset_1.png + iphone_preset_2.png + iphone_preset_3.png + iphone_preset_4.png + left_chevron.png + next_arrow.png + right_chevron.png + settings_divider.png + settings_line_art.png + + + YES + {56, 55} + {4, 4} + {960, 640} + {306, 208} + {306, 208} + {306, 208} + {306, 208} + {66, 80} + {65, 63} + {66, 80} + {597, 13} + {562, 192} + + + 141 + + diff --git a/wolf3d/code/iphone/SettingsViewController.h b/wolf3d/code/iphone/SettingsViewController.h new file mode 100644 index 0000000..be9f6fa --- /dev/null +++ b/wolf3d/code/iphone/SettingsViewController.h @@ -0,0 +1,56 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + + +@interface SettingsViewController : UIViewController { + + IBOutlet UISlider * sensitivitySlider; + IBOutlet UISlider * tiltMoveSpeedSlider; + IBOutlet UISlider * tiltTurnSpeedSlider; + IBOutlet UISlider * hudAlphaSlider; + + IBOutlet UILabel * sensitivityLabel; + IBOutlet UILabel * tiltMoveSpeedLabel; + IBOutlet UILabel * tiltTurnSpeedLabel; + IBOutlet UILabel * hudAlphaLabel; + + IBOutlet UILabel * presetLabel; +} + +- (void) LoadSettings; + +- (IBAction)back:(id)sender; + +- (IBAction) AdvancedPressed; + +- (IBAction) SensitivityValChanged; +- (IBAction) TiltMoveSpeedValChanged; +- (IBAction) TiltTurnSpeedValChanged; +- (IBAction) HudAlphaValChanged; + +- (IBAction) nextPreset; +- (IBAction) previousPreset; + +@end diff --git a/wolf3d/code/iphone/SettingsViewController.m b/wolf3d/code/iphone/SettingsViewController.m new file mode 100644 index 0000000..945ae00 --- /dev/null +++ b/wolf3d/code/iphone/SettingsViewController.m @@ -0,0 +1,282 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "SettingsViewController.h" +#import "wolfiphone.h" +#import "wolf3dAppDelegate.h" + +#define NUM_CONTROL_SCHEMES 4 + +void setSliderLabel( UISlider * slider, UILabel * label ); +void setSliderValue( UISlider * slider, UILabel * label, float value ); +float convertSliderValue( UISlider * slider ); + +@interface SettingsViewController () + +@property (nonatomic, retain) UISlider * sensitivitySlider; +@property (nonatomic, retain) UISlider * tiltMoveSpeedSlider; +@property (nonatomic, retain) UISlider * tiltTurnSpeedSlider; +@property (nonatomic, retain) UISlider * hudAlphaSlider; + +@property (nonatomic, retain) UIView * sensitivityLabel; +@property (nonatomic, retain) UIView * tiltMoveSpeedLabel; +@property (nonatomic, retain) UIView * tiltTurnSpeedLabel; +@property (nonatomic, retain) UIView * hudAlphaLabel; + +@property (nonatomic, retain) UILabel * presetLabel; + + +- (void)setPresetVisibility; + +@end + +@implementation SettingsViewController + +@synthesize sensitivitySlider, tiltMoveSpeedSlider, tiltTurnSpeedSlider, hudAlphaSlider; +@synthesize sensitivityLabel, tiltMoveSpeedLabel, tiltTurnSpeedLabel, hudAlphaLabel; +@synthesize presetLabel; + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + [self LoadSettings]; +} + +- (void) SetupSlider:(UISlider*)slider minimumTrack:(UIImage*)minImage + maximumTrack:(UIImage*)maxImage + thumb:(UIImage*)thumbImage { + + [slider setMinimumTrackImage:minImage forState:UIControlStateNormal]; + [slider setMaximumTrackImage:maxImage forState:UIControlStateNormal]; + + [slider setThumbImage:thumbImage forState:UIControlStateNormal]; + [slider setThumbImage:thumbImage forState:UIControlStateHighlighted]; +} + +- (void) LoadSettings { + // Minimum track image setup. + UIImage* minimumTrackImage = [UIImage imageNamed:@"settings_slider_grey.png"]; + CGFloat minimumTrackImageCap = minimumTrackImage.size.width * 0.5f; + + UIImage* minimumTrackImageCapped = [minimumTrackImage stretchableImageWithLeftCapWidth:minimumTrackImageCap topCapHeight:0.0]; + + + // Maximum track image setup. + UIImage* maximumTrackImage = [UIImage imageNamed:@"settings_slider_white.png"]; + CGFloat maximumTrackImageCap = maximumTrackImage.size.width * 0.5f; + + UIImage* maximumTrackImageCapped = [maximumTrackImage stretchableImageWithLeftCapWidth:maximumTrackImageCap topCapHeight:0.0]; + + // Thumb image. + UIImage* thumbImage = [UIImage imageNamed:@"settings_slider_blue.png"]; + + // Set up slider instances. + [self SetupSlider:sensitivitySlider minimumTrack:minimumTrackImageCapped + maximumTrack:maximumTrackImageCapped + thumb:thumbImage]; + + + [self SetupSlider:tiltMoveSpeedSlider minimumTrack:minimumTrackImageCapped + maximumTrack:maximumTrackImageCapped + thumb:thumbImage]; + + + + [self SetupSlider:tiltTurnSpeedSlider minimumTrack:minimumTrackImageCapped + maximumTrack:maximumTrackImageCapped + thumb:thumbImage]; + + + + + [self SetupSlider:hudAlphaSlider minimumTrack:minimumTrackImageCapped + maximumTrack:maximumTrackImageCapped + thumb:thumbImage]; + + + + // Load Settings from CVars. + setSliderValue( sensitivitySlider, sensitivityLabel, sensitivity->value ); + setSliderValue( tiltMoveSpeedSlider, tiltMoveSpeedLabel, tiltMove->value ); + setSliderValue( tiltTurnSpeedSlider, tiltTurnSpeedLabel, tiltTurn->value ); + setSliderValue( hudAlphaSlider, hudAlphaLabel, hudAlpha->value ); + + [self setPresetVisibility]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + + self.sensitivitySlider = nil; + self.tiltTurnSpeedSlider = nil; + self.tiltMoveSpeedSlider = nil; + self.hudAlphaSlider = nil; + + self.sensitivityLabel = nil; + self.tiltTurnSpeedLabel = nil; + self.tiltMoveSpeedLabel = nil; + self.hudAlphaSlider = nil; + + self.presetLabel = nil; +} + + +- (void)dealloc { + [super dealloc]; +} + + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +- (IBAction) SensitivityValChanged { + Cvar_SetValue( sensitivity->name, convertSliderValue( sensitivitySlider ) ); + setSliderLabel( sensitivitySlider, sensitivityLabel); +} + + +- (IBAction) TiltMoveSpeedValChanged { + Cvar_SetValue( tiltMove->name, convertSliderValue( tiltMoveSpeedSlider ) ); + setSliderLabel( tiltMoveSpeedSlider, tiltMoveSpeedLabel); + + if ( tiltMove->value == 5000 ) { + Cvar_SetValue( tiltMove->name, 0 ); + } + if ( tiltMove->value ) { + Cvar_SetValue( tiltTurn->name, 0 ); + setSliderValue( tiltTurnSpeedSlider, tiltTurnSpeedLabel, tiltTurnSpeedSlider.minimumValue ); + } +} + +- (IBAction) TiltTurnSpeedValChanged { + Cvar_SetValue( tiltTurn->name, convertSliderValue( tiltTurnSpeedSlider ) ); + setSliderLabel( tiltTurnSpeedSlider, tiltTurnSpeedLabel); + + if ( tiltTurn->value == 500 ) { + Cvar_SetValue( tiltTurn->name, 0 ); + } + if ( tiltTurn->value ) { + Cvar_SetValue( tiltMove->name, 0 ); + setSliderValue( tiltMoveSpeedSlider, tiltMoveSpeedLabel, tiltMoveSpeedSlider.minimumValue ); + } +} + +- (IBAction) HudAlphaValChanged { + Cvar_SetValue( hudAlpha->name, convertSliderValue( hudAlphaSlider ) ); + setSliderLabel( hudAlphaSlider, hudAlphaLabel ); +} + +- (IBAction) AdvancedPressed { + + iphonePreloadBeforePlay(); // make sure all the hud textures are loaded + menuState = IPM_HUDEDIT; + wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + [app showOpenGL]; + +} + +- (void)setPresetVisibility { + + for ( int i = 0; i < NUM_CONTROL_SCHEMES; ++i ) { + BOOL hide = true; + + if ( i == (int)controlScheme->value ) { + hide = false; + } + + [[self.view viewWithTag:(i + 1)] setHidden:hide]; + } + + self.presetLabel.text = [NSString stringWithFormat:@"Preset %d", (int)(controlScheme->value + 1) ]; +} + +- (IBAction)nextPreset { + int newScheme = controlScheme->value + 1; + + if ( newScheme >= NUM_CONTROL_SCHEMES ) { + newScheme = 0; + } + + Cvar_SetValue( controlScheme->name, newScheme ); + HudSetForScheme( (int)controlScheme->value ); + + [self setPresetVisibility]; +} + +- (IBAction)previousPreset { + int newScheme = controlScheme->value - 1; + + if ( newScheme < 0 ) { + newScheme = NUM_CONTROL_SCHEMES - 1; + } + + Cvar_SetValue( controlScheme->name, newScheme ); + HudSetForScheme( (int)controlScheme->value ); + + [self setPresetVisibility]; +} + +@end + +float convertSliderValue( UISlider * slider ) { + const float difference = slider.value - slider.minimumValue; + const float adjustedValue = slider.maximumValue - difference; + + return adjustedValue; +} + +void setSliderValue( UISlider * slider, UILabel * label, float value ) { + const float difference = value - slider.minimumValue; + const float reversedValue = slider.maximumValue - difference; + + slider.value = reversedValue; + + setSliderLabel( slider, label ); +} + +void setSliderLabel( UISlider * slider, UILabel * label ) { + const float range = slider.maximumValue - slider.minimumValue; + const float adjustedValue = convertSliderValue( slider ); + + const float adjustedDiff = adjustedValue - slider.minimumValue; + + const float percent = adjustedDiff / range * 100.0f; + + label.text = [NSString stringWithFormat:@"%.0f%%", percent]; +} + diff --git a/wolf3d/code/iphone/SkillView.xib b/wolf3d/code/iphone/SkillView.xib new file mode 100644 index 0000000..933bc45 --- /dev/null +++ b/wolf3d/code/iphone/SkillView.xib @@ -0,0 +1,1250 @@ + + + + 1056 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 1298 + + YES + + + 1298 + {480, 320} + + NO + YES + 1 + YES + 2 + IBCocoaTouchFramework + + NSImage + wolf_bg.png + + + + + 1316 + {{86, 96}, {308, 73}} + + NO + 2 + IBCocoaTouchFramework + + NSImage + highlight_bracket.png + + + + + 1316 + {{90, 28}, {300, 65}} + + 1 + NO + 2 + IBCocoaTouchFramework + + NSImage + episode_bracket.png + + + + + 1316 + {{90, 100}, {300, 65}} + + 2 + NO + 2 + IBCocoaTouchFramework + + + + + 1316 + {{90, 173}, {300, 65}} + + 3 + NO + 2 + IBCocoaTouchFramework + + + + + 1316 + {{90, 246}, {300, 65}} + + 4 + NO + 2 + IBCocoaTouchFramework + + + + + 1316 + {{90, 1}, {169, 29}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + Difficulty Select + + POSITYPE-idSettler_v10.2 + 24 + 16 + + + 3 + MQA + + + 1 + 10 + + + + 1298 + {{24, 279}, {32, 32}} + + 1 + NO + 2 + IBCocoaTouchFramework + + NSImage + back_arrow.png + + + + + 1298 + {{23, 260}, {66, 29}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + + 1 + 10 + 5 + + + + 1316 + {{418, 279}, {32, 32}} + + 1 + NO + 2 + IBCocoaTouchFramework + + NSImage + next_arrow.png + + + + + 1316 + {{417, 259.5}, {66, 29}} + + NO + YES + 7 + NO + 2 + IBCocoaTouchFramework + NEXT + + + + 1 + 10 + 5 + + + + 1325 + {{409, 257}, {52, 56}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + + 1298 + {{17, 259}, {53, 54}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 1298 + {{138, 31}, {249, 64}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + Helvetica-Bold + 32 + 16 + + Can I Play, Daddy? + + + + + + + 1298 + {{100, 38}, {32, 45}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + Helvetica-Bold + 24 + 16 + + NO + + + + + NSImage + difficulty_head1.png + + + + + 1298 + {{100, 109.5}, {32, 45}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + NO + + + + + NSImage + difficulty_head2.png + + + + + 1298 + {{100, 182}, {32, 45}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + NO + + + + + NSImage + difficulty_head3.png + + + + + 1298 + {{100, 255.5}, {32, 45}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + NO + + + + + NSImage + difficulty_head4.png + + + + + 1298 + {{138, 103}, {249, 64}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + Don't Hurt Me + + + + + + + 1298 + {{138, 175}, {249, 63}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + Bring 'Em On! + + + + + + + 1298 + {{138, 248}, {249, 63}} + + NO + NO + 1 + 2 + IBCocoaTouchFramework + 2 + + 0 + I am Death Incarnate! + + + + + + {480, 320} + + + 3 + MQA + + 2 + + + + 3 + + 2 + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + back: + + + 7 + + 29 + + + + BringEmOn: + + + 7 + + 30 + + + + canIPlayDaddy: + + + 7 + + 31 + + + + dontHurtMe: + + + 7 + + 32 + + + + IAmDeathIncarnate: + + + 7 + + 33 + + + + next: + + + 7 + + 34 + + + + selectionFrame + + + + 37 + + + + canIPlayDaddy: + + + 7 + + 41 + + + + dontHurtMe: + + + 7 + + 44 + + + + BringEmOn: + + + 7 + + 47 + + + + IAmDeathIncarnate: + + + 7 + + 50 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 9 + + + + + 10 + + + + + 8 + + + + + 7 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 24 + + + + + 35 + + + + + 40 + + + + + 42 + + + + + 45 + + + + + 48 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.CustomClassName + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 11.CustomClassName + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 14.IBViewBoundsToFrameTransform + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 21.CustomClassName + 21.IBPluginDependency + 21.IBViewBoundsToFrameTransform + 22.CustomClassName + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.CustomClassName + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 24.CustomClassName + 24.IBPluginDependency + 24.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 4.IBViewBoundsToFrameTransform + 40.IBPluginDependency + 40.IBViewBoundsToFrameTransform + 42.IBPluginDependency + 42.IBViewBoundsToFrameTransform + 45.IBPluginDependency + 45.IBViewBoundsToFrameTransform + 48.IBPluginDependency + 48.IBViewBoundsToFrameTransform + 5.CustomClassName + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 8.IBEditorWindowLastContentRect + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + SkillViewController + UIResponder + {{303, 509}, {960, 640}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPUgABDdQAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK0AAA/gAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK0AABBvAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK0AABCwAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK0AABDKQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK0AABDcgAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMWAABCCAAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMWAABC1AAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMWAABDMwAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDGAAAwtoAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCrAAAwyMAAA + + + P4AAAL+AAAAAAAAAw58AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AULOAABCCAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIeAABC0wAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIcAABDMgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCEAAAwrAAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIEAABDbQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIUAABDg4AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBgAAAw3QAAA + + {{323, 1045}, {52, 56}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDzAAAw3QAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPOgABDg4AAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 50 + + + + YES + + SkillViewController + UIViewController + + YES + + YES + BringEmOn: + IAmDeathIncarnate: + back: + canIPlayDaddy: + dontHurtMe: + next: + + + YES + id + id + id + id + id + id + + + + YES + + YES + BringEmOn: + IAmDeathIncarnate: + back: + canIPlayDaddy: + dontHurtMe: + next: + + + YES + + BringEmOn: + id + + + IAmDeathIncarnate: + id + + + back: + id + + + canIPlayDaddy: + id + + + dontHurtMe: + id + + + next: + id + + + + + selectionFrame + UIView + + + selectionFrame + + selectionFrame + UIView + + + + IBProjectSource + SkillViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + difficulty_head1.png + difficulty_head2.png + difficulty_head3.png + difficulty_head4.png + episode_bracket.png + highlight_bracket.png + next_arrow.png + wolf_bg.png + + + YES + {65, 63} + {4, 4} + {64, 87} + {60, 82} + {60, 78} + {59, 79} + {606, 168} + {623, 189} + {65, 63} + {480, 320} + + + 141 + + diff --git a/wolf3d/code/iphone/SkillViewController.h b/wolf3d/code/iphone/SkillViewController.h new file mode 100644 index 0000000..3b62232 --- /dev/null +++ b/wolf3d/code/iphone/SkillViewController.h @@ -0,0 +1,41 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + + +@interface SkillViewController : UIViewController { +@private + IBOutlet UIView* selectionFrame; +} + +-(IBAction)back:(id)sender; +-(IBAction)next:(id)sender; + +-(IBAction)canIPlayDaddy:(id)sender; +-(IBAction)dontHurtMe:(id)sender; +-(IBAction)BringEmOn:(id)sender; +-(IBAction)IAmDeathIncarnate:(id)sender; + + +@end diff --git a/wolf3d/code/iphone/SkillViewController.m b/wolf3d/code/iphone/SkillViewController.m new file mode 100644 index 0000000..4dfac40 --- /dev/null +++ b/wolf3d/code/iphone/SkillViewController.m @@ -0,0 +1,134 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "SkillViewController.h" +#import "EpisodeViewController.h" +#import "wolf_local.h" + +@interface SkillViewController () + +- (void)setSelectionFrame; + +@property (nonatomic, retain) UIView* selectionFrame; + +@end + +@implementation SkillViewController + +@synthesize selectionFrame; + +// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +/* +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization. + } + return self; +} +*/ + +/* +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView { +} +*/ + +- (void)setSelectionFrame { + + int skillTag = skill->value + 1; + + UIView *currentDifficulty = [self.view viewWithTag:skillTag]; + self.selectionFrame.center = currentDifficulty.center; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + [self setSelectionFrame]; +} + + + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + + self.selectionFrame = nil; +} + + +- (void)dealloc { + [super dealloc]; +} + + + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +- (IBAction)next:(id)sender { + EpisodeViewController *evc = [[EpisodeViewController alloc] initWithNibName:@"EpisodeView" bundle:nil]; + [self.navigationController pushViewController:evc animated:YES]; + [evc release]; +} + + +-(IBAction)canIPlayDaddy:(id)sender { + Cvar_SetValue( skill->name, 0 ); + [self setSelectionFrame]; +} + +-(IBAction)dontHurtMe:(id)sender { + Cvar_SetValue( skill->name, 1 ); + [self setSelectionFrame]; +} + +-(IBAction)BringEmOn:(id)sender { + Cvar_SetValue( skill->name, 2 ); + [self setSelectionFrame]; +} + +-(IBAction)IAmDeathIncarnate:(id)sender { + Cvar_SetValue( skill->name, 3 ); + [self setSelectionFrame]; +} + +@end diff --git a/wolf3d/code/iphone/TriviaView.xib b/wolf3d/code/iphone/TriviaView.xib new file mode 100644 index 0000000..6e78c8a --- /dev/null +++ b/wolf3d/code/iphone/TriviaView.xib @@ -0,0 +1,1327 @@ + + + + 1056 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {480, 320} + + NO + IBCocoaTouchFramework + + NSImage + wolf_bg.png + + + + + 292 + {{163, 16}, {134, 52}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Trivia + + POSITYPE-idSettler_v10.2 + 42 + 16 + + + 3 + MQA + + + + 1 + MCAwIDAAA + + {2, 2} + 1 + 10 + 1 + + + + 288 + {{20, 50}, {440, 171}} + + NO + YES + 7 + 1 + NO + IBCocoaTouchFramework + ORIGINAL WOLF: The original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as "The Nocturnal Missions", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together. + + Helvetica + 18 + 16 + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 27}, {440, 171}} + + NO + YES + 7 + 2 + NO + IBCocoaTouchFramework + BJ, THE MAN: William Joseph Blazkowicz was born August 15, 1911, to Polish immigrants. Blazkowicz was a top spy for the Allied Forces, eventually receiving the Congressional Medal of Honor. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 16}, {440, 171}} + + NO + YES + 7 + 3 + NO + IBCocoaTouchFramework + BOX ART: Ken Rieger was the talented illustrator who created the cover art for Spear of Destiny, Wolfenstein3D and Commander Keen. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 50}, {440, 171}} + + NO + YES + 7 + 4 + NO + IBCocoaTouchFramework + THE REAL SPEAR: The Spear of Destiny, also known as The Spear or The Holy Lance, is believed to have been the weapon used to pierce the side of Jesus Christ at the Crucifixion. The Spear soon became a symbol of God's favor and those who possessed it were believed to be invincible. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 60}, {440, 171}} + + NO + YES + 7 + 5 + NO + IBCocoaTouchFramework + THE SPEAR AND HITLER: Hitler is believed to have acquired the Spear at the beginning of WWII. Near the end of that war, it is rumored that General Patton discovered the Spear and that the downfall of Germany began that day. It is fabled that the U.S. was destined to succeed Germany as the New World Power once ownership of the Spear changed hands. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 16}, {440, 171}} + + NO + YES + 7 + 6 + NO + IBCocoaTouchFramework + DEATH DIMENSION: It is said that Hitler made a pact with the Angel of Death, promising the souls of his Nazi soldiers, to protect the Spear of Destiny. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 5}, {440, 171}} + + NO + YES + 7 + 7 + NO + IBCocoaTouchFramework + GOD MODE: In the game, if you can access god mode, BJ's eyes will glow with eerie golden light. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 5}, {440, 171}} + + NO + YES + 7 + 8 + NO + IBCocoaTouchFramework + A PRINCE: Robert Prince, wrote the music for Commander Keen, Wolfenstein 3-D, and Doom. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 37}, {440, 171}} + + NO + YES + 7 + 9 + NO + IBCocoaTouchFramework + DELAYED DEVELOPMENT: It is rumored that work on Spear of Destiny was hindered by the development team's time spent playing Fatal Fury (which Jay Wilbur called 'Fatal Productivity'), and Street Fighter II. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 38}, {440, 171}} + + NO + YES + 7 + 10 + NO + IBCocoaTouchFramework + A MATTER OF DEGREES: John Carmack is known for his innovations in 3D graphics and rocketry but what is less known is that this self-taught engineer has no degrees - he dropped out of school after one semester. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 28}, {440, 171}} + + NO + YES + 7 + 11 + NO + IBCocoaTouchFramework + THE CARMACK: John Carmack, one of the founders of id Software, preferred to work at a pizza joint and make games rather than go to college. His favorite programming food is pizza and diet coke. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 17}, {440, 171}} + + NO + YES + 7 + 12 + NO + IBCocoaTouchFramework + DREAMING IN DIGITAL: Doom was reported to cause gamers to dream in pixels and lower productivity. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 8}, {440, 171}} + + NO + YES + 7 + 13 + NO + IBCocoaTouchFramework + KEEPING IT IN THE FAMILY: BJ is Commander Keen's grandfather. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, -6}, {440, 195}} + + NO + YES + 7 + 14 + NO + IBCocoaTouchFramework + WHAT'S IN A NAME: The original name for Doom was "It's Green and Pissed" + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 69}, {440, 92}} + + NO + YES + 9 + 15 + NO + IBCocoaTouchFramework + GIBS: Gibs, pronounced with a hard 'g', is sometimes confused as 'jibs' due to its pronunciation. The term came from the imagery of flying chicken giblets, or gibs for short. + + + + + {2, 2} + 1 + NO + 10 + 7 + 1 + 0 + + + + -2147483360 + {{20, 38}, {440, 171}} + + NO + YES + 7 + 16 + NO + IBCocoaTouchFramework + WOLFENSTEIN 3D: The game was originally designed to have more complex gameplay. Though dragging bodies, stealth kills and uniforms were already programmed, it was decided that they slowed down the pace of the game and were removed. + + + + + {2, 2} + 1 + 10 + 7 + 1 + 0 + + + + 292 + {{18, 268}, {32, 32}} + + NO + IBCocoaTouchFramework + + NSImage + back_arrow.png + + + + + 292 + {{17, 243}, {66, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + BACK + + POSITYPE-idSettler_v10.2 + 18 + 16 + + + + 1 + 10 + 5 + + + + 319 + {{394, 256}, {66, 38}} + + NO + IBCocoaTouchFramework + 0 + 0 + + POSITYPE-idSettler_v10.2 + 32 + 16 + + {2, 2} + Next + + 3 + MC4zMzMzMzMzMzMzAA + + + + + + + 319 + {{173, 256}, {125, 38}} + + NO + IBCocoaTouchFramework + 0 + 0 + + {2, 2} + Previous + + + + + + + 301 + {{9, 244}, {60, 60}} + + NO + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + button_highlight.png + + + + {480, 320} + + + 3 + MAA + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + nextTrivia: + + + 7 + + 18 + + + + previousTrivia: + + + 7 + + 19 + + + + firstTrivia + + + + 24 + + + + lastTrivia + + + + 43 + + + + back: + + + 7 + + 48 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 5 + + + + + 16 + + + + + 17 + + + + + 20 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + 40 + + + + + 44 + + + + + 45 + + + + + 46 + + + + + 47 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 16.CustomClassName + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 17.CustomClassName + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 20.IBPluginDependency + 20.IBViewBoundsToFrameTransform + 26.IBPluginDependency + 26.IBViewBoundsToFrameTransform + 27.IBPluginDependency + 27.IBViewBoundsToFrameTransform + 28.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 29.IBPluginDependency + 29.IBViewBoundsToFrameTransform + 30.IBPluginDependency + 30.IBViewBoundsToFrameTransform + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 34.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 36.IBPluginDependency + 36.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 37.IBViewBoundsToFrameTransform + 38.IBPluginDependency + 38.IBViewBoundsToFrameTransform + 39.IBPluginDependency + 39.IBViewBoundsToFrameTransform + 40.IBPluginDependency + 40.IBViewBoundsToFrameTransform + 44.CustomClassName + 44.IBPluginDependency + 44.IBViewBoundsToFrameTransform + 45.IBPluginDependency + 45.IBViewBoundsToFrameTransform + 46.IBPluginDependency + 46.IBViewBoundsToFrameTransform + 47.IBPluginDependency + 47.IBViewBoundsToFrameTransform + 5.CustomClassName + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + + + YES + TriviaViewController + UIResponder + {{376, 816}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDroAAw5IAAA + + UIFontButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABC8gAAw5IAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGgAABCaAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHIAABCfAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHwAABCiAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUHIAABCfAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIMAABCkgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIgAABCnAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw2MAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJIAABCsAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUI0AABCpgAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUIEAABDbQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUK2AABDgYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUFgAABDcwAAA + + UIFontLabel + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUMtAABBoAAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 48 + + + + YES + + TriviaViewController + UIViewController + + YES + + YES + back: + nextTrivia: + previousTrivia: + + + YES + id + id + id + + + + YES + + YES + back: + nextTrivia: + previousTrivia: + + + YES + + back: + id + + + nextTrivia: + id + + + previousTrivia: + id + + + + + YES + + YES + firstTrivia + lastTrivia + + + YES + UIView + UIView + + + + YES + + YES + firstTrivia + lastTrivia + + + YES + + firstTrivia + UIView + + + lastTrivia + UIView + + + + + IBProjectSource + TriviaViewController.h + + + + UIFontButton + UIButton + + IBProjectSource + UIFontButton.h + + + + UIFontLabel + UILabel + + IBProjectSource + UIFontLabel.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wolf3d.xcodeproj + 3 + + YES + + YES + back_arrow.png + button_highlight.png + wolf_bg.png + + + YES + {65, 63} + {4, 4} + {960, 640} + + + 141 + + diff --git a/wolf3d/code/iphone/TriviaViewController.h b/wolf3d/code/iphone/TriviaViewController.h new file mode 100644 index 0000000..2667ab9 --- /dev/null +++ b/wolf3d/code/iphone/TriviaViewController.h @@ -0,0 +1,43 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + +// This class handles the trivia menu. It is based on tags - to make it work, each trivia view +// needs a unique, incrementing tag number, and the default trivia item but be set up as an +// IBOutlet. +@interface TriviaViewController : UIViewController { + +@private + IBOutlet UIView* firstTrivia; + IBOutlet UIView* lastTrivia; + + UIView* currentTrivia; +} + +- (IBAction)nextTrivia:(id)sender; +- (IBAction)previousTrivia:(id)sender; + +- (IBAction)back:(id)sender; + +@end diff --git a/wolf3d/code/iphone/TriviaViewController.m b/wolf3d/code/iphone/TriviaViewController.m new file mode 100644 index 0000000..509ab38 --- /dev/null +++ b/wolf3d/code/iphone/TriviaViewController.m @@ -0,0 +1,139 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "TriviaViewController.h" + +#define TRIVIA_COUNT 4 + +@interface TriviaViewController () + + @property (nonatomic, retain) IBOutlet UIView *firstTrivia; + @property (nonatomic, retain) IBOutlet UIView *lastTrivia; + + @property (nonatomic, retain) UIView *currentTrivia; + +@end + +@implementation TriviaViewController + +@synthesize firstTrivia, lastTrivia, currentTrivia; + +// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +/* +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization. + } + return self; +} +*/ + +/* +// Implement loadView to create a view hierarchy programmatically, without using a nib. +- (void)loadView { +} +*/ + + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + self.currentTrivia = self.firstTrivia; +} + + +// Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewDidUnload { + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + + self.firstTrivia = nil; + self.lastTrivia = nil; + + self.currentTrivia = nil; +} + + +- (void)dealloc { + [super dealloc]; +} + +- (IBAction)nextTrivia:(id)sender { + // Hide the current trivia + self.currentTrivia.hidden = YES; + + if ( self.currentTrivia == self.lastTrivia ) { + // If we are on the last trivia, we need to loop back to the first one. + self.currentTrivia = self.firstTrivia; + } else { + // Otherwise, just go to the trivia with the next tag. + NSInteger currentTriviaTag = self.currentTrivia.tag; + NSInteger nextTriviaTag = currentTriviaTag + 1; + + self.currentTrivia = [self.view viewWithTag:nextTriviaTag]; + } + + // Now that the currentTrivia has been reassigned, we can show the new one. + self.currentTrivia.hidden = NO; +} + +- (IBAction)previousTrivia:(id)sender { + // Hide the current trivia + self.currentTrivia.hidden = YES; + + if ( self.currentTrivia == self.firstTrivia ) { + // If we are on the first trivia, we need to loop back to the last one. + self.currentTrivia = self.lastTrivia; + } else { + // Otherwise, just go to the trivia with the previous tag. + NSInteger currentTriviaTag = self.currentTrivia.tag; + NSInteger nextTriviaTag = currentTriviaTag - 1; + + self.currentTrivia = [self.view viewWithTag:nextTriviaTag]; + } + + // Now that the currentTrivia has been reassigned, we can show the new one. + self.currentTrivia.hidden = NO; +} + +- (IBAction)back:(id)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +@end diff --git a/wolf3d/code/iphone/UIFontButton.h b/wolf3d/code/iphone/UIFontButton.h new file mode 100644 index 0000000..520384e --- /dev/null +++ b/wolf3d/code/iphone/UIFontButton.h @@ -0,0 +1,30 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + + +#import + +@interface UIFontButton : UIButton + + +@end diff --git a/wolf3d/code/iphone/UIFontButton.m b/wolf3d/code/iphone/UIFontButton.m new file mode 100644 index 0000000..4243fc2 --- /dev/null +++ b/wolf3d/code/iphone/UIFontButton.m @@ -0,0 +1,34 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "UIFontButton.h" + +@implementation UIFontButton + +- (void)awakeFromNib { + CGFloat points = self.titleLabel.font.pointSize; + + self.titleLabel.font = [UIFont fontWithName:@"POSITYPE idSettler v10.2" size:points]; +} + +@end diff --git a/wolf3d/code/iphone/UIFontLabel.h b/wolf3d/code/iphone/UIFontLabel.h new file mode 100644 index 0000000..016ca7a --- /dev/null +++ b/wolf3d/code/iphone/UIFontLabel.h @@ -0,0 +1,30 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + + +#import + +@interface UIFontLabel : UILabel + + +@end diff --git a/wolf3d/code/iphone/UIFontLabel.m b/wolf3d/code/iphone/UIFontLabel.m new file mode 100644 index 0000000..f6f2096 --- /dev/null +++ b/wolf3d/code/iphone/UIFontLabel.m @@ -0,0 +1,34 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "UIFontLabel.h" + +@implementation UIFontLabel + +- (void)awakeFromNib { + CGFloat points = self.font.pointSize; + + self.font = [UIFont fontWithName:@"POSITYPE idSettler v10.2" size:points]; +} + +@end diff --git a/wolf3d/code/iphone/UITableViewScrolling.h b/wolf3d/code/iphone/UITableViewScrolling.h new file mode 100644 index 0000000..2df185b --- /dev/null +++ b/wolf3d/code/iphone/UITableViewScrolling.h @@ -0,0 +1,35 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#ifndef UITABLEVIEWSCROLLING_H +#define UITABLEVIEWSCROLLING_H + + +@class UITableView; + +void UITableViewScrollingPageUp( UITableView * table, int totalRows ); +void UITableViewScrollingPageDown( UITableView * table, int totalRows ); +void UITableViewScrollingScrollToRow( UITableView * table, int row, int maxRow ); + + +#endif diff --git a/wolf3d/code/iphone/UITableViewScrolling.m b/wolf3d/code/iphone/UITableViewScrolling.m new file mode 100644 index 0000000..0b7d88c --- /dev/null +++ b/wolf3d/code/iphone/UITableViewScrolling.m @@ -0,0 +1,74 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "UITableViewScrolling.h" +#import + +void UITableViewScrollingPageDown( UITableView * table, int totalRows ) { + // If the user taps the page down button, we want to scroll the table view so that the first + // non-visible row becomes visible. To do this, we can get the array of visible index paths, + // find the maximum row within the array, and scroll to the row just after that. + + NSArray* visibleIndexPaths = [table indexPathsForVisibleRows]; + + int maxRow = 0; + + for ( NSIndexPath* path in visibleIndexPaths ) { + maxRow = maxRow < path.row ? path.row: maxRow; + } + + const int rowToMakeVisible = maxRow + 1; + + UITableViewScrollingScrollToRow( table,rowToMakeVisible, totalRows ); +} + + +void UITableViewScrollingPageUp( UITableView * table, int totalRows ) { + + // If the user taps the page up button, we want to scroll the table view so that the first + // non-visible row becomes visible. To do this, we can get the array of visible index paths, + // find the minimum row within the array, and scroll to the row just before that. + + NSArray* visibleIndexPaths = [table indexPathsForVisibleRows]; + + int minRow = totalRows - 1; + + for ( NSIndexPath* path in visibleIndexPaths ) { + minRow = minRow < path.row ? minRow: path.row; + } + + const int rowToMakeVisible = minRow - 1; + + UITableViewScrollingScrollToRow( table,rowToMakeVisible, totalRows ); +} + + +void UITableViewScrollingScrollToRow( UITableView * table, int row, int maxRow ) { + + const int clampedRowMax = row < maxRow? row: maxRow-1; + const int clampedRow = clampedRowMax < 0? 0: clampedRowMax; + + NSIndexPath* pathToMakeVisible = [NSIndexPath indexPathForRow:clampedRow inSection:0]; + + [table scrollToRowAtIndexPath:pathToMakeVisible atScrollPosition:UITableViewScrollPositionNone animated:YES]; +} diff --git a/wolf3d/code/iphone/WolfSlider.h b/wolf3d/code/iphone/WolfSlider.h new file mode 100644 index 0000000..576200a --- /dev/null +++ b/wolf3d/code/iphone/WolfSlider.h @@ -0,0 +1,31 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + + +@interface WolfSlider : UISlider { + +} + +@end diff --git a/wolf3d/code/iphone/WolfSlider.m b/wolf3d/code/iphone/WolfSlider.m new file mode 100644 index 0000000..68f3c11 --- /dev/null +++ b/wolf3d/code/iphone/WolfSlider.m @@ -0,0 +1,40 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import "WolfSlider.h" + + +@implementation WolfSlider + + +- (CGRect)trackRectForBounds:(CGRect)bounds { + + UIImage* trackImage = [self minimumTrackImageForState:UIControlStateNormal]; + + CGFloat trackImageHeight = trackImage.size.height; + + return CGRectMake(bounds.origin.x, bounds.origin.y, self.bounds.size.width, trackImageHeight); +} + + +@end diff --git a/wolf3d/code/iphone/gles_glue.c b/wolf3d/code/iphone/gles_glue.c index d4d53f9..f291b8a 100644 --- a/wolf3d/code/iphone/gles_glue.c +++ b/wolf3d/code/iphone/gles_glue.c @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -46,8 +49,8 @@ unsigned int QGLBeginStarted = 0; struct Vertex { - float xyz[3]; - float st[2]; + GLfloat xyz[3]; + GLfloat st[2]; GLubyte c[4]; }; @@ -56,10 +59,12 @@ struct Vertex { typedef struct Vertex Vertex; Vertex immediate[ MAX_VERTS ]; Vertex vab; -short quad_indexes[MAX_VERTS * 3 / 2 ]; +GLushort quad_indexes[MAX_VERTS * 3 / 2 ]; int curr_vertex; GLenum curr_prim; +GLuint quad_index_buffer_name; + void InitImmediateModeGL() { for ( int i = 0; i < MAX_VERTS * 3 / 2; i+=6 ) { int q = i / 6 * 4; @@ -71,6 +76,11 @@ void InitImmediateModeGL() { quad_indexes[ i + 4 ] = q + 2; quad_indexes[ i + 5 ] = q + 3; } + + // Use a VBO for the quad indices, since they never change. + glGenBuffers( 1, &quad_index_buffer_name ); + glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, quad_index_buffer_name ); + glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( quad_indexes), quad_indexes, GL_STATIC_DRAW ); qglVertexPointer( 3, GL_FLOAT, sizeof( Vertex ), immediate[ 0 ].xyz ); qglTexCoordPointer( 2, GL_FLOAT, sizeof( Vertex ), immediate[ 0 ].st ); @@ -132,7 +142,7 @@ void pfglTexCoord2f( GLfloat s, GLfloat t ) { void pfglEnd() { if ( curr_prim == GL_QUADS ) { - qglDrawElements( GL_TRIANGLES, curr_vertex / 4 * 6, GL_UNSIGNED_SHORT, quad_indexes ); + qglDrawElements( GL_TRIANGLES, curr_vertex / 4 * 6, GL_UNSIGNED_SHORT, (void*)0 ); } else { qglDrawArrays( curr_prim, 0, curr_vertex ); } diff --git a/wolf3d/code/iphone/gles_glue.h b/wolf3d/code/iphone/gles_glue.h index 7942186..0f9e4e8 100644 --- a/wolf3d/code/iphone/gles_glue.h +++ b/wolf3d/code/iphone/gles_glue.h @@ -55,6 +55,7 @@ extern "C" { void pfglBegin( GLenum prim ); void pfglVertex3f( float x, float y, float z ); void pfglVertex2i( GLint x, GLint y ); +void pfglVertex2f(GLfloat x, GLfloat y ); void pfglColor4ub( GLubyte r, GLubyte g, GLubyte b, GLubyte a ); void pfglColor4f( GLfloat r, GLfloat g, GLfloat b, GLfloat a ); void pfglTexCoord2i( GLint s, GLint t ); diff --git a/wolf3d/code/iphone/hud.c b/wolf3d/code/iphone/hud.c index 056a76e..9472bc0 100644 --- a/wolf3d/code/iphone/hud.c +++ b/wolf3d/code/iphone/hud.c @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -20,6 +23,9 @@ #include "../wolfiphone.h" +extern int BackButton(); +extern int MenuButton(); + hud_t huds; void HudDraw(); @@ -76,44 +82,102 @@ void HudSetTexnums() { #endif } +// HUD element sizes +#define HUD_FORWARD_STICK_WIDTH 100 +#define HUD_FORWARD_STICK_HEIGHT 100 + +#define HUD_SIDE_STICK_WIDTH 100 +#define HUD_SIDE_STICK_HEIGHT 100 + +#define HUD_TURN_STICK_WIDTH 100 +#define HUD_TURN_STICK_HEIGHT 100 + +#define HUD_FIRE_BUTTON_WIDTH 80 +#define HUD_FIRE_BUTTON_HEIGHT 80 + +#define HUD_MENU_BUTTON_WIDTH 64 +#define HUD_MENU_BUTTON_HEIGHT 64 + +#define HUD_MAP_BUTTON_WIDTH 64 +#define HUD_MAP_BUTTON_HEIGHT 64 + +#define HUD_AMMO_WIDTH 80 +#define HUD_AMMO_HEIGHT 44 + + +#define TABLET_STICK_SCALE 0.9f + void HudSetForScheme( int schemeNum ) { + + int forwardWidth = HUD_FORWARD_STICK_WIDTH * screenScale; + int forwardHeight = HUD_FORWARD_STICK_HEIGHT * screenScale; + + int sideWidth = HUD_SIDE_STICK_WIDTH * screenScale; + int sideHeight = HUD_SIDE_STICK_HEIGHT * screenScale; + + int turnWidth = HUD_TURN_STICK_WIDTH * screenScale; + int turnHeight = HUD_TURN_STICK_HEIGHT * screenScale; + + int fireWidth = HUD_FIRE_BUTTON_WIDTH * screenScale; + int fireHeight = HUD_FIRE_BUTTON_HEIGHT * screenScale; + + int menuWidth = HUD_MENU_BUTTON_WIDTH * screenScale; + int menuHeight = HUD_MENU_BUTTON_HEIGHT * screenScale; + + int mapWidth = HUD_MAP_BUTTON_WIDTH * screenScale; + int mapHeight = HUD_MAP_BUTTON_HEIGHT * screenScale; + + int ammoWidth = HUD_AMMO_WIDTH * screenScale; + int ammoHeight = HUD_AMMO_HEIGHT * screenScale; + + // Scale the size of the sticks down a bit on the iPad. This helps normalize the + // sensitivity and helps with any potential controller attachments :) + if ( iphoneGetDeviceType() == DEVICE_TABLET ) { + forwardWidth *= TABLET_STICK_SCALE; + forwardHeight *= TABLET_STICK_SCALE; + sideWidth *= TABLET_STICK_SCALE; + sideHeight *= TABLET_STICK_SCALE; + turnWidth *= TABLET_STICK_SCALE; + turnHeight *= TABLET_STICK_SCALE; + } + switch ( schemeNum ) { default: case 0: - SetHudSpot( &huds.forwardStick, 0, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.sideStick, 0, 320-100, 100, 100, HF_DISABLED ); - SetHudSpot( &huds.turnStick, 0, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.fire, 480-80, 320-80, 80, 80, 0 ); - SetHudSpot( &huds.menu, 480-64, 0, 64, 32, 0 ); - SetHudSpot( &huds.map, 0, 0, 64, 32, 0 ); - SetHudSpot( &huds.ammo, 480-80, 320-100-44, 80, 44, 0 ); + SetHudSpot( &huds.forwardStick, 0, viddef.height-forwardHeight, forwardWidth, forwardHeight, 0 ); + SetHudSpot( &huds.sideStick, 0, viddef.height-sideHeight, sideWidth, sideHeight, HF_DISABLED ); + SetHudSpot( &huds.turnStick, 0, viddef.height-turnHeight, turnWidth, turnHeight, 0 ); + SetHudSpot( &huds.fire, viddef.width-fireWidth, viddef.height-fireHeight, fireWidth, fireHeight, 0 ); + SetHudSpot( &huds.menu, viddef.width-menuWidth, 0, menuWidth, menuHeight, 0 ); + SetHudSpot( &huds.map, 0, 0, mapWidth, mapHeight, 0 ); + SetHudSpot( &huds.ammo, viddef.width-ammoWidth, viddef.height-fireHeight-ammoHeight, ammoWidth, ammoHeight, 0 ); break; case 1: - SetHudSpot( &huds.forwardStick, 480-100, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.sideStick, 0, 320-100, 100, 100, HF_DISABLED ); - SetHudSpot( &huds.turnStick, 480-100, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.fire, 0, 320-80, 80, 80, 0 ); - SetHudSpot( &huds.menu, 480-64, 0, 64, 32, 0 ); - SetHudSpot( &huds.map, 0, 0, 64, 32, 0 ); - SetHudSpot( &huds.ammo, 480-80, 320-100-44, 80, 44, 0 ); + SetHudSpot( &huds.forwardStick, viddef.width-forwardWidth, viddef.height-forwardHeight, forwardWidth, forwardHeight, 0 ); + SetHudSpot( &huds.sideStick, 0, viddef.height-sideHeight, sideWidth, sideHeight, HF_DISABLED ); + SetHudSpot( &huds.turnStick, viddef.width-turnWidth, viddef.height-turnHeight, turnWidth, turnHeight, 0 ); + SetHudSpot( &huds.fire, 0, viddef.height-fireHeight, fireWidth, fireHeight, 0 ); + SetHudSpot( &huds.menu, viddef.width-menuWidth, 0, menuWidth, menuHeight, 0 ); + SetHudSpot( &huds.map, 0, 0, mapWidth, mapHeight, 0 ); + SetHudSpot( &huds.ammo, 0, viddef.height-fireHeight-ammoHeight, ammoWidth, ammoHeight, 0 ); break; case 2: - SetHudSpot( &huds.forwardStick, 0, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.sideStick, 0, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.turnStick, 480-100, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.fire, 480-80, 0, 80, 80, 0 ); - SetHudSpot( &huds.menu, 0, 32, 64, 32, 0 ); - SetHudSpot( &huds.map, 0, 0, 64, 32, 0 ); - SetHudSpot( &huds.ammo, 480-80, 80, 80, 44, 0 ); + SetHudSpot( &huds.forwardStick, 0, viddef.height-forwardHeight, forwardWidth, forwardHeight, 0 ); + SetHudSpot( &huds.sideStick, 0, viddef.height-sideHeight, sideWidth, sideHeight, 0 ); + SetHudSpot( &huds.turnStick, viddef.width-turnWidth, viddef.height-turnHeight, turnWidth, turnHeight, 0 ); + SetHudSpot( &huds.fire, viddef.width-fireWidth, 0, fireWidth, fireHeight, 0 ); + SetHudSpot( &huds.menu, 0, mapHeight, menuWidth, menuHeight, 0 ); + SetHudSpot( &huds.map, 0, 0, mapWidth, mapHeight, 0 ); + SetHudSpot( &huds.ammo, viddef.width-ammoWidth, fireHeight, ammoWidth, ammoHeight, 0 ); break; case 3: - SetHudSpot( &huds.forwardStick, 480-100, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.sideStick, 480-100, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.turnStick, 0, 320-100, 100, 100, 0 ); - SetHudSpot( &huds.fire, 480-80, 0, 80, 80, 0 ); - SetHudSpot( &huds.menu, 0, 32, 64, 32, 0 ); - SetHudSpot( &huds.map, 0, 0, 64, 32, 0 ); - SetHudSpot( &huds.ammo, 480-80, 80, 80, 44, 0 ); + SetHudSpot( &huds.forwardStick, viddef.width-forwardWidth, viddef.height-forwardHeight, forwardWidth, forwardHeight, 0 ); + SetHudSpot( &huds.sideStick, viddef.width-sideWidth, viddef.height-sideHeight, sideWidth, sideHeight, 0 ); + SetHudSpot( &huds.turnStick, 0, viddef.height-turnHeight, turnWidth, turnHeight, 0 ); + SetHudSpot( &huds.fire, viddef.width-fireWidth, 0, fireWidth, fireHeight, 0 ); + SetHudSpot( &huds.menu, 0, mapHeight, menuWidth, menuHeight, 0 ); + SetHudSpot( &huds.map, 0, 0, mapWidth, mapHeight, 0 ); + SetHudSpot( &huds.ammo, viddef.width-ammoWidth, fireHeight, ammoWidth, ammoHeight, 0 ); break; } @@ -192,14 +256,14 @@ void HudEditFrame() { if ( dragHud->x < 0 ) { dragHud->x = 0; } - if ( dragHud->x > 480 - dragHud->width ) { - dragHud->x = 480 - dragHud->width; + if ( dragHud->x > viddef.width - dragHud->width ) { + dragHud->x = viddef.width - dragHud->width; } if ( dragHud->y < 0 ) { dragHud->y = 0; } - if ( dragHud->y > 320 - dragHud->height ) { - dragHud->y = 320 - dragHud->height; + if ( dragHud->y > viddef.height - dragHud->height ) { + dragHud->y = viddef.height - dragHud->height; } } @@ -210,7 +274,7 @@ void HudEditFrame() { w += hud->width; } } - x = 240 - w / 2; + x = (480 / 2) - w / 2; for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) { if ( hud->hudFlags & HF_DISABLED ) { @@ -242,7 +306,7 @@ void HudEditFrame() { } // draw the done button - if ( iphoneDrawPicWithTouch( 240-32, 320-80-32, 64, 32, "iphone/button_back.tga" ) ) { + if ( iphoneDrawPicWithTouch( (480 / 2)-32, 320-80-32, 64, 32, "iphone/button_back.tga" ) ) { menuState = IPM_CONTROLS; iphoneSetNotifyText( "" ); } @@ -279,11 +343,16 @@ void ConvertFromImageToScreen(int *x, int *y, rect_t boundsRect) //int boundsUnder = 320-10; int height = boundsUnder - boundsAbove; + float windowWidth = 480.0f; + float windowHeight = 320.0f; + + ScalePositionAndSize( NULL, NULL, &windowWidth, &windowHeight ); + valX -= boundsLeft; - valX = 480*valX/width; + valX = windowWidth*valX/width; valY -= boundsAbove; - valY = 320*valY/height; + valY = windowHeight*valY/height; *x = valX; *y = valY; @@ -295,7 +364,7 @@ void ConvertFromImageToScreen(int *x, int *y, rect_t boundsRect) // to the coordinates of the screen of the iphone image // gsh //------------------- -void ConvertFromScreenToImage(int *x, int *y, rect_t boundsRect) +void ConvertFromScreenToImage(int *x, int *y, rect_t boundsRect, float screenWidth, float screenHeight ) { int boundsLeft = boundsRect.x; int boundsRight = boundsRect.x + boundsRect.width; @@ -312,11 +381,11 @@ void ConvertFromScreenToImage(int *x, int *y, rect_t boundsRect) //int boundsAbove = 100; //int boundsUnder = 320-10; int height = boundsUnder - boundsAbove; - - valX = width*valX/480; + + valX = width*valX/screenWidth; valX += boundsLeft; - valY = height*valY/320; + valY = height*valY/screenHeight; valY += boundsAbove; *x = valX; @@ -346,8 +415,13 @@ void ScaleFromScreenToImage(int *width, int *height, rect_t boundsRect) //int boundsUnder = 320-10; int iH = boundsUnder - boundsAbove; - w = w*iW/480; - h = h*iH/320; + float screenWidth = 480.0f; + float screenHeight = 320.0f; + + ScalePositionAndSize( NULL, NULL, &screenWidth, &screenHeight ); + + w = w*iW/screenWidth; + h = h*iH/screenHeight; *width = w; *height = h; @@ -369,8 +443,18 @@ void iphoneHudEditFrame() { int adjustY = 10; rect_t boundsRect = RectMake(86, 80-adjustY, 300, 205); + rect_t scaledBoundsRect; + + scaledBoundsRect.x = boundsRect.x; + scaledBoundsRect.y = boundsRect.y; + scaledBoundsRect.width = boundsRect.width; + scaledBoundsRect.height = boundsRect.height; + ScaleRect( &scaledBoundsRect ); + float scaledScreenWidth = 480.0f; + float scaledScreenHeight = 320.0f; + ScalePositionAndSize( NULL, NULL, &scaledScreenWidth, &scaledScreenHeight ); //iphoneSetNotifyText( "Drag the controls" ); @@ -380,10 +464,22 @@ void iphoneHudEditFrame() { int y = prevTouches[0][1]; //convert x, y coordinates from iphone_image to screen coordinates - ConvertFromImageToScreen( &x, &y, boundsRect); + ConvertFromImageToScreen( &x, &y, scaledBoundsRect); //ConvertFromScreenToImage( &x, &y); - if ( x > 120 && x < 360 && y > 80 && y < 240 ) { + float disableRegionLeft = 120; + float disableRegionRight = REFERENCE_WIDTH - 120; + + float disableRegionTop = 80; + float disableRegionBottom = REFERENCE_HEIGHT - 80; + + disableRegionTop *= screenScale; + disableRegionBottom *= screenScale; + disableRegionLeft *= screenScale; + disableRegionRight *= screenScale; + + if ( x > disableRegionLeft && x < disableRegionRight && + y > disableRegionTop && y < disableRegionBottom ) { dragHud->hudFlags |= HF_DISABLED; } else { // magnet pull a matchable axis if it is close enough @@ -408,7 +504,7 @@ void iphoneHudEditFrame() { int y = touches[0][1]; //convert x, y coordinates from iphone_image to screen coordinates - ConvertFromImageToScreen( &x, &y, boundsRect); + ConvertFromImageToScreen( &x, &y, scaledBoundsRect); // ConvertFromScreenToImage( &x, &y); dragHud = NULL; @@ -416,9 +512,6 @@ void iphoneHudEditFrame() { if ( x >= hud->x && x - hud->x < hud->width && y >= hud->y && y - hud->y < hud->height ) { dragHud = hud; - //int tempDragX = dragHud->x; - //int tempDragY = dragHud->y; - //ConvertFromImageToScreen(&, <#int * y#>) dragX = dragHud->x - x; dragY = dragHud->y - y; Sound_StartLocalSound( "iphone/bdown_01.wav" ); @@ -432,21 +525,21 @@ void iphoneHudEditFrame() { // adjust the position of the dragHud int x = touches[0][0]; int y = touches[0][1]; - ConvertFromImageToScreen(&x, &y, boundsRect); + ConvertFromImageToScreen(&x, &y, scaledBoundsRect); dragHud->x = x + dragX; dragHud->y = y + dragY; if ( dragHud->x < 0 ) { dragHud->x = 0; } - if ( dragHud->x > 480 - dragHud->width ) { - dragHud->x = 480 - dragHud->width; + if ( dragHud->x > scaledScreenWidth - dragHud->width ) { + dragHud->x = scaledScreenWidth - dragHud->width; } if ( dragHud->y < 0 ) { dragHud->y = 0; } - if ( dragHud->y > 320 - dragHud->height ) { - dragHud->y = 320 - dragHud->height; + if ( dragHud->y > scaledScreenHeight - dragHud->height ) { + dragHud->y = scaledScreenHeight - dragHud->height; } } @@ -457,12 +550,12 @@ void iphoneHudEditFrame() { w += hud->width; } } - x = 240 - w / 2; + x = ( viddef.width / 2 ) - ( w / 2 ); for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) { if ( hud->hudFlags & HF_DISABLED ) { hud->x = x; - hud->y = 160-hud->height/2; + hud->y = ( viddef.height / 2 ) - ( hud->height/2 ); x += hud->width; } } @@ -470,21 +563,21 @@ void iphoneHudEditFrame() { // decide where the menu button, map button, and ammo will draw // solid background color and some UI elements for context - R_Draw_Fill( 0, 0, 480, 320, gray ); + rectFloat_t backgroundFill = MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ); + R_Draw_Fill( backgroundFill.x, backgroundFill.y, backgroundFill.width, backgroundFill.height, gray ); - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); //iphoneDrawPic(240-108, 0, 217, 50, "iphone/header_advanced.tga"); - iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_advanced.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 240.0f-108.0f*9/10.0f, 0.0f, 217.0f*9/10.0f, 50.0f*9/10.0f ), "iphone/header_advanced.tga"); //gsh - iphoneDrawPic(10, 60-adjustY, 462, 250, "iphone/iphone_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 10.0f, 60.0f-adjustY, 462.0f, 250.0f ), "iphone/iphone_image.tga"); // iphoneDrawPic(0, 320-240, 480, 240, "iphone/iphone_image.tga"); // iphoneDrawFace(); // iphoneDrawNotifyText(); - // draw the active items at their current locations for ( hudPic_t *hud = (hudPic_t *)&huds ; hud != (hudPic_t *)(&huds+1) ; hud++ ) { //nice foreach loop! if ( hud->hudFlags & HF_DISABLED ) { @@ -496,8 +589,10 @@ void iphoneHudEditFrame() { int w = 48; int h = 48; - ConvertFromScreenToImage(&x, &y, boundsRect); - ScaleFromScreenToImage(&w, &h, boundsRect); + ConvertFromScreenToImage(&x, &y, scaledBoundsRect, scaledScreenWidth, scaledScreenHeight ); + ScaleFromScreenToImage(&w, &h, scaledBoundsRect); + + //ScalePositionAndSizeInt( &x, &y, &w, &h ); iphoneDrawNumber( x, y, 99, w, h ); } else { @@ -506,8 +601,10 @@ void iphoneHudEditFrame() { int w = hud->width; int h = hud->height; - ConvertFromScreenToImage(&x, &y, boundsRect); - ScaleFromScreenToImage(&w, &h, boundsRect); + ConvertFromScreenToImage(&x, &y, scaledBoundsRect, scaledScreenWidth, scaledScreenHeight ); + ScaleFromScreenToImage(&w, &h, scaledBoundsRect); + + //ScalePositionAndSizeInt( &x, &y, &w, &h ); iphoneDrawPicNum( x, y, w, h, hud->glTexNum ); } @@ -519,16 +616,14 @@ void iphoneHudEditFrame() { // draw the back button - if ( iphoneDrawPicWithTouch( 0, 0, 64, 36, "iphone/button_back.tga" ) ) { - menuState = IPM_CONTROLS; + if ( BackButton() ) { + iphoneStartPreviousMenu(); iphoneSetNotifyText( "" ); } - //x = 64; - //if (revLand->value) - x = 480-64; + x = 480-64; // draw the menu button - if ( iphoneDrawPicWithTouch( x, 0, 64, 36, "iphone/menu.tga" ) ) { + if ( MenuButton() ) { //if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/button_menu_yellow.tga" ) ) { menuState = IPM_MAIN; iphoneSetNotifyText( "" ); @@ -543,10 +638,6 @@ void iphoneHudEditFrame() { int y = 0; y = 0; x = 480-width; - if (revLand->value){ - y = 320-height; - x = 0; - } //gsh if ((int)volumeFireUpSetting->value) { @@ -560,8 +651,6 @@ void iphoneHudEditFrame() { x = 480-width-width-5; - if (revLand->value) - x = width+5; if ((int)volumeFireDownSetting->value) { if (iphoneDrawPicWithTouch( x, y, width, height, "iphone/button_pistol.tga" )) @@ -574,10 +663,6 @@ void iphoneHudEditFrame() { //----------------------------------- */ //draw the instructions - //if (revLand->value) - // iphoneDrawText(x+width+20, 300, 16, 16, "Drag the controls to customize"); - //else -// iphoneCenterText(240, 300, "Drag each element of the controls to customize"); iphoneCenterArialText(245, 315, 0.8f, "Drag each element of the controls to customize"); } diff --git a/wolf3d/code/iphone/iphone_alerts.h b/wolf3d/code/iphone/iphone_alerts.h index 45227d0..f7ffd5f 100644 --- a/wolf3d/code/iphone/iphone_alerts.h +++ b/wolf3d/code/iphone/iphone_alerts.h @@ -1,16 +1,9 @@ -/* - * iphone_alerts.h - * wolf3d - * - * Created by Greg Hodges on 7/14/09. - * Copyright 2009 id software. All rights reserved. - * - * C wrappers for the UIAlertView. - * - */ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -28,12 +21,12 @@ */ - #ifndef __IPHONE_ALERTS__ #define __IPHONE_ALERTS__ void iphoneMessageBox(char *title, char *message); void iphoneKillMessageBox(); +void iphoneNewMessageBox(char *title, char *message); void iphoneYesNoBox(char *title, char *message); #endif \ No newline at end of file diff --git a/wolf3d/code/iphone/iphone_alerts.m b/wolf3d/code/iphone/iphone_alerts.m index e1a4464..7ec2f3c 100644 --- a/wolf3d/code/iphone/iphone_alerts.m +++ b/wolf3d/code/iphone/iphone_alerts.m @@ -1,14 +1,9 @@ -/* - * iphone_alerts.c - * wolf3d - * - * Created by Greg Hodges on 7/14/09. - * Copyright 2009 id software. All rights reserved. - * - */ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -26,7 +21,6 @@ */ - #import "iphone_alerts.h" #import "wolf3dAppDelegate.h" @@ -71,6 +65,34 @@ void iphoneKillMessageBox() [alert dismissWithClickedButtonIndex:alert.cancelButtonIndex animated:NO]; } +/* + ======================== + iphoneNewMessageBox() + creates a new message box without + drestroying the old one + ======================== + */ +void iphoneNewMessageBox(char *title, char *message) +{ + UIAlertView *newAlert; + newAlert = [[UIAlertView alloc] initWithTitle:@"Title" + message:@"Message" + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles: nil]; + + + NSString *nsTitle = [[NSString alloc] initWithCString:title]; + NSString *nsMessage = [[NSString alloc] initWithCString:message]; + + newAlert.title = nsTitle; + newAlert.message = nsMessage; + + [newAlert show]; + [newAlert release]; +} + + #if 1 /* ================================== diff --git a/wolf3d/code/iphone/iphone_downloadSOD.m b/wolf3d/code/iphone/iphone_downloadSOD.m index 0cf94a3..74efe5c 100644 --- a/wolf3d/code/iphone/iphone_downloadSOD.m +++ b/wolf3d/code/iphone/iphone_downloadSOD.m @@ -1,13 +1,9 @@ -// -// iphone_downloadSOD.m -// wolf3d -// -// Created by Greg Hodges on 6/8/09. -// Copyright 2009 id software. All rights reserved. -// /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -25,15 +21,15 @@ */ - - #import "../wolfiphone.h" #import "wolf3dAppDelegate.h" +//#import "zlib.h" #import "iphone_alerts.h" #include #include +//gsh #import //this is for testing network availability //Note: in order to link the zlib library into the build from usr/lib/libz.ylib @@ -46,6 +42,7 @@ extern void my_snprintf( char *dest, size_t size, const char *format, ... ); #ifdef SPEARSTOREKIT +//extern int StartUntgz(char *TGZfile); extern void PurchaseSOD(); extern bool isStorekitAvailable; #endif @@ -178,6 +175,11 @@ void DownloadSOD() { menuState = IPM_DOWNLOADPROGRESS; //change the menu to the download screen + /* + //TODO: alert user that the download is beginning and will take a while + */ + //iphoneMessageBox("Download in Progress", "You have not been charged. Purchasing comes at the end of this process. Download may take several minutes."); + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; @@ -199,6 +201,20 @@ void DownloadSOD() //after this the control automatically goes back to the appDelegate where it receives the packets of downloaded information } +/* +//============================ +// AppendData +// adds a packet of data to our buffer +//============================ +void AppendData(NSData* data) +{ + Com_Printf("appending data\n"); + + NSUInteger length = [data length]; + NSLog(@"Received %d bytes of data", length); + +// [receivedData appendData:data]; +}*/ unsigned int dataAmount = 0; unsigned int dataTotalAmount = 0; @@ -216,7 +232,13 @@ void AppendDataToFile(NSData* data) dataAmount = (unsigned int)length; dataTotalAmount += dataAmount; totalDownloaded = dataTotalAmount; //update the download screen with the total downloaded - +/* + if (dataTotalAmount > DownloadFileSize * 7/10 && !hasBeenMessaged) + { + iphoneMessageBox("Extraction in Progress", "SOD is installing. This may take several minutes."); + hasBeenMessaged = 1; + } +*/ //get documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; @@ -253,7 +275,162 @@ void DecompressData() char path[1024]; my_snprintf(path, sizeof(path), "%s/downloadedfile.tgz", iphoneDocDirectory); + +// StartUntgz(path); //this is where we would normally start decompression. + //but we no longer need to decompress anything + //so we might as well get rid of our zlib dependencies } +/* +//================================ +// CopyFolders +// Copies the contents of the base folder to the SODbase folder +// One folder at a time... hopefully to allow renderings +// This allows us to provide a smaller download +//================================ +void CopyFolders() +{ + int numberOfFolders = 7; + char sourcePath[1024]; + char destPath[1024]; + char folderNames[7][8] = {"iphone","lsfx","maps","music","sfx","sprites","walls"}; + + char *appDir; + appDir = getenv("CWD"); + + NSString *source; + NSString *toPath; + + //Draw a black colored bar + colour4_t backgroundColor = { 10, 10, 10, 255 }; + R_Draw_Blend( 40, 150, 4*100, 20, backgroundColor ); + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error; + + //try creating the base directory + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/", iphoneDocDirectory); + toPath = [[NSString alloc] initWithUTF8String:destPath]; + NSLog(@"creating Directory: %@", toPath); + if([fileManager createDirectoryAtPath:toPath attributes:nil]) + Com_Printf("creating SODbase success!\n"); + else + Com_Printf("creating SODbase failed :(\n"); + + for (int i = 0; i < numberOfFolders; ++i) + { + + my_snprintf(sourcePath, sizeof(sourcePath), "%s/base/%s", appDir, folderNames[i]); + // my_snprintf(destPath, sizeof(destPath), "%s/base/", iphoneDocDirectory); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/%s", iphoneDocDirectory, folderNames[i]); + + source = [[NSString alloc] initWithUTF8String:sourcePath]; + toPath = [[NSString alloc] initWithUTF8String:destPath]; + + NSLog(source); + NSLog(toPath); + + //attempt the copy + if ([fileManager copyItemAtPath:source toPath:toPath error:&error])//; + Com_Printf("copy base %s success!\n", folderNames[i]); + else + Com_Printf("copy %s folder failed :(\n", folderNames[i]); + + //draw the next iteration + colour4_t color = { 255, 0, 0, 255 }; + R_Draw_Blend( 40, 150, 400*i/numberOfFolders, 20, color ); + + SysIPhoneSwapBuffers(); + + [source release]; + [toPath release]; + } + + //TODO: delete some of the copied files + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/012.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/017.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/024.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/042.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/046.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/047.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/048.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/050.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/051.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/052.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/053.5551", iphoneDocDirectory); + remove(destPath); + +} + + +//================================ +// CopyFolder +// Copies the contents of the base folder to the SODbase folder +// This allows us to provide a smaller download +// This is all very slow. The POSIX library might've been faster. +//================================ +void CopyFolder() +{ + + char sourcePath[1024]; + char destPath[1024]; + + char *appDir; + appDir = getenv("CWD"); + + my_snprintf(sourcePath, sizeof(sourcePath), "%s/base/", appDir); + // my_snprintf(destPath, sizeof(destPath), "%s/base/", iphoneDocDirectory); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/", iphoneDocDirectory); + + NSString *source = [[NSString alloc] initWithUTF8String:sourcePath]; + NSString *toPath = [[NSString alloc] initWithUTF8String:destPath]; + + NSLog(source); + NSLog(toPath); + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error; + + //attempt the copy + if ([fileManager copyItemAtPath:source toPath:toPath error:&error])//; + Com_Printf("copy base folder success!\n"); + else + Com_Printf("copy base folder failed :(\n"); + + + //TODO: delete some of the copied files + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/012.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/017.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/024.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/042.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/046.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/047.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/048.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/050.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/051.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/052.5551", iphoneDocDirectory); + remove(destPath); + my_snprintf(destPath, sizeof(destPath), "%s/SODbase/sprites/053.5551", iphoneDocDirectory); + remove(destPath); +}*/ //================================ // IsSpearPurchased @@ -337,6 +514,10 @@ void FinalizeDownload() NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fileName = [documentsDirectory stringByAppendingString:@"/downloadedfile.tgz"]; + + //TODO: after save check that the file is of the correct size... if it isn't then something was corrupted + // and we should try again + //inflate the data and store in its appropriate directory DecompressData(); diff --git a/wolf3d/code/iphone/iphone_downloadUserMap.m b/wolf3d/code/iphone/iphone_downloadUserMap.m index 1b1172b..d66140a 100644 --- a/wolf3d/code/iphone/iphone_downloadUserMap.m +++ b/wolf3d/code/iphone/iphone_downloadUserMap.m @@ -1,14 +1,9 @@ -/* - * iphone_downloadUserMap.c - * wolf3d - * - * Created by Greg Hodges on 7/20/09. - * Copyright 2009 id software. All rights reserved. - * - */ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -26,7 +21,6 @@ */ - #import "../wolfiphone.h" #import "wolf3dAppDelegate.h" #import "iphone_alerts.h" @@ -91,7 +85,7 @@ void DownloadURLConnection( char *url ) if (dp != NULL) { struct dirent *ep; - while (ep = readdir (dp)) + while ( ( ep = readdir (dp) ) ) { //if you find a .DS_Store file... ignore it! if ( strcmp(ep->d_name, ".DS_Store") == 0 ) diff --git a/wolf3d/code/iphone/iphone_loop.c b/wolf3d/code/iphone/iphone_loop.c index 2667547..6d4a00c 100644 --- a/wolf3d/code/iphone/iphone_loop.c +++ b/wolf3d/code/iphone/iphone_loop.c @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -138,10 +141,24 @@ int returnButtonFrameNum = 0; // console mode int consoleActive; +// The size of UI elements will be scaled by this value in order to support different +// resolutions, such as Retina displays and the iPad. +float screenScale = 1.0f; + // the native iPhone code should set the following each frame: int numTouches; int touches[5][2]; // [0] = x, [1] = y in landscape mode, raster order with y = 0 at top int isTouchMoving = 0; //gsh + +// On Retina displays, touch coordinates are still reported at "low resolution". Since the game +// compares touch coordinates directly to the on-screen positions of buttons, we will need to +// scale the touches on Retina displays. +int touchCoordinateScale = 1; + +float deviceScale = 1.0f; + +deviceOrientation_t deviceOrientation = ORIENTATION_LANDSCAPE_LEFT; + float tilt; // -1.0 to 1.0 float tiltPitch; @@ -158,6 +175,10 @@ texture_t *numberPics[10]; //gsh texture_t *arialFontTexture; +// Profiling information +CFAbsoluteTime soundTime = 0.0; +CFAbsoluteTime menuTime = 0.0; + char *mugshotnames[ NUM_MUGSHOTS ] = { "iphone/FACE1APIC.tga", @@ -202,6 +223,20 @@ int attackDirTime[2]; logTime_t loggedTimes[MAX_LOGGED_TIMES]; // indexed by iphoneFrameNum + +// Some HUD element constants +#define HUD_FACE_WIDTH 64.0f +#define HUD_FACE_HEIGHT 80.0f + +#define HUD_WEAPON_WIDTH 128.0f +#define HUD_WEAPON_HEIGHT 128.0f + +float faceWidth = HUD_FACE_WIDTH; +float faceHeight = HUD_FACE_HEIGHT; + +float weaponWidth = HUD_WEAPON_WIDTH; +float weaponHeight = HUD_WEAPON_HEIGHT; + /* ================== iphoneActivateConsole @@ -305,14 +340,14 @@ int iphoneCenterText( int x, int y, const char *str ) { pfglTexCoord2f( fcol, frow ); pfglVertex2i( x, y ); - pfglTexCoord2f( fcol+myfont->wFrac, frow ); - pfglVertex2i( x+scale, y ); + pfglTexCoord2f( fcol, frow+myfont->hFrac ); + pfglVertex2i( x, y+scale ); pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac ); pfglVertex2i( x+scale, y+scale ); - pfglTexCoord2f( fcol, frow+myfont->hFrac ); - pfglVertex2i( x, y+scale ); + pfglTexCoord2f( fcol+myfont->wFrac, frow ); + pfglVertex2i( x+scale, y ); } pfglEnd(); @@ -338,6 +373,8 @@ void iphoneCenterTextWithColor(int x, int y, const char *str, colour4_t color ) ================== */ int iphoneDrawArialText( int x, int y, float scale, const char *str ) { + scale *= screenScale; + /* int l = strlen( str ); int i; @@ -392,17 +429,17 @@ int iphoneDrawArialText( int x, int y, float scale, const char *str ) { // pfglVertex2f( fx + xoff, fy + yoff ); pfglVertex2i( x, y + yoff); - pfglTexCoord2f( x1, y0 ); -// pfglVertex2f( fx + xoff + width, fy + yoff ); - pfglVertex2i( x+width, y + yoff); - + pfglTexCoord2f( x0, y1); +// pfglVertex2f( fx + xoff, fy + yoff + height ); + pfglVertex2i( x, y+height + yoff); + pfglTexCoord2f( x1, y1); // pfglVertex2f( fx + xoff + width, fy + yoff + height ); pfglVertex2i( x+width, y+height + yoff ); - pfglTexCoord2f( x0, y1); -// pfglVertex2f( fx + xoff, fy + yoff + height ); - pfglVertex2i( x, y+height + yoff); + pfglTexCoord2f( x1, y0 ); +// pfglVertex2f( fx + xoff + width, fy + yoff ); + pfglVertex2i( x+width, y + yoff); // with our default texture, the difference is negligable // fx += glyph->xadvance * scale; @@ -439,7 +476,11 @@ int iphoneCenterArialText( int x, int y, float scale, const char *str ) ++str; } - return iphoneDrawArialText( x - width/2, y, scale, strcopy ); + float scaledX = x - width / 2; + float scaledY = y; + ScalePosition( &scaledX, &scaledY ); + + return iphoneDrawArialText( scaledX, scaledY, scale, strcopy ); } /* ================== @@ -450,6 +491,7 @@ int iphoneCenterArialText( int x, int y, float scale, const char *str ) ================== */ int iphoneDrawArialTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ) { + int l = strlen( str ); int i; @@ -552,14 +594,14 @@ int iphoneDrawArialTextInBox( rect_t paragraph, int lineLength, const char *str, pfglTexCoord2f( x0, y0 ); pfglVertex2i( x, y + yoff); - pfglTexCoord2f( x1, y0 ); - pfglVertex2i( x+width, y + yoff); + pfglTexCoord2f( x0, y1); + pfglVertex2i( x, y+height + yoff); pfglTexCoord2f( x1, y1); pfglVertex2i( x+width, y+height + yoff ); - pfglTexCoord2f( x0, y1); - pfglVertex2i( x, y+height + yoff); + pfglTexCoord2f( x1, y0 ); + pfglVertex2i( x+width, y + yoff); x += glyph->xadvance * scale + 1; @@ -608,14 +650,15 @@ int iphoneDrawText( int x, int y, int width, int height, const char *str ) { pfglTexCoord2f( fcol, frow ); pfglVertex2i( x, y ); - pfglTexCoord2f( fcol+myfont->wFrac, frow ); - pfglVertex2i( x+width, y ); + pfglTexCoord2f( fcol, frow+myfont->hFrac ); + pfglVertex2i( x, y+height ); pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac ); pfglVertex2i( x+width, y+height ); - pfglTexCoord2f( fcol, frow+myfont->hFrac ); - pfglVertex2i( x, y+height ); + pfglTexCoord2f( fcol+myfont->wFrac, frow ); + pfglVertex2i( x+width, y ); + } pfglEnd(); @@ -644,8 +687,11 @@ void iphoneDrawTextWithColor( rect_t rect, const char *str, float colors[4] ) { */ void iphoneDrawMapName( rect_t rect, const char *str ) { + rect.y += 25; rect.x += 110;//80; + + rectFloat_t rectFloat = MakeScaledRectFloat( rect.x, rect.y, rect.width, rect.height ); /* float colors[4] = { 0, 0, 0, 1 }; iphoneDrawTextWithColor(RectMake(rect.x+1, rect.y+1, rect.width, rect.height), str, colors); @@ -657,11 +703,11 @@ void iphoneDrawMapName( rect_t rect, const char *str ) { */ pfglColor4f(0, 0, 0, 1); - iphoneDrawArialText(rect.x + 1, rect.y + 1, 0.9f, str); - iphoneDrawArialText(rect.x + 2, rect.y + 2, 0.9f, str); + iphoneDrawArialText(rectFloat.x + 1, rectFloat.y + 1, 0.9f, str); + iphoneDrawArialText(rectFloat.x + 2, rectFloat.y + 2, 0.9f, str); pfglColor4f(225.0f/255, 166.0f/255, 0, 1); pfglColor4f(225.0f/255, 242.0f/255, 0, 1); - iphoneDrawArialText(rect.x, rect.y, 0.9f, str); + iphoneDrawArialText(rectFloat.x, rectFloat.y, 0.9f, str); pfglColor4f(1, 1, 1, 1); } @@ -737,14 +783,14 @@ int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect pfglTexCoord2f( fcol, frow ); pfglVertex2i( x, y ); - pfglTexCoord2f( fcol+myfont->wFrac, frow ); - pfglVertex2i( x+width, y ); + pfglTexCoord2f( fcol, frow+myfont->hFrac ); + pfglVertex2i( x, y+height ); pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac ); pfglVertex2i( x+width, y+height ); - pfglTexCoord2f( fcol, frow+myfont->hFrac ); - pfglVertex2i( x, y+height ); + pfglTexCoord2f( fcol+myfont->wFrac, frow ); + pfglVertex2i( x+width, y ); } pfglEnd(); @@ -752,7 +798,136 @@ int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect return l * step; } +/* + ================== + ScaleToScreen + + Scales a value for the current resolution. + ================== + */ +void ScaleToScreen( int * value ) { + if ( value ) { + *value *= screenScale; + } +} + +/* + ================== + ScalePosition + + Scales an x, y position for the current resolution. + ================== + */ +void ScalePosition( float * x, float * y ) { + if ( x ) { + *x *= screenScale; + *x += ( viddef.width - ( REFERENCE_WIDTH * screenScale ) ) / 2.0f; + } + + if ( y ) { + *y *= screenScale; + *y += ( viddef.height - ( REFERENCE_HEIGHT * screenScale ) ) / 2.0f; + } +} + +/* + ================== + ScalePositionInt + + Scales an x, y position for the current resolution. + ================== + */ +void ScalePositionInt( int * x, int * y ) { + if ( x ) { + *x *= screenScale; + *x += ( viddef.width - ( REFERENCE_WIDTH * screenScale ) ) / 2.0f; + } + + if ( y ) { + *y *= screenScale; + *y += ( viddef.height - ( REFERENCE_HEIGHT * screenScale ) ) / 2.0f; + } +} + +/* + ================== + ScalePositionAndSize + + Scales an x, y, width, and height set for the current resolution. + ================== + */ +void ScalePositionAndSize( float * x, float * y, float * w, float * h ) { + ScalePosition( x, y ); + + if ( w ) { + *w *= screenScale; + } + + if ( h ) { + *h *= screenScale; + } +} + +/* + ================== + ScalePositionAndSizeInt + + Scales an x, y, width, and height set for the current resolution. + ================== + */ +void ScalePositionAndSizeInt( int * x, int * y, int * w, int * h ) { + ScalePositionInt( x, y ); + + if ( w ) { + *w *= screenScale; + } + + if ( h ) { + *h *= screenScale; + } +} + +/* + ================== + ScaleRect + + Scales a rect for the current resolution. + ================== + */ +void ScaleRect( rect_t * rect ) { + if ( rect ) { + ScalePositionInt( &(rect->x), &(rect->y) ); + rect->width *= screenScale; + rect->height *= screenScale; + } +} + + +/* + ================== + ScaleRectFloat + + Scales a rect for the current resolution. + ================== + */ +void ScaleRectFloat( rectFloat_t * rect ) { + if ( rect ) { + ScalePositionAndSize( &rect->x, &rect->y, &rect->width, &rect->height ); + } +} +/* + ================== + MakeScaledRectFloat + + Produces a scaled rect for the current resolution. + ================== + */ +rectFloat_t MakeScaledRectFloat( float x, float y, float width, float height ) { + rectFloat_t rect = { x, y, width, height }; + ScaleRectFloat( &rect ); + return rect; +} /* ================== @@ -762,6 +937,8 @@ int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect ================== */ int TouchDown( int x, int y, int w, int h ) { + //ScalePositionAndSize( &x, &y, &w, &h ); + int i; for ( i = 0 ; i < numTouches ; i++ ) { if ( touches[i][0] >= x && touches[i][1] >= y @@ -781,6 +958,8 @@ int TouchDown( int x, int y, int w, int h ) { ================== */ int TouchReleased( int x, int y, int w, int h ) { + //ScalePositionAndSize( &x, &y, &w, &h ); + int i; int downPrev = 0; int downNow = 0; @@ -828,21 +1007,6 @@ int TouchReleased( int x, int y, int w, int h ) { return 1; } -/* - ================== - iphoneRotateForLandscape - - ================== - */ -void iphoneRotateForLandscape() { - if ( revLand->value ) { - // reverse landscape mode - pfglRotatef( -90, 0, 0, 1 ); - } else { - pfglRotatef( 90, 0, 0, 1 ); - } -} - /* ================== iphoneSet2D @@ -850,20 +1014,23 @@ void iphoneRotateForLandscape() { ================== */ void iphoneSet2D( void ) { - pfglViewport( 0,0, 480, 320 ); pfglMatrixMode( GL_MODELVIEW ); pfglLoadIdentity(); pfglDisable( GL_DEPTH_TEST ); - pfglDisable( GL_CULL_FACE ); - pfglEnable( GL_BLEND ); - pfglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - pfglDisable( GL_ALPHA_TEST ); + + static bool doBlending = true; + if ( doBlending ) { + pfglEnable( GL_BLEND ); + } else { + pfglDisable( GL_BLEND ); + } + pfglColor4f( 1,1,1,1 ); pfglMatrixMode( GL_PROJECTION ); pfglLoadIdentity(); iphoneRotateForLandscape(); - pfglOrtho( 0, 480, 320, 0, -99999, 99999 ); + pfglOrtho( 0, viddef.width, viddef.height, 0, -99999, 99999 ); } @@ -902,6 +1069,9 @@ float AxisHit( hudPic_t *hud ) { int y = hud->y; int width = hud->width; int height = hud->width; + + //ScalePositionAndSize( &x, &y, &width, &height ); + float activeFraction = 0.8f; int i; int isXaxis = ( hud != &huds.forwardStick ); @@ -955,33 +1125,6 @@ float AxisHit( hudPic_t *hud ) { return 0; } -void iphoneTouchEvent( int _numTouches, int _touches[16] ) { - numTouches = _numTouches; - for ( int i = 0 ; i < numTouches ; i++ ) { - if ( revLand->value ) { - touches[i][0] = _touches[i*2+1]; - touches[i][1] = 319 - _touches[i*2+0]; - } else { - touches[i][0] = 479 - _touches[i*2+1]; - touches[i][1] = _touches[i*2+0]; - } - } -} - -void iphoneCheckForLandscapeReverse() { - static int reverseCount; - - // if we stay significantly negative for half a second, flip orientation - if ( tiltPitch < -0.35 ) { - if ( ++reverseCount > 10 ) { - Cvar_SetValue( revLand->name, !revLand->value ); - SysIPhoneSetUIKitOrientation( revLand->value ); - } - } else { - reverseCount = 0; - } -} - void iphoneTiltEvent( float *tilts ) { int i; int j; @@ -989,7 +1132,7 @@ void iphoneTiltEvent( float *tilts ) { float sum[3]; static float prevTime; - if ( revLand->value ) { + if ( deviceOrientation == ORIENTATION_LANDSCAPE_RIGHT ) { tilts[1] = -tilts[1]; tilts[0] = -tilts[0]; } @@ -1087,7 +1230,7 @@ PRIVATE void CreateIphoneUserCmd() float stickTurnValue; float stickMoveValue; - stickTurnValue = stickTurnBase->value + stickTurnScale->value * sensitivity->value; + stickTurnValue = ( stickTurnBase->value + stickTurnScale->value * sensitivity->value ); stickMoveValue = stickMoveBase->value + stickMoveScale->value * sensitivity->value; usercmd_t *cmd = &Player.cmd; @@ -1122,18 +1265,38 @@ PRIVATE void CreateIphoneUserCmd() } #endif + int weaponSwitchWidth = weaponWidth * 0.625f; + // tapping the weapon issues the nextWeapon impulse - if ( TouchReleased( 240 - 40, 320 - 80 - 64, 80, 64 ) ) { + if ( TouchReleased( (viddef.width / 2) - ( weaponSwitchWidth / 2 ), + viddef.height - faceHeight - ( weaponHeight / 2 ), + weaponSwitchWidth, + weaponHeight / 2 ) ) { cmd->buttons |= BUTTON_CHANGE_WEAPON; } - cmd->forwardmove = -stickMoveValue * AxisHit( &huds.forwardStick ); - cmd->sidemove = stickMoveValue * AxisHit( &huds.sideStick ); - Player.position.angle += -stickTurnValue * AxisHit( &huds.turnStick ); + float forwardAxisHit = AxisHit( &huds.forwardStick ); + float sideAxisHit = AxisHit( &huds.sideStick ); + float turnAxisHit = AxisHit( &huds.turnStick ); + + static bool printSticks = false; + + if ( printSticks ) { + printf( "Forward: %.4f \nSide: %.4f\nTurn: %.4f\n", forwardAxisHit, sideAxisHit, turnAxisHit ); + } + + cmd->forwardmove = -stickMoveValue * forwardAxisHit; + cmd->sidemove = stickMoveValue * sideAxisHit; + Player.position.angle += -stickTurnValue * turnAxisHit * tics; // accelerometer tilting cmd->sidemove += tiltMove->value * DeadBandAdjust( tilt, tiltDeadBand->value ); - Player.position.angle -= tiltTurn->value * DeadBandAdjust( tilt, tiltDeadBand->value ); + + + // Multiply by 0.5 and tics because the original calculation was for 30Hz. + // The multiplication allows this calculation to scale with different framerates while + // maintaining the same behavior at 30Hz. + Player.position.angle -= tiltTurn->value * DeadBandAdjust( tilt, tiltDeadBand->value ) * 0.5f * tics; // always use if ( iphoneFrameNum & 1 ) { @@ -1171,12 +1334,15 @@ void iphoneHighlightPicNumWhenTouched( int x, int y, int w, int h, int glTexNum void iphoneDrawWeapon( void ) { char name[ 32 ]; texture_t *tex; - static int w = 128; - static int h = 128; - int x = (viddef.width - w ) >> 1; - int y = viddef.height - 80 - h; + float w = 128 * screenScale; + float h = 128 * screenScale; + float x = (viddef.width - w ) / 2.0f; + float y = viddef.height - ( HUD_FACE_HEIGHT * screenScale ) - h; int frame; + weaponWidth = w; + weaponHeight = h; + if ( gunFrame->value ) { // screenshots look better with the muzzle flash frame = Player.weapon * 4 + gunFrame->value + SPR_KNIFEREADY; @@ -1189,12 +1355,12 @@ void iphoneDrawWeapon( void ) { R_Bind( tex->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); - pfglTexCoord2f( 0.01f, 0.01f ); pfglVertex2i( x, y ); - pfglTexCoord2f( 0.99f, 0.01f ); pfglVertex2i( x + w, y ); - pfglTexCoord2f( 0.99f, 0.99f ); pfglVertex2i( x + w, y + h ); - pfglTexCoord2f( 0.01f, 0.99f ); pfglVertex2i( x, y + h ); + pfglTexCoord2f( 0.01f, 0.01f ); pfglVertex2f( x, y ); + pfglTexCoord2f( 0.01f, 0.99f ); pfglVertex2f( x, y + h ); + pfglTexCoord2f( 0.99f, 0.01f ); pfglVertex2f( x + w, y ); + pfglTexCoord2f( 0.99f, 0.99f ); pfglVertex2f( x + w, y + h ); pfglEnd(); } @@ -1207,6 +1373,8 @@ void iphoneDrawWeapon( void ) { ================== */ void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight ) { + //ScalePositionAndSize( &x, &y, &charWidth, &charHeight ); + texture_t *tex; int i; char string[ 20 ]; @@ -1226,12 +1394,12 @@ void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight ) tex = numberPics[digit]; R_Bind( tex->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglTexCoord2f( 0, 0 ); pfglVertex2i( x, y ); + pfglTexCoord2f( 0, 1 ); pfglVertex2i( x, y+charHeight ); pfglTexCoord2f( 1, 0 ); pfglVertex2i( x+charWidth, y ); pfglTexCoord2f( 1, 1 ); pfglVertex2i( x+charWidth, y+charHeight ); - pfglTexCoord2f( 0, 1 ); pfglVertex2i( x, y+charHeight ); pfglEnd(); x += charStep; @@ -1247,22 +1415,31 @@ void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight ) */ void iphoneDrawFace() { int i; - int w = 64; - int h = 80; - int x = (viddef.width - w ) >> 1; - int y = viddef.height - h; + float w = HUD_FACE_WIDTH * screenScale; + float h = HUD_FACE_HEIGHT * screenScale; const char *pic; + const int halfScreenWidth = viddef.width / 2.0f; + + faceWidth = 128.0f * screenScale; + float halfFaceWidth = faceWidth / 2.0f; + faceHeight = 80.0f * screenScale; + float keyY = 72.0f * screenScale; + float keyWidth = 32.0f * screenScale; + float keyHeight = 64.0f * screenScale; + + float damageWidth = 40.0f * screenScale; + // solid background - iphoneDrawPic( 240 - 64, 320 - 80, 128, 80, "iphone/status_hud.tga" ); + iphoneDrawPicFloat( halfScreenWidth - halfFaceWidth, viddef.height - faceHeight, faceWidth, faceHeight, "iphone/status_hud.tga" ); // keys on the side if( Player.items & ITEM_KEY_1 ) { - iphoneDrawPic( 240-64, 320-72, 32, 64, "iphone/gold_key.tga" ); + iphoneDrawPicFloat( halfScreenWidth - halfFaceWidth, viddef.height - keyY, keyWidth, keyHeight, "iphone/gold_key.tga" ); } if( Player.items & ITEM_KEY_2 ) { - iphoneDrawPic( 240+32, 320-72, 32, 64, "iphone/silver_key.tga" ); + iphoneDrawPicFloat( halfScreenWidth + halfFaceWidth - keyWidth, viddef.height - keyY, keyWidth, keyHeight, "iphone/silver_key.tga" ); } @@ -1312,7 +1489,7 @@ void iphoneDrawFace() { pic = mugshotnames[ 21 ]; } - iphoneDrawPic( x, y, w, h, pic ); + iphoneDrawPicFloat( halfScreenWidth - w / 2.0f, (float)(viddef.height) - faceHeight, w, h, pic ); // blend the right / left damage indicators on the side for ( i = 0 ; i < 2 ; i++ ) { @@ -1332,15 +1509,22 @@ void iphoneDrawFace() { } pfglColor4f( 1, 1, 1, f ); if ( i == 0 ) { - iphoneDrawPic( 240 - 64, 320 - 80, 40, 80, "iphone/L_damage.tga" ); + iphoneDrawPicFloat( halfScreenWidth - halfFaceWidth, + (float)(viddef.height) - faceHeight, + damageWidth, faceHeight, "iphone/L_damage.tga" ); } else { - iphoneDrawPic( 240 + 64 - 40, 320 - 80, 40, 80, "iphone/R_damage.tga" ); + iphoneDrawPicFloat( halfScreenWidth + halfFaceWidth - damageWidth, + (float)viddef.height - faceHeight, + damageWidth, faceHeight, "iphone/R_damage.tga" ); } pfglColor4f( 1, 1, 1, 1 ); } + float healthWidth = 16 * screenScale; + float healthHeight = 16 * screenScale; + // draw the tiny health numbers on top of the face - iphoneDrawNumber( 240, 304, Player.health, 16, 16 ); + iphoneDrawNumber( halfScreenWidth, viddef.height - healthHeight, Player.health, healthWidth, healthHeight ); } /* @@ -1422,7 +1606,8 @@ void iphoneDrawReturnButton() { f = 0.5f; pfglColor4f( 1, 1, 1, f ); - if (iphoneDrawPicWithTouch( 240-32, 32, 64, 48, "iphone/button_back.tga")) {//int x, int y, int w, int h, const char *pic )) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 240.0f-32.0f, 32.0f, BACK_BUTTON_WIDTH, BACK_BUTTON_HEIGHT ), + "iphone/button_back.tga")) {//int x, int y, int w, int h, const char *pic )) { menuState = IPM_MAPS; returnButtonFrameNum = 0; @@ -1445,6 +1630,8 @@ void iphoneDrawReturnButton() { episode->value = 9; } } + + iphoneStartPreviousMenu(); } pfglColor4f( 1, 1, 1, 1 ); @@ -1552,6 +1739,10 @@ iphoneFrame ================== */ void iphoneFrame() { + // clear depth buffer + qglDepthMask( GL_TRUE ); + pfglClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); + unsigned char blendColor[4] = { 0, 0, 0, 0 }; iphoneFrameNum++; @@ -1566,14 +1757,16 @@ void iphoneFrame() { // toggle / scroll down the console Client_Screen_RunConsole(); - - // check for flipping the phone orientation - iphoneCheckForLandscapeReverse(); - // fixed frame timing, assume we go 30hz - tics = 2; // wolf's global rate counter + // fixed frame timing, assume we go 60Hz + tics = DEFAULT_FRAME_INTERVAL; // wolf's global rate counter + CFAbsoluteTime soundStartTime = CFAbsoluteTimeGetCurrent(); Sound_Update( vnull, vnull, vnull, vnull ); + CFAbsoluteTime soundEndTime = CFAbsoluteTimeGetCurrent(); + soundTime = soundEndTime - soundStartTime; + + //printf( "Sound_Update took %0.8f seconds.\n", soundTime ); if ( consoleActive ) { iphoneSet2D(); @@ -1581,16 +1774,20 @@ void iphoneFrame() { Client_Screen_DrawConsole(); iphoneSavePrevTouches(); - SysIPhoneSwapBuffers(); + //SysIPhoneSwapBuffers(); return; } if ( menuState != IPM_GAME ) { iphoneSet2D(); - iphoneDrawMenus(); + CFAbsoluteTime menuStartTime = CFAbsoluteTimeGetCurrent(); + iphoneDrawMenus( vnull, vnull, vnull, vnull ); + CFAbsoluteTime menuEndTime = CFAbsoluteTimeGetCurrent(); + menuTime = menuEndTime - menuStartTime; + + //printf( "iphoneDrawMenus took %0.8f seconds.\n", menuTime ); iphoneSavePrevTouches(); - SysIPhoneSwapBuffers(); return; } @@ -1620,10 +1817,6 @@ void iphoneFrame() { levelstate.time += tics; } - - // clear depth buffer - qglDepthMask( GL_TRUE ); - pfglClear( GL_DEPTH_BUFFER_BIT ); // fill the floor and ceiling pfglDisable( GL_BLEND ); @@ -1633,7 +1826,7 @@ void iphoneFrame() { pfglMatrixMode( GL_PROJECTION ); pfglLoadIdentity(); iphoneRotateForLandscape(); - pfglOrtho( 0, 480, 320, 0, -99999, 99999 ); + pfglOrtho( 0, viddef.width, viddef.height, 0, -99999, 99999 ); R_Draw_Fill( 0, 0, viddef.width, viddef.height >> 1, r_world->ceilingColour ); R_Draw_Fill( 0, viddef.height >> 1, viddef.width, viddef.height, r_world->floorColour ); @@ -1644,7 +1837,6 @@ void iphoneFrame() { cur_x_fov = 75; cur_y_fov = CalcFov( cur_x_fov, (float)viddef.width, (float)viddef.height ); - pfglMatrixMode( GL_PROJECTION ); pfglLoadIdentity(); iphoneRotateForLandscape(); MYgluPerspective( cur_y_fov - 2.0f, ratio, 0.2f, 64.0f ); // tweak fov in to avoid edge tile clips @@ -1653,13 +1845,8 @@ void iphoneFrame() { pfglRotatef( (float)(90 - FINE2DEG( Player.position.angle )), 0, 1, 0 ); pfglTranslatef( -Player.position.origin[ 0 ] / FLOATTILE, 0, Player.position.origin[ 1 ] / FLOATTILE ); - - pfglCullFace( GL_BACK ); pfglEnable( GL_DEPTH_TEST ); - pfglEnable( GL_CULL_FACE ); - pfglDisable( GL_BLEND ); - pfglDisable( GL_ALPHA_TEST ); // find and draw all the walls R_RayCast( Player.position, r_world ); @@ -1668,7 +1855,7 @@ void iphoneFrame() { R_DrawSprites(); // draw 2D overlays - iphoneSet2D(); + iphoneSet2D(); // do a full screen blend for damage, death, and bonus pickup if( Player.playstate == ex_dead ) { @@ -1733,6 +1920,7 @@ void iphoneFrame() { if ( iphoneDrawHudButton( &huds.menu ) ) { menuState = IPM_MAIN; + iphoneStartMainMenu(); } if ( iphoneDrawHudButton( &huds.map ) ) { iphoneOpenAutomap(); @@ -1745,7 +1933,7 @@ void iphoneFrame() { iphoneSavePrevTouches(); - SysIPhoneSwapBuffers(); // do the swapbuffers + //SysIPhoneSwapBuffers(); // do the swapbuffers } @@ -1759,7 +1947,7 @@ void iphoneDrawLoading() //draw stuff here iphoneDrawText(100, 100, 16, 16, "Drawing Loading!");//, <#int y#>, <#int width#>, <#int height#>, <#const char * str#>) - SysIPhoneSwapBuffers(); // do the swapbuffers + //SysIPhoneSwapBuffers(); // do the swapbuffers } diff --git a/wolf3d/code/iphone/iphone_main.c b/wolf3d/code/iphone/iphone_main.c index b9c6991..bdd4914 100644 --- a/wolf3d/code/iphone/iphone_main.c +++ b/wolf3d/code/iphone/iphone_main.c @@ -1,8 +1,13 @@ /* + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. Copyright (C) 2004-2005 Michael Liebscher Copyright (C) 1997-2001 Id Software, Inc. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 @@ -28,6 +33,7 @@ */ #include "../wolfiphone.h" +#include "iphone_store.h" cvar_t *controlScheme; cvar_t *sensitivity; @@ -55,7 +61,6 @@ cvar_t *cropSprites; cvar_t *blends; cvar_t *gunFrame; cvar_t *slowAI; -cvar_t *revLand; cvar_t *mapScale; cvar_t *hideControls; cvar_t *autoFire; @@ -111,20 +116,27 @@ void Reset_f() { void iphoneStartup() { char *s; int start = Sys_Milliseconds(); + static bool firstInit = true; + + if ( !firstInit ) { + return; + } + + firstInit = false; #ifdef STOREKIT //check for storekit framework and set appropriate flags... gsh CheckForStorekitExistence(); #endif + InAppPurchaseInit(); + // temporary const char *systemVersion = SysIPhoneGetOSVersion(); printf( "systemVersion = %s\n", systemVersion ); z_chain.next = z_chain.prev = &z_chain; - InitImmediateModeGL(); - // Prepare enough of the subsystems to handle // cvar and command buffer management. COM_InitArgv( 0, NULL ); // FIXME: get args... @@ -170,11 +182,11 @@ void iphoneStartup() { consoleActive = 0; controlScheme = Cvar_Get( "controlScheme", "0", CVAR_ARCHIVE ); - sensitivity = Cvar_Get( "sensitivity", "0.3", CVAR_ARCHIVE ); - stickTurnBase = Cvar_Get( "stickTurnBase", "300", CVAR_ARCHIVE ); - stickTurnScale = Cvar_Get( "stickTurnScale", "500", CVAR_ARCHIVE ); - stickMoveBase = Cvar_Get( "stickMoveBase", "3000", CVAR_ARCHIVE ); - stickMoveScale = Cvar_Get( "stickMoveScale", "5000", CVAR_ARCHIVE ); + sensitivity = Cvar_Get( "sensitivity", "0.5", CVAR_ARCHIVE ); + stickTurnBase = Cvar_Get( "stickTurnBase", "200", CVAR_ARCHIVE ); + stickTurnScale = Cvar_Get( "stickTurnScale", "400", CVAR_ARCHIVE ); + stickMoveBase = Cvar_Get( "stickMoveBase", "2000", CVAR_ARCHIVE ); + stickMoveScale = Cvar_Get( "stickMoveScale", "4000", CVAR_ARCHIVE ); stickDeadBand = Cvar_Get( "stickDeadBand", "0.2", CVAR_ARCHIVE ); tiltTurn = Cvar_Get( "tiltTurn", "0", CVAR_ARCHIVE ); tiltMove = Cvar_Get( "tiltMove", "0", CVAR_ARCHIVE ); @@ -195,13 +207,13 @@ void iphoneStartup() { blends = Cvar_Get( "blends", "1", 0 ); gunFrame = Cvar_Get( "gunFrame", "0", 0 ); slowAI = Cvar_Get( "slowAI", "0", 0 ); - revLand = Cvar_Get( "revLand", "0", CVAR_ARCHIVE ); mapScale = Cvar_Get( "mapScale", "10", CVAR_ARCHIVE ); hideControls = Cvar_Get( "hideControls", "0", CVAR_ARCHIVE ); autoFire = Cvar_Get( "autoFire", "0", 0 ); - - // make sure volume changes and incoming calls draw the right orientation - SysIPhoneSetUIKitOrientation( revLand->value ); + g_version = Cvar_Get( "g_version", "1", CVAR_ARCHIVE ); + //this call fixes the bug of crashed apps during sod map loads + //( it only occured on devices updated from ( 1.1 || 1.0 )->1.2 ) + Cvar_Set( "g_version", "1" ); /* //if we don't preload the ogg files then we have faster start ups... gsh // preload all the ogg FM synth sounds @@ -246,15 +258,30 @@ void iphoneStartup() { if ( !LoadTheGame() ) { PL_NewGame( &Player ); iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill ); + HudSetForScheme( 0 ); } - // always start at main menu menuState = IPM_MAIN; + // Start menu music + iphoneInitMenuMusic(); + iphoneStartMenuMusic(); + Com_Printf( "startup time: %i msec\n", Sys_Milliseconds() - start ); } +/* + =================== + iphoneStartGameplay + + Loads the saved game if there is one, otherwise starts a new game. + =================== +*/ +void iphoneStartGameplay() { + +} + /* =================== iphonePreloadBeforePlay @@ -354,9 +381,9 @@ void iphoneWriteConfig( void ) { */ void iphoneShutdown() { Sound_StopAllSounds(); - Sound_StopBGTrack(); + //Sound_StopBGTrack(); iphoneWriteConfig(); SaveTheGame(); - exit( 0 ); + //exit( 0 ); } diff --git a/wolf3d/code/iphone/iphone_mapselector.c b/wolf3d/code/iphone/iphone_mapselector.c index 17bd86d..8f83384 100644 --- a/wolf3d/code/iphone/iphone_mapselector.c +++ b/wolf3d/code/iphone/iphone_mapselector.c @@ -1,11 +1,27 @@ /* - * iphone_mapselector.c - * wolf3d - * - * Created by Greg Hodges on 7/2/09. - * Copyright 2009 id software. All rights reserved. - * + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + #include "../wolfiphone.h" #include @@ -13,7 +29,6 @@ const char levelNames[][29] = { "E1 level 1", "E1 level 2", "E1 level 3", -#ifndef LITE "E1 level 4", "E1 level 5", "E1 level 6", @@ -92,7 +107,6 @@ const char levelNames[][29] = { "Floor 19: Secret 1 ", "Floor 20: Secret 2 ", "Floor 21: Angel of Death", -#endif }; int dragVelocity = 0; //velocity for the scrolling maps @@ -106,9 +120,7 @@ extern int iphoneDrawPicWithTouchAndColor( int x, int y, int w, int h, const cha extern void iphoneStartUserMap( int episodeNum, int mapNum, int skillLevel, char *mapName ); -#ifdef LITE extern void GetMoreLevels( int x, int y ); -#endif //========================================== // iphoneUpdateDrags() @@ -132,13 +144,13 @@ void iphoneUpdateDrags(int numMaps, int skillSides, int height, int spacing, int //boundary check the drags int num = numMaps+1+6; - if (g_version-> value == SPEAROFDESTINY) + if (g_version->value == SPEAROFDESTINY) num = numMaps + 7; num += numUserMaps + 1; if (dragPosition < 320 - (height+spacing)*(num) - 20) - dragPosition < 320 - (height+spacing)*(num) - 20; + dragPosition = 320 - (height+spacing)*(num) - 20; else if (dragPosition > 40) dragPosition = 40; @@ -150,6 +162,8 @@ void iphoneUpdateDrags(int numMaps, int skillSides, int height, int spacing, int //update the drags dragPosition -= dragVelocity; + dragVelocity /= screenScale; + //retard the velocity if (dragVelocity > 0) --dragVelocity; @@ -184,28 +198,28 @@ void iphoneDrawRewards(int m, int s, int x, int y) int height = 40;//22; int spacing = -12; // draw award shadows - iphoneDrawPic( x,y+23, width, height, "iphone/kills_shadow.tga" ); x += width + spacing; - iphoneDrawPic( x,y+23, width, height, "iphone/secrets_shadow.tga" ); x += width + spacing; - iphoneDrawPic( x,y+23, width, height, "iphone/treasure_shadow.tga" ); x += width + spacing; - iphoneDrawPic( x,y+23, width, height, "iphone/partime_shadow.tga" ); //x += width + 5; + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/kills_shadow.tga" ); x += width + spacing; + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/secrets_shadow.tga" ); x += width + spacing; + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/treasure_shadow.tga" ); x += width + spacing; + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/partime_shadow.tga" ); //x += width + 5; x = startX; // draw awards if ( (ch & MF_KILLS) || forceDrawRewards) { - iphoneDrawPic( x,y+23, width, height, "iphone/kills.tga" ); + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/kills.tga" ); } x += width + spacing; if ( (ch & MF_SECRETS) || forceDrawRewards) { - iphoneDrawPic( x,y+23, width, height, "iphone/secrets.tga" ); + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/secrets.tga" ); } x += width + spacing; if ( (ch & MF_TREASURE) || forceDrawRewards) { - iphoneDrawPic( x,y+23, width, height, "iphone/treasure.tga" ); + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/treasure.tga" ); } x += width + spacing; if ( (ch & MF_TIME) || forceDrawRewards) { - iphoneDrawPic( x,y+23, width, height, "iphone/partime.tga" ); + iphoneDrawPicRect( MakeScaledRectFloat( x,y+23, width, height ), "iphone/partime.tga" ); } } @@ -239,7 +253,7 @@ int iphoneDrawUserMaps(int Yoffset, int height, int spacing, int skillValue) iphoneDrawPic( 0, y, 480-80, height, "iphone/button_epSOD.tga"); - while (ep = readdir (dp)) + while ( ( ep = readdir (dp) ) ) { ++numMaps; if (numMaps < 3) //skip the '.' and '..' @@ -315,13 +329,9 @@ void iphoneSelectMapMenu() char strMission[80]; strMission[79] = '\0'; -#ifdef LITE - int numMaps = 3;//5; -#else int numMaps = 60; if (g_version->value == SPEAROFDESTINY) numMaps = 60 + 21; -#endif iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); @@ -429,18 +439,13 @@ void iphoneSelectMapMenu() int numUserMaps = 0; -#ifdef LITE - //buy more episodes button - GetMoreLevels( 0, dragPosition + (height + spacing) * (m+1) ); -#else #if 0 //buy more episodes button if (g_version->value != SPEAROFDESTINY) GetSpearOfDestiny( 0, dragPosition + (height + spacing) * (m+6) ); #endif //TODO: Draw user maps - numUserMaps = iphoneDrawUserMaps(y, height, spacing, skillValue); -#endif + numUserMaps = iphoneDrawUserMaps(y, height, spacing, skillValue); //Update the scrolling drags iphoneUpdateDrags(numMaps, skillSides, height, spacing, numUserMaps); diff --git a/wolf3d/code/iphone/iphone_menus.c b/wolf3d/code/iphone/iphone_menus.c index b47f789..8e7de9a 100644 --- a/wolf3d/code/iphone/iphone_menus.c +++ b/wolf3d/code/iphone/iphone_menus.c @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -17,10 +20,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + + //gsh //#define NUM_TOUCHFRAME 10 #include "../wolfiphone.h" +#include "iphone_store.h" int intermissionStartFrameNum; int hasReleased; @@ -39,7 +46,6 @@ extern const unsigned int DownloadUserFileSize; //-------------- //gsh int wasDLInstructionsCalledFromEpisodeMenu = 0; -int wasCalledFromDownloadInstructionsMenu = 0; /* ========================= iphoneSetLevelNotifyText @@ -113,17 +119,85 @@ rect_t RectMake(int x, int y, int width, int height) ================== */ void iphoneDrawPicNum( int x, int y, int w, int h, int glTexNum ) { + //ScalePositionAndSize( &x, &y, &w, &h ); + R_Bind( glTexNum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y ); + pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); pfglTexCoord2f( 1.0f, 0.0f ); pfglVertex2i( x+w, y ); pfglTexCoord2f( 1.0f, 1.0f ); pfglVertex2i( x+w, y+h ); - pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); pfglEnd(); } +typedef struct drawPicTiming_tag { + CFAbsoluteTime totalTime; + CFAbsoluteTime bindTime; + CFAbsoluteTime endTime; + CFAbsoluteTime findTexTime; + const char * pic; +} drawPicTiming; + +#define NUM_PIC_TIMINGS 16 + +static drawPicTiming picTimings[NUM_PIC_TIMINGS]; +int curPic = 0; + +void picTimingPrint() { + for ( int i = 0; i < NUM_PIC_TIMINGS; ++i) { + if ( picTimings[i].pic != NULL ) { + printf( " iphoneDrawPic took %0.6f seconds. %s\n", picTimings[i].totalTime, picTimings[i].pic ); + if ( picTimings[i].totalTime > 0.01 ) { + printf( " R_Bind took %0.6f seconds.\n", picTimings[i].bindTime ); + printf( " pfglEnd took %0.6f seconds.\n", picTimings[i].endTime ); + printf( " TM_FindTexture took %0.6f seconds.\n", picTimings[i].findTexTime ); + } + } + } +} + +void picTimingClear() { + for ( int i = 0; i < NUM_PIC_TIMINGS; ++i) { + picTimings[i].pic = NULL; + } + + curPic = 0; +} + +/* + ================== + iphoneDrawPicFloat + + ================== + */ +void iphoneDrawPicFloat( float x, float y, float w, float h, const char *pic ) { + texture_t *gl; + + gl = TM_FindTexture( pic, TT_Pic ); + + if( ! gl ) { + Com_Printf( "Can't find pic: %s\n", pic ); + return; + } + + R_Bind( gl->texnum ); + + pfglBegin( GL_TRIANGLE_STRIP ); + + pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2f( x, y ); + pfglTexCoord2f( 0.0f, gl->maxT ); pfglVertex2f( x, y+h ); + pfglTexCoord2f( gl->maxS, 0.0f ); pfglVertex2f( x+w, y ); + pfglTexCoord2f( gl->maxS, gl->maxT ); pfglVertex2f( x+w, y+h ); + + pfglEnd(); +} + +#define DRAWPIC_PROFILING 0 +//#define DRAWPIC_PROFILING 1 + + /* ================== iphoneDrawPic @@ -131,23 +205,77 @@ void iphoneDrawPicNum( int x, int y, int w, int h, int glTexNum ) { ================== */ void iphoneDrawPic( int x, int y, int w, int h, const char *pic ) { + texture_t *gl; - + +#if DRAWPIC_PROFILING + CFAbsoluteTime picStartTime = CFAbsoluteTimeGetCurrent(); + CFAbsoluteTime texStartTime = CFAbsoluteTimeGetCurrent(); +#endif + gl = TM_FindTexture( pic, TT_Pic ); + +#if DRAWPIC_PROFILING + CFAbsoluteTime texEndTime = CFAbsoluteTimeGetCurrent(); + CFAbsoluteTime texTime = texEndTime - texStartTime; +#endif + if( ! gl ) { Com_Printf( "Can't find pic: %s\n", pic ); return; } +#if DRAWPIC_PROFILING + CFAbsoluteTime bindStartTime = CFAbsoluteTimeGetCurrent(); +#endif + R_Bind( gl->texnum ); - pfglBegin( GL_QUADS ); + +#if DRAWPIC_PROFILING + CFAbsoluteTime bindEndTime = CFAbsoluteTimeGetCurrent(); + CFAbsoluteTime bindTime = bindEndTime - bindStartTime; +#endif + + pfglBegin( GL_TRIANGLE_STRIP ); pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y ); + pfglTexCoord2f( 0.0f, gl->maxT ); pfglVertex2i( x, y+h ); pfglTexCoord2f( gl->maxS, 0.0f ); pfglVertex2i( x+w, y ); pfglTexCoord2f( gl->maxS, gl->maxT ); pfglVertex2i( x+w, y+h ); - pfglTexCoord2f( 0.0f, gl->maxT ); pfglVertex2i( x, y+h ); + +#if DRAWPIC_PROFILING + CFAbsoluteTime endStartTime = CFAbsoluteTimeGetCurrent(); +#endif + pfglEnd(); + +#if DRAWPIC_PROFILING + CFAbsoluteTime endEndTime = CFAbsoluteTimeGetCurrent(); + CFAbsoluteTime endTime = endEndTime - endStartTime; + + CFAbsoluteTime picEndTime = CFAbsoluteTimeGetCurrent(); + CFAbsoluteTime picTime = picEndTime - picStartTime; + + if ( curPic < NUM_PIC_TIMINGS ) { + picTimings[curPic].totalTime = picTime; + picTimings[curPic].bindTime = bindTime; + picTimings[curPic].endTime = endTime; + picTimings[curPic].findTexTime = texTime; + picTimings[curPic].pic = pic; + curPic++; + } +#endif +} + +/* + ================== + iphoneDrawPicRect + + ================== + */ +void iphoneDrawPicRect( rectFloat_t rect, const char *pic ) { + iphoneDrawPic( rect.x, rect.y, rect.width, rect.height, pic ); } //gsh @@ -203,15 +331,15 @@ void iphoneDrawPicInBox( rect_t drawRect, const char *pic, rect_t boxRect ) R_Bind( gl->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); //float u, v; //u = ((float)newX)/((float)x); //v = ((float)newY)/((float)y); pfglTexCoord2f( u0, v0 ); pfglVertex2i( newX, newY ); + pfglTexCoord2f( u0, v1 ); pfglVertex2i( newX, newY+newH ); pfglTexCoord2f( u1, v0 ); pfglVertex2i( newX+newW, newY ); pfglTexCoord2f( u1, v1 ); pfglVertex2i( newX+newW, newY+newH ); - pfglTexCoord2f( u0, v1 ); pfglVertex2i( newX, newY+newH ); pfglEnd(); } @@ -238,6 +366,16 @@ int iphoneDrawPicWithTouch( int x, int y, int w, int h, const char *pic ) { return r; } +/* + ================== + iphoneDrawPicRectWithTouch + + ================== + */ +int iphoneDrawPicRectWithTouch( rectFloat_t rect, const char *pic ) { + return iphoneDrawPicWithTouch( rect.x, rect.y, rect.width, rect.height, pic ); +} + //gsh int iphoneDrawPicWithTouchSpecified( rect_t drawRect, rect_t touchRect, const char *pic) {//int x, int y, int w, int h, int touchX, int touchY, int touchW, int touchH, const char *pic ) { int r = TouchReleased( touchRect.x, touchRect.y, touchRect.width, touchRect.height ); @@ -256,6 +394,9 @@ int iphoneDrawPicWithTouchSpecified( rect_t drawRect, rect_t touchRect, const c } //gsh int iphoneDrawPicInBoxWithTouchSpecified( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect ) { + ScaleRect( &drawRect ); + ScaleRect( &touchRect ); + ScaleRect( &boundingRect ); //make sure touches are in drawing bounds if (touchRect.x < boundingRect.x) { @@ -290,7 +431,7 @@ int iphoneDrawPicInBoxWithTouchSpecified( rect_t drawRect, rect_t touchRect, con } //gsh -int iphoneDrawPicInBoxWithTouchAndVelocity( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect, int dragVelocity ) { +int iphoneDrawPicInBoxWithTouchAndVelocity( rectFloat_t drawRect, rectFloat_t touchRect, const char *pic, rectFloat_t boundingRect, int dragVelocity ) { //make sure touches are in drawing bounds if (touchRect.x < boundingRect.x) { @@ -319,7 +460,9 @@ int iphoneDrawPicInBoxWithTouchAndVelocity( rect_t drawRect, rect_t touchRect, c } // iphoneDrawPic( x, y, w, h, pic ); // iphoneDrawPicInBox( x, y, w, h, pic, boxX, boxY, boxW, boxH ); - iphoneDrawPicInBox( drawRect, pic, boundingRect ); + rect_t drawRectInt = RectMake( drawRect.x, drawRect.y, drawRect.width, drawRect.height ); + rect_t boundingRectInt = RectMake( boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height ); + iphoneDrawPicInBox( drawRectInt, pic, boundingRectInt ); // iphoneDrawPicInBox( int x, int y, int w, int h, const char *pic, int boxX, int boxY, int boxW, int boxH ) if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) && !dragVelocity) { colour4_t color = { 255, 255, 255, 64 }; @@ -366,7 +509,7 @@ int iphoneDrawPicInBoxWithTouchSpecifiedAndColor( rect_t drawRect, rect_t touchR } //gsh -int iphoneDrawPicInBoxWithTouchColorAndVelocity( rect_t drawRect, rect_t touchRect, const char *pic, rect_t boundingRect, colour4_t color, int dragVelocity ) { +int iphoneDrawPicInBoxWithTouchColorAndVelocity( rectFloat_t drawRect, rectFloat_t touchRect, const char *pic, rectFloat_t boundingRect, colour4_t color, int dragVelocity ) { //make sure touches are in drawing bounds if (touchRect.x < boundingRect.x) { @@ -394,7 +537,10 @@ int iphoneDrawPicInBoxWithTouchColorAndVelocity( rect_t drawRect, rect_t touchRe } // iphoneDrawPic( x, y, w, h, pic ); // iphoneDrawPicInBox( x, y, w, h, pic, boxX, boxY, boxW, boxH ); - iphoneDrawPicInBox( drawRect, pic, boundingRect ); + rect_t drawRectInt = RectMake( drawRect.x, drawRect.y, drawRect.width, drawRect.height ); + rect_t boundingRectInt = RectMake( boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height ); + + iphoneDrawPicInBox( drawRectInt, pic, boundingRectInt ); R_Draw_Blend( touchRect.x, touchRect.y, touchRect.width, touchRect.height, color ); // iphoneDrawPicInBox( int x, int y, int w, int h, const char *pic, int boxX, int boxY, int boxW, int boxH ) if ( TouchDown( touchRect.x, touchRect.y, touchRect.width, touchRect.height ) && !dragVelocity ) { @@ -505,12 +651,13 @@ void iphoneSlider( int x, int y, int w, int h, const char *title, cvar_t *cvar, gl = TM_FindTexture( "iphone/slider_bar.tga", TT_Pic );//stat_bar_1.tga", TT_Pic ); assert( gl ); R_Bind( gl->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y ); + pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); pfglTexCoord2f( f, 0.0f ); pfglVertex2i( x+w*f, y ); pfglTexCoord2f( f, 1.0f ); pfglVertex2i( x+w*f, y+h ); - pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); + pfglEnd(); @@ -568,7 +715,7 @@ void iphoneSlider( int x, int y, int w, int h, const char *title, cvar_t *cvar, ================== */ int BackButton() { - if ( iphoneDrawPicWithTouch( 0, 0, 64, 36, "iphone/button_back.tga" ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 0.0f, 0.0f, BACK_BUTTON_WIDTH, BACK_BUTTON_HEIGHT ), "iphone/button_back.tga" ) ) { return 1; } return 0; @@ -576,7 +723,7 @@ int BackButton() { //gsh... a back button on the other side of the screen int BackButton2() { - if ( iphoneDrawPicWithTouch( 480-64, 0, 64, 36, "iphone/button_back.tga" ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 480.0f-64.0f, 0.0f, 64.0f, 36.0f ), "iphone/button_back.tga" ) ) { return 1; } return 0; @@ -584,11 +731,11 @@ int BackButton2() { //gsh int BackButton3( int x, int y ) { - if ( iphoneDrawPicWithTouch( x, y, 64, 36, "iphone/button_back.tga" ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( x, y, 64.0f, 36.0f ), "iphone/button_back.tga" ) ) { return 1; } return 0; -} +} /* ================== @@ -597,9 +744,10 @@ int BackButton3( int x, int y ) { ================== */ int MenuButton() { - if ( iphoneDrawPicWithTouch( 480-64, 0, 64, 36, "iphone/menu.tga" ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 480.0f-64.0f, 0.0f, 64.0f, 64.0f ), "iphone/menu.tga" ) ) { // if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/menu.tga" ) ) { // if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/button_menu_yellow.tga" ) ) { + iphoneStartMainMenu(); return 1; } return 0; @@ -607,7 +755,7 @@ int MenuButton() { void GetMoreLevels( int x, int y ) { - if ( iphoneDrawPicWithTouch( x, y, 128, 64, "iphone/button_levels.tga" ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( x, y, 128.0f, 64.0f ), "iphone/button_levels.tga" ) ) { // directly to the app store for more levels SysIPhoneOpenURL( "http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=309470478" ); } @@ -688,11 +836,17 @@ void SaveTheGame() { } // turn the r_world->Doors.doors from pointers to indexes - // ok to be destructive, because we are quiting - for ( i = 0 ; i < r_world->Doors.doornum ; i++ ) { + // Can't be destructive anymore, because the app can be suspended in the background now. + + // Quick fix for non-destructiveness: Just make a copy of the levelData, convert the + // pointers to indices in the copy, and write the copy to the save data. Leave the actual + // current levelData alone. + LevelData_t copiedLevelData = levelData; + + for ( i = 0 ; i < copiedLevelData.Doors.doornum ; i++ ) { int index = r_world->Doors.Doors[i] - &r_world->Doors.DoorMap[0][0]; assert( index >= 0 && index < 4096 ); - r_world->Doors.Doors[i] = (void *)index; + copiedLevelData.Doors.Doors[i] = (void *)index; } // this is only used for the mutant death face, so just @@ -704,7 +858,7 @@ void SaveTheGame() { fwrite( &huds, 1,sizeof(huds), f); - fwrite( &levelData, 1,sizeof(levelData), f ); + fwrite( &copiedLevelData, 1,sizeof(levelData), f ); fwrite( &LevelRatios, 1,sizeof(LevelRatios), f ); fwrite( &levelstate, 1,sizeof(levelstate), f ); fwrite( Guards, 1,sizeof(Guards), f ); @@ -817,7 +971,7 @@ int iphoneGetUserMapName(int mapNumber, char *mapName) if (dp != NULL) { - while (ep = readdir (dp)) + while ( ( ep = readdir (dp) ) ) {/* //if you find a .DS_Store file... ignore it! if ( strcmp(ep->d_name, ".DS_Store") == 0 ) @@ -877,7 +1031,7 @@ int iphoneGetUserMapLevelByName(const char *mapName) if (dp != NULL) { - while (ep = readdir (dp)) + while ( ( ep = readdir (dp) ) ) { if (strcmp(ep->d_name, mapName) == 0) { @@ -988,7 +1142,11 @@ void iphoneStartUserMap( int episodeNum, int mapNum, int skillLevel, char *mapNa Com_Printf("command: %s\n", command); Client_PrepRefresh( command ); - menuState = IPM_GAME; + if ( r_world != NULL ) { + menuState = IPM_GAME; + } else { + menuState = IPM_MAIN; + } } /* @@ -1038,7 +1196,44 @@ void iphoneStartMap( int episodeNum, int mapNum, int skillLevel ) { Com_Printf("command: %s\n", command); Client_PrepRefresh( command ); - menuState = IPM_GAME; + if ( r_world != NULL ) { + menuState = IPM_GAME; + } else { + menuState = IPM_MAIN; + } +} + +extern int notifyFrameNum; //gsh + +/* + ================== + iphoneResume + + ================== + */ +void iphoneResume() { + iphoneStopMenuMusic(); + + //iphoneStartGameplay(); + iphonePreloadBeforePlay(); + + Sound_StartBGTrack( levelData.musicName, levelData.musicName ); + + // if the game was saved at the intermission screen, immediately + // bring it back up when it is loaded + if ( currentMap.levelCompleted ) { + iphoneStartIntermission( 0 ); + } else { + //reset the notification so that we can see which level we've loaded.. gsh + iphoneSetLevelNotifyText(); + iphoneFrameNum = 0; + notifyFrameNum = 60; + if ( r_world != NULL ) { + menuState = IPM_GAME; + } else { + menuState = IPM_MAIN; + } + } } /* @@ -1047,14 +1242,15 @@ void iphoneStartMap( int episodeNum, int mapNum, int skillLevel ) { ================== */ -extern int notifyFrameNum; //gsh void iphoneMainMenu() { char str[80]; float scale = 40 / 32.0; //iphoneDrawPic( 480-256, 0, 256, 128, "iphone/wolf_logo.tga" ); //iphoneDrawPic( 0, 0, 480, 320, "iphone/background_main.tga" ); //gsh - iphoneDrawPic(0, 0, 264, 250, "iphone/wolfplatinum_logo.tga"); + + //iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 264.0f, 250.0f ), "iphone/wolfplatinum_logo.tga"); + /*gsh #ifdef LITE iphoneDrawPic( -20, 0, 256, 64, "iphone/ep_1.tga" ); @@ -1071,20 +1267,9 @@ void iphoneMainMenu() { // iphoneDrawPic( 0, 320 - 128, 128, 128, "iphone/id_logo.tga" ); // if ( iphoneDrawPicWithTouch( 300 - 64*scale, 80, 128*scale, 64*scale, "iphone/button_resume.tga" ) ) { - if ( iphoneDrawPicWithTouch( 360 - 64*scale, 20, 128*scale, 32*scale, "iphone/button_resume.tga" ) ) { //gsh - iphonePreloadBeforePlay(); - - // if the game was saved at the intermission screen, immediately - // bring it back up when it is loaded - if ( currentMap.levelCompleted ) { - iphoneStartIntermission( 0 ); - } else { - //reset the notification so that we can see which level we've loaded.. gsh - iphoneSetLevelNotifyText(); - iphoneFrameNum = 0; - notifyFrameNum = 60; - menuState = IPM_GAME; - } + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 360 - 64*scale, 20, 128*scale, 32*scale ), + "iphone/button_resume.tga" ) ) { //gsh + iphoneResume(); } //gsh @@ -1097,22 +1282,22 @@ void iphoneMainMenu() { // iphoneCenterText( 360, 34*scale, str ); //gsh // if ( iphoneDrawPicWithTouch( 300 - 64*scale, 170, 128*scale, 32*scale, "iphone/button_control.tga" ) ) { - if ( iphoneDrawPicWithTouch( 360 - 64*scale, 120, 128*scale, 32*scale, "iphone/button_settings.tga" ) ) { //gsh + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 360 - 64*scale, 120, 128*scale, 32*scale ), "iphone/button_settings.tga" ) ) { //gsh menuState = IPM_CONTROLS; } // if ( iphoneDrawPicWithTouch( 300 - 64*scale, 220, 128*scale, 32*scale, "iphone/button_new.tga" ) ) { - if ( iphoneDrawPicWithTouch( 360 - 64*scale, 70, 128*scale, 32*scale, "iphone/button_new.tga" ) ) { //gsh + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 360 - 64*scale, 70, 128*scale, 32*scale ), "iphone/button_new.tga" ) ) { //gsh menuState = IPM_SKILL;//IPM_MAPSELECTOR;//IPM_SKILL; //gsh } // if ( iphoneDrawPicWithTouch( 300 - 64*scale, 270, 128*scale, 32*scale, "iphone/button_web.tga" ) ) { - if ( iphoneDrawPicWithTouch( 100 - 64*scale, 250, 64, 64, "iphone/id_logo.tga" ) ) { //gsh - wasCalledFromDownloadInstructionsMenu = 0; - iphoneYesNoBox("Website", "This will navigate you to idsoftware.com. Continue?"); + //if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 100 - 64*scale, 250, 64, 64 ), "iphone/id_logo.tga" ) ) { //gsh + // currentYesNoBox = YESNO_GO_TO_WEBSITE; + // iphoneYesNoBox("Website", "This will navigate you to idsoftware.com. Continue?"); // SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein3dclassic/" ); - } + //} //gsh // if (iphoneDrawPicWithTouch(100 - 64*scale, 270, 128*scale, 32*scale, "iphone/button_control.tga" ) ) { - if (iphoneDrawPicWithTouch(360 - 64*scale, 220, 128*scale, 32*scale, "iphone/button_more.tga" ) ) { //gsh + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 360 - 64*scale, 220, 128*scale, 32*scale ), "iphone/button_more.tga" ) ) { //gsh menuState = IPM_MORE;//IPM_TRIVIA; } @@ -1120,17 +1305,17 @@ void iphoneMainMenu() { int y = 170; if ( SysIPhoneOtherAudioIsPlaying() ) { // iphoneDrawPic( 480 - 64, 220, 64, 64, "iphone/music_off.tga" ); - iphoneDrawPic( x - 64*scale, y, 128*scale, 32*scale, "iphone/music_off.tga" ); //gsh + iphoneDrawPicRect( MakeScaledRectFloat( x - 64*scale, y, 128*scale, 32*scale ), "iphone/music_off.tga" ); //gsh } else { if ( music->value ) { //if ( iphoneDrawPicWithTouch( 480 - 64, 220, 64, 64, "iphone/music_on.tga" ) ) { - if ( iphoneDrawPicWithTouch( x - 64*scale, y, 128*scale, 32*scale, "iphone/music_on.tga" ) ) { //gsh + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( x - 64*scale, y, 128*scale, 32*scale ), "iphone/music_on.tga" ) ) { //gsh Cvar_SetValue( music->name, 0 ); Sound_StopBGTrack(); } } else { //if ( iphoneDrawPicWithTouch( 480 - 64, 220, 64, 64, "iphone/music_off.tga" ) ) { - if ( iphoneDrawPicWithTouch( x - 64*scale, y, 128*scale, 32*scale, "iphone/music_off.tga" ) ) { //gsh + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( x - 64*scale, y, 128*scale, 32*scale ), "iphone/music_off.tga" ) ) { //gsh Cvar_SetValue( music->name, 1 ); Sound_StartBGTrack( levelData.musicName, levelData.musicName ); } @@ -1138,7 +1323,10 @@ void iphoneMainMenu() { } sprintf( str, "v%3.1f", WOLF_IPHONE_VERSION ); - iphoneCenterText( 460, 300, str ); + float versionX = 460.0f; + float versionY = 300.0f; + ScalePosition( &versionX, &versionY ); + iphoneCenterText( versionX, versionY, str ); } //========================================== @@ -1362,6 +1550,10 @@ void iphoneControlMenu() { iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "hud alpha", hudAlpha, 0, 1 ); sliderY += sliderHeight + sliderSpacing; + +#ifdef VOLUMEHACK + //Draw volume up/down settings... gsh + y = 0; x = 480-74; if (revLand->value) @@ -1370,9 +1562,6 @@ void iphoneControlMenu() { x = 74-64; } -#ifdef VOLUMEHACK - //Draw volume up/down settings... gsh - if ( iphoneDrawPicWithTouch( x, y, 64, 32, "iphone/button_pistol.tga" ) ) { if ((int)volumeFireUpSetting->value) Cvar_Set("volumeFireUpSetting", "0"); @@ -1403,6 +1592,8 @@ void iphoneControlMenu() { #endif } #endif + +#if 0 /* ================== iphoneControlMenu @@ -1415,21 +1606,25 @@ void iphoneControlMenu() { int x = 0; int y = 0; - iphoneDrawPic(x, y, 480, 320, "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( x, y, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); if ( BackButton() ) { menuState = IPM_MAIN; + iphoneStartMainMenu(); } x = 480-128*9/10; - if ( iphoneDrawPicWithTouch( x, y, 128*9/10, 36, "iphone/advanced_button.tga" ) ) { + + /* Advanced controls are now accessed by the new menu system + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( x, y, 128.0f*9/10.0f, 36.0f ), "iphone/advanced_button.tga" ) ) { Cvar_SetValue( controlScheme->name, -1 ); iphonePreloadBeforePlay(); // make sure all the hud textures are loaded menuState = IPM_HUDEDIT; } + */ x = 240-108*9/10; - iphoneDrawPic(x, y, 217*9/10, 50*9/10, "iphone/header_settings.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( x, y, 217.0f*9/10.0f, 50*9/10.0f ), "iphone/header_settings.tga"); //update the position of the control settings const int startPosition = 70; @@ -1445,7 +1640,7 @@ void iphoneControlMenu() { static int moveRight = 0; //move right or left, depending on button pushed - if (iphoneDrawPicWithTouch(9, y+60, 64, 64, "iphone/button_left.tga") ) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 9.0f, y+60.0f, 64.0f, 64.0f ), "iphone/button_left.tga") ) { moveRight = 0; ++currentPreset; if (currentPreset > numPresets-1) { @@ -1453,7 +1648,7 @@ void iphoneControlMenu() { } } - if (iphoneDrawPicWithTouch(411, y+60, 64, 64, "iphone/button_right.tga") ) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 411.0f, y+60.0f, 64.0f, 64.0f ), "iphone/button_right.tga") ) { moveRight = 1; --currentPreset; if (currentPreset < 0) { @@ -1532,22 +1727,40 @@ void iphoneControlMenu() { char buffer[32]; sprintf(buffer, "Preset %i", i+1); + rect_t textBoxRect = RectMake( 70, 0, 480-140+10, 320 ); + ScaleRect( &textBoxRect ); + + rect_t paragraphBox1 = RectMake(thisX+35+1, y+125+1, 16, 16); + ScaleRect( ¶graphBox1 ); + + rect_t paragraphBox2 = RectMake(thisX+35+2, y+125+2, 16, 16); + ScaleRect( ¶graphBox2 ); + + rect_t paragraphBox3 = RectMake(thisX+35+3, y+125+3, 16, 16); + ScaleRect( ¶graphBox3 ); + + rect_t paragraphBox4 = RectMake(thisX+35, y+125, 16, 16); + ScaleRect( ¶graphBox4 ); + + pfglColor3f( 0, 0, 0 ); - iphoneDrawTextInBox( RectMake(thisX+35+1, y+125+1, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) ); - iphoneDrawTextInBox( RectMake(thisX+35+2, y+125+2, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) ); - iphoneDrawTextInBox( RectMake(thisX+35+3, y+125+3, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) ); + + iphoneDrawTextInBox( paragraphBox1, 480*screenScale, buffer, textBoxRect ); + iphoneDrawTextInBox( paragraphBox2, 480*screenScale, buffer, textBoxRect ); + iphoneDrawTextInBox( paragraphBox3, 480*screenScale, buffer, textBoxRect ); pfglColor3f( 1, 1, 1 ); - iphoneDrawTextInBox( RectMake(thisX+35, y+125, 16, 16), 480, buffer, RectMake(70, 0, 480-140+10, 320) ); + iphoneDrawTextInBox( paragraphBox4, 480*screenScale, buffer, textBoxRect ); } - int sliderHeight = 25;//35; + float sliderHeight = 25;//35; int sliderSpacing = 10; - int sliderY = y + size;// - 13;//190;//170; - int sliderX = 80;//20; - int sliderWidth = 320;//440; + float sliderY = y + size;// - 13;//190;//170; + float sliderX = 80;//20; + float sliderWidth = 320;//440; //sensitivity slider + ScalePositionAndSize( &sliderX, &sliderY, &sliderWidth, &sliderHeight ); iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "sensitivity", sensitivity, 0, 1 ); sliderY += sliderHeight + sliderSpacing; @@ -1575,6 +1788,9 @@ void iphoneControlMenu() { iphoneSlider( sliderX, sliderY, sliderWidth, sliderHeight, "hud alpha", hudAlpha, 0, 1 ); sliderY += sliderHeight + sliderSpacing; +#ifdef VOLUMEHACK + //Draw volume up/down settings... gsh + y = 0; x = 480-74; if (revLand->value) @@ -1583,9 +1799,6 @@ void iphoneControlMenu() { x = 74-64; } -#ifdef VOLUMEHACK - //Draw volume up/down settings... gsh - if ( iphoneDrawPicWithTouch( x, y, 64, 32, "iphone/button_pistol.tga" ) ) { if ((int)volumeFireUpSetting->value) Cvar_Set("volumeFireUpSetting", "0"); @@ -1629,13 +1842,14 @@ void iphoneSkillMenu() { char str[64]; //gsh - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); //gsh - iphoneDrawPic(0, 0, 480, 48, "iphone/header_how_tough_are_you.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 48.0f ), "iphone/header_how_tough_are_you.tga"); if ( BackButton() ) { menuState = IPM_MAIN; + iphoneStartMainMenu(); } // highlight the current skill selection @@ -1649,7 +1863,7 @@ void iphoneSkillMenu() { pfglColor3f( 0.5, 0.5, 0.5 ); } //if ( iphoneDrawPicWithTouch( 112, 40+64*s, 256, 64, str ) ) { - if ( iphoneDrawPicWithTouch( 112, 60+64*s, 256, 64, str ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 112.0f, 60.0f+64.0f*s, 256.0f, 64.0f ), str ) ) { Cvar_SetValue( skill->name, s ); menuState = IPM_EPISODE; } @@ -1667,14 +1881,11 @@ void iphoneSkillMenu() { void iphoneEpisodeMenu() { int e; char str[64]; -#ifdef LITE - int numE = 1; -#else int numE = 6; //gsh if (g_version->value == SPEAROFDESTINY) numE = 9; -#endif + if ( BackButton() ) { menuState = IPM_SKILL; @@ -1692,8 +1903,8 @@ void iphoneEpisodeMenu() { if ( e != (int)episode->value ) { pfglColor3f( 0.5, 0.5, 0.5 ); } - int height = 32;//48;//gsh... 96x32 - if ( iphoneDrawPicWithTouch( 48, 32+height*e, 384, height, str ) ) { + float height = 32.0f;//48;//gsh... 96x32 + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 48.0f, 32.0f+height*e, 384.0f, height), str ) ) { Cvar_SetValue( episode->name, e ); menuState = IPM_MAPS; }/*gsh @@ -1703,16 +1914,6 @@ void iphoneEpisodeMenu() { }*/ pfglColor3f( 1, 1, 1 ); } - -#ifdef LITE - // buy more episodes button - GetMoreLevels( 240 - 64, 200 ); -#else - #if 0 - if (g_version->value != SPEAROFDESTINY) //gsh - GetSpearOfDestiny( 240 - 64, 232 ); - #endif -#endif } /* @@ -1722,19 +1923,19 @@ void iphoneEpisodeMenu() { ================== */ //int scrollingFlags = 0; -void iphoneUpdateScrollingDrags(int *dragPosition, int *dragVelocity, int upperLimit, int lowerLimit, int padding, rect_t touchRect) +void iphoneUpdateScrollingDrags(int *dragPosition, int *dragVelocity, int upperLimit, int lowerLimit, int padding ) { static int oldVelocity = 0; //if Touch is in touchable area // if (TouchDown(touchRect.x, touchRect.y, touchRect.width, touchRect.height)) - if (TouchDown( 0, 0, 480, 320) )//|| isTouchMoving) + if (TouchDown( 0, 0, viddef.width, viddef.height ) )//|| isTouchMoving) { if (!numPrevTouches) prevTouches[0][1] = touches[0][1]; else if (numTouches == 1) - *dragVelocity = touches[0][1] - prevTouches[0][1]; + *dragVelocity = ((float)(touches[0][1]) - prevTouches[0][1]) * ( 1.0f / screenScale ); //if (*dragVelocity < 3) // isTouchMoving = 0; @@ -1750,8 +1951,8 @@ void iphoneUpdateScrollingDrags(int *dragPosition, int *dragVelocity, int upperL else if (abs(*dragVelocity) < 5) //this returns the position to a node position { int startPosition = 70 - 10; - int height = 48; - int spacing = 20; + int height = 48 * screenScale; + int spacing = 20 * screenScale; int nodePosition = upperLimit + padding; @@ -1759,7 +1960,7 @@ void iphoneUpdateScrollingDrags(int *dragPosition, int *dragVelocity, int upperL nodePosition = n*(height+spacing) + startPosition;// - 5; /* if (nodePosition != *dragPosition) - {/* + { int nodePositionPlus = nodePosition + (height+spacing); int nodePositionMinus = nodePosition - (height+spacing); int distMinus = abs(nodePositionMinus - *dragPosition); @@ -1871,6 +2072,56 @@ void iphoneUpdateScrollingDrags(int *dragPosition, int *dragVelocity, int upperL } +#endif + +/* + ================== + iphoneDrawLoadingIndicator + ================== + */ +void iphoneDrawLoadingIndicator() { + //int loadingWidth = 128; + //int loadingHeight = 128; + + //int halfWidth = loadingWidth / 2; + //int halfHeight = loadingWidth / 2; + + // Keep track of ticks so we can rotate the indicator periodically. + static int ticks = 0; + + // The graphic is designed on 45-degree angles, so that's how we want to rotate. + float rotateInterval = 45.0f; + + // Rotate by rotateInterval degrees every tickInterval. + int tickInterval = 10; + + static float rotateDegrees = 0.0f; + + if ( ticks >= tickInterval ) { + rotateDegrees += rotateInterval; + + if ( rotateDegrees > 360.0f ) { + rotateDegrees -= 360.0f; + } + + ticks = 0; + } + + pfglTranslatef( (viddef.width / 2.0f), + (viddef.height / 2.0f), + 0.0f ); + pfglRotatef( rotateDegrees, 0.0f, 0.0f, 1.0f ); + + + //iphoneDrawPic( -halfWidth, -halfHeight, loadingWidth, loadingHeight, "iphone/loading.tga" ); + + ++ticks; + + return; +} + +#if 0 + /* ================== iphoneScrollingEpisodeMenu @@ -1887,9 +2138,6 @@ void iphoneScrollingEpisodeMenu() { static int touchedFrameNum = 0; static int lastTouchFrame = 0; -#ifdef LITE - int numE = 1; -#else int numE = 11;//10; //check for user maps @@ -1913,13 +2161,20 @@ void iphoneScrollingEpisodeMenu() { //gsh //if (g_version->value == SPEAROFDESTINY) // numE = 9; -#endif - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); + + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 48.0f ), "iphone/header_episodes.tga"); + + // If waiting for an in-app purchase, show the user an activity indicator. + if ( InAppPurchaseIsInProgress() ) { + iphoneDrawLoadingIndicator(); + + return; + } - iphoneDrawPic( 0, 0, 480, 48, "iphone/header_episodes.tga"); if ( BackButton() ) { menuState = IPM_SKILL; @@ -1940,7 +2195,7 @@ void iphoneScrollingEpisodeMenu() { */ int lowerLimit = -320; lowerLimit = 70-(11-4)*(48+20); - iphoneUpdateScrollingDrags(&dragPosition, &dragVelocity, 55, lowerLimit, 0, RectMake(0, 48, 480-48, 320-64)); + iphoneUpdateScrollingDrags(&dragPosition, &dragVelocity, 55, lowerLimit, 0 ); // 96 x 48 images for ( e = 0 ; e < numE ; e++ ) { @@ -1993,10 +2248,10 @@ void iphoneScrollingEpisodeMenu() { && !dragVelocity && !isTouchMoving )//touchedFrameNum >= NUM_TOUCHFRAME ) //must hold finger down for 10 frames */// iphoneDrawPicInBoxWithTouchAndVelocity - if (iphoneDrawPicInBoxWithTouchAndVelocity(RectMake(0, dragPosition+(height+spacing)*e, 480, height), - RectMake(0, dragPosition+(height+spacing)*e, 480, height), - str, - RectMake(0, 48, 480, 320-48), dragVelocity | isTouchMoving ) )//RectMake(0, 42, 480, 238) ) + if (iphoneDrawPicInBoxWithTouchAndVelocity(MakeScaledRectFloat(0.0f, dragPosition+(height+spacing)*e, 480.0f, height), + MakeScaledRectFloat(0.0f, dragPosition+(height+spacing)*e, 480.0f, height), + str, + MakeScaledRectFloat(0.0f, 48.0f, 480.0f, 320.0f-48.0f), dragVelocity | isTouchMoving ) )//RectMake(0, 42, 480, 238) ) //&& !dragVelocity //&& !isTouchMoving ) { @@ -2008,8 +2263,18 @@ void iphoneScrollingEpisodeMenu() { pfglColor3f( 1, 1, 1 ); break; } - Cvar_SetValue( episode->name, e ); - menuState = IPM_MAPS; + + // If they have the Lite version, only allow episode 1. + if ( SysIPhoneGetContentVersion() == CONTENT_PLATINUM || e == 0 ) { + Cvar_SetValue( episode->name, e ); + menuState = IPM_MAPS; + } else { + // Lite version, but user chose an episode that was not episode 1. + // Prompt in-app purchase for platinum. + // TODO: this. + InAppPurchaseStartPurchase( PLATINUM_UPGRADE_STRING ); + } + } pfglColor3f( 1, 1, 1 ); } @@ -2024,20 +2289,19 @@ void iphoneScrollingEpisodeMenu() { } lastTouchFrame = iphoneFrameNum; -#ifdef LITE - // buy more episodes button - GetMoreLevels( 240 - 64, 200 ); -#else + #ifdef SPEARSTOREKIT if (g_version->value != SPEAROFDESTINY) //gsh GetSpearOfDestiny( 240 - 64, 232 ); #endif -#endif if ( MenuButton() ) { menuState = IPM_MAIN; } } + +#endif + //gsh extern void iphoneDrawRewards(int m, int s, int x, int y); //gsh @@ -2056,6 +2320,8 @@ colour4_t colorNoTry = { 0, 0, 0, 150 }; colour4_t colorTried = { 80, 80, 80, 40 }; colour4_t colorCompleted = { 0, 120, 0, 80 }; +#if 0 + /* ======================== iphoneDrawWolf3dMaps @@ -2072,8 +2338,6 @@ void iphoneDrawWolf3dMaps(int dragPosition, int dragVelocity, int e, int s, int colour4_t colorCompleted = { 0, 80, 0, 100 }; */ - - // draw the individual maps for ( int m = 0 ; m < 10; m++ ) { int y; @@ -2119,7 +2383,7 @@ void iphoneDrawWolf3dMaps(int dragPosition, int dragVelocity, int e, int s, int case 3: color = colorNoTry; break; }*/ - rect_t box = RectMake(0, 48, 480, 320-48); + rectFloat_t box = MakeScaledRectFloat(0.0f, 48.0f, 480.0f, 320.0f-48.0f); int borderWidth = 40; /* if (iphoneDrawPicInBoxWithTouchSpecifiedAndColor(RectMake(borderWidth, y - 9, 480-2*borderWidth, height), RectMake(borderWidth, y - 9, 480-2*borderWidth, height), @@ -2127,22 +2391,31 @@ void iphoneDrawWolf3dMaps(int dragPosition, int dragVelocity, int e, int s, int box, color) && !dragVelocity && !isTouchMoving)//touchedFrameNum >= 10) -*/ if (iphoneDrawPicInBoxWithTouchColorAndVelocity(RectMake(borderWidth, y - 9, 480-2*borderWidth, height), - RectMake(borderWidth, y - 9, 480-2*borderWidth, height), +*/ if (iphoneDrawPicInBoxWithTouchColorAndVelocity( MakeScaledRectFloat(borderWidth, y - 9.0f, 480.0f-2*borderWidth, height), + MakeScaledRectFloat(borderWidth, y - 9.0f, 480.0f-2*borderWidth, height), "iphone/menu_bar.tga", box, color, dragVelocity | isTouchMoving) )// && !dragVelocity //&& !isTouchMoving) { - // don't let them go to the secret level unless they earned it - if ( m == 9 && !( ch & MF_TRIED ) ) - continue; - - PL_NewGame( &Player ); - iphoneStartMap( e, m, s ); - iphoneFrameNum = 0; - returnButtonFrameNum = 100; - iphonePreloadBeforePlay(); + // Only allow access to the first three levels if they have the Lite version. + if ( SysIPhoneGetContentVersion() == CONTENT_PLATINUM || m < 3 ) { + // don't let them go to the secret level unless they earned it + if ( m == 9 && !( ch & MF_TRIED ) ) + continue; + + PL_NewGame( &Player ); + iphoneStartMap( e, m, s ); + iphoneFrameNum = 0; + returnButtonFrameNum = 100; + iphonePreloadBeforePlay(); + } else { + // User has chosen a level he does not have acces to in the Lite version. + // Prompt the user to buy Platinum with an in-app purchase. + // TODO: This. + InAppPurchaseStartPurchase( PLATINUM_UPGRADE_STRING ); + } + } //draw the rewards @@ -2280,7 +2553,7 @@ void iphoneDrawSpearMaps(int dragPosition, int dragVelocity, int fakeEpisode, in color = colorNoTry; } - rect_t box = RectMake(0, 48, 480, 320-48); + rectFloat_t box = MakeScaledRectFloat(0, 48, 480, 320-48); int borderWidth = 40; /* if (iphoneDrawPicInBoxWithTouchSpecifiedAndColor(RectMake(borderWidth, y - 9, 480-2*borderWidth, height), RectMake(borderWidth, y - 9, 480-2*borderWidth, height), @@ -2288,27 +2561,33 @@ void iphoneDrawSpearMaps(int dragPosition, int dragVelocity, int fakeEpisode, in box, color) && !dragVelocity && !isTouchMoving)//touchedFrameNum >= NUM_TOUCHFRAME) -*/ if (iphoneDrawPicInBoxWithTouchColorAndVelocity(RectMake(borderWidth, y - 9, 480-2*borderWidth, height), - RectMake(borderWidth, y - 9, 480-2*borderWidth, height), +*/ if (iphoneDrawPicInBoxWithTouchColorAndVelocity(MakeScaledRectFloat(borderWidth, y - 9, 480-2*borderWidth, height), + MakeScaledRectFloat(borderWidth, y - 9, 480-2*borderWidth, height), "iphone/menu_bar.tga", box, color, dragVelocity | isTouchMoving ) ) //&& !isTouchMoving) { - //diagnostic info - Com_Printf("fakeEpisode: %i fakeMap: %i\n", fakeEpisode, fakeMap); - Com_Printf("e: %i m: %i\n", e, m); - - // don't let them go to the secret level unless they earned it - if ( (levelNum == 78 || levelNum == 79) && !( ch & MF_TRIED ) ) - continue; + if ( SysIPhoneGetContentVersion() == CONTENT_PLATINUM ) { + //diagnostic info + Com_Printf("fakeEpisode: %i fakeMap: %i\n", fakeEpisode, fakeMap); + Com_Printf("e: %i m: %i\n", e, m); + + // don't let them go to the secret level unless they earned it + if ( (levelNum == 78 || levelNum == 79) && !( ch & MF_TRIED ) ) + continue; + + PL_NewGame( &Player ); + iphonePreloadBeforePlay(); + iphoneStartMap(e, m, s); + iphoneFrameNum = 0; + returnButtonFrameNum = 100; + break; //break the loop... no need to keep looping + } else { + // User hasn't purchased platinum, prompt them to buy. + InAppPurchaseStartPurchase( PLATINUM_UPGRADE_STRING ); + } - PL_NewGame( &Player ); - iphonePreloadBeforePlay(); - iphoneStartMap(e, m, s); - iphoneFrameNum = 0; - returnButtonFrameNum = 100; - break; //break the loop... no need to keep looping } //draw the rewards @@ -2357,7 +2636,7 @@ int iphoneDrawUserCreatedMaps(int dragPosition, int dragVelocity, /*int fakeEpis Com_Printf("y: %i\n", y); - while (ep = readdir (dp)) + while ( ( ep = readdir (dp) ) ) { //if you find a .DS_Store file... ignore it! if ( strcmp(ep->d_name, ".DS_Store") == 0 ) @@ -2399,12 +2678,12 @@ int iphoneDrawUserCreatedMaps(int dragPosition, int dragVelocity, /*int fakeEpis } int borderWidth = 40; - rect_t box = RectMake(0, 48, 480, 320-48); - if (iphoneDrawPicInBoxWithTouchColorAndVelocity(RectMake(borderWidth, y - 9, 480-2*borderWidth, height), - RectMake(borderWidth, y - 9, 480-2*borderWidth, height), - "iphone/menu_bar.tga", - box, - color, dragVelocity | isTouchMoving) ) + rectFloat_t box = MakeScaledRectFloat(0.0f, 48.0f, 480.0f, 320.0f-48.0f); + if (iphoneDrawPicInBoxWithTouchColorAndVelocity( MakeScaledRectFloat(borderWidth, y - 9.0f, 480.0f-2.0f*borderWidth, height), + MakeScaledRectFloat(borderWidth, y - 9.0f, 480.0f-2.0f*borderWidth, height), + "iphone/menu_bar.tga", + box, + color, dragVelocity | isTouchMoving) ) { //reset the player to new PL_NewGame( &Player ); @@ -2444,6 +2723,10 @@ int iphoneDrawUserCreatedMaps(int dragPosition, int dragVelocity, /*int fakeEpis return numMaps; } +#endif + +#if 0 + /* ================== iphoneScrollingMapMenu @@ -2453,13 +2736,9 @@ int iphoneDrawUserCreatedMaps(int dragPosition, int dragVelocity, /*int fakeEpis extern int forceDrawRewards; void iphoneScrollingMapMenu() { -#ifdef LITE -# define NUM_MAPS 3 -#else + # define NUM_MAPS 10 -#endif - - + //used for preventing accidental touches //user must hold touch down for 10 frames in order to load map static int touchedFrameNum = 0; @@ -2474,7 +2753,15 @@ void iphoneScrollingMapMenu() static int dragPosition = 70; static int dragVelocity = 0; - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); + + // If waiting for an in-app purchase, show the user an activity indicator. + if ( InAppPurchaseIsInProgress() ) { + iphoneDrawLoadingIndicator(); + + return; + } + /* //static int forceDrawRewards = 0; //This is only for debugging/testing out the look of the medals @@ -2560,7 +2847,7 @@ void iphoneScrollingMapMenu() if ( e == 8 ) lowerLimit = -85; */ - iphoneUpdateScrollingDrags(&dragPosition, &dragVelocity, 65, lowerLimit, 0, RectMake(0, 48, 480-48, 320-64)); + iphoneUpdateScrollingDrags( &dragPosition, &dragVelocity, 65, lowerLimit, 0 ); //---------------------------- if ( e < 6 ) @@ -2592,7 +2879,7 @@ void iphoneScrollingMapMenu() // draw the header for the episode my_snprintf( str, sizeof( str ), "iphone/header_ep%i.tga", e+1 ); - iphoneDrawPic( 0, 0, 480, 48, str ); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 48.0f ), str ); if ( BackButton() ) { menuState = IPM_EPISODE; @@ -2608,11 +2895,8 @@ void iphoneScrollingMapMenu() ================== */ void iphoneMapMenu() { -#ifdef LITE -# define NUM_MAPS 3 -#else + # define NUM_MAPS 10 -#endif int e, m, s; char str[64]; @@ -2736,6 +3020,8 @@ void iphoneMapMenu() { } } +#endif + /* ================== iphoneStartIntermission @@ -2787,13 +3073,22 @@ void iphoneStartIntermission( int framesFromNow ) { ================== */ void DrawDigit( int x, int y, int digit ) { + float width = 32.0f; + float height = 32.0f; + + float xFloat = (float)x; + float yFloat = (float)y; + + ScalePositionAndSize( &xFloat, &yFloat, &width, &height ); + R_Bind( numberPics[digit]->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); + + pfglTexCoord2f( 0, 0 ); pfglVertex2f( xFloat, yFloat ); + pfglTexCoord2f( 0, 1 ); pfglVertex2f( xFloat, yFloat+height ); + pfglTexCoord2f( 1, 0 ); pfglVertex2f( xFloat+width, yFloat ); + pfglTexCoord2f( 1, 1 ); pfglVertex2f( xFloat+width, yFloat+height ); - pfglTexCoord2f( 0, 0 ); pfglVertex2i( x, y ); - pfglTexCoord2f( 1, 0 ); pfglVertex2i( x+32, y ); - pfglTexCoord2f( 1, 1 ); pfglVertex2i( x+32, y+32 ); - pfglTexCoord2f( 0, 1 ); pfglVertex2i( x, y+32 ); pfglEnd(); } @@ -2831,7 +3126,7 @@ void DrawRatio( int y, int got, int total, const char *bonusPic ) { // draw the award icon if ( got == total ) { - iphoneDrawPic( 480 - 40, y, 32, 32, bonusPic ); + iphoneDrawPicRect( MakeScaledRectFloat( 480.0f - 40.0f, y, 32.0f, 32.0f ), bonusPic ); } } @@ -2847,7 +3142,7 @@ void DrawIntermissionStats() { //gsh // iphoneDrawPic( 0, 0, 480, 320, "iphone/intermission_256.tga" ); - iphoneDrawPic( 0, 0, 480, 320, "iphone/intermission.tga" ); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/intermission.tga" ); // episode //if (currentMap.episode < 10)//6) //gsh added the check for SOD @@ -2889,41 +3184,49 @@ void DrawIntermissionStats() { // iphoneDrawPic( 0, 0, 384, 48, str ); // iphoneDrawPic( -104, 0, 480, 48, str ); //gsh - iphoneDrawPic( 0, 0, 480, 48, str ); //gsh + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 48.0f), str ); //gsh // level // iphoneDrawNumber( 430, 0, currentMap.map + 1, 48, 48 ); // iphoneDrawNumber( 430-48, 50, currentMap.map + 1, 48, 48 ); //gsh //display the appropriate mission number + float missionWidth = 48.0f; + float missionHeight = 48.0f; + + float missionX = 430.0f - missionWidth; + float missionY = 50.0f; + + ScalePositionAndSize( &missionX, &missionY, &missionWidth, &missionHeight ); + if (currentMap.episode < 6) - iphoneDrawNumber( 430-48, 50, currentMap.map + 1, 48, 48 ); + iphoneDrawNumber( missionX, missionY, currentMap.map + 1, missionWidth, missionHeight ); else if (currentMap.episode < 10) { int currentLevel = currentMap.episode * 10 + currentMap.map; switch (currentLevel) { case 60: case 61: case 62: case 63: case 64: - iphoneDrawNumber( 430-48, 50, currentLevel - 60 + 1, 48, 48 ); + iphoneDrawNumber( missionX, missionY, currentLevel - 60 + 1, missionWidth, missionHeight ); break; case 78: - iphoneDrawNumber( 430-48, 50, 6, 48, 48 ); + iphoneDrawNumber( missionX, missionY, 6, 48, 48 ); break; case 65: case 66: case 67: case 68: case 69: - iphoneDrawNumber( 430-48, 50, currentLevel - 65 + 1, 48, 48 ); + iphoneDrawNumber( missionX, missionY, currentLevel - 65 + 1, missionWidth, missionHeight ); break; case 79: - iphoneDrawNumber( 430-48, 50, 6, 48, 48 ); + iphoneDrawNumber( missionX, missionY, 6, 48, 48 ); break; case 70: case 71: case 72: case 73: case 74: case 75: - iphoneDrawNumber( 430-48, 50, currentLevel - 70 + 1, 48, 48 ); + iphoneDrawNumber( missionX, missionY, currentLevel - 70 + 1, missionWidth, missionHeight ); break; case 76: - iphoneDrawNumber( 430-48, 50, 1, 48, 48 ); + iphoneDrawNumber( missionX, missionY, 1, missionWidth, missionHeight ); break; case 77: - iphoneDrawNumber( 430-48, 50, 2, 48, 48 ); + iphoneDrawNumber( missionX, missionY, 2, missionWidth, missionHeight ); break; case 80: - iphoneDrawNumber( 430-48, 50, 3, 48, 48 ); + iphoneDrawNumber( missionX, missionY, 3, missionWidth, missionHeight ); break; default: sprintf( str, " "); @@ -2931,15 +3234,16 @@ void DrawIntermissionStats() { } } else - iphoneDrawNumber( 430-48, 50, currentMap.map + 1, 48, 48 ); + iphoneDrawNumber( missionX, missionY, currentMap.map + 1, missionWidth, missionHeight ); // par / time - int offset = 50; + float offset = 50.0f; DrawTime( 51, 63+offset, levelstate.fpartime * 60 ); // fpartime is in minutes DrawTime( 285, 63+offset, levelstate.time / 60 ); // levelstate.time is in tics if ( levelstate.time/60 <= levelstate.fpartime * 60 ) { - iphoneDrawPic( 480 - 40, 63+offset, 32, 32, "iphone/partime.tga" ); + iphoneDrawPicRect( MakeScaledRectFloat( 480.0f - 40.0f, 63.0f+offset, 32.0f, 32.0f ), + "iphone/partime.tga" ); } // ratios @@ -2972,7 +3276,7 @@ void iphoneIntermission() { //---------------------- // tap for next level //---------------------- - if ( !TouchReleased( 0, 0, 480, 320 ) ) { + if ( !TouchReleased( 0, 0, viddef.width, viddef.height ) ) { return; } @@ -3011,47 +3315,47 @@ void iphoneIntermission() { { int currentLevel = currentMap.episode * 10 + currentMap.map; -#ifdef LITE - switch ( currentLevel ) { - case 2: - // go back to the episode select screen - menuState = IPM_VICTORY; - Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" ); - return; - default: nextLevel = currentLevel + 1; break; - } -#else - if( Player.playstate == ex_secretlevel ) { - switch( currentLevel ) { - case 0: nextLevel = 9; break; - case 10: nextLevel = 19; break; - case 26: nextLevel = 29; break; - case 32: nextLevel = 39; break; - case 44: nextLevel = 49; break; - case 52: nextLevel = 59; break; - } - } else { + if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) { switch ( currentLevel ) { - case 8: - case 18: - case 28: - case 38: - case 48: - case 58: + case 2: // go back to the episode select screen menuState = IPM_VICTORY; Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" ); return; - case 9: nextLevel = 1; break; - case 19: nextLevel = 11; break; - case 29: nextLevel = 27; break; - case 39: nextLevel = 33; break; - case 49: nextLevel = 44; break; - case 59: nextLevel = 53; break; default: nextLevel = currentLevel + 1; break; + } + } else { // Content is Platinum + if( Player.playstate == ex_secretlevel ) { + switch( currentLevel ) { + case 0: nextLevel = 9; break; + case 10: nextLevel = 19; break; + case 26: nextLevel = 29; break; + case 32: nextLevel = 39; break; + case 44: nextLevel = 49; break; + case 52: nextLevel = 59; break; + } + } else { + switch ( currentLevel ) { + case 8: + case 18: + case 28: + case 38: + case 48: + case 58: + // go back to the episode select screen + menuState = IPM_VICTORY; + Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" ); + return; + case 9: nextLevel = 1; break; + case 19: nextLevel = 11; break; + case 29: nextLevel = 27; break; + case 39: nextLevel = 33; break; + case 49: nextLevel = 44; break; + case 59: nextLevel = 53; break; + default: nextLevel = currentLevel + 1; break; + } } } -#endif } else //they just defeated a custom map... gsh { @@ -3072,11 +3376,13 @@ void iphoneIntermission() { ================== */ void iphoneVictory() { - iphoneDrawPic( 0, 0, 480, 320, "iphone/victory_256.tga" ); - if ( !TouchReleased( 0, 0, 480, 320 ) ) { + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), + "iphone/victory_256.tga" ); + if ( !TouchReleased( 0, 0, viddef.width, viddef.height ) ) { return; } menuState = IPM_EPISODE; + iphoneStartMainMenu(); //gsh menuState = IPM_MAPSELECTOR; } @@ -3225,9 +3531,11 @@ void iphoneOpenAutomap() { } void iphoneAutomap() { + int halfWidth = viddef.width / 2; + int halfHeight = viddef.height / 2; //draw the new background... gsh - iphoneDrawPic(0, 0, 480, 320, "iphone/map_background.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0, 0, 480, 320 ), "iphone/map_background.tga"); mapTile_t *mt; @@ -3333,8 +3641,8 @@ void iphoneAutomap() { zoom = 1; //need to translate tap/screen coordinate to map coordinate - int Xrelative2screenorigin = tapX - 240; - int Yrelative2screenorigin = 160 - tapY; + int Xrelative2screenorigin = tapX - halfWidth; + int Yrelative2screenorigin = halfHeight - tapY; float scaledX = Xrelative2screenorigin / scale; float scaledY = Yrelative2screenorigin / scale; float camSpaceX = scaledX + mapOrigin[0]; @@ -3391,14 +3699,13 @@ void iphoneAutomap() { Cvar_SetValue( mapScale->name, scale ); } - - + // set up matrix for drawing in tile units pfglMatrixMode( GL_PROJECTION ); pfglLoadIdentity(); iphoneRotateForLandscape(); - pfglOrtho( mapOrigin[0]-240.0 / scale, mapOrigin[0]+240.0 / scale, - mapOrigin[1]-160.0 / scale, mapOrigin[1]+160.0 / scale, -99999, 99999 ); + pfglOrtho( mapOrigin[0]-halfWidth / scale, mapOrigin[0]+halfWidth / scale, + mapOrigin[1]-halfHeight / scale, mapOrigin[1]+halfHeight / scale, -99999, 99999 ); mt = mapTiles; texnum = 99999; @@ -3458,14 +3765,14 @@ void iphoneAutomap() { pfglMatrixMode( GL_PROJECTION ); pfglLoadIdentity(); iphoneRotateForLandscape(); - pfglOrtho( 0, 480, 320, 0, -99999, 99999 ); + pfglOrtho( 0, viddef.width, viddef.height, 0, -99999, 99999 ); if ( BackButton() ) { menuState = IPM_GAME; } // stats button for stats display //if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/stats.tga" ) ) { - if ( iphoneDrawPicWithTouch( 64, 0, 120, 36, "iphone/stats_large.tga" ) ) { + if ( iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 64.0f, 0.0f, 120.0f, 36.0f ), "iphone/stats_large.tga" ) ) { menuState = IPM_STATS; } //gsh @@ -3518,7 +3825,7 @@ void iphoneDownloadSpearProgressBar() y += 17*scale; //draw "Spear of Destiny" at the top - iphoneDrawPic(90, 20, 256, 128, "iphone/spear_logo.tga"); + //iphoneDrawPic(90, 20, 256, 128, "iphone/spear_logo.tga"); //draw the progress bar iphoneDrawPic( 40, 150, 400, barHeight, "iphone/menu_bar.tga" ); @@ -3529,11 +3836,14 @@ void iphoneDownloadSpearProgressBar() } #endif +char urlbuffer[1024]; + +#if 0 + //========================== // iphoneDownloadMenu //gsh //========================== -char urlbuffer[1024]; void iphoneDownloadMenu() { char str[80]; @@ -3541,7 +3851,7 @@ void iphoneDownloadMenu() int barHeight = 30; //draw the background - iphoneDrawPic(0, 0, 480, 320, "iphone/download_background.tga"); + //iphoneDrawPic(0, 0, 480, 320, "iphone/download_background.tga"); //draw the url iphoneCenterText(240, 120, urlbuffer); @@ -3572,6 +3882,8 @@ void iphoneDownloadMenu() iphoneDrawPic(pos, 150+34/2-22/2, 60, 22, "iphone/download_bullet.tga"); } +#endif + /* //========================================== // iphoneUpdateTriviaDrags() @@ -3584,21 +3896,21 @@ void iphoneUpdateTriviaAndInstructionsDrags(int numEnteries, int x, int y, int w //Update drag/touch info // int x = 0; // int w = 480;// - skillSides - 64; - /* + if (TouchDown(x, y, w, h)) { if (!numPrevTouches) prevTouches[0][0] = touches[0][0]; else if (numTouches == 1) *dragVelocity = touches[0][0] - prevTouches[0][0]; - }* + } //update the drags *dragPosition += *dragVelocity; - /* + //int rightBoundary = 240 - 2*width;//480/2 - (numPresets*width/2 + spacing); if (*dragPosition < -(numTrivia-1)*480-10)//270-10)//(numPresets*(width+spacing))/2 ) *dragPosition = -(numTrivia-1)*480-10;//270-10;//(numPresets*(width+spacing))/2; @@ -3609,7 +3921,7 @@ void iphoneUpdateTriviaAndInstructionsDrags(int numEnteries, int x, int y, int w *dragVelocity = 2; else if (*dragPosition > x) *dragVelocity = -2; - * + //retard the velocity if (*dragVelocity > 0) @@ -3673,8 +3985,8 @@ void iphoneTriviaMenu() //get number of trivia int numTrivia = sizeof(triviaText)/(sizeof(char) * 1024); - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); - iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_trivia.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 240.0f-108*9/10.0f, 0.0f, 217.0f*9/10.0f, 50.0f*9/10.0f ), "iphone/header_trivia.tga"); if (BackButton()) { menuState = IPM_MORE; @@ -3699,7 +4011,7 @@ void iphoneTriviaMenu() //if (revLand->value) // y = -20; - if (iphoneDrawPicWithTouch(9, y+60+16, 64, 64, "iphone/button_left.tga") ){//&& !dragVelocity) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 9.0f, y+60.0f+16, 64.0f, 64.0f ), "iphone/button_left.tga") ){//&& !dragVelocity) { dragVelocity += -25;//-18; if (dragVelocity < -50) @@ -3708,7 +4020,7 @@ void iphoneTriviaMenu() if (currentLocation >= numTrivia) currentLocation = 0;//numTrivia-1; */ } - if (iphoneDrawPicWithTouch(411, y+60+16, 64, 64, "iphone/button_right.tga") ){//&& !dragVelocity) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloaT( 411.0f, y+60.0f+16, 64.0f, 64.0f ), "iphone/button_right.tga") ){//&& !dragVelocity) { dragVelocity += 25;//18; if (dragVelocity > 50) dragVelocity = 50; @@ -3807,6 +4119,7 @@ void iphoneTriviaMenu() } #endif +#if 0 //This is a different implementation of the one above //gsh void iphoneTriviaMenu() @@ -3835,11 +4148,12 @@ void iphoneTriviaMenu() //get number of trivia int numTrivia = sizeof(triviaText)/(sizeof(char) * 1024); - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); - iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_trivia.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 240.0f-108.0f*9/10.0f, 0.0f, 217.0f*9/10.0f, 50.0f*9/10.0f ), "iphone/header_trivia.tga"); if (BackButton()) { menuState = IPM_MORE; + iphoneStartMainMenu(); return; } @@ -3862,7 +4176,7 @@ void iphoneTriviaMenu() static int moveRight = 0; //move right or left, depending on button pushed - if (iphoneDrawPicWithTouch(9, y+60+16, 64, 64, "iphone/button_left.tga") ) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 9.0f, y+60.0f+16.0f, 64.0f, 64.0f ), "iphone/button_left.tga") ) { moveRight = 0; ++currentTrivia; if (currentTrivia > numTrivia-1) { @@ -3870,7 +4184,7 @@ void iphoneTriviaMenu() } } - if (iphoneDrawPicWithTouch(411, y+60+16, 64, 64, "iphone/button_right.tga") ) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 411.0f, y+60.0f+16.0f, 64.0f, 64.0f ), "iphone/button_right.tga") ) { moveRight = 1; --currentTrivia; if (currentTrivia < 0) { @@ -3949,8 +4263,8 @@ void iphoneTriviaMenu() // int x = 0; - y = 50; - int w = 305; + // y = 50; + int w = 305 * screenScale; int h = 250; colour4_t color = { 0, 0, 0, 255 }; colour4_t colorWhite = { 255, 255, 255, 255 }; @@ -3963,16 +4277,27 @@ void iphoneTriviaMenu() if (Position < lowerLimit )//startPosition - numTrivia*480) Position = startPosition;// - (width+spacing); - x = Position + (width+spacing)*i; + float xFloat = Position + (width+spacing)*i; + float yFloat = 50; - if (x > 480 || x + width < 0) + if (xFloat > 480 || xFloat + width < 0) continue; - DrawBlendInBox( x-2, y-2, w+4, h+4, colorWhite, 71, 410-70); - DrawBlendInBox( x-1, y-1, w+2, h+2, colorGrey, 71, 410-70); - DrawBlendInBox( x, y, w, h, color, 71, 410-70); + ScalePosition( &xFloat, &yFloat ); + + x = (int)xFloat; + y = (int)yFloat; + + int boxWidth = (410-70) * screenScale; + + DrawBlendInBox( x-2, y-2, w+4, h+4, colorWhite, 71 * screenScale, boxWidth); + DrawBlendInBox( x-1, y-1, w+2, h+2, colorGrey, 71 * screenScale, boxWidth); + DrawBlendInBox( x, y, w, h, color, 71 * screenScale, boxWidth); //iphoneDrawTextInBox(RectMake(x, y+16, 16, 16), 410-70-32-16, triviaText[i], RectMake(71, 0, 320, 410-70)); - iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), 410-70-32-16, triviaText[i], RectMake(71, 0, 320, 410-70)); + rect_t boxRect = RectMake(71, 0, 320, 410-70); + ScaleRect( &boxRect ); + + iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), (410-70-32-16) * screenScale, triviaText[i], boxRect ); } } @@ -3984,20 +4309,21 @@ void iphoneMoreMenu() { wasDLInstructionsCalledFromEpisodeMenu = 0; - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); - iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_more.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 240.0f-108*9/10.0f, 0.0f, 217.0f*9/10.0f, 50.0f*9/10.0f ), "iphone/header_more.tga"); float scale = 40 / 32.0; if (BackButton()) { menuState = IPM_MAIN; + iphoneStartMainMenu(); } - if (iphoneDrawPicWithTouch(240-64*scale, 120, 128*scale, 32*scale, "iphone/button_trivia.tga")) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 240-64*scale, 120, 128*scale, 32*scale ), "iphone/button_trivia.tga")) { menuState = IPM_TRIVIA; } - if (iphoneDrawPicWithTouch(240-64*scale, 170, 128*scale, 32*scale, "iphone/button_downloads.tga")) { + if (iphoneDrawPicRectWithTouch( MakeScaledRectFloat( 240-64*scale, 170, 128*scale, 32*scale ), "iphone/button_downloads.tga")) { menuState = IPM_DOWNLOADINSTRUCTIONS; } } @@ -4008,8 +4334,8 @@ void iphoneMoreMenu() //----------------------------------- void iphoneDownloadInstructionsMenu() { - iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); - iphoneDrawPic(240-108*9/10, 0, 217*9/10, 50*9/10, "iphone/header_downloads.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 0.0f, 0.0f, 480.0f, 320.0f ), "iphone/submenus_background_image.tga"); + iphoneDrawPicRect( MakeScaledRectFloat( 240.0f-108*9/10.0f, 0.0f, 217.0f*9/10.0f, 50.0f*9/10.0f ), "iphone/header_downloads.tga"); if (BackButton()) { @@ -4026,7 +4352,7 @@ void iphoneDownloadInstructionsMenu() } /* if ( iphoneDrawPicWithTouch( 64, 0, 64, 36, "iphone/button_web.tga" ) ) { - wasCalledFromDownloadInstructionsMenu = 1; + currentYesNoBox = ESNO_DOWNLOAD_INSTRUCTIONS; iphoneYesNoBox("Website", "This will navigate you to idsoftware.com/iphone/wolf3dInstructions.html. Continue?"); }*/ @@ -4035,14 +4361,19 @@ void iphoneDownloadInstructionsMenu() " For details, go to:\n\nhttp://www.idsoftware.com/wolfenstein\n" "-3d-classic-platinum/mapinstructions/"; - int x = 20; - int y = 100; - int w = 480-40; - int h = 150; + float x = 20; + float y = 100; + float w = 480-40; + float h = 150; colour4_t color = { 0, 0, 0, 255 }; colour4_t colorGrey = { 100, 100, 100, 255 }; colour4_t colorWhite = { 255, 255, 255, 255 }; + x = ( viddef.width * 0.5f ) - ( w / 2.0f ); + float contentHeight = REFERENCE_HEIGHT - 45.0f; + y = ( contentHeight * 0.5f ) - ( h / 2.0f ); + + ScalePosition( NULL, &y ); //draw a background, behind the text, with a white border R_Draw_Blend( x-2, y-2, w+4, h+4, colorWhite); @@ -4050,12 +4381,15 @@ void iphoneDownloadInstructionsMenu() R_Draw_Blend( x, y, w, h, color); //draw arial text - iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), 400, instructions, RectMake(10, 0, 480-40, 320)); + rect_t boxRect = RectMake(10, 0, 480-40, 320); + ScaleRect( &boxRect ); + + iphoneDrawArialTextInBox(RectMake(x, y+16, 16, 16), 400, instructions, boxRect ); //check for touch events on the text itself int r = TouchReleased( x, y, w, h ); if ( r ) { - wasCalledFromDownloadInstructionsMenu = 1; + currentYesNoBox = YESNO_DOWNLOAD_INSTRUCTIONS; iphoneYesNoBox("Website", "This will navigate you to idsoftware.com/wolfenstein-3d-classic-platinum/mapinstructions/ Continue?"); } if ( TouchDown( x, y, w, h ) ) { @@ -4064,7 +4398,7 @@ void iphoneDownloadInstructionsMenu() } } - +#endif //gsh extern void iphoneSelectMapMenu(); @@ -4074,29 +4408,39 @@ extern void iphoneStoreKit(); void iphoneDrawMenus() { // iphoneDrawPic( 0, 0, 480, 320, "iphone/background_main_sepia.tga" ); - iphoneDrawPic( 0, 0, 480, 320, "iphone/background_main_hued.tga" ); //gsh + //iphoneDrawPicRect( MakeScaledRectFloat( 0, 0, 480, 320 ), "iphone/background_main_hued.tga" ); //gsh switch ( menuState ) { case IPM_MAIN: iphoneMainMenu(); break; - case IPM_SKILL: iphoneSkillMenu(); break; - case IPM_EPISODE: iphoneScrollingEpisodeMenu(); break;//gsh //iphoneEpisodeMenu(); break; - case IPM_MAPS: iphoneScrollingMapMenu(); break; //gsh iphoneMapMenu(); break; + case IPM_SKILL: /* iphoneSkillMenu(); */ break; + case IPM_EPISODE: /* iphoneScrollingEpisodeMenu(); */ break;//gsh //iphoneEpisodeMenu(); break; + case IPM_MAPS: /* iphoneScrollingMapMenu(); */ break; //gsh iphoneMapMenu(); break; // case IPM_MAPSELECTOR: iphoneSelectMapMenu(); break; //gsh - case IPM_CONTROLS: iphoneControlMenu(); break; + case IPM_CONTROLS: /* iphoneControlMenu(); */ break; case IPM_INTERMISSION: iphoneIntermission(); break; case IPM_VICTORY: iphoneVictory(); break; case IPM_AUTOMAP: iphoneAutomap(); break; case IPM_STATS: iphoneStats(); break; case IPM_HUDEDIT: iphoneHudEditFrame(); break;//gsh HudEditFrame(); break; - case IPM_DOWNLOADPROGRESS: iphoneDownloadMenu(); break; //gsh + case IPM_DOWNLOADPROGRESS: /* iphoneDownloadMenu(); */ break; //gsh #if SPEARSTOREKIT case IPM_STOREKIT: iphoneStoreKit(); break; //gsh #endif // case IPM_LOADING: iphoneLoadingMenu(); //gsh - case IPM_TRIVIA: iphoneTriviaMenu(); break;//gsh - case IPM_MORE: iphoneMoreMenu(); break;//gsh - case IPM_DOWNLOADINSTRUCTIONS: iphoneDownloadInstructionsMenu(); break; //gsh + case IPM_TRIVIA: /* iphoneTriviaMenu(); */ break;//gsh + case IPM_MORE: /* iphoneMoreMenu(); */ break;//gsh + case IPM_DOWNLOADINSTRUCTIONS: /* iphoneDownloadInstructionsMenu(); */ break; //gsh + default: break; } + + // Draw letterbox bars. Some of the items in the level select menu spill beyond the scaled + // viewport, this is a quick way to hide them. + float contentHeight = REFERENCE_HEIGHT * screenScale; + float boxWidth = viddef.width; + float boxHeight = ( viddef.height - contentHeight ) / 2.0f; + R_DrawBox( 0, 0, boxWidth, boxHeight, 0xFF000000 ); + // The lower box is adjusted to cover rows of pixels lost to floating-point truncation. + R_DrawBox( 0, boxHeight + contentHeight - 1, boxWidth, boxHeight + 2, 0xFF000000 ); } diff --git a/wolf3d/code/iphone/iphone_qgl.h b/wolf3d/code/iphone/iphone_qgl.h index 793ec74..cb15d85 100644 --- a/wolf3d/code/iphone/iphone_qgl.h +++ b/wolf3d/code/iphone/iphone_qgl.h @@ -3,6 +3,8 @@ #ifndef _IPHONE_QGL_H_ #define _IPHONE_QGL_H_ +//#define QGL_CHECK_GL_ERRORS + #ifdef QGL_LOG_GL_CALLS extern unsigned int QGLLogGLCalls; #ifdef __cplusplus @@ -1177,8 +1179,8 @@ static inline GLenum qglGetError(void) #endif returnValue = glGetError(); #if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetError"); + //if (!QGLBeginStarted) + // QGLCheckError("glGetError"); #endif return returnValue; } @@ -2041,8 +2043,7 @@ static inline void qglViewport(GLint x, GLint y, GLsizei width, GLsizei height) fprintf(QGLDebugFile(), "glViewport(x=%ld, y=%ld, width=%ld, height=%ld)\n", x, y, width, height); #endif //extern glconfig_t glConfig; - int vidHeight = 320; - glViewport(vidHeight - y - height, x, height, width); + glViewport(x, y, width, height); #if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) if (!QGLBeginStarted) QGLCheckError("glViewport"); @@ -2231,6 +2232,8 @@ static inline void qglDrawTexfvOES(const GLfloat *coords) #endif } +/* + // Prevent calls to the 'normal' GL functions #define glAlphaFunc CALL_THE_QGL_VERSION_OF_glAlphaFunc #define glClearColor CALL_THE_QGL_VERSION_OF_glClearColor @@ -2388,5 +2391,5 @@ static inline void qglDrawTexfvOES(const GLfloat *coords) #define glDrawTexxvOES CALL_THE_QGL_VERSION_OF_glDrawTexxvOES #define glDrawTexfOES CALL_THE_QGL_VERSION_OF_glDrawTexfOES #define glDrawTexfvOES CALL_THE_QGL_VERSION_OF_glDrawTexfvOES - +*/ #endif // _IPHONE_QGL_H_ diff --git a/wolf3d/code/iphone/iphone_store.h b/wolf3d/code/iphone/iphone_store.h new file mode 100644 index 0000000..d848ef0 --- /dev/null +++ b/wolf3d/code/iphone/iphone_store.h @@ -0,0 +1,69 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#include + +/* +=============================================== +Expose a C interface to the In App Purchase functionality. + +This interface only supports non-consumable products, such as one-time purchases of extra levels +or expansion packs. It uses NSUserDefaults internally to keep track of purchases the user has +made. This is Apple's recommended method, and it means that purchases will automatically be +backed up with the app in iTunes, should the user choose to do so. Each product is a boolean +value stored in NSUserDefaults, with a key equal to the product ID string specified in iTunes +connect. This is the same string that needs to passed to InAppPurchaseStartPurchase and similar +functions. + +Usage: + +InAppPurchaseInit needs to be called during app launch to complete any transactions that +were not finished last time. + +Call InAppPurchaseStartPurchase with the product ID string from iTunes connect to begin the +purchase process. This will launch Apple's interface for logging in with an Apple ID and +comfirming the purchase. + +Call InAppPurchaseHasPurchased to see if the user has purchased a specific product. The string +parameter is the same product ID used in iTunes Connect and InAppPurchaseStartPurchase. + +=============================================== +*/ + +void InAppPurchaseInit( void ); +void InAppPurchaseShutdown( void ); +void InAppPurchaseStartPurchase( const char * productIdentifier ); + +typedef enum { + IAP_SUCCESS, + IAP_FAILURE +} InAppPurchaseResult; + +typedef void (*InAppPurchaseCallbackPtr)( InAppPurchaseResult result ); + +void InAppPurchaseSetCallback( InAppPurchaseCallbackPtr function ); + +bool InAppPurchaseIsInProgress( void ); + +bool InAppPurchaseHasPurchased( const char * productIdentifier ); + diff --git a/wolf3d/code/iphone/iphone_store.m b/wolf3d/code/iphone/iphone_store.m new file mode 100644 index 0000000..b771539 --- /dev/null +++ b/wolf3d/code/iphone/iphone_store.m @@ -0,0 +1,350 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + +#import +#import +#import + +#import + +#import "iphone_store.h" + + +@interface MyStoreObserver : NSObject { + +} + +// SKProductsRequestDelegate methods +- (void)productsRequest: (SKProductsRequest *)request didReceiveResponse: (SKProductsResponse *)response; + +// SKPaymentTransactionObserver methods +- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions; +- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions; + +- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error; +- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue; + +// MyStoreObserver methods +- (void)completeTransaction:(SKPaymentTransaction *)transaction; +- (void)failedTransaction:(SKPaymentTransaction *)transaction; +- (void)restoreTransaction:(SKPaymentTransaction *)transaction; +- (void)finalizeTransaction:(SKPaymentTransaction *)transaction; + +@end + +// The single instance of the store observer. This is created in InAppPurchaseInit and released +// in InAppPurchaseShutdown. +static MyStoreObserver *storeObserver; + +// Flag to indicate whether a purchase is in progress or not. This is set to true in +// InAppPurchaseStartPurchase and false when the request either succeeds or fails. +static bool isInProgress = false; + +static InAppPurchaseCallbackPtr clientCallback; + +@implementation MyStoreObserver + +/* +======================== +productsRequest:didReceiveResponse + +Called by the system when the application gets product information about an In-App Purchase. +======================== +*/ +- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response +{ + NSArray *myProduct = response.products; + + // For now, immediately request payment for any items the user has requested. + for (SKProduct *product in myProduct) + { + SKPayment *payment = [SKPayment paymentWithProductIdentifier:[product productIdentifier]]; + [[SKPaymentQueue defaultQueue] addPayment:payment]; + } + + // We should handle the case of an empty array, this seems to occur if we send a request + // with a nonexistant product ID, but there may be other cases. + // TODO: Need a timeout to be even more robust. + if ( [myProduct count] == 0 ) { + if ( clientCallback ) { + clientCallback( IAP_FAILURE ); + } + } + + [request autorelease]; +} + +/* +======================== +paymentQueue:updatedTransactions + +Called by the system when purchase requests are updated. +======================== +*/ +- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions +{ + for (SKPaymentTransaction *transaction in transactions) + { + switch (transaction.transactionState) + { + case SKPaymentTransactionStatePurchased: + [self completeTransaction:transaction]; + break; + case SKPaymentTransactionStateFailed: + [self failedTransaction:transaction]; + break; + case SKPaymentTransactionStateRestored: + [self restoreTransaction:transaction]; + default: + break; + } + } +} + +- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions +{ + +} + +- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error +{ + +} + + +- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue +{ + +} + +/* +======================== +completeTransaction + +Called by updatedTransactions when a request is completed. +======================== +*/ +- (void)completeTransaction:(SKPaymentTransaction *)transaction +{ + [self finalizeTransaction:transaction]; +} + +/* +======================== +failedTransaction + +Called by updatedTransactions when a request fails. +======================== +*/ +- (void)failedTransaction:(SKPaymentTransaction *)transaction +{ + if (transaction.error.code != SKErrorPaymentCancelled) + { + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"In-App Purchase error" + message:[transaction.error localizedDescription] + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + + [alert show]; + [alert release]; + } + [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; + + isInProgress = false; + + if ( clientCallback ) { + clientCallback( IAP_FAILURE ); + } +} + +/* +======================== +restoreTransaction + +Called by updatedTransactions when a request is restored. This can behave identically to +completeTransaction. +======================== +*/ +- (void)restoreTransaction:(SKPaymentTransaction *)transaction +{ + [self finalizeTransaction:transaction.originalTransaction]; +} + +/* +======================== +finalizeTransaction + +This method actually delivers the purchased item to the user. Currently, this means setting +a key in NSUserDefaults equal to the product ID to TRUE. +======================== +*/ +- (void)finalizeTransaction:(SKPaymentTransaction *)transaction +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSString *productID = transaction.payment.productIdentifier; + + [defaults setBool:TRUE forKey:productID]; + + [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; + + isInProgress = false; + + if ( clientCallback ) { + clientCallback( IAP_SUCCESS ); + } +} + +@end + + + + + +/* +======================== +InAppPurchaseInit + +Creates the instance of the payment observer and adds it to the payment queue. This should be +called at application launch. +======================== +*/ +void InAppPurchaseInit(void) { + if ( !storeObserver ) { + storeObserver = [[MyStoreObserver alloc] init]; + + // Add the observer here in case purchase requests were interrupted last time. + [[SKPaymentQueue defaultQueue] addTransactionObserver:storeObserver]; + } + +} + +void InAppPurchaseShutdown(void) { + [storeObserver release]; + storeObserver = nil; +} + +/* +======================== +InAppPurchaseStartPurchase + +If payments are enabled, starts an In-App Purchase transaction for the given product identifier. +If payments are not enabled, reminds the user that they can be enabled. +If a request is currently in progress, nothing happens, as only one request at a time is +allowed. +======================== +*/ +void InAppPurchaseStartPurchase( const char * productIdentifier ) { + // Only allow one request at a time. + if ( isInProgress ) { + return; + } + + if ( [SKPaymentQueue canMakePayments] ) { + // Start transaction. + if ( storeObserver == nil ) { + printf( "In-App Purchase system not initialized. Can't purchase anything!\n" ); + return; + } + + isInProgress = true; + + // convert the C string to an NSString. + NSString *productKey = [[NSString alloc] initWithCString:productIdentifier + encoding:NSASCIIStringEncoding]; + + SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: productKey]]; + + // The set retains the string, so we can release it now. + [productKey release]; + + request.delegate = storeObserver; + [request start]; + } else { + // User has disabled In-App purchases in settings. Kindly remind him that he can + // enable purchases again. + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"In-App Purchases are disabled" + message:@"You can enable In-App purchases in your device's settings." + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + + [alert show]; + [alert release]; + } + +} + +/* +======================== +InAppPurchaseHasPurchased + +Queries the standard NSUserDefaults object for a boolean key equal to the product identifier. +If this key is true, the user has purchased the product. If the key is false, the user has +not purchased the product. +======================== +*/ +bool InAppPurchaseHasPurchased( const char * productIdentifier ) { + // Convert the C string to an NSString for use with NSUserDefaults. + NSString *productKey = [[NSString alloc] initWithCString:productIdentifier + encoding:NSASCIIStringEncoding]; + + // Purchase records are stored in the standardUserDefaults, with a key equal to the product + // identifier. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + BOOL hasProduct = [defaults boolForKey:productKey]; + + // This string was alloced above, but since it isn't needed anymore, it must be released. + [productKey release]; + + // Convert Objective-C BOOL type to standard C99 _Bool type. + return ( hasProduct )? true: false; +} + +/* +======================== +InAppPurchaseIsInProgress + +Returns true if an In-App Purchase request is currently pending. Only one request can be active +at a time. +======================== +*/ +bool InAppPurchaseIsInProgress( void ) { + return isInProgress; +} + +/* +======================== +InAppPurchaseSetCallback + +Sets a functino pointer to be called when the in-app purchase transaction in complete, either +successfully or unsuccessfully. +======================== +*/ +void InAppPurchaseSetCallback( InAppPurchaseCallbackPtr function ) { + clientCallback = function; +} + diff --git a/wolf3d/code/iphone/iphone_sys.m b/wolf3d/code/iphone/iphone_sys.m index 68d5186..22948c0 100644 --- a/wolf3d/code/iphone/iphone_sys.m +++ b/wolf3d/code/iphone/iphone_sys.m @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -19,9 +22,13 @@ */ #include "../wolfiphone.h" +#include "iphone_store.h" + +#import "wolf3dAppDelegate.h" #import -//#import +#import +#import void interruptionListener( void *inUserData, UInt32 inInterruption) { @@ -45,7 +52,7 @@ void SysIPhoneInitAudioSession() { UInt32 audioCategory = kAudioSessionCategory_AmbientSound; status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); - UInt32 propOtherAudioIsPlaying = 'othr'; // kAudioSessionProperty_OtherAudioIsPlaying + AudioSessionPropertyID propOtherAudioIsPlaying = kAudioSessionProperty_OtherAudioIsPlaying; UInt32 size = sizeof( otherAudioIsPlaying ); AudioSessionGetProperty( propOtherAudioIsPlaying, &size, &otherAudioIsPlaying ); @@ -72,3 +79,276 @@ int SysIPhoneOtherAudioIsPlaying() { return osVersion; } + +/* + ================== + SysIPhoneGetContentVersion + + Checks the NSUserDefaults and returns true if the user has purchased the Platinum edition. + ================== + */ +contentVersion_t SysIPhoneGetContentVersion(void) { +#ifndef LITE + return CONTENT_PLATINUM; +#else + + // For the "Lite" app, we must check the user defaults to see if the user has purchased + // the platinum edition. + + bool platinum = InAppPurchaseHasPurchased( PLATINUM_UPGRADE_STRING ); + + if ( platinum ) { + return CONTENT_PLATINUM; + } + + return CONTENT_LITE; + +#endif +} + +/* + ================== + SysIPhoneGetPathToMainBundleLength + + Fills in the string + ================== + */ +int SysIPhoneGetPathToMainBundleLength( void ) { + NSBundle *mainBundle = [NSBundle mainBundle]; + + NSString *path = [mainBundle bundlePath]; + + return [path length]; + +} + +/* + ================== + SysIPhoneGetPathToMainBundle + + Fills in the string outPath with the path to the main bundle. If the path is longer than + maxLength, it will be truncated. Call SysIPhoneGetPathToMainBundleLength to get the string + size needed without truncation. + ================== + */ +void SysIPhoneGetPathToMainBundle( char * outPath, int maxLength ) { + NSBundle *mainBundle = [NSBundle mainBundle]; + + NSString *path = [mainBundle bundlePath]; + + [path getCString:outPath maxLength:maxLength encoding:NSASCIIStringEncoding]; + +} + +/* + ================== + iphoneRotateForLandscape + + ================== + */ +void iphoneRotateForLandscape() { + switch ( deviceOrientation ) { + case ORIENTATION_LANDSCAPE_LEFT: + pfglRotatef( 90.0f, 0.0f, 0.0f, 1.0f ); + break; + default: + pfglRotatef( -90.0f, 0.0f, 0.0f, 1.0f ); + break; + } +} + +/* + ================== + iphoneTouchEvent + + ================== + */ +void iphoneTouchEvent( int _numTouches, int _touches[16] ) { + numTouches = _numTouches; + for ( int i = 0 ; i < numTouches ; i++ ) { + switch( deviceOrientation ) { + case ORIENTATION_LANDSCAPE_RIGHT: + touches[i][0] = _touches[i*2+1] * touchCoordinateScale; + touches[i][1] = ( (viddef.height / touchCoordinateScale ) - 1 - _touches[i*2+0]) * touchCoordinateScale; + break; + + default: + touches[i][0] = ( ( viddef.width / touchCoordinateScale ) - 1 - _touches[i*2+1]) * touchCoordinateScale; + touches[i][1] = _touches[i*2+0] * touchCoordinateScale; + break; + } + } +} + +/* + ================== + iphonePromptToBuyPlatinum + + ================== + */ +void iphonePromptToBuyPlatinum() { + currentYesNoBox = YESNO_BUY_PLATINUM; + iphoneYesNoBox( "Purchase Platinum", "This level is not available in " + "Wolfenstein 3D Lite. Would you like to upgrade to " + "Platinum?" ); +} + + + +/* + ================== + LoadPNG + + Uses the iPhone's Core Graphics library to easily load PNG files. + ================== + */ +void LoadPNG( const char *filename, W8 **pic, W16 *outWidth, W16 *outHeight, W16 *bytes ) { + CGImageRef spriteImage; + CGContextRef spriteContext; + + GLubyte *spriteData = NULL; + size_t width = 0; + size_t height = 0; + size_t bytesPerPixel = 0; + + // Get just the filename from the path passed in. + const char * lastSeparator = strrchr( filename, '/' ); + + const char * filenameOnly = filename; + + if ( lastSeparator ) { + filenameOnly = lastSeparator + 1; + } + + // Creates a Core Graphics image from an image file + spriteImage = [UIImage imageNamed:[NSString stringWithCString:filenameOnly encoding:NSASCIIStringEncoding]].CGImage; + // Get the width and height of the image + width = CGImageGetWidth(spriteImage); + height = CGImageGetHeight(spriteImage); + bytesPerPixel = CGImageGetBitsPerPixel(spriteImage) / 8; + + // Texture dimensions must be a power of 2. If you write an application that allows users to supply an image, + // you'll want to add code that checks the dimensions and takes appropriate action if they are not a power of 2. + + // HACK to fix alpha/non-alpha images. + // If an image has alpha, it will be 4 bytes per pixel. + // If an image doesn't have alpha, it will be 3 bytes per pixel. + CGImageAlphaInfo alpha = kCGImageAlphaPremultipliedLast; + size_t byteWidth = width * 4; + if ( bytesPerPixel == 4 ) { + alpha = kCGImageAlphaPremultipliedLast; + byteWidth = width * 4; + } + + if(spriteImage) { + // Allocated memory needed for the bitmap context + spriteData = (GLubyte *) MM_CALLOC(width * height * 4, sizeof(GLubyte)); + // Uses the bitmap creation function provided by the Core Graphics framework. + spriteContext = CGBitmapContextCreate(spriteData, width, height, + 8, + byteWidth, + CGImageGetColorSpace(spriteImage), + alpha); + + if ( spriteContext ) { + // After you create the context, you can draw the sprite image to the context. + CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), spriteImage); + // You don't need the context at this point, so you need to release it to avoid memory leaks. + CGContextRelease(spriteContext); + + if ( outWidth ) { + *outWidth = width; + } + if ( outHeight ) { + *outHeight = height; + } + if ( pic ) { + *pic = spriteData; + } + if ( bytes ) { + *bytes = bytesPerPixel; + } + return; + } + } + + if ( outWidth ) { + *outWidth = 0; + } + if ( outHeight ) { + *outHeight = 0; + } + if ( pic ) { + *pic = NULL; + } + if ( bytes ) { + *bytes = 0; + } + return; +} + +/* + ================== + iphoneGetDeviceType + + Uses the iPhone's Core Graphics library to easily load PNG files. + ================== + */ +deviceType_t iphoneGetDeviceType(void) { + deviceType_t result = DEVICE_UNKNOWN; + + switch ( UI_USER_INTERFACE_IDIOM() ) { + case UIUserInterfaceIdiomPhone: + result = DEVICE_PHONE; + break; + + case UIUserInterfaceIdiomPad: + result = DEVICE_TABLET; + break; + + default: + break; + } + + return result; +} + +/* + ================== + iphoneInitMenuMusic + ================== + */ +void iphoneInitMenuMusic() { + + wolf3dAppDelegate * app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + + [app initMenuMusicPlayer]; + +} + +/* + ================== + iphoneStartMenuMusic + ================== + */ +void iphoneStartMenuMusic() { + wolf3dAppDelegate * app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + + [app startMenuMusic]; +} + + +/* + ================== + iphoneStopMenuMusic + ================== + */ + +void iphoneStopMenuMusic() { + wolf3dAppDelegate * app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + + [app stopMenuMusic]; +} + + + diff --git a/wolf3d/code/iphone/iphone_wolf.h b/wolf3d/code/iphone/iphone_wolf.h index 06f0290..e54335d 100644 --- a/wolf3d/code/iphone/iphone_wolf.h +++ b/wolf3d/code/iphone/iphone_wolf.h @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -18,12 +21,18 @@ */ +#include "video.h" +#include "texture_manager.h" +#include "vector.h" +#include "cvar.h" +#include "arch.h" + // define this to get only the first episode on selections, and the // automatic sell screen at the end of episode 1 //#define EPISODE_ONE_ONLY // this is the version number displayed on the menu screen -#define WOLF_IPHONE_VERSION 1.2//1.1 +#define WOLF_IPHONE_VERSION 2.1 extern viddef_t viddef; @@ -84,6 +93,13 @@ typedef struct { } rect_t; rect_t RectMake(int x, int y, int width, int height); +typedef struct { + float x; + float y; + float width; + float height; +} rectFloat_t; + extern currentMap_t currentMap; void iphoneStartMap( int episodeNum, int mapNum, int skillLevel ); @@ -130,15 +146,39 @@ extern cvar_t *cropSprites; extern cvar_t *blends; extern cvar_t *gunFrame; extern cvar_t *slowAI; -extern cvar_t *revLand; extern cvar_t *mapScale; extern cvar_t *hideControls; extern cvar_t *autoFire; +// The size of UI elements will be scaled by this value in order to support different +// resolutions, such as Retina displays and the iPad. +extern float screenScale; + // the native iPhone code should set the following each frame: extern int numTouches; extern int touches[5][2]; // [0] = x, [1] = y in landscape mode, raster order with y = 0 at top extern int isTouchMoving; //gsh + +// On Retina displays, touch coordinates are still reported at "low resolution". Since the game +// compares touch coordinates directly to the on-screen positions of buttons, we will need to +// scale the touches on Retina displays. +extern int touchCoordinateScale; + +// Store the device's contentScaleFactor ourselves. This is needed to support iOS +// versions < 4.0, as the UIView contentScaleFactor property did not exist before then. +// This should be 1 for all non-Retina displays, and 2 for Retina displays. +extern float deviceScale; + +// The orientation of the device. Currently, we only support both landscape modes. +// LEFT and RIGHT correspond to the position of the home button as you look at the +// device from the front. +typedef enum { + ORIENTATION_LANDSCAPE_LEFT, + ORIENTATION_LANDSCAPE_RIGHT +} deviceOrientation_t; + +extern deviceOrientation_t deviceOrientation; + extern float tilt; // -1.0 to 1.0 extern float tiltPitch; @@ -169,7 +209,10 @@ void iphoneDrawMapName( rect_t rect, const char *str ); //gsh int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ); //gsh void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight ); void iphoneDrawPic( int x, int y, int w, int h, const char *pic ); +void iphoneDrawPicFloat( float x, float y, float w, float h, const char *pic ); +void iphoneDrawPicRect( rectFloat_t rect, const char * pic ); int iphoneDrawPicWithTouch( int x, int y, int w, int h, const char *pic ); +int iphoneDrawPicRectWithTouch( rectFloat_t rect, const char *pic ); void iphoneDrawPicNum( int x, int y, int w, int h, int glTexNum ); void R_Draw_Blend( int x, int y, int w, int h, colour4_t c ); void SaveTheGame(); @@ -182,7 +225,15 @@ void iphonePreloadBeforePlay(); void InitImmediateModeGL(); void iphoneRotateForLandscape(); -void iphoneCheckForLandscapeReverse(); + +void ScaleToScreen( int * value); +void ScalePosition( float * x, float * y ); +void ScalePositionInt( int * x, int * y ); +void ScalePositionAndSize( float * x, float * y, float * w, float * h ); +void ScalePositionAndSizeInt( int * x, int * y, int * w, int * h ); +void ScaleRect( rect_t * rect ); +void ScaleRectFloat( rectFloat_t * rect ); +rectFloat_t MakeScaledRectFloat( float x, float y, float width, float height ); extern colour4_t colorPressed; @@ -229,6 +280,13 @@ void HudEditFrame(); void iphoneHudEditFrame(); +//--------------------------------------- +// Content version management for Lite and Platinum +//--------------------------------------- +typedef enum { + CONTENT_LITE, + CONTENT_PLATINUM +} contentVersion_t; //--------------------------------------- // interfaces from the original game code @@ -246,13 +304,23 @@ void iphoneSetLevelNotifyText(); //gsh void SysIPhoneSwapBuffers(); void SysIPhoneVibrate(); void SysIPhoneOpenURL( const char *url ); -void SysIPhoneSetUIKitOrientation( int isLandscapeRight ); void SysIPhoneLoadJPG( W8* jpegData, int jpegBytes, W8 **pic, W16 *width, W16 *height, W16 *bytes ); const char * SysIPhoneGetConsoleTextField(); void SysIPhoneSetConsoleTextField(const char *); void SysIPhoneInitAudioSession(); int SysIPhoneOtherAudioIsPlaying(); const char *SysIPhoneGetOSVersion(); +contentVersion_t SysIPhoneGetContentVersion(); +int SysIPhoneGetPathToMainBundleLength( void ); +void SysIPhoneGetPathToMainBundle( char * outPath, int maxLength ); + +void iphoneStartPreviousMenu(); +void iphoneStartMainMenu(); +void iphonePromptToBuyPlatinum(); + +void iphoneInitMenuMusic(); +void iphoneStartMenuMusic(); +void iphoneStopMenuMusic(); //--------------------------------------- // interfaces from Objective-C land @@ -265,4 +333,53 @@ void iphoneTouchEvent( int numTouches, int touches[16] ); void iphoneActivateConsole(); void iphoneDeactivateConsole(); void iphoneExecuteCommandLine(); +void iphoneStartGameplay(); + +void iphoneResume(); + +void LoadPNG( const char *filename, W8 **pic, W16 *width, W16 *height, W16 *bytes ); + +// The width and height the assets were originally designed for. Used in scaling to different +// resolutions for preserving aspect ratio. +#define REFERENCE_WIDTH 480.0f +#define REFERENCE_HEIGHT 320.0f + +// Constants for HUD buttons. +#define BACK_BUTTON_WIDTH 64.0f +#define BACK_BUTTON_HEIGHT 64.0f + +// These variables store the scaled dimensions of certain HUD elements that are needed +// in various parts of the code. +extern float faceWidth; +extern float faceHeight; + +extern float weaponWidth; +extern float weaponHeight; + + +// The following items support in-app purchases. +#define PLATINUM_UPGRADE_STRING "com.idsoftware.wolf3dlite.platupgrade" + + +// An enum to help keep track of YesNo boxes. +typedef enum { + YESNO_NONE, + YESNO_BUY_PLATINUM, + YESNO_GO_TO_WEBSITE, + YESNO_DOWNLOAD_INSTRUCTIONS +} yesNoBoxType_t; + +extern yesNoBoxType_t currentYesNoBox; + +// This determines the default framerate of the game. +// 1 = 60Hz, 2 = 30Hz, etc. +#define DEFAULT_FRAME_INTERVAL 1 + +// Determine phone or tablet device at runtime. +typedef enum { + DEVICE_UNKNOWN, + DEVICE_PHONE, + DEVICE_TABLET +} deviceType_t; +deviceType_t iphoneGetDeviceType(void); diff --git a/wolf3d/code/iphone/main.m b/wolf3d/code/iphone/main.m index bb5f5df..eb2e7b9 100644 --- a/wolf3d/code/iphone/main.m +++ b/wolf3d/code/iphone/main.m @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -19,28 +22,11 @@ */ #import -#include -#include int main(int argc, char *argv[]) { - - { - char cwd[256]; - strcpy( cwd, argv[0] ); - int len = strlen( cwd ); - for( int i = len-1; i >= 0; i-- ) { - if ( cwd[i] == '/' ) { - cwd[i] = 0; - break; - } - cwd[i] = 0; - } - setenv( "CWD", cwd, 1 ); - } - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); + int retVal = UIApplicationMain(argc, argv, nil, @"wolf3dAppDelegate"); [pool release]; return retVal; } diff --git a/wolf3d/code/iphone/untgz.c b/wolf3d/code/iphone/untgz.c new file mode 100644 index 0000000..e8ddd27 --- /dev/null +++ b/wolf3d/code/iphone/untgz.c @@ -0,0 +1,703 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +// This file was originally authored by the people above. +// It has been modified for this program. + +#include +#include +#include +#include +#include + +#include "../wolfiphone.h" + +extern int chmod(const char *, mode_t) __DARWIN_ALIAS(chmod); +extern int mkdir(const char *, mode_t); +extern void Com_Printf( const char *fmt, ... ); + +#include "zlib.h" + +//Note: in order to link the zlib library into the build from usr/lib/libz.ylib +// the flag -lz was added to the OTHER_LDFLAGS under the build options. +// To get there: right click on the wolf3d project. choose get info. +// Click on build and scroll to "Other Link Flags" under "Linking" + + +#define unix + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +//extern int iphoneCenterText( int x, int y, const char *str ); + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +extern char iphoneDocDirectory[1024]; + +//returns the fname along with the appdocdirectory tagged onto the front +char *DirFName (const char* fname) +{ + static char buffer[1024]; + int origlen;//, i; + +// Com_Printf("iphone Doc Direct: %s\n", iphoneDocDirectory); + + //copy the directory into the buffer + strcpy(buffer, iphoneDocDirectory); + origlen = strlen(buffer); + + //add the '/' to the end of the iphoneDocDirectory + buffer[origlen] = '/'; + ++origlen; + buffer[origlen] = '\0'; + + //copy the file name into the buffer + strcpy(buffer+origlen, fname); + + Com_Printf("extracting file: %s\n", buffer); + +// colour4_t backgroundColor = { 10, 10, 10, 255 }; +// R_Draw_Blend( 40, 150, 4*100, 20, backgroundColor ); //this is not actually drawing. The draw thread is somehow pausing + + return buffer; +} + + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + + +int tar2 (gzFile in,int action) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + //char dirfname; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + + case DIRTYPE: + if (action == TGZ_LIST) + { + printf(" %s %s\n",strtime(&tartime),fname); + Com_Printf("case DIRTYPE: %s\n", DirFName(fname)); + } + if (action == TGZ_EXTRACT) + { + Com_Printf("blah blah DIRTYPE:action == TGZ_EXTRACT, make directory\n"); + makedir(fname); + //makedir(DirFName(fname)); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (1)//gsh matchname(arg,argc,argv,fname)) + { + //Com_Printf("call just before iphonedocdirectory\n"); + //Com_Printf("iphonedocdirect: %s\n", iphoneDocDirectory); + char* outname = DirFName(fname); + //Com_Printf("outname is: %s\n", outname); + outfile = fopen(outname,"wb"); + if (outfile == NULL) { + // try creating directory + char *p = strrchr(outname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(outname); + *p = '/'; + outfile = fopen(outname,"wb"); + } + }/* + if (outfile != NULL) + Com_Printf("Extracting %s\n",fname); + else + Com_Printf("%s: Couldn't create %s",prog,fname);*/ + /* + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory * + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname);*/ + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + //Com_Printf("else called\n"); + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + + +int StartUntgz(char *TGZfile) +{ + int action = TGZ_EXTRACT; + gzFile *f; + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + Com_Printf("%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + + return tar2(f, action); +} + + + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.mode1v3 b/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.mode1v3 index 6f7c124..b5f51ae 100644 --- a/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.mode1v3 +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.mode1v3 @@ -211,6 +211,7 @@ active-combo-popup action NSToolbarFlexibleSpaceItem + debugger-enable-breakpoints build-and-go com.apple.ide.PBXToolbarStopButton get-info @@ -234,7 +235,6 @@ 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 - 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 @@ -265,6 +265,7 @@ 29B97314FDCFA39411CA2CEA 29B97315FDCFA39411CA2CEA + 72935B190F6B2D720085DD28 29B97317FDCFA39411CA2CEA 29B97323FDCFA39411CA2CEA 19C28FACFE9D520D11CA2CBB @@ -274,13 +275,13 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 32 - 27 + 4 + 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {186, 720}} + {{0, 742}, {186, 720}} PBXTopSmartGroupGIDs @@ -299,7 +300,7 @@ 186 RubberWindowFrame - 391 174 1010 779 0 0 1680 1028 + 337 313 1010 779 0 0 1920 1178 Module PBXSmartGroupTreeModule @@ -310,12 +311,14 @@ Dock + BecomeActive + ContentConfiguration PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel - Info.plist + iphone_main.c PBXSplitModuleInNavigatorKey Split0 @@ -323,44 +326,41 @@ PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel - Info.plist + iphone_main.c _historyCapacity 0 bookmark - ED45402710B21F0900DCFA32 + EDFA70BF119469CD0098FFFC history - ED2E5C05106C886700F57B9D - ED2E5C06106C886700F57B9D - ED4AC98010742365000706D8 - EDDA5A7E107BA97F003F55D3 - EDDA5A80107BA97F003F55D3 ED2754531085141B009C891E - ED0653B61087719F00E5450B - EDAFC5A2109A14EE002C3487 - ED845AB1109F5B3500F673AC ED45402110B21F0900DCFA32 ED45402210B21F0900DCFA32 ED45402310B21F0900DCFA32 - ED845AB2109F5B3500F673AC - - prevStack - - ED3703CD106C20620059C5F8 - ED2E5C0A106C886700F57B9D - ED2E5C0B106C886700F57B9D - ED4AC98210742365000706D8 - ED4AC9AB10743318000706D8 - ED4AC9AC10743318000706D8 - EDDA5A82107BA97F003F55D3 - EDDA5A83107BA97F003F55D3 - EDDA5A84107BA97F003F55D3 - ED2754551085141B009C891E - ED2754561085141B009C891E - ED0653B81087719F00E5450B - ED45402410B21F0900DCFA32 - ED45402510B21F0900DCFA32 - ED45402610B21F0900DCFA32 + ED89CF4410D0693D006A2D2E + ED89CF4710D0693D006A2D2E + ED89CF4810D0693D006A2D2E + ED89CF4910D0693D006A2D2E + EDC7BE4810D95AF900DA2765 + EDC7BE4910D95AF900DA2765 + EDB41E9910DADFF000487A3B + EDB41E9A10DADFF000487A3B + EDB41EAF10DAE14F00487A3B + EDB41EB110DAE14F00487A3B + EDB41ECB10DAE24C00487A3B + EDB41EFD10DAEE4800487A3B + EDB41EFE10DAEE4800487A3B + EDB41F0110DAEE4800487A3B + EDB41F1110DAF0FC00487A3B + EDB41F3610DAF95B00487A3B + ED89F57010DC207800C8A107 + ED89F58710DC257400C8A107 + ED89F58F10DC27DD00C8A107 + ED89F5B010DC406A00C8A107 + ED89F5B110DC406A00C8A107 + ED89F5B210DC406A00C8A107 + EDFA70BE119469CD0098FFFC + EDFA7084119384150098FFFC SplitCount @@ -372,14 +372,14 @@ GeometryConfiguration Frame - {{0, 0}, {802, 686}} + {{0, 0}, {802, 683}} RubberWindowFrame - 391 174 1010 779 0 0 1680 1028 + 337 313 1010 779 0 0 1920 1178 Module PBXNavigatorGroup Proportion - 686pt + 683pt ContentConfiguration @@ -392,14 +392,14 @@ GeometryConfiguration Frame - {{0, 691}, {802, 47}} + {{0, 688}, {802, 50}} RubberWindowFrame - 391 174 1010 779 0 0 1680 1028 + 337 313 1010 779 0 0 1920 1178 Module XCDetailModule Proportion - 47pt + 50pt Proportion @@ -418,12 +418,14 @@ TableOfContents - ED45402810B21F0900DCFA32 + EDFA70C0119469CD0098FFFC 1CE0B1FE06471DED0097A5F4 - ED45402910B21F0900DCFA32 + EDFA70C1119469CD0098FFFC 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 + ToolbarConfigUserDefaultsMinorVersion + 2 ToolbarConfiguration xcode.toolbar.config.defaultV3 @@ -554,10 +556,11 @@ 5 WindowOrderList - /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/wolf3d.xcodeproj + ED0A8CF61069A9E0001E0547 + /Volumes/Work/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/wolf3d.xcodeproj WindowString - 391 174 1010 779 0 0 1680 1028 + 337 313 1010 779 0 0 1920 1178 WindowToolsV3 @@ -587,7 +590,7 @@ Frame {{0, 0}, {500, 218}} RubberWindowFrame - 56 488 500 500 0 0 1680 1028 + 67 625 500 500 0 0 1920 1178 Module PBXNavigatorGroup @@ -600,7 +603,7 @@ PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel - Build + Build Results XCBuildResultsTrigger_Collapse 1021 XCBuildResultsTrigger_Open @@ -611,7 +614,7 @@ Frame {{0, 223}, {500, 236}} RubberWindowFrame - 56 488 500 500 0 0 1680 1028 + 67 625 500 500 0 0 1920 1178 Module PBXBuildResultsModule @@ -634,14 +637,14 @@ TableOfContents ED0A8CF61069A9E0001E0547 - EDAFC5AA109A14EE002C3487 + EDFA70C2119469CD0098FFFC 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.buildV3 WindowString - 56 488 500 500 0 0 1680 1028 + 67 625 500 500 0 0 1920 1178 WindowToolGUID ED0A8CF61069A9E0001E0547 WindowToolIsVisible @@ -676,8 +679,8 @@ yes sizes - {{0, 0}, {316, 203}} - {{316, 0}, {378, 203}} + {{0, 0}, {542, 426}} + {{542, 0}, {646, 426}} VerticalSplitView @@ -692,8 +695,8 @@ yes sizes - {{0, 0}, {694, 203}} - {{0, 203}, {694, 178}} + {{0, 0}, {1188, 426}} + {{0, 426}, {1188, 373}} @@ -713,7 +716,7 @@ DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame - {{0, 0}, {694, 381}} + {{0, 0}, {1188, 799}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration @@ -723,24 +726,24 @@ Value 85 Summary - 148 + 416 Frame - {{316, 0}, {378, 203}} + {{542, 0}, {646, 426}} RubberWindowFrame - 150 519 694 422 0 0 1680 1028 + 430 265 1188 840 0 0 1920 1178 RubberWindowFrame - 150 519 694 422 0 0 1680 1028 + 430 265 1188 840 0 0 1920 1178 Module PBXDebugSessionModule Proportion - 381pt + 799pt Proportion - 381pt + 799pt Name @@ -754,18 +757,18 @@ TableOfContents 1CD10A99069EF8BA00B06720 - EDAFC5AB109A14EE002C3487 + ED89F55610DC024400C8A107 1C162984064C10D400B95A72 - EDAFC5AC109A14EE002C3487 - EDAFC5AD109A14EE002C3487 - EDAFC5AE109A14EE002C3487 - EDAFC5AF109A14EE002C3487 - EDAFC5B0109A14EE002C3487 + ED89F55710DC024400C8A107 + ED89F55810DC024400C8A107 + ED89F55910DC024400C8A107 + ED89F55A10DC024400C8A107 + ED89F55B10DC024400C8A107 ToolbarConfiguration xcode.toolbar.config.debugV3 WindowString - 150 519 694 422 0 0 1680 1028 + 430 265 1188 840 0 0 1920 1178 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible @@ -787,23 +790,21 @@ Dock - BecomeActive - ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel - iphone_menus.c + StatusBarVisibility GeometryConfiguration Frame - {{0, 0}, {1122, 588}} + {{0, 0}, {1122, 464}} RubberWindowFrame - 450 88 1122 866 0 0 1680 1028 + 1948 265 1122 866 1920 150 1680 1050 Module PBXNavigatorGroup @@ -812,9 +813,11 @@ Proportion - 588pt + 464pt + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -825,14 +828,14 @@ GeometryConfiguration Frame - {{0, 593}, {1122, 232}} + {{0, 469}, {1122, 356}} RubberWindowFrame - 450 88 1122 866 0 0 1680 1028 + 1948 265 1122 866 1920 150 1680 1050 Module PBXProjectFindModule Proportion - 232pt + 356pt Proportion @@ -850,17 +853,17 @@ TableOfContents 1C530D57069F1CE1000CFCEE - EDAFC5B1109A14EE002C3487 - EDAFC5B2109A14EE002C3487 + EDFA70821193840B0098FFFC + EDFA70831193840B0098FFFC 1CDD528C0622207200134675 1CD0528E0623707200166675 WindowString - 450 88 1122 866 0 0 1680 1028 + 1948 265 1122 866 1920 150 1680 1050 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible - + Identifier @@ -891,7 +894,7 @@ Frame {{0, 0}, {650, 209}} RubberWindowFrame - 450 704 650 250 0 0 1680 1028 + 555 839 650 250 0 0 1920 1178 Module PBXDebugCLIModule @@ -914,13 +917,13 @@ TableOfContents 1C78EAAD065D492600B07095 - EDAFC5B3109A14EE002C3487 + EDB41EC610DAE14F00487A3B 1C78EAAC065D492600B07095 ToolbarConfiguration xcode.toolbar.config.consoleV3 WindowString - 450 704 650 250 0 0 1680 1028 + 555 839 650 250 0 0 1920 1178 WindowToolGUID 1C78EAAD065D492600B07095 WindowToolIsVisible diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.pbxuser b/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.pbxuser index 839a542..76359eb 100644 --- a/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.pbxuser +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/greghodges.pbxuser @@ -7,13 +7,15 @@ ); }; 29B97313FDCFA39411CA2CEA /* Project object */ = { - activeBuildConfigurationName = Release; + activeBuildConfigurationName = Distribution; activeExecutable = ED0A8CE41069A9CF001E0547 /* wolf3d */; - activeSDKPreference = iphonesimulator2.0; + activeSDKPreference = iphoneos2.0; activeTarget = 1D6058900D05DD3D006BFB54 /* wolf3d */; addToTargets = ( 1D6058900D05DD3D006BFB54 /* wolf3d */, ); + breakpoints = ( + ); codeSenseManager = ED0A8CFA1069A9F5001E0547 /* Code sense */; executables = ( ED0A8CE41069A9CF001E0547 /* wolf3d */, @@ -41,12 +43,24 @@ PBXFileDataSource_Target_ColumnID, ); }; + PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID; + PBXFileTableDataSourceColumnWidthsKey = ( + 200, + 577, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFindDataSource_MessageID, + PBXFindDataSource_LocationID, + ); + }; PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, - 523, + 1433, 60, 20, 48, @@ -63,39 +77,39 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 280108689; - PBXWorkspaceStateSaveDate = 280108689; + PBXPerProjectTemplateStateSaveDate = 294880202; + PBXWorkspaceStateSaveDate = 294880202; }; perUserProjectItems = { - ED0653B61087719F00E5450B /* PBXTextBookmark */ = ED0653B61087719F00E5450B /* PBXTextBookmark */; - ED0653B81087719F00E5450B /* PBXTextBookmark */ = ED0653B81087719F00E5450B /* PBXTextBookmark */; ED2754531085141B009C891E /* PBXTextBookmark */ = ED2754531085141B009C891E /* PBXTextBookmark */; - ED2754551085141B009C891E /* PlistBookmark */ = ED2754551085141B009C891E /* PlistBookmark */; - ED2754561085141B009C891E /* PBXTextBookmark */ = ED2754561085141B009C891E /* PBXTextBookmark */; - ED2E5C05106C886700F57B9D /* PBXTextBookmark */ = ED2E5C05106C886700F57B9D /* PBXTextBookmark */; - ED2E5C06106C886700F57B9D /* PBXTextBookmark */ = ED2E5C06106C886700F57B9D /* PBXTextBookmark */; - ED2E5C0A106C886700F57B9D /* PBXTextBookmark */ = ED2E5C0A106C886700F57B9D /* PBXTextBookmark */; - ED2E5C0B106C886700F57B9D /* PBXTextBookmark */ = ED2E5C0B106C886700F57B9D /* PBXTextBookmark */; - ED3703CD106C20620059C5F8 /* PlistBookmark */ = ED3703CD106C20620059C5F8 /* PlistBookmark */; ED45402110B21F0900DCFA32 /* PBXTextBookmark */ = ED45402110B21F0900DCFA32 /* PBXTextBookmark */; ED45402210B21F0900DCFA32 /* PBXTextBookmark */ = ED45402210B21F0900DCFA32 /* PBXTextBookmark */; ED45402310B21F0900DCFA32 /* PBXTextBookmark */ = ED45402310B21F0900DCFA32 /* PBXTextBookmark */; - ED45402410B21F0900DCFA32 /* PBXTextBookmark */ = ED45402410B21F0900DCFA32 /* PBXTextBookmark */; - ED45402510B21F0900DCFA32 /* PBXTextBookmark */ = ED45402510B21F0900DCFA32 /* PBXTextBookmark */; - ED45402610B21F0900DCFA32 /* PBXTextBookmark */ = ED45402610B21F0900DCFA32 /* PBXTextBookmark */; - ED45402710B21F0900DCFA32 /* PlistBookmark */ = ED45402710B21F0900DCFA32 /* PlistBookmark */; - ED4AC98010742365000706D8 /* PBXTextBookmark */ = ED4AC98010742365000706D8 /* PBXTextBookmark */; - ED4AC98210742365000706D8 /* PBXTextBookmark */ = ED4AC98210742365000706D8 /* PBXTextBookmark */; - ED4AC9AB10743318000706D8 /* PBXTextBookmark */ = ED4AC9AB10743318000706D8 /* PBXTextBookmark */; - ED4AC9AC10743318000706D8 /* PBXTextBookmark */ = ED4AC9AC10743318000706D8 /* PBXTextBookmark */; - ED845AB1109F5B3500F673AC /* PBXTextBookmark */ = ED845AB1109F5B3500F673AC /* PBXTextBookmark */; - ED845AB2109F5B3500F673AC /* PlistBookmark */ = ED845AB2109F5B3500F673AC /* PlistBookmark */; - EDAFC5A2109A14EE002C3487 /* PBXTextBookmark */ = EDAFC5A2109A14EE002C3487 /* PBXTextBookmark */; - EDDA5A7E107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A7E107BA97F003F55D3 /* PBXTextBookmark */; - EDDA5A80107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A80107BA97F003F55D3 /* PBXTextBookmark */; - EDDA5A82107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A82107BA97F003F55D3 /* PBXTextBookmark */; - EDDA5A83107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A83107BA97F003F55D3 /* PBXTextBookmark */; - EDDA5A84107BA97F003F55D3 /* PBXTextBookmark */ = EDDA5A84107BA97F003F55D3 /* PBXTextBookmark */; + ED89CF4410D0693D006A2D2E /* PBXTextBookmark */ = ED89CF4410D0693D006A2D2E /* PBXTextBookmark */; + ED89CF4610D0693D006A2D2E /* PBXTextBookmark */ = ED89CF4610D0693D006A2D2E /* PBXTextBookmark */; + ED89CF4710D0693D006A2D2E /* PBXTextBookmark */ = ED89CF4710D0693D006A2D2E /* PBXTextBookmark */; + ED89CF4810D0693D006A2D2E /* PBXTextBookmark */ = ED89CF4810D0693D006A2D2E /* PBXTextBookmark */; + ED89CF4910D0693D006A2D2E /* PBXTextBookmark */ = ED89CF4910D0693D006A2D2E /* PBXTextBookmark */; + ED89F57010DC207800C8A107 /* PlistBookmark */ = ED89F57010DC207800C8A107 /* PlistBookmark */; + ED89F58710DC257400C8A107 /* PBXTextBookmark */ = ED89F58710DC257400C8A107 /* PBXTextBookmark */; + ED89F58F10DC27DD00C8A107 /* PBXTextBookmark */ = ED89F58F10DC27DD00C8A107 /* PBXTextBookmark */; + ED89F5B010DC406A00C8A107 /* PBXTextBookmark */ = ED89F5B010DC406A00C8A107 /* PBXTextBookmark */; + ED89F5B110DC406A00C8A107 /* PBXTextBookmark */ = ED89F5B110DC406A00C8A107 /* PBXTextBookmark */; + ED89F5B210DC406A00C8A107 /* PBXTextBookmark */ = ED89F5B210DC406A00C8A107 /* PBXTextBookmark */; + EDB41E9910DADFF000487A3B /* PlistBookmark */ = EDB41E9910DADFF000487A3B /* PlistBookmark */; + EDB41E9A10DADFF000487A3B /* PBXTextBookmark */ = EDB41E9A10DADFF000487A3B /* PBXTextBookmark */; + EDB41EAF10DAE14F00487A3B /* PBXTextBookmark */ = EDB41EAF10DAE14F00487A3B /* PBXTextBookmark */; + EDB41EB110DAE14F00487A3B /* PBXTextBookmark */ = EDB41EB110DAE14F00487A3B /* PBXTextBookmark */; + EDB41ECB10DAE24C00487A3B /* PBXTextBookmark */ = EDB41ECB10DAE24C00487A3B /* PBXTextBookmark */; + EDB41EFD10DAEE4800487A3B /* PBXTextBookmark */ = EDB41EFD10DAEE4800487A3B /* PBXTextBookmark */; + EDB41EFE10DAEE4800487A3B /* PBXTextBookmark */ = EDB41EFE10DAEE4800487A3B /* PBXTextBookmark */; + EDB41F0110DAEE4800487A3B /* PBXTextBookmark */ = EDB41F0110DAEE4800487A3B /* PBXTextBookmark */; + EDB41F1110DAF0FC00487A3B /* PBXTextBookmark */ = EDB41F1110DAF0FC00487A3B /* PBXTextBookmark */; + EDB41F3610DAF95B00487A3B /* PBXTextBookmark */ = EDB41F3610DAF95B00487A3B /* PBXTextBookmark */; + EDC7BE4810D95AF900DA2765 /* PBXTextBookmark */ = EDC7BE4810D95AF900DA2765 /* PBXTextBookmark */; + EDC7BE4910D95AF900DA2765 /* PBXTextBookmark */ = EDC7BE4910D95AF900DA2765 /* PBXTextBookmark */; + EDFA7075119383080098FFFC /* PBXTextBookmark */ = EDFA7075119383080098FFFC /* PBXTextBookmark */; + EDFA7084119384150098FFFC /* PBXTextBookmark */ = EDFA7084119384150098FFFC /* PBXTextBookmark */; }; sourceControlManager = ED0A8CF91069A9F5001E0547 /* Source Control */; userBuildSettings = { @@ -103,24 +117,31 @@ }; 43AF6B940F996DA200777569 /* iphone_sys.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {852, 1050}}"; + sepNavIntBoundsRect = "{{0, 0}, {1651, 1050}}"; sepNavSelRange = "{1419, 24}"; - sepNavVisRange = "{771, 1684}"; + sepNavVisRange = "{289, 2254}"; }; }; 43CF03090F56D5C200E4A23D /* iphone_loop.c */ = { uiCtxt = { sepNavFolds = "{\n c = (\n {\n l = \"int y\";\n r = \"{41674, 9}\";\n s = 1;\n },\n {\n l = \"int width\";\n r = \"{41685, 13}\";\n s = 1;\n },\n {\n l = \"int height\";\n r = \"{41700, 14}\";\n s = 1;\n },\n {\n l = \"const char * str\";\n r = \"{41716, 20}\";\n s = 1;\n }\n );\n r = \"{0, 41792}\";\n s = 0;\n}"; - sepNavIntBoundsRect = "{{0, 0}, {1061, 24388}}"; - sepNavSelRange = "{27221, 8}"; - sepNavVisRange = "{26941, 622}"; + sepNavIntBoundsRect = "{{0, 0}, {1061, 24066}}"; + sepNavSelRange = "{34481, 0}"; + sepNavVisRange = "{34065, 813}"; }; }; 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {741, 5418}}"; - sepNavSelRange = "{1413, 4}"; - sepNavVisRange = "{970, 956}"; + sepNavIntBoundsRect = "{{0, 0}, {741, 4760}}"; + sepNavSelRange = "{5816, 0}"; + sepNavVisRange = "{5166, 2013}"; + }; + }; + 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 13384}}"; + sepNavSelRange = "{1895, 9}"; + sepNavVisRange = "{1545, 981}"; }; }; 7229CC270F6B3222004123C5 /* wolf_actors.c */ = { @@ -130,6 +151,90 @@ sepNavVisRange = "{0, 1418}"; }; }; + 7229CC290F6B3222004123C5 /* wolf_ai_com.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 18186}}"; + sepNavSelRange = "{24018, 9}"; + sepNavVisRange = "{23772, 594}"; + }; + }; + 7229CC2E0F6B3222004123C5 /* wolf_client_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 2142}}"; + sepNavSelRange = "{1430, 9}"; + sepNavVisRange = "{1285, 710}"; + }; + }; + 7229CC310F6B3222004123C5 /* wolf_level.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 20342}}"; + sepNavSelRange = "{19282, 0}"; + sepNavVisRange = "{19052, 690}"; + }; + }; + 7229CC320F6B3222004123C5 /* wolf_level.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 3976}}"; + sepNavSelRange = "{5009, 7}"; + sepNavVisRange = "{4411, 607}"; + }; + }; + 7229CC330F6B3222004123C5 /* wolf_local.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 1932}}"; + sepNavSelRange = "{1187, 0}"; + sepNavVisRange = "{867, 423}"; + }; + }; + 7229CC340F6B3222004123C5 /* wolf_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 1260}}"; + sepNavSelRange = "{1698, 9}"; + sepNavVisRange = "{1375, 596}"; + }; + }; + 7229CC380F6B3222004123C5 /* wolf_player.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1127, 14616}}"; + sepNavSelRange = "{2849, 0}"; + sepNavVisRange = "{2450, 554}"; + }; + }; + 7229CC3A0F6B3222004123C5 /* wolf_powerups.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 5376}}"; + sepNavSelRange = "{7666, 0}"; + sepNavVisRange = "{7116, 1214}"; + }; + }; + 7229CC3C0F6B3222004123C5 /* wolf_pushwalls.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 2310}}"; + sepNavSelRange = "{2623, 9}"; + sepNavVisRange = "{2617, 967}"; + }; + }; + 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1127, 5348}}"; + sepNavSelRange = "{2319, 0}"; + sepNavVisRange = "{2010, 511}"; + }; + }; + 7229CC3F0F6B3222004123C5 /* wolf_renderer.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 1456}}"; + sepNavSelRange = "{2450, 9}"; + sepNavVisRange = "{2238, 497}"; + }; + }; + 7229CC430F6B3222004123C5 /* wolf_sv_ccmds.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 1344}}"; + sepNavSelRange = "{2007, 5}"; + sepNavVisRange = "{1624, 525}"; + }; + }; 7229CC8E0F6B3363004123C5 /* wolfiphone.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {741, 1260}}"; @@ -139,9 +244,9 @@ }; 7229CE460F6C89F8004123C5 /* EAGLView.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {786, 6650}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{10594, 1878}"; + sepNavIntBoundsRect = "{{0, 0}, {1061, 6706}}"; + sepNavSelRange = "{10810, 13}"; + sepNavVisRange = "{10594, 1180}"; }; }; 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */ = { @@ -153,9 +258,9 @@ }; 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1074, 5012}}"; - sepNavSelRange = "{3930, 0}"; - sepNavVisRange = "{5119, 1271}"; + sepNavIntBoundsRect = "{{0, 0}, {1074, 4872}}"; + sepNavSelRange = "{9060, 13}"; + sepNavVisRange = "{8605, 1087}"; }; }; 72935B1E0F6B2D9D0085DD28 /* arch.h */ = { @@ -165,6 +270,34 @@ sepNavVisRange = "{2465, 1040}"; }; }; + 72935B2D0F6B2D9D0085DD28 /* cvar.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {741, 10542}}"; + sepNavSelRange = "{5889, 0}"; + sepNavVisRange = "{5250, 937}"; + }; + }; + 72935B2E0F6B2D9D0085DD28 /* cvar.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {741, 2310}}"; + sepNavSelRange = "{3022, 0}"; + sepNavVisRange = "{2654, 1407}"; + }; + }; + 72935B2F0F6B2D9D0085DD28 /* fileio.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 4060}}"; + sepNavSelRange = "{5506, 0}"; + sepNavVisRange = "{4925, 708}"; + }; + }; + 72935B5D0F6B2D9D0085DD28 /* sound_sfx_id.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 4354}}"; + sepNavSelRange = "{5333, 9}"; + sepNavVisRange = "{5277, 575}"; + }; + }; 72935B630F6B2D9D0085DD28 /* tga.c */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {741, 10822}}"; @@ -174,37 +307,25 @@ }; 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {741, 3850}}"; - sepNavSelRange = "{1009, 0}"; - sepNavVisRange = "{0, 1316}"; + sepNavIntBoundsRect = "{{0, 0}, {741, 3682}}"; + sepNavSelRange = "{742, 0}"; + sepNavVisRange = "{0, 1321}"; }; }; 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {900, 56714}}"; - sepNavSelRange = "{66944, 0}"; - sepNavVisRange = "{62588, 1640}"; + sepNavIntBoundsRect = "{{0, 0}, {2202, 55510}}"; + sepNavSelRange = "{76416, 0}"; + sepNavVisRange = "{75965, 1083}"; }; }; - ED0653B61087719F00E5450B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 43AF6B940F996DA200777569 /* iphone_sys.m */; - name = "iphone_sys.m: 40"; - rLen = 24; - rLoc = 1419; - rType = 0; - vrLen = 1684; - vrLoc = 771; - }; - ED0653B81087719F00E5450B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 43AF6B940F996DA200777569 /* iphone_sys.m */; - name = "iphone_sys.m: 40"; - rLen = 24; - rLoc = 1419; - rType = 0; - vrLen = 1684; - vrLoc = 771; + 72B5FF380F7E5C3D00C8A372 /* hud.c */ = { + uiCtxt = { + sepNavFolds = "{\n c = (\n {\n l = \"int * y\";\n r = \"{11911, 11}\";\n s = 1;\n }\n );\n r = \"{0, 16141}\";\n s = 0;\n}"; + sepNavIntBoundsRect = "{{0, 0}, {1061, 7784}}"; + sepNavSelRange = "{2416, 0}"; + sepNavVisRange = "{2009, 1134}"; + }; }; ED0A8CE41069A9CF001E0547 /* wolf3d */ = { isa = PBXExecutable; @@ -217,6 +338,9 @@ configStateDict = { }; customDataFormattersEnabled = 1; + dataTipCustomDataFormattersEnabled = 1; + dataTipShowTypeColumn = 1; + dataTipSortType = 0; debuggerPlugin = GDBDebugging; disassemblyDisplayState = 0; dylibVariantSuffix = ""; @@ -229,6 +353,7 @@ name = wolf3d; savedGlobals = { }; + showTypeColumn = 0; sourceDirectories = ( ); variableFormatDictionary = { @@ -239,24 +364,55 @@ fallbackIsa = XCSourceControlManager; isSCMEnabled = 0; scmConfiguration = { + repositoryNamesForRoots = { + "" = ""; + }; }; }; ED0A8CFA1069A9F5001E0547 /* Code sense */ = { isa = PBXCodeSenseManager; indexTemplatePath = ""; }; + ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {741, 1512}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 2920}"; + }; + }; + ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1651, 884}}"; + sepNavSelRange = "{362, 0}"; + sepNavVisRange = "{0, 419}"; + }; + }; + ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1061, 1638}}"; + sepNavSelRange = "{1027, 19}"; + sepNavVisRange = "{684, 647}"; + }; + }; ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {741, 7434}}"; - sepNavSelRange = "{1756, 0}"; - sepNavVisRange = "{1108, 1549}"; + sepNavIntBoundsRect = "{{0, 0}, {966, 7378}}"; + sepNavSelRange = "{5826, 0}"; + sepNavVisRange = "{15863, 1355}"; + }; + }; + ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {858, 2856}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{4517, 1352}"; }; }; ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {948, 6706}}"; - sepNavSelRange = "{7865, 0}"; - sepNavVisRange = "{1577, 1229}"; + sepNavIntBoundsRect = "{{0, 0}, {1061, 6664}}"; + sepNavSelRange = "{10729, 9}"; + sepNavVisRange = "{10370, 764}"; }; }; ED0A8D101069ACA8001E0547 /* iphone_store.h */ = { @@ -268,9 +424,9 @@ }; ED0A8D111069ACA8001E0547 /* iphone_store.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {741, 5964}}"; - sepNavSelRange = "{673, 17}"; - sepNavVisRange = "{0, 1394}"; + sepNavIntBoundsRect = "{{0, 0}, {1061, 6118}}"; + sepNavSelRange = "{2402, 13}"; + sepNavVisRange = "{1952, 677}"; }; }; ED2754531085141B009C891E /* PBXTextBookmark */ = { @@ -283,97 +439,6 @@ vrLen = 1878; vrLoc = 10594; }; - ED2754551085141B009C891E /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - UIPrerenderedIcon, - ); - name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/Info.plist; - rLen = 0; - rLoc = 2147483647; - }; - ED2754561085141B009C891E /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 7229CE460F6C89F8004123C5 /* EAGLView.m */; - name = "EAGLView.m: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 1878; - vrLoc = 10594; - }; - ED2E5C05106C886700F57B9D /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */; - name = "iphone_downloadSOD.m: 61"; - rLen = 0; - rLoc = 1756; - rType = 0; - vrLen = 1549; - vrLoc = 1108; - }; - ED2E5C06106C886700F57B9D /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = ED2E5C07106C886700F57B9D /* OpenTGA.c */; - name = "OpenTGA.c: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 722; - vrLoc = 12240; - }; - ED2E5C07106C886700F57B9D /* OpenTGA.c */ = { - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.c; - name = OpenTGA.c; - path = /Users/greghodges/Desktop/MyTGAConverter/OpenTGA.c; - sourceTree = ""; - }; - ED2E5C0A106C886700F57B9D /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */; - name = "iphone_downloadSOD.m: 61"; - rLen = 0; - rLoc = 1756; - rType = 0; - vrLen = 1549; - vrLoc = 1108; - }; - ED2E5C0B106C886700F57B9D /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = ED2E5C0C106C886700F57B9D /* OpenTGA.c */; - name = "OpenTGA.c: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 722; - vrLoc = 12240; - }; - ED2E5C0C106C886700F57B9D /* OpenTGA.c */ = { - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.c; - name = OpenTGA.c; - path = /Users/greghodges/Desktop/MyTGAConverter/OpenTGA.c; - sourceTree = ""; - }; - ED3703CD106C20620059C5F8 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = ED3703CE106C20620059C5F8; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - ); - rLen = 0; - rLoc = 2147483647; - }; - ED3703CE106C20620059C5F8 = { - isa = PBXFileReference; - lastKnownFileType = folder; - sourceTree = ""; - }; ED45402110B21F0900DCFA32 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 7229CC270F6B3222004123C5 /* wolf_actors.c */; @@ -404,175 +469,256 @@ vrLen = 1205; vrLoc = 0; }; - ED45402410B21F0900DCFA32 /* PBXTextBookmark */ = { + ED89CF4410D0693D006A2D2E /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 7229CC270F6B3222004123C5 /* wolf_actors.c */; - name = "wolf_actors.c: 5"; + fRef = ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */; + name = "arialGlyphRects.h: 1"; rLen = 0; - rLoc = 84; + rLoc = 0; rType = 0; - vrLen = 1418; + vrLen = 2920; vrLoc = 0; }; - ED45402510B21F0900DCFA32 /* PBXTextBookmark */ = { + ED89CF4610D0693D006A2D2E /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; - name = "wolf3dAppDelegate.m: 124"; + fRef = ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */; + name = "iphone_alerts.m: 1"; rLen = 0; - rLoc = 3930; + rLoc = 0; rType = 0; - vrLen = 1271; - vrLoc = 5119; + vrLen = 965; + vrLoc = 868; }; - ED45402610B21F0900DCFA32 /* PBXTextBookmark */ = { + ED89CF4710D0693D006A2D2E /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */; - name = "wolf3dAppDelegate.h: 1"; + fRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */; + name = "iphone_downloadSOD.m: 185"; + rLen = 0; + rLoc = 5826; + rType = 0; + vrLen = 1355; + vrLoc = 15863; + }; + ED89CF4810D0693D006A2D2E /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */; + name = "iphone_downloadUserMap.m: 1"; rLen = 0; rLoc = 0; rType = 0; - vrLen = 1205; - vrLoc = 0; + vrLen = 1352; + vrLoc = 4517; + }; + ED89CF4910D0693D006A2D2E /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; + name = "iphone_mapselector.c: 341"; + rLen = 0; + rLoc = 7864; + rType = 0; + vrLen = 1282; + vrLoc = 1549; }; - ED45402710B21F0900DCFA32 /* PlistBookmark */ = { + ED89F57010DC207800C8A107 /* PlistBookmark */ = { isa = PlistBookmark; fRef = 8D1107310486CEB800E47090 /* Info.plist */; fallbackIsa = PBXBookmark; isK = 0; kPath = ( - UIPrerenderedIcon, ); name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/Info.plist; rLen = 0; rLoc = 2147483647; }; - ED4AC98010742365000706D8 /* PBXTextBookmark */ = { + ED89F58710DC257400C8A107 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = EDD56B7E10740B7A007C0E16 /* ConvertTGA.c */; - name = "ConvertTGA.c: 1"; + fRef = 72935B2D0F6B2D9D0085DD28 /* cvar.c */; + name = "cvar.c: 286"; rLen = 0; - rLoc = 0; + rLoc = 5889; rType = 0; - vrLen = 1082; - vrLoc = 18055; + vrLen = 937; + vrLoc = 5250; }; - ED4AC98210742365000706D8 /* PBXTextBookmark */ = { + ED89F58F10DC27DD00C8A107 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = EDD56B7E10740B7A007C0E16 /* ConvertTGA.c */; - name = "ConvertTGA.c: 1"; + fRef = 7229CC340F6B3222004123C5 /* wolf_main.c */; + name = "wolf_main.c: 73"; rLen = 0; - rLoc = 0; + rLoc = 1674; rType = 0; - vrLen = 1082; - vrLoc = 18055; + vrLen = 938; + vrLoc = 1084; }; - ED4AC9AB10743318000706D8 /* PBXTextBookmark */ = { + ED89F5B010DC406A00C8A107 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; - name = "wolf3dAppDelegate.m: 124"; + fRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; + name = "iphone_menus.c: 2810"; rLen = 0; - rLoc = 3930; + rLoc = 76416; rType = 0; - vrLen = 1417; - vrLoc = 3274; + vrLen = 1083; + vrLoc = 75965; }; - ED4AC9AC10743318000706D8 /* PBXTextBookmark */ = { + ED89F5B110DC406A00C8A107 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; - name = "iphone_menus.c: 1111"; - rLen = 13; - rLoc = 31543; + fRef = 72935B2E0F6B2D9D0085DD28 /* cvar.h */; + name = "cvar.h: 101"; + rLen = 0; + rLoc = 3022; rType = 0; - vrLen = 2083; - vrLoc = 30775; + vrLen = 1407; + vrLoc = 2654; }; - ED845AB1109F5B3500F673AC /* PBXTextBookmark */ = { + ED89F5B210DC406A00C8A107 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; - name = "iphone_menus.c: 2407"; + fRef = 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */; + name = "iphone_wolf.h: 20"; rLen = 0; - rLoc = 66944; + rLoc = 742; rType = 0; - vrLen = 1640; - vrLoc = 62588; + vrLen = 1321; + vrLoc = 0; }; - ED845AB2109F5B3500F673AC /* PlistBookmark */ = { + EDB41E9910DADFF000487A3B /* PlistBookmark */ = { isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* Info.plist */; + fRef = 4364BF3E0F5CB25900F29317 /* dist.plist */; fallbackIsa = PBXBookmark; isK = 0; kPath = ( - UIPrerenderedIcon, ); - name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/Info.plist; + name = /Users/greghodges/wolf3dplatinum/wolf3d/code/iphone/dist.plist; rLen = 0; rLoc = 2147483647; }; - EDAFC5A2109A14EE002C3487 /* PBXTextBookmark */ = { + EDB41E9A10DADFF000487A3B /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */; - name = "iphone_main.c: 50"; - rLen = 4; - rLoc = 1413; + fRef = 72935B2F0F6B2D9D0085DD28 /* fileio.c */; + name = "fileio.c: 1"; + rLen = 0; + rLoc = 0; rType = 0; - vrLen = 956; - vrLoc = 970; + vrLen = 1148; + vrLoc = 2350; }; - EDD56B7E10740B7A007C0E16 /* ConvertTGA.c */ = { - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.c; - name = ConvertTGA.c; - path = /Users/greghodges/Desktop/MyTGAConverter/ConvertTGA.c; - sourceTree = ""; + EDB41EAF10DAE14F00487A3B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 43AF6B940F996DA200777569 /* iphone_sys.m */; + name = "iphone_sys.m: 40"; + rLen = 24; + rLoc = 1419; + rType = 0; + vrLen = 2254; + vrLoc = 289; }; - EDDA5A7E107BA97F003F55D3 /* PBXTextBookmark */ = { + EDB41EB110DAE14F00487A3B /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */; name = "iphone_loop.c: 1226"; rLen = 0; rLoc = 28766; rType = 0; - vrLen = 942; - vrLoc = 28216; + vrLen = 1255; + vrLoc = 30135; }; - EDDA5A80107BA97F003F55D3 /* PBXTextBookmark */ = { + EDB41ECB10DAE24C00487A3B /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; - name = "iphone_mapselector.c: 341"; + fRef = 7229CC320F6B3222004123C5 /* wolf_level.h */; + name = "wolf_level.h: 232"; rLen = 0; - rLoc = 7865; + rLoc = 5017; rType = 0; - vrLen = 1229; - vrLoc = 1577; + vrLen = 1538; + vrLoc = 4647; }; - EDDA5A82107BA97F003F55D3 /* PBXTextBookmark */ = { + EDB41EFD10DAEE4800487A3B /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */; - name = "iphone_loop.c: 1226"; + fRef = 7229CC2E0F6B3222004123C5 /* wolf_client_main.c */; + name = "wolf_client_main.c: 76"; + rLen = 19; + rLoc = 1963; + rType = 0; + vrLen = 1735; + vrLoc = 1148; + }; + EDB41EFE10DAEE4800487A3B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC3F0F6B3222004123C5 /* wolf_renderer.c */; + name = "wolf_renderer.c: 72"; rLen = 0; - rLoc = 28766; + rLoc = 2093; + rType = 0; + vrLen = 1527; + vrLoc = 1208; + }; + EDB41F0110DAEE4800487A3B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */; + name = "wolf_raycast.c: 92"; + rLen = 0; + rLoc = 2319; + rType = 0; + vrLen = 1398; + vrLoc = 1520; + }; + EDB41F1110DAF0FC00487A3B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC310F6B3222004123C5 /* wolf_level.c */; + name = "wolf_level.c: 922"; + rLen = 0; + rLoc = 19218; rType = 0; - vrLen = 942; - vrLoc = 28216; + vrLen = 1355; + vrLoc = 18618; }; - EDDA5A83107BA97F003F55D3 /* PBXTextBookmark */ = { + EDB41F3610DAF95B00487A3B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */; + name = "iphone_alerts.h: 17"; + rLen = 0; + rLoc = 362; + rType = 0; + vrLen = 419; + vrLoc = 0; + }; + EDC7BE4810D95AF900DA2765 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D101069ACA8001E0547 /* iphone_store.h */; + name = "iphone_store.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1253; + vrLoc = 0; + }; + EDC7BE4910D95AF900DA2765 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D111069ACA8001E0547 /* iphone_store.m */; + name = "iphone_store.m: 399"; + rLen = 9; + rLoc = 11914; + rType = 0; + vrLen = 1577; + vrLoc = 11199; + }; + EDFA7075119383080098FFFC /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */; - name = "iphone_main.c: 272"; + name = "iphone_main.c: 207"; rLen = 0; - rLoc = 7878; + rLoc = 5816; rType = 0; - vrLen = 1550; - vrLoc = 7519; + vrLen = 2013; + vrLoc = 5166; }; - EDDA5A84107BA97F003F55D3 /* PBXTextBookmark */ = { + EDFA7084119384150098FFFC /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; - name = "iphone_mapselector.c: 341"; + fRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */; + name = "iphone_main.c: 207"; rLen = 0; - rLoc = 7865; + rLoc = 5816; rType = 0; - vrLen = 1229; - vrLoc = 1577; + vrLen = 2013; + vrLoc = 5166; }; } diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj b/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj index 2192ff2..b9f1ec0 100644 --- a/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj @@ -10,9 +10,146 @@ 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; - 4333CCE80F5CC23E00AE2B6F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */; }; + 35048AAA13E07E7800516B10 /* next_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AA913E07E7800516B10 /* next_arrow.png */; }; + 35048AAD13E0A03A00516B10 /* credits_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AAC13E0A03A00516B10 /* credits_bg.png */; }; + 35048ABC13E0D2EA00516B10 /* wolf_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048ABB13E0D2EA00516B10 /* wolf_bg.png */; }; + 35048AC113E0D51600516B10 /* iphone_preset_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048ABD13E0D51600516B10 /* iphone_preset_1.png */; }; + 35048ADA13E0E98800516B10 /* difficulty_star1.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD613E0E98800516B10 /* difficulty_star1.png */; }; + 35048ADB13E0E98800516B10 /* difficulty_star2.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD713E0E98800516B10 /* difficulty_star2.png */; }; + 35048ADC13E0E98800516B10 /* difficulty_star3.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD813E0E98800516B10 /* difficulty_star3.png */; }; + 35048ADD13E0E98800516B10 /* difficulty_star4.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD913E0E98800516B10 /* difficulty_star4.png */; }; + 350BA59813F34F7900FAE7E4 /* difficulty_head1.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59413F34F7900FAE7E4 /* difficulty_head1.png */; }; + 350BA59913F34F7900FAE7E4 /* difficulty_head2.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59513F34F7900FAE7E4 /* difficulty_head2.png */; }; + 350BA59A13F34F7900FAE7E4 /* difficulty_head3.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59613F34F7900FAE7E4 /* difficulty_head3.png */; }; + 350BA59B13F34F7900FAE7E4 /* difficulty_head4.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59713F34F7900FAE7E4 /* difficulty_head4.png */; }; + 350CCF9B13DF8B0E003303AB /* episode_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCF9A13DF8B0E003303AB /* episode_bg.png */; }; + 350CCF9F13DF8C47003303AB /* back_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCF9D13DF8C47003303AB /* back_arrow.png */; }; + 350CCFA013DF8C47003303AB /* difficulty_selection_box.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */; }; + 350CCFCE13DF8DED003303AB /* mission_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCFCD13DF8DED003303AB /* mission_bg.png */; }; + 3534C87513E208F400740F63 /* CreditsView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C87313E208F400740F63 /* CreditsView~ipad.xib */; }; + 3534C87613E208F400740F63 /* TriviaView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C87413E208F400740F63 /* TriviaView~ipad.xib */; }; + 3534C88F13E220CE00740F63 /* LegalView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */; }; + 3534C95C13E241AB00740F63 /* LevelSelectView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */; }; + 3534C95E13E241B100740F63 /* EpisodeView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */; }; + 3534C96A13E2485F00740F63 /* adv_button_frame.png in Resources */ = {isa = PBXBuildFile; fileRef = 3534C96913E2485F00740F63 /* adv_button_frame.png */; }; + 3534C96C13E2486700740F63 /* preset_frame.png in Resources */ = {isa = PBXBuildFile; fileRef = 3534C96B13E2486700740F63 /* preset_frame.png */; }; + 3534C97F13E24E0E00740F63 /* SettingsView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */; }; + 3555CC4013E2001A006E7D2F /* button_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 3555CC3F13E2001A006E7D2F /* button_highlight.png */; }; + 356D306D13F9820400EDDACE /* EpisodeCell~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */; }; + 356D306F13F9820900EDDACE /* SkillView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 356D306E13F9820900EDDACE /* SkillView~ipad.xib */; }; + 3589EBA813F5E3DC005FBE56 /* settings_slider_blue~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 3589EBA513F5E3DC005FBE56 /* settings_slider_blue~ipad.png */; }; + 3589EBA913F5E3DC005FBE56 /* settings_slider_grey~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 3589EBA613F5E3DC005FBE56 /* settings_slider_grey~ipad.png */; }; + 3589EBAA13F5E3DC005FBE56 /* settings_slider_white~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 3589EBA713F5E3DC005FBE56 /* settings_slider_white~ipad.png */; }; + 35E6E15513F3172F0010F530 /* adv_btn.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E15413F3172F0010F530 /* adv_btn.png */; }; + 35E6E15B13F3182C0010F530 /* settings_divider.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E15913F3182C0010F530 /* settings_divider.png */; }; + 35E6E15C13F3182C0010F530 /* up_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E15A13F3182C0010F530 /* up_arrow.png */; }; + 35E6E16013F318420010F530 /* left_chevron.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E15E13F318420010F530 /* left_chevron.png */; }; + 35E6E16113F318420010F530 /* right_chevron.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E15F13F318420010F530 /* right_chevron.png */; }; + 35E6E16413F318600010F530 /* highlight_bracket.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E16313F318600010F530 /* highlight_bracket.png */; }; + 35E6E16913F318A50010F530 /* down_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E16813F318A50010F530 /* down_arrow.png */; }; + 35E6E17513F3196A0010F530 /* star_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E17413F3196A0010F530 /* star_icon.png */; }; + 35E6E1A213F321A50010F530 /* settings_slider_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E19F13F321A50010F530 /* settings_slider_blue.png */; }; + 35E6E1A313F321A50010F530 /* settings_slider_grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E1A013F321A50010F530 /* settings_slider_grey.png */; }; + 35E6E1A413F321A50010F530 /* settings_slider_white.png in Resources */ = {isa = PBXBuildFile; fileRef = 35E6E1A113F321A50010F530 /* settings_slider_white.png */; }; + 3D10C37B13F310F700DF5856 /* EpisodeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D10C37A13F310F700DF5856 /* EpisodeCell.xib */; }; + 3D10C39F13F3212A00DF5856 /* WolfSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D10C39E13F3212A00DF5856 /* WolfSlider.m */; }; + 3D10C3E413F33AB700DF5856 /* SkillViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; }; + 3D10C3F213F33D3700DF5856 /* SkillView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D10C3F113F33D3700DF5856 /* SkillView.xib */; }; + 3D24009E13D89BF4009FC7A7 /* iphone_store.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D24009D13D89BF4009FC7A7 /* iphone_store.m */; }; + 3D24FF3913D77577009FC7A7 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D24FF3813D77577009FC7A7 /* StoreKit.framework */; }; + 3D3ED73F13BF554400C5B1DF /* wolf3dViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; }; + 3D3ED8D113BF775B00C5B1DF /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3ED8D013BF775B00C5B1DF /* OpenAL.framework */; }; + 3D3ED8EB13BF77A800C5B1DF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3ED8EA13BF77A800C5B1DF /* QuartzCore.framework */; }; + 3D3ED95B13BF77FA00C5B1DF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3ED95A13BF77FA00C5B1DF /* AudioToolbox.framework */; }; + 3D5C0C2713DF6701008ECBD1 /* EpisodeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0C2613DF6701008ECBD1 /* EpisodeView.xib */; }; + 3D5C0C2B13DF6836008ECBD1 /* EpisodeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */; }; + 3D5C0C4B13DF800E008ECBD1 /* LevelSelectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; }; + 3D5C0C4D13DF8084008ECBD1 /* LevelSelectView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0C4C13DF8084008ECBD1 /* LevelSelectView.xib */; }; + 3D5C0C7013DF8920008ECBD1 /* UIFontLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0C6F13DF8920008ECBD1 /* UIFontLabel.m */; }; + 3D5C0CF713DF9A5D008ECBD1 /* CreditsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */; }; + 3D5C0CFA13DF9A8E008ECBD1 /* LegalViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0CF913DF9A8E008ECBD1 /* LegalViewController.m */; }; + 3D5C0D0A13DF9B41008ECBD1 /* main_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0D0913DF9B41008ECBD1 /* main_bg.png */; }; + 3D5C0D2C13DF9D9B008ECBD1 /* MainMenuView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0D2B13DF9D9B008ECBD1 /* MainMenuView~ipad.xib */; }; + 3D5C0D3113DFA0DF008ECBD1 /* CreditsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0D3013DFA0DF008ECBD1 /* CreditsView.xib */; }; + 3D5C0D3313DFA0EA008ECBD1 /* LegalView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0D3213DFA0EA008ECBD1 /* LegalView.xib */; }; + 3D5C0DE213E05D4D008ECBD1 /* TriviaViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */; }; + 3D5C0DF513E063F5008ECBD1 /* TriviaView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0DF413E063F5008ECBD1 /* TriviaView.xib */; }; + 3D5C0F8213E0FC46008ECBD1 /* iphone_preset_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0F7F13E0FC46008ECBD1 /* iphone_preset_2.png */; }; + 3D5C0F8313E0FC46008ECBD1 /* iphone_preset_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0F8013E0FC46008ECBD1 /* iphone_preset_3.png */; }; + 3D5C0F8413E0FC46008ECBD1 /* iphone_preset_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D5C0F8113E0FC46008ECBD1 /* iphone_preset_4.png */; }; + 3D5C0FD813E10204008ECBD1 /* MissionTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5C0FD713E10204008ECBD1 /* MissionTableViewCell.m */; }; + 3D86CF8D13DDE51800186487 /* MainMenuView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3D86CF8A13DDE51800186487 /* MainMenuView.xib */; }; + 3D86CF8E13DDE51800186487 /* MainMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */; }; + 3D86D68B13DF172B00186487 /* POSITYPE-idSettler10v2.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3D86D68A13DF172B00186487 /* POSITYPE-idSettler10v2.otf */; }; + 3DB8734113FACAD20050FB2A /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DB8734013FACAD20050FB2A /* AVFoundation.framework */; }; + 3DB873FF13FB3C0E0050FB2A /* wondering.caf in Resources */ = {isa = PBXBuildFile; fileRef = 3DB873FE13FB3C0E0050FB2A /* wondering.caf */; }; + 3DBC68B313F58BCC002A8253 /* UITableViewScrolling.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DBC68B213F58BCC002A8253 /* UITableViewScrolling.m */; }; + 3DBC68E713F599B4002A8253 /* settings_line_art.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DBC68E613F599B4002A8253 /* settings_line_art.png */; }; + 3DDD3A2113DF228500967735 /* SettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3DDD3A2013DF228500967735 /* SettingsView.xib */; }; + 3DDD3A2413DF231100967735 /* UIFontButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DDD3A2313DF231100967735 /* UIFontButton.m */; }; + 3DE8828613E35E5000C95AE8 /* arialImageLAL_white-alpha.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824713E35E5000C95AE8 /* arialImageLAL_white-alpha.png */; }; + 3DE8828713E35E5000C95AE8 /* arialImageLAL.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */; }; + 3DE8828813E35E5000C95AE8 /* button_back.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824913E35E5000C95AE8 /* button_back.png */; }; + 3DE8828913E35E5000C95AE8 /* button_downloads.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824A13E35E5000C95AE8 /* button_downloads.png */; }; + 3DE8828A13E35E5000C95AE8 /* button_knife.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824B13E35E5000C95AE8 /* button_knife.png */; }; + 3DE8828B13E35E5000C95AE8 /* button_left.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824C13E35E5000C95AE8 /* button_left.png */; }; + 3DE8828C13E35E5000C95AE8 /* button_more.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824D13E35E5000C95AE8 /* button_more.png */; }; + 3DE8828D13E35E5000C95AE8 /* button_new.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824E13E35E5000C95AE8 /* button_new.png */; }; + 3DE8828E13E35E5000C95AE8 /* button_pistol.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824F13E35E5000C95AE8 /* button_pistol.png */; }; + 3DE8828F13E35E5000C95AE8 /* button_resume.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825013E35E5000C95AE8 /* button_resume.png */; }; + 3DE8829013E35E5000C95AE8 /* button_right.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825113E35E5000C95AE8 /* button_right.png */; }; + 3DE8829113E35E5000C95AE8 /* button_settings.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825213E35E5000C95AE8 /* button_settings.png */; }; + 3DE8829213E35E5000C95AE8 /* button_trivia.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825313E35E5000C95AE8 /* button_trivia.png */; }; + 3DE8829313E35E5000C95AE8 /* button_web.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825413E35E5000C95AE8 /* button_web.png */; }; + 3DE8829413E35E5000C95AE8 /* diractional_01.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825513E35E5000C95AE8 /* diractional_01.png */; }; + 3DE8829513E35E5000C95AE8 /* diractional_02.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825613E35E5000C95AE8 /* diractional_02.png */; }; + 3DE8829613E35E5000C95AE8 /* diractional_03.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825713E35E5000C95AE8 /* diractional_03.png */; }; + 3DE8829A13E35E5000C95AE8 /* GODMODEFACE0PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825B13E35E5000C95AE8 /* GODMODEFACE0PIC.png */; }; + 3DE8829B13E35E5000C95AE8 /* GODMODEFACE1PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825C13E35E5000C95AE8 /* GODMODEFACE1PIC.png */; }; + 3DE8829C13E35E5000C95AE8 /* GODMODEFACE2PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825D13E35E5000C95AE8 /* GODMODEFACE2PIC.png */; }; + 3DE8829D13E35E5000C95AE8 /* header_advanced.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825E13E35E5000C95AE8 /* header_advanced.png */; }; + 3DE8829E13E35E5000C95AE8 /* header_ep1.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825F13E35E5000C95AE8 /* header_ep1.png */; }; + 3DE8829F13E35E5000C95AE8 /* header_ep2.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826013E35E5000C95AE8 /* header_ep2.png */; }; + 3DE882A013E35E5000C95AE8 /* header_ep3.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826113E35E5000C95AE8 /* header_ep3.png */; }; + 3DE882A113E35E5000C95AE8 /* header_ep4.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826213E35E5000C95AE8 /* header_ep4.png */; }; + 3DE882A213E35E5000C95AE8 /* header_ep5.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826313E35E5000C95AE8 /* header_ep5.png */; }; + 3DE882A313E35E5000C95AE8 /* header_ep6.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826413E35E5000C95AE8 /* header_ep6.png */; }; + 3DE882A413E35E5000C95AE8 /* header_ep7.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826513E35E5000C95AE8 /* header_ep7.png */; }; + 3DE882A513E35E5000C95AE8 /* header_ep8.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826613E35E5000C95AE8 /* header_ep8.png */; }; + 3DE882A613E35E5000C95AE8 /* header_ep9.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826713E35E5000C95AE8 /* header_ep9.png */; }; + 3DE882A713E35E5000C95AE8 /* header_ep10.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826813E35E5000C95AE8 /* header_ep10.png */; }; + 3DE882A813E35E5000C95AE8 /* header_ep11.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826913E35E5000C95AE8 /* header_ep11.png */; }; + 3DE882A913E35E5000C95AE8 /* intermission.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826A13E35E5000C95AE8 /* intermission.png */; }; + 3DE882AA13E35E5000C95AE8 /* iphone_image.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826B13E35E5000C95AE8 /* iphone_image.png */; }; + 3DE882AB13E35E5000C95AE8 /* kills_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826C13E35E5000C95AE8 /* kills_shadow.png */; }; + 3DE882AC13E35E5000C95AE8 /* kills.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826D13E35E5000C95AE8 /* kills.png */; }; + 3DE882AD13E35E5000C95AE8 /* map_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826E13E35E5000C95AE8 /* map_background.png */; }; + 3DE882AE13E35E5000C95AE8 /* map.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826F13E35E5000C95AE8 /* map.png */; }; + 3DE882AF13E35E5000C95AE8 /* menu_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827013E35E5000C95AE8 /* menu_bar.png */; }; + 3DE882B013E35E5000C95AE8 /* menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827113E35E5000C95AE8 /* menu.png */; }; + 3DE882B113E35E5000C95AE8 /* music_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827213E35E5000C95AE8 /* music_off.png */; }; + 3DE882B213E35E5000C95AE8 /* music_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827313E35E5000C95AE8 /* music_on.png */; }; + 3DE882B313E35E5000C95AE8 /* partime_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827413E35E5000C95AE8 /* partime_shadow.png */; }; + 3DE882B413E35E5000C95AE8 /* partime.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827513E35E5000C95AE8 /* partime.png */; }; + 3DE882B513E35E5000C95AE8 /* secrets_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827613E35E5000C95AE8 /* secrets_shadow.png */; }; + 3DE882B613E35E5000C95AE8 /* secrets.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827713E35E5000C95AE8 /* secrets.png */; }; + 3DE882B713E35E5000C95AE8 /* shoot.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827813E35E5000C95AE8 /* shoot.png */; }; + 3DE882B813E35E5000C95AE8 /* side_2_side.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827913E35E5000C95AE8 /* side_2_side.png */; }; + 3DE882B913E35E5000C95AE8 /* slider_bar_rainbow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */; }; + 3DE882BA13E35E5000C95AE8 /* slider_bar_underlay.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */; }; + 3DE882BB13E35E5000C95AE8 /* slider_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827C13E35E5000C95AE8 /* slider_bar.png */; }; + 3DE882BC13E35E5000C95AE8 /* slider_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827D13E35E5000C95AE8 /* slider_knob.png */; }; + 3DE882BD13E35E5000C95AE8 /* stats_large.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827E13E35E5000C95AE8 /* stats_large.png */; }; + 3DE882BE13E35E5000C95AE8 /* stats.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827F13E35E5000C95AE8 /* stats.png */; }; + 3DE882BF13E35E5000C95AE8 /* status_hud.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828013E35E5000C95AE8 /* status_hud.png */; }; + 3DE882C013E35E5000C95AE8 /* submenus_background_image.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828113E35E5000C95AE8 /* submenus_background_image.png */; }; + 3DE882C113E35E5000C95AE8 /* treasure_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828213E35E5000C95AE8 /* treasure_shadow.png */; }; + 3DE882C213E35E5000C95AE8 /* treasure.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828313E35E5000C95AE8 /* treasure.png */; }; + 3DE882C313E35E5000C95AE8 /* up_down.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828413E35E5000C95AE8 /* up_down.png */; }; + 3DE882C413E35E5000C95AE8 /* victory_256.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828513E35E5000C95AE8 /* victory_256.png */; }; + 3DF1804413F44D6700ED668A /* episode_bracket.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DF1804213F44D6700ED668A /* episode_bracket.png */; }; + 3DF1804513F44D6700ED668A /* episode_divider.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DF1804313F44D6700ED668A /* episode_divider.png */; }; 4364BF3F0F5CB25900F29317 /* dist.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4364BF3E0F5CB25900F29317 /* dist.plist */; }; 43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */; }; 43AF6B950F996DA200777569 /* iphone_sys.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF6B940F996DA200777569 /* iphone_sys.m */; }; @@ -21,8 +158,6 @@ 43CF030A0F56D5C200E4A23D /* iphone_loop.c in Sources */ = {isa = PBXBuildFile; fileRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */; }; 43E341290F9BB4B6003C5D00 /* wolf3dlite_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 43E341280F9BB4B6003C5D00 /* wolf3dlite_icon.png */; }; 43E8D2E10F4FC61E003F09B2 /* iphone_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */; }; - 43E8D4E00F51B48B003F09B2 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */; }; - 720EBBAE0F82E0BB003F989A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 720EBBAD0F82E0BB003F989A /* QuartzCore.framework */; }; 7229CC460F6B3222004123C5 /* wolf_actor_ai.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */; }; 7229CC470F6B3222004123C5 /* wolf_actors.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC270F6B3222004123C5 /* wolf_actors.c */; }; 7229CC480F6B3222004123C5 /* wolf_ai_com.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC290F6B3222004123C5 /* wolf_ai_com.c */; }; @@ -95,11 +230,16 @@ 72935BA20F6B2D9D0085DD28 /* zmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B720F6B2D9D0085DD28 /* zmem.c */; }; 72A7E8F70F5F2063005B83C0 /* iphone_menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; }; 72B5FF390F7E5C3D00C8A372 /* hud.c in Sources */ = {isa = PBXBuildFile; fileRef = 72B5FF380F7E5C3D00C8A372 /* hud.c */; }; + C81E11A913E2112100B1049A /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C81E11A813E2112100B1049A /* SettingsViewController.m */; }; + C81E121C13E225FB00B1049A /* slider.png in Resources */ = {isa = PBXBuildFile; fileRef = C81E121B13E225FB00B1049A /* slider.png */; }; + C8D1CFE013E22A6700F0EAC6 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFDF13E22A6700F0EAC6 /* Default-Portrait~ipad.png */; }; + C8D1CFE413E22B5200F0EAC6 /* WOLF_57.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */; }; + C8D1CFE613E22B5B00F0EAC6 /* WOLF_114.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */; }; + C8D1CFE813E22B6800F0EAC6 /* WOLF_72.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */; }; ED0A8D121069ACA8001E0547 /* iphone_alerts.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */; }; ED0A8D131069ACA8001E0547 /* iphone_downloadSOD.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */; }; ED0A8D141069ACA8001E0547 /* iphone_downloadUserMap.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */; }; ED0A8D151069ACA8001E0547 /* iphone_mapselector.c in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; }; - ED0A8D161069ACA8001E0547 /* iphone_store.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0A8D111069ACA8001E0547 /* iphone_store.m */; }; ED3703B4106C1CD40059C5F8 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */; }; /* End PBXBuildFile section */ @@ -107,11 +247,161 @@ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D6058910D05DD3D006BFB54 /* wolf3d.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = wolf3d.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* wolf3d_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wolf3d_Prefix.pch; sourceTree = ""; }; - 4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; + 35048AA913E07E7800516B10 /* next_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = next_arrow.png; path = ../../menu_art/next_arrow.png; sourceTree = SOURCE_ROOT; }; + 35048AAC13E0A03A00516B10 /* credits_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = credits_bg.png; path = ../../menu_art/credits_bg.png; sourceTree = SOURCE_ROOT; }; + 35048ABB13E0D2EA00516B10 /* wolf_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = wolf_bg.png; path = ../../menu_art/wolf_bg.png; sourceTree = SOURCE_ROOT; }; + 35048ABD13E0D51600516B10 /* iphone_preset_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_preset_1.png; path = ../../menu_art/iphone_preset_1.png; sourceTree = SOURCE_ROOT; }; + 35048AD613E0E98800516B10 /* difficulty_star1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star1.png; path = ../../menu_art/difficulty_star1.png; sourceTree = SOURCE_ROOT; }; + 35048AD713E0E98800516B10 /* difficulty_star2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star2.png; path = ../../menu_art/difficulty_star2.png; sourceTree = SOURCE_ROOT; }; + 35048AD813E0E98800516B10 /* difficulty_star3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star3.png; path = ../../menu_art/difficulty_star3.png; sourceTree = SOURCE_ROOT; }; + 35048AD913E0E98800516B10 /* difficulty_star4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star4.png; path = ../../menu_art/difficulty_star4.png; sourceTree = SOURCE_ROOT; }; + 350BA59413F34F7900FAE7E4 /* difficulty_head1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head1.png; path = ../../menu_art/difficulty_head1.png; sourceTree = SOURCE_ROOT; }; + 350BA59513F34F7900FAE7E4 /* difficulty_head2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head2.png; path = ../../menu_art/difficulty_head2.png; sourceTree = SOURCE_ROOT; }; + 350BA59613F34F7900FAE7E4 /* difficulty_head3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head3.png; path = ../../menu_art/difficulty_head3.png; sourceTree = SOURCE_ROOT; }; + 350BA59713F34F7900FAE7E4 /* difficulty_head4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head4.png; path = ../../menu_art/difficulty_head4.png; sourceTree = SOURCE_ROOT; }; + 350CCF9A13DF8B0E003303AB /* episode_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = episode_bg.png; path = ../../menu_art/episode_bg.png; sourceTree = SOURCE_ROOT; }; + 350CCF9D13DF8C47003303AB /* back_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = back_arrow.png; path = ../../menu_art/back_arrow.png; sourceTree = SOURCE_ROOT; }; + 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_selection_box.png; path = ../../menu_art/difficulty_selection_box.png; sourceTree = SOURCE_ROOT; }; + 350CCFCD13DF8DED003303AB /* mission_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mission_bg.png; path = ../../menu_art/mission_bg.png; sourceTree = SOURCE_ROOT; }; + 3534C87313E208F400740F63 /* CreditsView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "CreditsView~ipad.xib"; path = "Resources-iPad/CreditsView~ipad.xib"; sourceTree = ""; }; + 3534C87413E208F400740F63 /* TriviaView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "TriviaView~ipad.xib"; path = "Resources-iPad/TriviaView~ipad.xib"; sourceTree = ""; }; + 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "LegalView~ipad.xib"; path = "Resources-iPad/LegalView~ipad.xib"; sourceTree = ""; }; + 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "LevelSelectView~ipad.xib"; path = "Resources-iPad/LevelSelectView~ipad.xib"; sourceTree = ""; }; + 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "EpisodeView~ipad.xib"; path = "Resources-iPad/EpisodeView~ipad.xib"; sourceTree = ""; }; + 3534C96913E2485F00740F63 /* adv_button_frame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = adv_button_frame.png; path = ../../menu_art/adv_button_frame.png; sourceTree = SOURCE_ROOT; }; + 3534C96B13E2486700740F63 /* preset_frame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preset_frame.png; path = ../../menu_art/preset_frame.png; sourceTree = SOURCE_ROOT; }; + 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "SettingsView~ipad.xib"; path = "Resources-iPad/SettingsView~ipad.xib"; sourceTree = ""; }; + 3555CC3F13E2001A006E7D2F /* button_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_highlight.png; path = ../../menu_art/button_highlight.png; sourceTree = SOURCE_ROOT; }; + 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "EpisodeCell~ipad.xib"; path = "Resources-iPad/EpisodeCell~ipad.xib"; sourceTree = ""; }; + 356D306E13F9820900EDDACE /* SkillView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "SkillView~ipad.xib"; path = "Resources-iPad/SkillView~ipad.xib"; sourceTree = ""; }; + 3589EBA513F5E3DC005FBE56 /* settings_slider_blue~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "settings_slider_blue~ipad.png"; path = "../../menu_art/settings_slider_blue~ipad.png"; sourceTree = SOURCE_ROOT; }; + 3589EBA613F5E3DC005FBE56 /* settings_slider_grey~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "settings_slider_grey~ipad.png"; path = "../../menu_art/settings_slider_grey~ipad.png"; sourceTree = SOURCE_ROOT; }; + 3589EBA713F5E3DC005FBE56 /* settings_slider_white~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "settings_slider_white~ipad.png"; path = "../../menu_art/settings_slider_white~ipad.png"; sourceTree = SOURCE_ROOT; }; + 35E6E15413F3172F0010F530 /* adv_btn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = adv_btn.png; path = ../../menu_art/adv_btn.png; sourceTree = SOURCE_ROOT; }; + 35E6E15913F3182C0010F530 /* settings_divider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = settings_divider.png; path = ../../menu_art/settings_divider.png; sourceTree = SOURCE_ROOT; }; + 35E6E15A13F3182C0010F530 /* up_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = up_arrow.png; path = ../../menu_art/up_arrow.png; sourceTree = SOURCE_ROOT; }; + 35E6E15E13F318420010F530 /* left_chevron.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = left_chevron.png; path = ../../menu_art/left_chevron.png; sourceTree = SOURCE_ROOT; }; + 35E6E15F13F318420010F530 /* right_chevron.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = right_chevron.png; path = ../../menu_art/right_chevron.png; sourceTree = SOURCE_ROOT; }; + 35E6E16313F318600010F530 /* highlight_bracket.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = highlight_bracket.png; path = ../../menu_art/highlight_bracket.png; sourceTree = SOURCE_ROOT; }; + 35E6E16813F318A50010F530 /* down_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = down_arrow.png; path = ../../menu_art/down_arrow.png; sourceTree = SOURCE_ROOT; }; + 35E6E17413F3196A0010F530 /* star_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = star_icon.png; path = ../../menu_art/star_icon.png; sourceTree = SOURCE_ROOT; }; + 35E6E19F13F321A50010F530 /* settings_slider_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = settings_slider_blue.png; path = ../../menu_art/settings_slider_blue.png; sourceTree = SOURCE_ROOT; }; + 35E6E1A013F321A50010F530 /* settings_slider_grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = settings_slider_grey.png; path = ../../menu_art/settings_slider_grey.png; sourceTree = SOURCE_ROOT; }; + 35E6E1A113F321A50010F530 /* settings_slider_white.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = settings_slider_white.png; path = ../../menu_art/settings_slider_white.png; sourceTree = SOURCE_ROOT; }; + 3D10C37A13F310F700DF5856 /* EpisodeCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EpisodeCell.xib; sourceTree = ""; }; + 3D10C39D13F3212A00DF5856 /* WolfSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WolfSlider.h; sourceTree = ""; }; + 3D10C39E13F3212A00DF5856 /* WolfSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WolfSlider.m; sourceTree = ""; }; + 3D10C3E213F33AB700DF5856 /* SkillViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkillViewController.h; sourceTree = ""; }; + 3D10C3E313F33AB700DF5856 /* SkillViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SkillViewController.m; sourceTree = ""; }; + 3D10C3F113F33D3700DF5856 /* SkillView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SkillView.xib; sourceTree = ""; }; + 3D24009D13D89BF4009FC7A7 /* iphone_store.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_store.m; sourceTree = ""; }; + 3D24FF3813D77577009FC7A7 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + 3D3ED73D13BF554400C5B1DF /* wolf3dViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wolf3dViewController.h; sourceTree = ""; }; + 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = wolf3dViewController.m; sourceTree = ""; }; + 3D3ED8D013BF775B00C5B1DF /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; + 3D3ED8EA13BF77A800C5B1DF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 3D3ED95A13BF77FA00C5B1DF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 3D5C0C2613DF6701008ECBD1 /* EpisodeView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EpisodeView.xib; sourceTree = ""; }; + 3D5C0C2913DF6836008ECBD1 /* EpisodeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EpisodeViewController.h; sourceTree = ""; }; + 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EpisodeViewController.m; sourceTree = ""; }; + 3D5C0C4913DF800E008ECBD1 /* LevelSelectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelSelectViewController.h; sourceTree = ""; }; + 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LevelSelectViewController.m; sourceTree = ""; }; + 3D5C0C4C13DF8084008ECBD1 /* LevelSelectView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LevelSelectView.xib; sourceTree = ""; }; + 3D5C0C6E13DF88F8008ECBD1 /* UIFontLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIFontLabel.h; sourceTree = ""; }; + 3D5C0C6F13DF8920008ECBD1 /* UIFontLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIFontLabel.m; sourceTree = ""; }; + 3D5C0CF513DF9A5D008ECBD1 /* CreditsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CreditsViewController.h; sourceTree = ""; }; + 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CreditsViewController.m; sourceTree = ""; }; + 3D5C0CF813DF9A8E008ECBD1 /* LegalViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegalViewController.h; sourceTree = ""; }; + 3D5C0CF913DF9A8E008ECBD1 /* LegalViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LegalViewController.m; sourceTree = ""; }; + 3D5C0D0913DF9B41008ECBD1 /* main_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = main_bg.png; path = ../../menu_art/main_bg.png; sourceTree = SOURCE_ROOT; }; + 3D5C0D2B13DF9D9B008ECBD1 /* MainMenuView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainMenuView~ipad.xib"; path = "Resources-iPad/MainMenuView~ipad.xib"; sourceTree = ""; }; + 3D5C0D3013DFA0DF008ECBD1 /* CreditsView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CreditsView.xib; sourceTree = ""; }; + 3D5C0D3213DFA0EA008ECBD1 /* LegalView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LegalView.xib; sourceTree = ""; }; + 3D5C0DE013E05D4D008ECBD1 /* TriviaViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TriviaViewController.h; sourceTree = ""; }; + 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TriviaViewController.m; sourceTree = ""; }; + 3D5C0DF413E063F5008ECBD1 /* TriviaView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TriviaView.xib; sourceTree = ""; }; + 3D5C0F7F13E0FC46008ECBD1 /* iphone_preset_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_preset_2.png; path = ../../menu_art/iphone_preset_2.png; sourceTree = SOURCE_ROOT; }; + 3D5C0F8013E0FC46008ECBD1 /* iphone_preset_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_preset_3.png; path = ../../menu_art/iphone_preset_3.png; sourceTree = SOURCE_ROOT; }; + 3D5C0F8113E0FC46008ECBD1 /* iphone_preset_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_preset_4.png; path = ../../menu_art/iphone_preset_4.png; sourceTree = SOURCE_ROOT; }; + 3D5C0FD613E10204008ECBD1 /* MissionTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MissionTableViewCell.h; sourceTree = ""; }; + 3D5C0FD713E10204008ECBD1 /* MissionTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MissionTableViewCell.m; sourceTree = ""; }; + 3D86CF8A13DDE51800186487 /* MainMenuView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenuView.xib; sourceTree = ""; }; + 3D86CF8B13DDE51800186487 /* MainMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainMenuViewController.h; sourceTree = ""; }; + 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainMenuViewController.m; sourceTree = ""; }; + 3D86D68A13DF172B00186487 /* POSITYPE-idSettler10v2.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "POSITYPE-idSettler10v2.otf"; sourceTree = ""; }; + 3DB8734013FACAD20050FB2A /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 3DB873FE13FB3C0E0050FB2A /* wondering.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = wondering.caf; sourceTree = ""; }; + 3DBC68B113F58BCC002A8253 /* UITableViewScrolling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UITableViewScrolling.h; sourceTree = ""; }; + 3DBC68B213F58BCC002A8253 /* UITableViewScrolling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UITableViewScrolling.m; sourceTree = ""; }; + 3DBC68E613F599B4002A8253 /* settings_line_art.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = settings_line_art.png; path = ../../menu_art/settings_line_art.png; sourceTree = SOURCE_ROOT; }; + 3DDD3A2013DF228500967735 /* SettingsView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingsView.xib; sourceTree = ""; }; + 3DDD3A2313DF231100967735 /* UIFontButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIFontButton.m; sourceTree = ""; }; + 3DDD3A2513DF232900967735 /* UIFontButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIFontButton.h; sourceTree = ""; }; + 3DE8824713E35E5000C95AE8 /* arialImageLAL_white-alpha.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "arialImageLAL_white-alpha.png"; path = "../../menu_art/arialImageLAL_white-alpha.png"; sourceTree = SOURCE_ROOT; }; + 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = arialImageLAL.png; path = ../../menu_art/arialImageLAL.png; sourceTree = SOURCE_ROOT; }; + 3DE8824913E35E5000C95AE8 /* button_back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_back.png; path = ../../menu_art/button_back.png; sourceTree = SOURCE_ROOT; }; + 3DE8824A13E35E5000C95AE8 /* button_downloads.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_downloads.png; path = ../../menu_art/button_downloads.png; sourceTree = SOURCE_ROOT; }; + 3DE8824B13E35E5000C95AE8 /* button_knife.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_knife.png; path = ../../menu_art/button_knife.png; sourceTree = SOURCE_ROOT; }; + 3DE8824C13E35E5000C95AE8 /* button_left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_left.png; path = ../../menu_art/button_left.png; sourceTree = SOURCE_ROOT; }; + 3DE8824D13E35E5000C95AE8 /* button_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_more.png; path = ../../menu_art/button_more.png; sourceTree = SOURCE_ROOT; }; + 3DE8824E13E35E5000C95AE8 /* button_new.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_new.png; path = ../../menu_art/button_new.png; sourceTree = SOURCE_ROOT; }; + 3DE8824F13E35E5000C95AE8 /* button_pistol.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_pistol.png; path = ../../menu_art/button_pistol.png; sourceTree = SOURCE_ROOT; }; + 3DE8825013E35E5000C95AE8 /* button_resume.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_resume.png; path = ../../menu_art/button_resume.png; sourceTree = SOURCE_ROOT; }; + 3DE8825113E35E5000C95AE8 /* button_right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_right.png; path = ../../menu_art/button_right.png; sourceTree = SOURCE_ROOT; }; + 3DE8825213E35E5000C95AE8 /* button_settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_settings.png; path = ../../menu_art/button_settings.png; sourceTree = SOURCE_ROOT; }; + 3DE8825313E35E5000C95AE8 /* button_trivia.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_trivia.png; path = ../../menu_art/button_trivia.png; sourceTree = SOURCE_ROOT; }; + 3DE8825413E35E5000C95AE8 /* button_web.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_web.png; path = ../../menu_art/button_web.png; sourceTree = SOURCE_ROOT; }; + 3DE8825513E35E5000C95AE8 /* diractional_01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = diractional_01.png; path = ../../menu_art/diractional_01.png; sourceTree = SOURCE_ROOT; }; + 3DE8825613E35E5000C95AE8 /* diractional_02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = diractional_02.png; path = ../../menu_art/diractional_02.png; sourceTree = SOURCE_ROOT; }; + 3DE8825713E35E5000C95AE8 /* diractional_03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = diractional_03.png; path = ../../menu_art/diractional_03.png; sourceTree = SOURCE_ROOT; }; + 3DE8825B13E35E5000C95AE8 /* GODMODEFACE0PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE0PIC.png; path = ../../menu_art/GODMODEFACE0PIC.png; sourceTree = SOURCE_ROOT; }; + 3DE8825C13E35E5000C95AE8 /* GODMODEFACE1PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE1PIC.png; path = ../../menu_art/GODMODEFACE1PIC.png; sourceTree = SOURCE_ROOT; }; + 3DE8825D13E35E5000C95AE8 /* GODMODEFACE2PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE2PIC.png; path = ../../menu_art/GODMODEFACE2PIC.png; sourceTree = SOURCE_ROOT; }; + 3DE8825E13E35E5000C95AE8 /* header_advanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_advanced.png; path = ../../menu_art/header_advanced.png; sourceTree = SOURCE_ROOT; }; + 3DE8825F13E35E5000C95AE8 /* header_ep1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep1.png; path = ../../menu_art/header_ep1.png; sourceTree = SOURCE_ROOT; }; + 3DE8826013E35E5000C95AE8 /* header_ep2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep2.png; path = ../../menu_art/header_ep2.png; sourceTree = SOURCE_ROOT; }; + 3DE8826113E35E5000C95AE8 /* header_ep3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep3.png; path = ../../menu_art/header_ep3.png; sourceTree = SOURCE_ROOT; }; + 3DE8826213E35E5000C95AE8 /* header_ep4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep4.png; path = ../../menu_art/header_ep4.png; sourceTree = SOURCE_ROOT; }; + 3DE8826313E35E5000C95AE8 /* header_ep5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep5.png; path = ../../menu_art/header_ep5.png; sourceTree = SOURCE_ROOT; }; + 3DE8826413E35E5000C95AE8 /* header_ep6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep6.png; path = ../../menu_art/header_ep6.png; sourceTree = SOURCE_ROOT; }; + 3DE8826513E35E5000C95AE8 /* header_ep7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep7.png; path = ../../menu_art/header_ep7.png; sourceTree = SOURCE_ROOT; }; + 3DE8826613E35E5000C95AE8 /* header_ep8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep8.png; path = ../../menu_art/header_ep8.png; sourceTree = SOURCE_ROOT; }; + 3DE8826713E35E5000C95AE8 /* header_ep9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep9.png; path = ../../menu_art/header_ep9.png; sourceTree = SOURCE_ROOT; }; + 3DE8826813E35E5000C95AE8 /* header_ep10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep10.png; path = ../../menu_art/header_ep10.png; sourceTree = SOURCE_ROOT; }; + 3DE8826913E35E5000C95AE8 /* header_ep11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep11.png; path = ../../menu_art/header_ep11.png; sourceTree = SOURCE_ROOT; }; + 3DE8826A13E35E5000C95AE8 /* intermission.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = intermission.png; path = ../../menu_art/intermission.png; sourceTree = SOURCE_ROOT; }; + 3DE8826B13E35E5000C95AE8 /* iphone_image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_image.png; path = ../../menu_art/iphone_image.png; sourceTree = SOURCE_ROOT; }; + 3DE8826C13E35E5000C95AE8 /* kills_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = kills_shadow.png; path = ../../menu_art/kills_shadow.png; sourceTree = SOURCE_ROOT; }; + 3DE8826D13E35E5000C95AE8 /* kills.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = kills.png; path = ../../menu_art/kills.png; sourceTree = SOURCE_ROOT; }; + 3DE8826E13E35E5000C95AE8 /* map_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = map_background.png; path = ../../menu_art/map_background.png; sourceTree = SOURCE_ROOT; }; + 3DE8826F13E35E5000C95AE8 /* map.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = map.png; path = ../../menu_art/map.png; sourceTree = SOURCE_ROOT; }; + 3DE8827013E35E5000C95AE8 /* menu_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = menu_bar.png; path = ../../menu_art/menu_bar.png; sourceTree = SOURCE_ROOT; }; + 3DE8827113E35E5000C95AE8 /* menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = menu.png; path = ../../menu_art/menu.png; sourceTree = SOURCE_ROOT; }; + 3DE8827213E35E5000C95AE8 /* music_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = music_off.png; path = ../../menu_art/music_off.png; sourceTree = SOURCE_ROOT; }; + 3DE8827313E35E5000C95AE8 /* music_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = music_on.png; path = ../../menu_art/music_on.png; sourceTree = SOURCE_ROOT; }; + 3DE8827413E35E5000C95AE8 /* partime_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = partime_shadow.png; path = ../../menu_art/partime_shadow.png; sourceTree = SOURCE_ROOT; }; + 3DE8827513E35E5000C95AE8 /* partime.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = partime.png; path = ../../menu_art/partime.png; sourceTree = SOURCE_ROOT; }; + 3DE8827613E35E5000C95AE8 /* secrets_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = secrets_shadow.png; path = ../../menu_art/secrets_shadow.png; sourceTree = SOURCE_ROOT; }; + 3DE8827713E35E5000C95AE8 /* secrets.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = secrets.png; path = ../../menu_art/secrets.png; sourceTree = SOURCE_ROOT; }; + 3DE8827813E35E5000C95AE8 /* shoot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = shoot.png; path = ../../menu_art/shoot.png; sourceTree = SOURCE_ROOT; }; + 3DE8827913E35E5000C95AE8 /* side_2_side.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = side_2_side.png; path = ../../menu_art/side_2_side.png; sourceTree = SOURCE_ROOT; }; + 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_bar_rainbow.png; path = ../../menu_art/slider_bar_rainbow.png; sourceTree = SOURCE_ROOT; }; + 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_bar_underlay.png; path = ../../menu_art/slider_bar_underlay.png; sourceTree = SOURCE_ROOT; }; + 3DE8827C13E35E5000C95AE8 /* slider_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_bar.png; path = ../../menu_art/slider_bar.png; sourceTree = SOURCE_ROOT; }; + 3DE8827D13E35E5000C95AE8 /* slider_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_knob.png; path = ../../menu_art/slider_knob.png; sourceTree = SOURCE_ROOT; }; + 3DE8827E13E35E5000C95AE8 /* stats_large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stats_large.png; path = ../../menu_art/stats_large.png; sourceTree = SOURCE_ROOT; }; + 3DE8827F13E35E5000C95AE8 /* stats.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stats.png; path = ../../menu_art/stats.png; sourceTree = SOURCE_ROOT; }; + 3DE8828013E35E5000C95AE8 /* status_hud.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = status_hud.png; path = ../../menu_art/status_hud.png; sourceTree = SOURCE_ROOT; }; + 3DE8828113E35E5000C95AE8 /* submenus_background_image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = submenus_background_image.png; path = ../../menu_art/submenus_background_image.png; sourceTree = SOURCE_ROOT; }; + 3DE8828213E35E5000C95AE8 /* treasure_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = treasure_shadow.png; path = ../../menu_art/treasure_shadow.png; sourceTree = SOURCE_ROOT; }; + 3DE8828313E35E5000C95AE8 /* treasure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = treasure.png; path = ../../menu_art/treasure.png; sourceTree = SOURCE_ROOT; }; + 3DE8828413E35E5000C95AE8 /* up_down.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = up_down.png; path = ../../menu_art/up_down.png; sourceTree = SOURCE_ROOT; }; + 3DE8828513E35E5000C95AE8 /* victory_256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = victory_256.png; path = ../../menu_art/victory_256.png; sourceTree = SOURCE_ROOT; }; + 3DF1804213F44D6700ED668A /* episode_bracket.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = episode_bracket.png; path = ../../menu_art/episode_bracket.png; sourceTree = SOURCE_ROOT; }; + 3DF1804313F44D6700ED668A /* episode_divider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = episode_divider.png; path = ../../menu_art/episode_divider.png; sourceTree = SOURCE_ROOT; }; 4364BF3E0F5CB25900F29317 /* dist.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = dist.plist; sourceTree = ""; }; 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 43AF6B940F996DA200777569 /* iphone_sys.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_sys.m; sourceTree = ""; }; @@ -120,8 +410,6 @@ 43CF03090F56D5C200E4A23D /* iphone_loop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_loop.c; sourceTree = ""; }; 43E341280F9BB4B6003C5D00 /* wolf3dlite_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wolf3dlite_icon.png; sourceTree = ""; }; 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_main.c; sourceTree = ""; }; - 43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = /System/Library/Frameworks/OpenAL.framework; sourceTree = ""; }; - 720EBBAD0F82E0BB003F989A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; 7229CC240F6B3222004123C5 /* wolf_act_stat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_act_stat.h; path = ../wolf/wolf_act_stat.h; sourceTree = SOURCE_ROOT; }; 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_actor_ai.c; path = ../wolf/wolf_actor_ai.c; sourceTree = SOURCE_ROOT; }; 7229CC260F6B3222004123C5 /* wolf_actor_ai.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_actor_ai.h; path = ../wolf/wolf_actor_ai.h; sourceTree = SOURCE_ROOT; }; @@ -262,7 +550,14 @@ 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_wolf.h; sourceTree = ""; }; 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_menus.c; sourceTree = ""; }; 72B5FF380F7E5C3D00C8A372 /* hud.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hud.c; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + C81E11A713E2112100B1049A /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; + C81E11A813E2112100B1049A /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; + C81E121B13E225FB00B1049A /* slider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider.png; path = ../../menu_art/slider.png; sourceTree = SOURCE_ROOT; }; + C8D1CFDF13E22A6700F0EAC6 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait~ipad.png"; sourceTree = ""; }; + C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WOLF_57.png; sourceTree = ""; }; + C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WOLF_114.png; sourceTree = ""; }; + C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WOLF_72.png; sourceTree = ""; }; ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arialGlyphRects.h; sourceTree = ""; }; ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_alerts.h; sourceTree = ""; }; ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_alerts.m; sourceTree = ""; }; @@ -270,7 +565,6 @@ ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_downloadUserMap.m; sourceTree = ""; }; ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_mapselector.c; sourceTree = ""; }; ED0A8D101069ACA8001E0547 /* iphone_store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_store.h; sourceTree = ""; }; - ED0A8D111069ACA8001E0547 /* iphone_store.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iphone_store.m; sourceTree = ""; }; ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -279,14 +573,16 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, + 3D3ED8D113BF775B00C5B1DF /* OpenAL.framework in Frameworks */, 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */, - 43E8D4E00F51B48B003F09B2 /* OpenAL.framework in Frameworks */, - 4333CCE80F5CC23E00AE2B6F /* AudioToolbox.framework in Frameworks */, - 43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */, - 720EBBAE0F82E0BB003F989A /* QuartzCore.framework in Frameworks */, + 3D3ED8EB13BF77A800C5B1DF /* QuartzCore.framework in Frameworks */, ED3703B4106C1CD40059C5F8 /* SystemConfiguration.framework in Frameworks */, + 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, + 3D3ED95B13BF77FA00C5B1DF /* AudioToolbox.framework in Frameworks */, + 3D24FF3913D77577009FC7A7 /* StoreKit.framework in Frameworks */, + 3DB8734113FACAD20050FB2A /* AVFoundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -305,11 +601,16 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */, + C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */, + C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */, + C8D1CFDF13E22A6700F0EAC6 /* Default-Portrait~ipad.png */, + 3D86D68A13DF172B00186487 /* POSITYPE-idSettler10v2.otf */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, + 3D15A41A13C6BA0B00FBFAA2 /* Resources-iPad */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, - 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */, ); name = CustomTemplate; sourceTree = ""; @@ -318,30 +619,34 @@ isa = PBXGroup; children = ( ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */, + 3D5C0C7513DF8F78008ECBD1 /* controllers */, + 7229CE450F6C89F8004123C5 /* EAGLView.h */, + 7229CE460F6C89F8004123C5 /* EAGLView.m */, + 72935B180F6B2D630085DD28 /* env */, + 7229CE540F6C8CDE004123C5 /* gles_glue.c */, + 72B5FF380F7E5C3D00C8A372 /* hud.c */, ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */, ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */, ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */, ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */, + 43CF03090F56D5C200E4A23D /* iphone_loop.c */, + 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */, ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */, + 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */, ED0A8D101069ACA8001E0547 /* iphone_store.h */, - ED0A8D111069ACA8001E0547 /* iphone_store.m */, - 72935B180F6B2D630085DD28 /* env */, + 3D24009D13D89BF4009FC7A7 /* iphone_store.m */, + 43AF6B940F996DA200777569 /* iphone_sys.m */, + 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */, + 29B97316FDCFA39411CA2CEA /* main.m */, + 3D5C0FD613E10204008ECBD1 /* MissionTableViewCell.h */, + 3D5C0FD713E10204008ECBD1 /* MissionTableViewCell.m */, 7229CC5A0F6B324A004123C5 /* tremor */, + 3D5C0C7613DF8FAF008ECBD1 /* utilities */, 72935B190F6B2D720085DD28 /* wolf */, 32CA4F630368D1EE00C91783 /* wolf3d_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - 7229CE540F6C8CDE004123C5 /* gles_glue.c */, - 7229CE450F6C89F8004123C5 /* EAGLView.h */, - 7229CE460F6C89F8004123C5 /* EAGLView.m */, - 72B5FF380F7E5C3D00C8A372 /* hud.c */, 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */, 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */, 7229CC8E0F6B3363004123C5 /* wolfiphone.h */, - 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */, - 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */, - 43CF03090F56D5C200E4A23D /* iphone_loop.c */, - 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */, - 43AF6B940F996DA200777569 /* iphone_sys.m */, ); name = "Other Sources"; sourceTree = ""; @@ -349,11 +654,13 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( - 43E341280F9BB4B6003C5D00 /* wolf3dlite_icon.png */, + 3D5C0CFE13DF9AD5008ECBD1 /* views */, + 3D5C0CFD13DF9ABF008ECBD1 /* menu_art */, 43CF02FE0F56974E00E4A23D /* Default.png */, - 43CF02EC0F56955F00E4A23D /* wolf3d_icon.png */, - 28AD733E0D9D9553002E5188 /* MainWindow.xib */, + 3DB873FE13FB3C0E0050FB2A /* wondering.caf */, 8D1107310486CEB800E47090 /* Info.plist */, + 43CF02EC0F56955F00E4A23D /* wolf3d_icon.png */, + 43E341280F9BB4B6003C5D00 /* wolf3dlite_icon.png */, ); name = Resources; sourceTree = ""; @@ -361,17 +668,208 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( - ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */, - 720EBBAD0F82E0BB003F989A /* QuartzCore.framework */, - 4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */, - 43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */, + 3D3ED95A13BF77FA00C5B1DF /* AudioToolbox.framework */, + 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */, + 1D30AB110D05D00D00671497 /* Foundation.framework */, + 3D3ED8D013BF775B00C5B1DF /* OpenAL.framework */, 28FD14FF0DC6FC520079059D /* OpenGLES.framework */, + 3D3ED8EA13BF77A800C5B1DF /* QuartzCore.framework */, + ED3703B3106C1CD40059C5F8 /* SystemConfiguration.framework */, 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, + 3D24FF3813D77577009FC7A7 /* StoreKit.framework */, + 3DB8734013FACAD20050FB2A /* AVFoundation.framework */, ); name = Frameworks; sourceTree = ""; }; + 3D15A41A13C6BA0B00FBFAA2 /* Resources-iPad */ = { + isa = PBXGroup; + children = ( + 3D5C0D0F13DF9B82008ECBD1 /* views */, + ); + name = "Resources-iPad"; + sourceTree = ""; + }; + 3D5C0C7513DF8F78008ECBD1 /* controllers */ = { + isa = PBXGroup; + children = ( + C81E11A713E2112100B1049A /* SettingsViewController.h */, + C81E11A813E2112100B1049A /* SettingsViewController.m */, + 3D5C0CF513DF9A5D008ECBD1 /* CreditsViewController.h */, + 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */, + 3D5C0C2913DF6836008ECBD1 /* EpisodeViewController.h */, + 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */, + 3D5C0CF813DF9A8E008ECBD1 /* LegalViewController.h */, + 3D5C0CF913DF9A8E008ECBD1 /* LegalViewController.m */, + 3D5C0C4913DF800E008ECBD1 /* LevelSelectViewController.h */, + 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */, + 3D86CF8B13DDE51800186487 /* MainMenuViewController.h */, + 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */, + 3D3ED73D13BF554400C5B1DF /* wolf3dViewController.h */, + 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */, + 3D5C0DE013E05D4D008ECBD1 /* TriviaViewController.h */, + 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */, + 3D10C3E213F33AB700DF5856 /* SkillViewController.h */, + 3D10C3E313F33AB700DF5856 /* SkillViewController.m */, + ); + name = controllers; + sourceTree = ""; + }; + 3D5C0C7613DF8FAF008ECBD1 /* utilities */ = { + isa = PBXGroup; + children = ( + 3DDD3A2313DF231100967735 /* UIFontButton.m */, + 3DDD3A2513DF232900967735 /* UIFontButton.h */, + 3D5C0C6E13DF88F8008ECBD1 /* UIFontLabel.h */, + 3D5C0C6F13DF8920008ECBD1 /* UIFontLabel.m */, + 3D10C39D13F3212A00DF5856 /* WolfSlider.h */, + 3D10C39E13F3212A00DF5856 /* WolfSlider.m */, + 3DBC68B113F58BCC002A8253 /* UITableViewScrolling.h */, + 3DBC68B213F58BCC002A8253 /* UITableViewScrolling.m */, + ); + name = utilities; + sourceTree = ""; + }; + 3D5C0CFD13DF9ABF008ECBD1 /* menu_art */ = { + isa = PBXGroup; + children = ( + 35E6E15413F3172F0010F530 /* adv_btn.png */, + 3534C96913E2485F00740F63 /* adv_button_frame.png */, + 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */, + 3DE8824713E35E5000C95AE8 /* arialImageLAL_white-alpha.png */, + 350CCF9D13DF8C47003303AB /* back_arrow.png */, + 3DE8824913E35E5000C95AE8 /* button_back.png */, + 3DE8824A13E35E5000C95AE8 /* button_downloads.png */, + 3555CC3F13E2001A006E7D2F /* button_highlight.png */, + 3DE8824B13E35E5000C95AE8 /* button_knife.png */, + 3DE8824C13E35E5000C95AE8 /* button_left.png */, + 3DE8824D13E35E5000C95AE8 /* button_more.png */, + 3DE8824E13E35E5000C95AE8 /* button_new.png */, + 3DE8824F13E35E5000C95AE8 /* button_pistol.png */, + 3DE8825013E35E5000C95AE8 /* button_resume.png */, + 3DE8825113E35E5000C95AE8 /* button_right.png */, + 3DE8825213E35E5000C95AE8 /* button_settings.png */, + 3DE8825313E35E5000C95AE8 /* button_trivia.png */, + 3DE8825413E35E5000C95AE8 /* button_web.png */, + 35048AAC13E0A03A00516B10 /* credits_bg.png */, + 350BA59413F34F7900FAE7E4 /* difficulty_head1.png */, + 350BA59513F34F7900FAE7E4 /* difficulty_head2.png */, + 350BA59613F34F7900FAE7E4 /* difficulty_head3.png */, + 350BA59713F34F7900FAE7E4 /* difficulty_head4.png */, + 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */, + 35048AD613E0E98800516B10 /* difficulty_star1.png */, + 35048AD713E0E98800516B10 /* difficulty_star2.png */, + 35048AD813E0E98800516B10 /* difficulty_star3.png */, + 35048AD913E0E98800516B10 /* difficulty_star4.png */, + 3DE8825513E35E5000C95AE8 /* diractional_01.png */, + 3DE8825613E35E5000C95AE8 /* diractional_02.png */, + 3DE8825713E35E5000C95AE8 /* diractional_03.png */, + 35E6E16813F318A50010F530 /* down_arrow.png */, + 350CCF9A13DF8B0E003303AB /* episode_bg.png */, + 3DF1804213F44D6700ED668A /* episode_bracket.png */, + 3DF1804313F44D6700ED668A /* episode_divider.png */, + 3DE8825B13E35E5000C95AE8 /* GODMODEFACE0PIC.png */, + 3DE8825C13E35E5000C95AE8 /* GODMODEFACE1PIC.png */, + 3DE8825D13E35E5000C95AE8 /* GODMODEFACE2PIC.png */, + 3DE8825E13E35E5000C95AE8 /* header_advanced.png */, + 3DE8825F13E35E5000C95AE8 /* header_ep1.png */, + 3DE8826813E35E5000C95AE8 /* header_ep10.png */, + 3DE8826913E35E5000C95AE8 /* header_ep11.png */, + 3DE8826013E35E5000C95AE8 /* header_ep2.png */, + 3DE8826113E35E5000C95AE8 /* header_ep3.png */, + 3DE8826213E35E5000C95AE8 /* header_ep4.png */, + 3DE8826313E35E5000C95AE8 /* header_ep5.png */, + 3DE8826413E35E5000C95AE8 /* header_ep6.png */, + 3DE8826513E35E5000C95AE8 /* header_ep7.png */, + 3DE8826613E35E5000C95AE8 /* header_ep8.png */, + 3DE8826713E35E5000C95AE8 /* header_ep9.png */, + 35E6E16313F318600010F530 /* highlight_bracket.png */, + 3DE8826A13E35E5000C95AE8 /* intermission.png */, + 3DE8826B13E35E5000C95AE8 /* iphone_image.png */, + 35048ABD13E0D51600516B10 /* iphone_preset_1.png */, + 3D5C0F7F13E0FC46008ECBD1 /* iphone_preset_2.png */, + 3D5C0F8013E0FC46008ECBD1 /* iphone_preset_3.png */, + 3D5C0F8113E0FC46008ECBD1 /* iphone_preset_4.png */, + 3DE8826D13E35E5000C95AE8 /* kills.png */, + 3DE8826C13E35E5000C95AE8 /* kills_shadow.png */, + 35E6E15E13F318420010F530 /* left_chevron.png */, + 3D5C0D0913DF9B41008ECBD1 /* main_bg.png */, + 3DE8826F13E35E5000C95AE8 /* map.png */, + 3DE8826E13E35E5000C95AE8 /* map_background.png */, + 3DE8827113E35E5000C95AE8 /* menu.png */, + 3DE8827013E35E5000C95AE8 /* menu_bar.png */, + 350CCFCD13DF8DED003303AB /* mission_bg.png */, + 3DE8827213E35E5000C95AE8 /* music_off.png */, + 3DE8827313E35E5000C95AE8 /* music_on.png */, + 35048AA913E07E7800516B10 /* next_arrow.png */, + 3DE8827513E35E5000C95AE8 /* partime.png */, + 3DE8827413E35E5000C95AE8 /* partime_shadow.png */, + 3534C96B13E2486700740F63 /* preset_frame.png */, + 35E6E15F13F318420010F530 /* right_chevron.png */, + 3DE8827713E35E5000C95AE8 /* secrets.png */, + 3DE8827613E35E5000C95AE8 /* secrets_shadow.png */, + 35E6E15913F3182C0010F530 /* settings_divider.png */, + 3DBC68E613F599B4002A8253 /* settings_line_art.png */, + 35E6E19F13F321A50010F530 /* settings_slider_blue.png */, + 3589EBA513F5E3DC005FBE56 /* settings_slider_blue~ipad.png */, + 35E6E1A013F321A50010F530 /* settings_slider_grey.png */, + 3589EBA613F5E3DC005FBE56 /* settings_slider_grey~ipad.png */, + 35E6E1A113F321A50010F530 /* settings_slider_white.png */, + 3589EBA713F5E3DC005FBE56 /* settings_slider_white~ipad.png */, + 3DE8827813E35E5000C95AE8 /* shoot.png */, + 3DE8827913E35E5000C95AE8 /* side_2_side.png */, + C81E121B13E225FB00B1049A /* slider.png */, + 3DE8827C13E35E5000C95AE8 /* slider_bar.png */, + 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */, + 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */, + 3DE8827D13E35E5000C95AE8 /* slider_knob.png */, + 35E6E17413F3196A0010F530 /* star_icon.png */, + 3DE8827F13E35E5000C95AE8 /* stats.png */, + 3DE8827E13E35E5000C95AE8 /* stats_large.png */, + 3DE8828013E35E5000C95AE8 /* status_hud.png */, + 3DE8828113E35E5000C95AE8 /* submenus_background_image.png */, + 3DE8828313E35E5000C95AE8 /* treasure.png */, + 3DE8828213E35E5000C95AE8 /* treasure_shadow.png */, + 35E6E15A13F3182C0010F530 /* up_arrow.png */, + 3DE8828413E35E5000C95AE8 /* up_down.png */, + 3DE8828513E35E5000C95AE8 /* victory_256.png */, + 35048ABB13E0D2EA00516B10 /* wolf_bg.png */, + ); + name = menu_art; + sourceTree = ""; + }; + 3D5C0CFE13DF9AD5008ECBD1 /* views */ = { + isa = PBXGroup; + children = ( + 3D5C0C2613DF6701008ECBD1 /* EpisodeView.xib */, + 3D86CF8A13DDE51800186487 /* MainMenuView.xib */, + 3DDD3A2013DF228500967735 /* SettingsView.xib */, + 3D5C0C4C13DF8084008ECBD1 /* LevelSelectView.xib */, + 3D5C0D3013DFA0DF008ECBD1 /* CreditsView.xib */, + 3D5C0D3213DFA0EA008ECBD1 /* LegalView.xib */, + 3D5C0DF413E063F5008ECBD1 /* TriviaView.xib */, + 3D10C3F113F33D3700DF5856 /* SkillView.xib */, + 3D10C37A13F310F700DF5856 /* EpisodeCell.xib */, + ); + name = views; + sourceTree = ""; + }; + 3D5C0D0F13DF9B82008ECBD1 /* views */ = { + isa = PBXGroup; + children = ( + 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */, + 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */, + 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */, + 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */, + 356D306E13F9820900EDDACE /* SkillView~ipad.xib */, + 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */, + 3534C87313E208F400740F63 /* CreditsView~ipad.xib */, + 3534C87413E208F400740F63 /* TriviaView~ipad.xib */, + 3D5C0D2B13DF9D9B008ECBD1 /* MainMenuView~ipad.xib */, + ); + name = views; + sourceTree = ""; + }; 7229CC5A0F6B324A004123C5 /* tremor */ = { isa = PBXGroup; children = ( @@ -552,10 +1050,17 @@ isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "wolf3d" */; compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; - projectRoot = ""; + projectRoot = ../../../; targets = ( 1D6058900D05DD3D006BFB54 /* wolf3d */, ); @@ -567,11 +1072,135 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 43CF02ED0F56955F00E4A23D /* wolf3d_icon.png in Resources */, 43CF02FF0F56974E00E4A23D /* Default.png in Resources */, 4364BF3F0F5CB25900F29317 /* dist.plist in Resources */, 43E341290F9BB4B6003C5D00 /* wolf3dlite_icon.png in Resources */, + 3D86CF8D13DDE51800186487 /* MainMenuView.xib in Resources */, + 3D86D68B13DF172B00186487 /* POSITYPE-idSettler10v2.otf in Resources */, + 3DDD3A2113DF228500967735 /* SettingsView.xib in Resources */, + 3D5C0C2713DF6701008ECBD1 /* EpisodeView.xib in Resources */, + 3D5C0C4D13DF8084008ECBD1 /* LevelSelectView.xib in Resources */, + 350CCF9B13DF8B0E003303AB /* episode_bg.png in Resources */, + 350CCF9F13DF8C47003303AB /* back_arrow.png in Resources */, + 350CCFA013DF8C47003303AB /* difficulty_selection_box.png in Resources */, + 350CCFCE13DF8DED003303AB /* mission_bg.png in Resources */, + 3D5C0D0A13DF9B41008ECBD1 /* main_bg.png in Resources */, + 3D5C0D2C13DF9D9B008ECBD1 /* MainMenuView~ipad.xib in Resources */, + 3D5C0D3113DFA0DF008ECBD1 /* CreditsView.xib in Resources */, + 3D5C0D3313DFA0EA008ECBD1 /* LegalView.xib in Resources */, + 3D5C0DF513E063F5008ECBD1 /* TriviaView.xib in Resources */, + 35048AAA13E07E7800516B10 /* next_arrow.png in Resources */, + 35048AAD13E0A03A00516B10 /* credits_bg.png in Resources */, + 35048ABC13E0D2EA00516B10 /* wolf_bg.png in Resources */, + 35048AC113E0D51600516B10 /* iphone_preset_1.png in Resources */, + 35048ADA13E0E98800516B10 /* difficulty_star1.png in Resources */, + 35048ADB13E0E98800516B10 /* difficulty_star2.png in Resources */, + 35048ADC13E0E98800516B10 /* difficulty_star3.png in Resources */, + 35048ADD13E0E98800516B10 /* difficulty_star4.png in Resources */, + 3D5C0F8213E0FC46008ECBD1 /* iphone_preset_2.png in Resources */, + 3D5C0F8313E0FC46008ECBD1 /* iphone_preset_3.png in Resources */, + 3D5C0F8413E0FC46008ECBD1 /* iphone_preset_4.png in Resources */, + 3555CC4013E2001A006E7D2F /* button_highlight.png in Resources */, + 3534C87513E208F400740F63 /* CreditsView~ipad.xib in Resources */, + 3534C87613E208F400740F63 /* TriviaView~ipad.xib in Resources */, + 3534C88F13E220CE00740F63 /* LegalView~ipad.xib in Resources */, + C81E121C13E225FB00B1049A /* slider.png in Resources */, + C8D1CFE013E22A6700F0EAC6 /* Default-Portrait~ipad.png in Resources */, + C8D1CFE413E22B5200F0EAC6 /* WOLF_57.png in Resources */, + C8D1CFE613E22B5B00F0EAC6 /* WOLF_114.png in Resources */, + C8D1CFE813E22B6800F0EAC6 /* WOLF_72.png in Resources */, + 3534C95C13E241AB00740F63 /* LevelSelectView~ipad.xib in Resources */, + 3534C95E13E241B100740F63 /* EpisodeView~ipad.xib in Resources */, + 3534C96A13E2485F00740F63 /* adv_button_frame.png in Resources */, + 3534C96C13E2486700740F63 /* preset_frame.png in Resources */, + 3534C97F13E24E0E00740F63 /* SettingsView~ipad.xib in Resources */, + 3DE8828613E35E5000C95AE8 /* arialImageLAL_white-alpha.png in Resources */, + 3DE8828713E35E5000C95AE8 /* arialImageLAL.png in Resources */, + 3DE8828813E35E5000C95AE8 /* button_back.png in Resources */, + 3DE8828913E35E5000C95AE8 /* button_downloads.png in Resources */, + 3DE8828A13E35E5000C95AE8 /* button_knife.png in Resources */, + 3DE8828B13E35E5000C95AE8 /* button_left.png in Resources */, + 3DE8828C13E35E5000C95AE8 /* button_more.png in Resources */, + 3DE8828D13E35E5000C95AE8 /* button_new.png in Resources */, + 3DE8828E13E35E5000C95AE8 /* button_pistol.png in Resources */, + 3DE8828F13E35E5000C95AE8 /* button_resume.png in Resources */, + 3DE8829013E35E5000C95AE8 /* button_right.png in Resources */, + 3DE8829113E35E5000C95AE8 /* button_settings.png in Resources */, + 3DE8829213E35E5000C95AE8 /* button_trivia.png in Resources */, + 3DE8829313E35E5000C95AE8 /* button_web.png in Resources */, + 3DE8829413E35E5000C95AE8 /* diractional_01.png in Resources */, + 3DE8829513E35E5000C95AE8 /* diractional_02.png in Resources */, + 3DE8829613E35E5000C95AE8 /* diractional_03.png in Resources */, + 3DE8829A13E35E5000C95AE8 /* GODMODEFACE0PIC.png in Resources */, + 3DE8829B13E35E5000C95AE8 /* GODMODEFACE1PIC.png in Resources */, + 3DE8829C13E35E5000C95AE8 /* GODMODEFACE2PIC.png in Resources */, + 3DE8829D13E35E5000C95AE8 /* header_advanced.png in Resources */, + 3DE8829E13E35E5000C95AE8 /* header_ep1.png in Resources */, + 3DE8829F13E35E5000C95AE8 /* header_ep2.png in Resources */, + 3DE882A013E35E5000C95AE8 /* header_ep3.png in Resources */, + 3DE882A113E35E5000C95AE8 /* header_ep4.png in Resources */, + 3DE882A213E35E5000C95AE8 /* header_ep5.png in Resources */, + 3DE882A313E35E5000C95AE8 /* header_ep6.png in Resources */, + 3DE882A413E35E5000C95AE8 /* header_ep7.png in Resources */, + 3DE882A513E35E5000C95AE8 /* header_ep8.png in Resources */, + 3DE882A613E35E5000C95AE8 /* header_ep9.png in Resources */, + 3DE882A713E35E5000C95AE8 /* header_ep10.png in Resources */, + 3DE882A813E35E5000C95AE8 /* header_ep11.png in Resources */, + 3DE882A913E35E5000C95AE8 /* intermission.png in Resources */, + 3DE882AA13E35E5000C95AE8 /* iphone_image.png in Resources */, + 3DE882AB13E35E5000C95AE8 /* kills_shadow.png in Resources */, + 3DE882AC13E35E5000C95AE8 /* kills.png in Resources */, + 3DE882AD13E35E5000C95AE8 /* map_background.png in Resources */, + 3DE882AE13E35E5000C95AE8 /* map.png in Resources */, + 3DE882AF13E35E5000C95AE8 /* menu_bar.png in Resources */, + 3DE882B013E35E5000C95AE8 /* menu.png in Resources */, + 3DE882B113E35E5000C95AE8 /* music_off.png in Resources */, + 3DE882B213E35E5000C95AE8 /* music_on.png in Resources */, + 3DE882B313E35E5000C95AE8 /* partime_shadow.png in Resources */, + 3DE882B413E35E5000C95AE8 /* partime.png in Resources */, + 3DE882B513E35E5000C95AE8 /* secrets_shadow.png in Resources */, + 3DE882B613E35E5000C95AE8 /* secrets.png in Resources */, + 3DE882B713E35E5000C95AE8 /* shoot.png in Resources */, + 3DE882B813E35E5000C95AE8 /* side_2_side.png in Resources */, + 3DE882B913E35E5000C95AE8 /* slider_bar_rainbow.png in Resources */, + 3DE882BA13E35E5000C95AE8 /* slider_bar_underlay.png in Resources */, + 3DE882BB13E35E5000C95AE8 /* slider_bar.png in Resources */, + 3DE882BC13E35E5000C95AE8 /* slider_knob.png in Resources */, + 3DE882BD13E35E5000C95AE8 /* stats_large.png in Resources */, + 3DE882BE13E35E5000C95AE8 /* stats.png in Resources */, + 3DE882BF13E35E5000C95AE8 /* status_hud.png in Resources */, + 3DE882C013E35E5000C95AE8 /* submenus_background_image.png in Resources */, + 3DE882C113E35E5000C95AE8 /* treasure_shadow.png in Resources */, + 3DE882C213E35E5000C95AE8 /* treasure.png in Resources */, + 3DE882C313E35E5000C95AE8 /* up_down.png in Resources */, + 3DE882C413E35E5000C95AE8 /* victory_256.png in Resources */, + 35E6E15513F3172F0010F530 /* adv_btn.png in Resources */, + 35E6E15B13F3182C0010F530 /* settings_divider.png in Resources */, + 35E6E15C13F3182C0010F530 /* up_arrow.png in Resources */, + 35E6E16013F318420010F530 /* left_chevron.png in Resources */, + 35E6E16113F318420010F530 /* right_chevron.png in Resources */, + 35E6E16413F318600010F530 /* highlight_bracket.png in Resources */, + 35E6E16913F318A50010F530 /* down_arrow.png in Resources */, + 35E6E17513F3196A0010F530 /* star_icon.png in Resources */, + 35E6E1A213F321A50010F530 /* settings_slider_blue.png in Resources */, + 35E6E1A313F321A50010F530 /* settings_slider_grey.png in Resources */, + 35E6E1A413F321A50010F530 /* settings_slider_white.png in Resources */, + 3D10C37B13F310F700DF5856 /* EpisodeCell.xib in Resources */, + 3D10C3F213F33D3700DF5856 /* SkillView.xib in Resources */, + 350BA59813F34F7900FAE7E4 /* difficulty_head1.png in Resources */, + 350BA59913F34F7900FAE7E4 /* difficulty_head2.png in Resources */, + 350BA59A13F34F7900FAE7E4 /* difficulty_head3.png in Resources */, + 350BA59B13F34F7900FAE7E4 /* difficulty_head4.png in Resources */, + 3DF1804413F44D6700ED668A /* episode_bracket.png in Resources */, + 3DF1804513F44D6700ED668A /* episode_divider.png in Resources */, + 3DBC68E713F599B4002A8253 /* settings_line_art.png in Resources */, + 3589EBA813F5E3DC005FBE56 /* settings_slider_blue~ipad.png in Resources */, + 3589EBA913F5E3DC005FBE56 /* settings_slider_grey~ipad.png in Resources */, + 3589EBAA13F5E3DC005FBE56 /* settings_slider_white~ipad.png in Resources */, + 356D306D13F9820400EDDACE /* EpisodeCell~ipad.xib in Resources */, + 356D306F13F9820900EDDACE /* SkillView~ipad.xib in Resources */, + 3DB873FF13FB3C0E0050FB2A /* wondering.caf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -678,7 +1307,21 @@ ED0A8D131069ACA8001E0547 /* iphone_downloadSOD.m in Sources */, ED0A8D141069ACA8001E0547 /* iphone_downloadUserMap.m in Sources */, ED0A8D151069ACA8001E0547 /* iphone_mapselector.c in Sources */, - ED0A8D161069ACA8001E0547 /* iphone_store.m in Sources */, + 3D3ED73F13BF554400C5B1DF /* wolf3dViewController.m in Sources */, + 3D24009E13D89BF4009FC7A7 /* iphone_store.m in Sources */, + 3D86CF8E13DDE51800186487 /* MainMenuViewController.m in Sources */, + 3DDD3A2413DF231100967735 /* UIFontButton.m in Sources */, + 3D5C0C2B13DF6836008ECBD1 /* EpisodeViewController.m in Sources */, + 3D5C0C4B13DF800E008ECBD1 /* LevelSelectViewController.m in Sources */, + 3D5C0C7013DF8920008ECBD1 /* UIFontLabel.m in Sources */, + 3D5C0CF713DF9A5D008ECBD1 /* CreditsViewController.m in Sources */, + 3D5C0CFA13DF9A8E008ECBD1 /* LegalViewController.m in Sources */, + 3D5C0DE213E05D4D008ECBD1 /* TriviaViewController.m in Sources */, + 3D5C0FD813E10204008ECBD1 /* MissionTableViewCell.m in Sources */, + C81E11A913E2112100B1049A /* SettingsViewController.m in Sources */, + 3D10C39F13F3212A00DF5856 /* WolfSlider.m in Sources */, + 3D10C3E413F33AB700DF5856 /* SkillViewController.m in Sources */, + 3DBC68B313F58BCC002A8253 /* UITableViewScrolling.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -689,10 +1332,9 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Cass Everitt"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = IPHONE; @@ -700,7 +1342,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "94041F5C-2EDC-4F49-AF97-95ECE6BB398D"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -708,7 +1351,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; @@ -717,7 +1360,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; @@ -729,11 +1373,13 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Cass Everitt"; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E2E91433-8CD1-46DB-9DC5-B7E4C84FD1C2"; - SDKROOT = iphoneos2.0; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = AdHocDistLite; @@ -742,7 +1388,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Cass Everitt"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; @@ -754,7 +1400,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "42086F40-083A-4573-8902-E1E628A229ED"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = AdHocDistLite; }; @@ -763,14 +1410,16 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CODE_SIGN_ENTITLEMENTS = dist.plist; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Cass Everitt"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E2E91433-8CD1-46DB-9DC5-B7E4C84FD1C2"; - SDKROOT = iphoneos2.0; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = AdHocDist; @@ -779,7 +1428,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Cass Everitt"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; @@ -788,7 +1437,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "42086F40-083A-4573-8902-E1E628A229ED"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = AdHocDist; }; @@ -796,14 +1446,16 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722"; - SDKROOT = iphoneos2.0; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = ReleaseLite; @@ -812,7 +1464,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; @@ -824,7 +1476,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = ReleaseLite; }; @@ -834,11 +1487,14 @@ ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = "-DDEBUG"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; - SDKROOT = iphoneos2.0; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = DebugLite; @@ -847,7 +1503,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Cass Everitt"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -861,7 +1517,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "94041F5C-2EDC-4F49-AF97-95ECE6BB398D"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = DebugLite; }; @@ -871,11 +1528,15 @@ ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = "-DDEBUG"; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; - SDKROOT = iphoneos2.0; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = Debug; @@ -884,18 +1545,63 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; + GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_OBJC_EXCEPTIONS = NO; + GCC_OPTIMIZATION_LEVEL = 3; GCC_THUMB_SUPPORT = NO; + GCC_UNROLL_LOOPS = YES; + GCC_VERSION = 4.2; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "156B7F53-1BDC-4116-B0CC-F8CB2252E722"; - SDKROOT = iphoneos2.0; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = Release; }; + C8139B6B13FC40750094C2C0 /* DistributionLite */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; + PREBINDING = NO; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F"; + SDKROOT = iphoneos; + SYMROOT = ../../build; + }; + name = DistributionLite; + }; + C8139B6C13FC40750094C2C0 /* DistributionLite */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + COPY_PHASE_STRIP = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = wolf3d_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + LITE, + IPHONE, + ); + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = Info.plist; + PRODUCT_NAME = wolf3dlite; + PROFILE_PREFIX = nu.r3; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DistributionLite; + }; ED2751531083BE8C009C891E /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { @@ -903,11 +1609,13 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.2; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F"; - SDKROOT = iphoneos2.0; + SDKROOT = iphoneos; SYMROOT = ../../build; }; name = Distribution; @@ -916,7 +1624,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; @@ -925,7 +1633,8 @@ INFOPLIST_FILE = Info.plist; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Distribution; }; @@ -942,6 +1651,7 @@ 4364BF490F5CB27300F29317 /* AdHocDist */, 431181710F994C5400FF9351 /* AdHocDistLite */, ED2751541083BE8C009C891E /* Distribution */, + C8139B6C13FC40750094C2C0 /* DistributionLite */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -956,6 +1666,7 @@ 4364BF480F5CB27300F29317 /* AdHocDist */, 431181700F994C5400FF9351 /* AdHocDistLite */, ED2751531083BE8C009C891E /* Distribution */, + C8139B6B13FC40750094C2C0 /* DistributionLite */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ccc050f --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/UserInterfaceState.xcuserstate b/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..d358fa0 --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/UserInterfaceState.xcuserstate @@ -0,0 +1,13352 @@ + + + + + $archiver + NSKeyedArchiver + $objects + + $null + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 2 + + + CF$UID + 3 + + + NS.objects + + + CF$UID + 4 + + + CF$UID + 618 + + + + 04A960C0-F0FB-4FFE-8B33-9A3E3166F3A7 + IDEWorkspaceDocument + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 5 + + + CF$UID + 6 + + + CF$UID + 7 + + + CF$UID + 8 + + + CF$UID + 9 + + + CF$UID + 10 + + + NS.objects + + + CF$UID + 7 + + + CF$UID + 11 + + + CF$UID + 13 + + + CF$UID + 617 + + + CF$UID + 497 + + + CF$UID + 2 + + + + IDEActiveWorkspaceTabController + IDEOrderedWorkspaceTabControllers + IDEWorkspaceTabController_C6037F83-CE47-4CA3-8F0B-75B835318606 + IDEWindowFrame + IDEWindowToolbarIsVisible + IDEWorkspaceWindowControllerUniqueIdentifier + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 7 + + + + + $classes + + NSArray + NSObject + + $classname + NSArray + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 14 + + + CF$UID + 15 + + + CF$UID + 16 + + + CF$UID + 17 + + + CF$UID + 18 + + + CF$UID + 19 + + + CF$UID + 20 + + + CF$UID + 21 + + + NS.objects + + + CF$UID + 22 + + + CF$UID + 497 + + + CF$UID + 460 + + + CF$UID + 507 + + + CF$UID + 513 + + + CF$UID + 607 + + + CF$UID + 497 + + + CF$UID + 616 + + + + IDEEditorArea + IDEShowNavigator + AssistantEditorsLayout + IDEWorkspaceTabControllerUtilityAreaSplitView + IDENavigatorArea + IDEWorkspaceTabControllerDesignAreaSplitView + IDEShowUtilities + IDETabLabel + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 23 + + + CF$UID + 24 + + + CF$UID + 25 + + + CF$UID + 26 + + + CF$UID + 27 + + + CF$UID + 28 + + + CF$UID + 29 + + + CF$UID + 30 + + + NS.objects + + + CF$UID + 31 + + + CF$UID + 49 + + + CF$UID + 471 + + + CF$UID + 497 + + + CF$UID + 460 + + + CF$UID + 498 + + + CF$UID + 506 + + + CF$UID + 497 + + + + layoutTree + IDEEditorMode_Standard + IDEEDitorArea_DebugArea + IDEShowEditor + EditorMode + DebuggerSplitView + DefaultPersistentRepresentations + ShowDebuggerArea + + $class + + CF$UID + 48 + + geniusEditorContextNode + + CF$UID + 0 + + primaryEditorContextNode + + CF$UID + 32 + + rootLayoutTreeNode + + CF$UID + 45 + + + + $class + + CF$UID + 47 + + children + + CF$UID + 0 + + contentType + 1 + documentArchivableRepresentation + + CF$UID + 33 + + orientation + 0 + parent + + CF$UID + 45 + + + + $class + + CF$UID + 44 + + DocumentLocation + + CF$UID + 40 + + DomainIdentifier + + CF$UID + 34 + + IdentifierPath + + CF$UID + 35 + + IndexOfDocumentIdentifier + + CF$UID + 39 + + + Xcode.IDENavigableItemDomain.WorkspaceStructure + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 36 + + + + + $class + + CF$UID + 38 + + Identifier + + CF$UID + 37 + + + wolf3d + + $classes + + IDEArchivableStringIndexPair + NSObject + + $classname + IDEArchivableStringIndexPair + + 9223372036854775807 + + $class + + CF$UID + 43 + + documentURL + + CF$UID + 41 + + timestamp + + CF$UID + 0 + + + + $class + + CF$UID + 42 + + NS.string + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/wolf3d.xcodeproj/ + + + $classes + + NSMutableString + NSString + NSObject + + $classname + NSMutableString + + + $classes + + DVTDocumentLocation + NSObject + + $classname + DVTDocumentLocation + + + $classes + + IDENavigableItemArchivableRepresentation + NSObject + + $classname + IDENavigableItemArchivableRepresentation + + + $class + + CF$UID + 47 + + children + + CF$UID + 46 + + contentType + 0 + documentArchivableRepresentation + + CF$UID + 0 + + orientation + 0 + parent + + CF$UID + 0 + + + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 32 + + + + + $classes + + IDEWorkspaceTabControllerLayoutTreeNode + NSObject + + $classname + IDEWorkspaceTabControllerLayoutTreeNode + + + $classes + + IDEWorkspaceTabControllerLayoutTree + NSObject + + $classname + IDEWorkspaceTabControllerLayoutTree + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 50 + + + NS.objects + + + CF$UID + 51 + + + + EditorLayout_PersistentRepresentation + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 52 + + + NS.objects + + + CF$UID + 53 + + + + Main + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 54 + + + CF$UID + 55 + + + CF$UID + 56 + + + NS.objects + + + CF$UID + 57 + + + CF$UID + 460 + + + CF$UID + 469 + + + + EditorLayout_StateSavingStateDictionaries + EditorLayout_Selected + EditorLayout_Geometry + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 58 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 59 + + + CF$UID + 60 + + + CF$UID + 61 + + + CF$UID + 62 + + + CF$UID + 63 + + + CF$UID + 64 + + + CF$UID + 65 + + + NS.objects + + + CF$UID + 66 + + + CF$UID + 67 + + + CF$UID + 72 + + + CF$UID + 464 + + + CF$UID + 464 + + + CF$UID + 465 + + + CF$UID + 466 + + + + FileDataType + ArchivableRepresentation + EditorState + NavigableItemName + DocumentNavigableItemName + DocumentExtensionIdentifier + DocumentURL + com.apple.xcode.project + + $class + + CF$UID + 44 + + DocumentLocation + + CF$UID + 40 + + DomainIdentifier + + CF$UID + 34 + + IdentifierPath + + CF$UID + 68 + + IndexOfDocumentIdentifier + + CF$UID + 71 + + + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 69 + + + + + $class + + CF$UID + 38 + + Identifier + + CF$UID + 70 + + + wolf3d + 9223372036854775807 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 73 + + + CF$UID + 74 + + + CF$UID + 75 + + + CF$UID + 76 + + + CF$UID + 77 + + + NS.objects + + + CF$UID + 78 + + + CF$UID + 79 + + + CF$UID + 92 + + + CF$UID + 93 + + + CF$UID + 463 + + + + Xcode3ProjectEditorPreviousProjectEditorClass + Xcode3ProjectEditor.sourceList.splitview + Xcode3ProjectEditorPreviousTargetEditorClass + Xcode3ProjectEditorSelectedDocumentLocations + Xcode3ProjectEditor_Xcode3BuildSettingsEditor + Xcode3ProjectInfoEditor + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 81 + + + + DVTSplitViewItems + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 82 + + + CF$UID + 88 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 85 + + + CF$UID + 86 + + + + DVTIdentifier + DVTViewMagnitude + + 170 + + $classes + + NSDictionary + NSObject + + $classname + NSDictionary + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 85 + + + CF$UID + 89 + + + + 931 + + $classes + + NSMutableArray + NSArray + NSObject + + $classname + NSMutableArray + + + $classes + + NSMutableDictionary + NSDictionary + NSObject + + $classname + NSMutableDictionary + + Xcode3BuildSettingsEditor + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 94 + + + + + $class + + CF$UID + 462 + + documentURL + + CF$UID + 95 + + selection + + CF$UID + 97 + + timestamp + + CF$UID + 96 + + + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/wolf3d.xcodeproj/ + 334881995.84964103 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 98 + + + CF$UID + 99 + + + CF$UID + 100 + + + NS.objects + + + CF$UID + 101 + + + CF$UID + 102 + + + CF$UID + 103 + + + + Editor + Target + Xcode3BuildSettingsEditorLocations + Xcode3BuildSettingsEditor + wolf3d + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 104 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 105 + + + CF$UID + 106 + + + CF$UID + 107 + + + CF$UID + 108 + + + CF$UID + 109 + + + CF$UID + 110 + + + NS.objects + + + CF$UID + 111 + + + CF$UID + 458 + + + CF$UID + 460 + + + CF$UID + 460 + + + CF$UID + 460 + + + CF$UID + 461 + + + + Collapsed Build Property Categories + Selected Build Properties + Xcode3BuildSettingsEditorDisplayMode + Xcode3BuildPropertyValueDisplayMode + Xcode3BuildSettingsEditorMode + Xcode3BuildPropertyNameDisplayMode + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 112 + + + CF$UID + 113 + + + CF$UID + 114 + + + CF$UID + 115 + + + CF$UID + 116 + + + CF$UID + 117 + + + CF$UID + 118 + + + CF$UID + 119 + + + CF$UID + 120 + + + CF$UID + 121 + + + CF$UID + 122 + + + CF$UID + 123 + + + CF$UID + 124 + + + CF$UID + 125 + + + CF$UID + 126 + + + CF$UID + 127 + + + CF$UID + 128 + + + CF$UID + 129 + + + CF$UID + 130 + + + CF$UID + 131 + + + CF$UID + 132 + + + CF$UID + 133 + + + CF$UID + 134 + + + CF$UID + 135 + + + CF$UID + 136 + + + CF$UID + 137 + + + CF$UID + 138 + + + CF$UID + 139 + + + CF$UID + 140 + + + CF$UID + 141 + + + CF$UID + 142 + + + CF$UID + 143 + + + CF$UID + 144 + + + CF$UID + 145 + + + CF$UID + 146 + + + CF$UID + 147 + + + CF$UID + 148 + + + CF$UID + 149 + + + CF$UID + 150 + + + CF$UID + 151 + + + CF$UID + 152 + + + CF$UID + 153 + + + CF$UID + 154 + + + CF$UID + 155 + + + CF$UID + 156 + + + CF$UID + 157 + + + CF$UID + 158 + + + CF$UID + 159 + + + CF$UID + 160 + + + CF$UID + 161 + + + CF$UID + 162 + + + CF$UID + 163 + + + CF$UID + 164 + + + CF$UID + 165 + + + CF$UID + 166 + + + CF$UID + 167 + + + CF$UID + 168 + + + CF$UID + 169 + + + CF$UID + 170 + + + CF$UID + 171 + + + CF$UID + 172 + + + CF$UID + 173 + + + CF$UID + 174 + + + CF$UID + 175 + + + CF$UID + 176 + + + CF$UID + 177 + + + CF$UID + 178 + + + CF$UID + 179 + + + CF$UID + 180 + + + CF$UID + 181 + + + CF$UID + 182 + + + CF$UID + 183 + + + CF$UID + 184 + + + CF$UID + 185 + + + CF$UID + 186 + + + CF$UID + 187 + + + CF$UID + 188 + + + CF$UID + 189 + + + CF$UID + 190 + + + CF$UID + 191 + + + CF$UID + 192 + + + CF$UID + 193 + + + CF$UID + 194 + + + CF$UID + 195 + + + CF$UID + 196 + + + CF$UID + 197 + + + CF$UID + 198 + + + CF$UID + 199 + + + CF$UID + 200 + + + CF$UID + 201 + + + CF$UID + 202 + + + CF$UID + 203 + + + CF$UID + 204 + + + CF$UID + 205 + + + CF$UID + 206 + + + CF$UID + 207 + + + CF$UID + 208 + + + CF$UID + 209 + + + CF$UID + 210 + + + CF$UID + 211 + + + CF$UID + 212 + + + CF$UID + 213 + + + CF$UID + 214 + + + CF$UID + 215 + + + CF$UID + 216 + + + CF$UID + 217 + + + CF$UID + 218 + + + CF$UID + 219 + + + CF$UID + 220 + + + CF$UID + 221 + + + CF$UID + 222 + + + CF$UID + 223 + + + CF$UID + 224 + + + CF$UID + 225 + + + CF$UID + 226 + + + CF$UID + 227 + + + CF$UID + 228 + + + CF$UID + 229 + + + CF$UID + 230 + + + CF$UID + 231 + + + CF$UID + 232 + + + CF$UID + 233 + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + CF$UID + 238 + + + CF$UID + 239 + + + CF$UID + 240 + + + CF$UID + 241 + + + CF$UID + 242 + + + CF$UID + 243 + + + CF$UID + 244 + + + CF$UID + 245 + + + CF$UID + 246 + + + CF$UID + 247 + + + CF$UID + 248 + + + CF$UID + 249 + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + CF$UID + 254 + + + CF$UID + 255 + + + CF$UID + 256 + + + CF$UID + 257 + + + CF$UID + 258 + + + CF$UID + 259 + + + CF$UID + 260 + + + CF$UID + 261 + + + CF$UID + 262 + + + CF$UID + 263 + + + CF$UID + 264 + + + CF$UID + 265 + + + CF$UID + 266 + + + CF$UID + 267 + + + CF$UID + 268 + + + CF$UID + 269 + + + CF$UID + 270 + + + CF$UID + 271 + + + CF$UID + 272 + + + CF$UID + 273 + + + CF$UID + 274 + + + CF$UID + 275 + + + CF$UID + 276 + + + CF$UID + 277 + + + CF$UID + 278 + + + CF$UID + 279 + + + CF$UID + 280 + + + CF$UID + 281 + + + CF$UID + 282 + + + CF$UID + 283 + + + CF$UID + 284 + + + CF$UID + 285 + + + CF$UID + 286 + + + CF$UID + 287 + + + CF$UID + 288 + + + CF$UID + 289 + + + CF$UID + 290 + + + CF$UID + 291 + + + CF$UID + 292 + + + CF$UID + 293 + + + CF$UID + 294 + + + CF$UID + 295 + + + CF$UID + 296 + + + CF$UID + 297 + + + CF$UID + 298 + + + CF$UID + 299 + + + CF$UID + 300 + + + CF$UID + 301 + + + CF$UID + 302 + + + CF$UID + 303 + + + CF$UID + 304 + + + CF$UID + 305 + + + CF$UID + 306 + + + CF$UID + 307 + + + CF$UID + 308 + + + CF$UID + 309 + + + CF$UID + 310 + + + CF$UID + 311 + + + CF$UID + 312 + + + CF$UID + 313 + + + CF$UID + 314 + + + CF$UID + 315 + + + CF$UID + 316 + + + CF$UID + 317 + + + CF$UID + 318 + + + CF$UID + 319 + + + CF$UID + 320 + + + CF$UID + 321 + + + CF$UID + 322 + + + CF$UID + 323 + + + CF$UID + 324 + + + CF$UID + 325 + + + CF$UID + 326 + + + CF$UID + 327 + + + CF$UID + 328 + + + CF$UID + 329 + + + CF$UID + 330 + + + CF$UID + 331 + + + CF$UID + 332 + + + CF$UID + 333 + + + CF$UID + 334 + + + CF$UID + 335 + + + CF$UID + 336 + + + CF$UID + 337 + + + CF$UID + 338 + + + CF$UID + 339 + + + CF$UID + 340 + + + CF$UID + 341 + + + CF$UID + 342 + + + CF$UID + 343 + + + CF$UID + 344 + + + CF$UID + 345 + + + CF$UID + 346 + + + CF$UID + 347 + + + CF$UID + 348 + + + CF$UID + 349 + + + CF$UID + 350 + + + CF$UID + 351 + + + CF$UID + 352 + + + CF$UID + 353 + + + CF$UID + 354 + + + CF$UID + 355 + + + CF$UID + 356 + + + CF$UID + 357 + + + CF$UID + 358 + + + CF$UID + 359 + + + CF$UID + 360 + + + CF$UID + 361 + + + CF$UID + 362 + + + CF$UID + 363 + + + CF$UID + 364 + + + CF$UID + 365 + + + CF$UID + 366 + + + CF$UID + 367 + + + CF$UID + 368 + + + CF$UID + 369 + + + CF$UID + 370 + + + CF$UID + 371 + + + CF$UID + 372 + + + CF$UID + 373 + + + CF$UID + 374 + + + CF$UID + 375 + + + CF$UID + 376 + + + CF$UID + 377 + + + CF$UID + 378 + + + CF$UID + 379 + + + CF$UID + 380 + + + CF$UID + 381 + + + CF$UID + 382 + + + CF$UID + 383 + + + CF$UID + 384 + + + CF$UID + 385 + + + CF$UID + 386 + + + CF$UID + 387 + + + CF$UID + 388 + + + CF$UID + 389 + + + CF$UID + 390 + + + CF$UID + 391 + + + CF$UID + 392 + + + CF$UID + 393 + + + CF$UID + 394 + + + CF$UID + 395 + + + CF$UID + 396 + + + CF$UID + 397 + + + CF$UID + 398 + + + CF$UID + 399 + + + CF$UID + 400 + + + CF$UID + 401 + + + CF$UID + 402 + + + CF$UID + 403 + + + CF$UID + 404 + + + CF$UID + 405 + + + CF$UID + 406 + + + CF$UID + 407 + + + CF$UID + 408 + + + CF$UID + 409 + + + CF$UID + 410 + + + CF$UID + 411 + + + CF$UID + 412 + + + CF$UID + 413 + + + CF$UID + 414 + + + CF$UID + 415 + + + CF$UID + 416 + + + CF$UID + 417 + + + CF$UID + 418 + + + CF$UID + 419 + + + CF$UID + 420 + + + CF$UID + 421 + + + CF$UID + 422 + + + CF$UID + 423 + + + CF$UID + 424 + + + CF$UID + 425 + + + CF$UID + 426 + + + CF$UID + 427 + + + CF$UID + 428 + + + CF$UID + 429 + + + CF$UID + 430 + + + CF$UID + 431 + + + CF$UID + 432 + + + CF$UID + 433 + + + CF$UID + 434 + + + CF$UID + 435 + + + CF$UID + 436 + + + CF$UID + 437 + + + CF$UID + 438 + + + CF$UID + 439 + + + CF$UID + 440 + + + CF$UID + 441 + + + CF$UID + 442 + + + CF$UID + 443 + + + CF$UID + 444 + + + CF$UID + 445 + + + CF$UID + 446 + + + CF$UID + 447 + + + CF$UID + 448 + + + CF$UID + 449 + + + CF$UID + 450 + + + CF$UID + 451 + + + CF$UID + 452 + + + CF$UID + 453 + + + CF$UID + 454 + + + CF$UID + 455 + + + CF$UID + 456 + + + CF$UID + 457 + + + + + $class + + CF$UID + 42 + + NS.string + Architectures||ADDITIONAL_SDKS + + + $class + + CF$UID + 42 + + NS.string + Architectures||ARCHS + + + $class + + CF$UID + 42 + + NS.string + Architectures||SDKROOT + + + $class + + CF$UID + 42 + + NS.string + Architectures||ONLY_ACTIVE_ARCH + + + $class + + CF$UID + 42 + + NS.string + Architectures||SUPPORTED_PLATFORMS + + + $class + + CF$UID + 42 + + NS.string + Architectures||VALID_ARCHS + + + $class + + CF$UID + 42 + + NS.string + Build Locations||SYMROOT + + + $class + + CF$UID + 42 + + NS.string + Build Locations||OBJROOT + + + $class + + CF$UID + 42 + + NS.string + Build Locations||SHARED_PRECOMPS_DIR + + + $class + + CF$UID + 42 + + NS.string + Build Options||BUILD_VARIANTS + + + $class + + CF$UID + 42 + + NS.string + Build Options||DEBUG_INFORMATION_FORMAT + + + $class + + CF$UID + 42 + + NS.string + Build Options||ENABLE_OPENMP_SUPPORT + + + $class + + CF$UID + 42 + + NS.string + Build Options||GENERATE_PROFILING_CODE + + + $class + + CF$UID + 42 + + NS.string + Build Options||PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR + + + $class + + CF$UID + 42 + + NS.string + Build Options||RUN_CLANG_STATIC_ANALYZER + + + $class + + CF$UID + 42 + + NS.string + Build Options||SCAN_ALL_SOURCE_FILES_FOR_INCLUDES + + + $class + + CF$UID + 42 + + NS.string + Build Options||VALIDATE_PRODUCT + + + $class + + CF$UID + 42 + + NS.string + Code Signing||CODE_SIGN_RESOURCE_RULES_PATH + + + $class + + CF$UID + 42 + + NS.string + Code Signing||OTHER_CODE_SIGN_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Deployment||STRIPFLAGS + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_GROUP + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_OWNER + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_MODE + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_PERMISSIONS_FILES + + + $class + + CF$UID + 42 + + NS.string + Deployment||COMBINE_HIDPI_IMAGES + + + $class + + CF$UID + 42 + + NS.string + Deployment||DEPLOYMENT_LOCATION + + + $class + + CF$UID + 42 + + NS.string + Deployment||DEPLOYMENT_POSTPROCESSING + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_GROUP + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_OWNER + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_MODE_FLAG + + + $class + + CF$UID + 42 + + NS.string + Deployment||DSTROOT + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_PATH + + + $class + + CF$UID + 42 + + NS.string + Deployment||MACOSX_DEPLOYMENT_TARGET + + + $class + + CF$UID + 42 + + NS.string + Deployment||SKIP_INSTALL + + + $class + + CF$UID + 42 + + NS.string + Deployment||STRIP_INSTALLED_PRODUCT + + + $class + + CF$UID + 42 + + NS.string + Deployment||STRIP_STYLE + + + $class + + CF$UID + 42 + + NS.string + Deployment||TARGETED_DEVICE_FAMILY + + + $class + + CF$UID + 42 + + NS.string + Deployment||SEPARATE_STRIP + + + $class + + CF$UID + 42 + + NS.string + Deployment||IPHONEOS_DEPLOYMENT_TARGET + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_NAME + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_START + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_STOP + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_VERSION + + + $class + + CF$UID + 42 + + NS.string + Linking||BUNDLE_LOADER + + + $class + + CF$UID + 42 + + NS.string + Linking||STANDARD_C_PLUS_PLUS_LIBRARY_TYPE + + + $class + + CF$UID + 42 + + NS.string + Linking||DYLIB_COMPATIBILITY_VERSION + + + $class + + CF$UID + 42 + + NS.string + Linking||DYLIB_CURRENT_VERSION + + + $class + + CF$UID + 42 + + NS.string + Linking||DEAD_CODE_STRIPPING + + + $class + + CF$UID + 42 + + NS.string + Linking||LINKER_DISPLAYS_MANGLED_NAMES + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_NO_PIE + + + $class + + CF$UID + 42 + + NS.string + Linking||PRESERVE_DEAD_CODE_INITS_AND_TERMS + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_DYLIB_INSTALL_NAME + + + $class + + CF$UID + 42 + + NS.string + Linking||EXPORTED_SYMBOLS_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||INIT_ROUTINE + + + $class + + CF$UID + 42 + + NS.string + Linking||LINK_WITH_STANDARD_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + Linking||MACH_O_TYPE + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_OPENMP_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||ORDER_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||OTHER_LDFLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||GENERATE_MASTER_OBJECT_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||PRELINK_LIBS + + + $class + + CF$UID + 42 + + NS.string + Linking||KEEP_PRIVATE_EXTERNS + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_RUNPATH_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Linking||SEPARATE_SYMBOL_EDIT + + + $class + + CF$UID + 42 + + NS.string + Linking||PRELINK_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||SECTORDER_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||UNEXPORTED_SYMBOLS_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||WARNING_LDFLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_GENERATE_MAP_FILE + + + $class + + CF$UID + 42 + + NS.string + Packaging||COMPRESS_PNG_FILES + + + $class + + CF$UID + 42 + + NS.string + Packaging||APPLY_RULES_IN_COPY_FILES + + + $class + + CF$UID + 42 + + NS.string + Packaging||EXECUTABLE_EXTENSION + + + $class + + CF$UID + 42 + + NS.string + Packaging||EXECUTABLE_PREFIX + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_EXPAND_BUILD_SETTINGS + + + $class + + CF$UID + 42 + + NS.string + Packaging||GENERATE_PKGINFO_FILE + + + $class + + CF$UID + 42 + + NS.string + Packaging||FRAMEWORK_VERSION + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_FILE + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_OTHER_PREPROCESSOR_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_OUTPUT_FORMAT + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_PREPROCESSOR_DEFINITIONS + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_PREPROCESS + + + $class + + CF$UID + 42 + + NS.string + Packaging||COPYING_PRESERVES_HFS_DATA + + + $class + + CF$UID + 42 + + NS.string + Packaging||PLIST_FILE_OUTPUT_FORMAT + + + $class + + CF$UID + 42 + + NS.string + Packaging||STRINGS_FILE_OUTPUT_ENCODING + + + $class + + CF$UID + 42 + + NS.string + Packaging||WRAPPER_EXTENSION + + + $class + + CF$UID + 42 + + NS.string + Search Paths||ALWAYS_SEARCH_USER_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||FRAMEWORK_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||HEADER_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||LIBRARY_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||REZ_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES + + + $class + + CF$UID + 42 + + NS.string + Search Paths||INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES + + + $class + + CF$UID + 42 + + NS.string + Search Paths||USER_HEADER_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||OTHER_TEST_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||TEST_AFTER_BUILD + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||TEST_HOST + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||TEST_RIG + + + $class + + CF$UID + 42 + + NS.string + Versioning||CURRENT_PROJECT_VERSION + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_EXPORT_DECL + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_PREFIX + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_SUFFIX + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSIONING_SYSTEM + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_BUILDER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_FAST_OBJC_DISPATCH + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_OBJC_CALL_CXX_CDTORS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_STRICT_ALIASING + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_FEEDBACK_DIRECTED_OPTIMIZATION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_GENERATE_TEST_COVERAGE_FILES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_INSTRUMENT_PROGRAM_FLOW_ARCS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_REUSE_STRINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_NO_COMMON_BLOCKS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_OBJC_GC + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_FAST_MATH + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SYMBOL_SEPARATION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_THREADSAFE_STATICS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_CHAR_IS_UNSIGNED_CHAR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_ASM_KEYWORD + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_CHECK_RETURN_VALUE_OF_OPERATOR_NEW + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_CW_ASM_SYNTAX + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_INPUT_FILETYPE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_CPP_EXCEPTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_CPP_RTTI + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_TRIGRAPHS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_USE_REGISTER_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||OTHER_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||OTHER_CPLUSPLUSFLAGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_PRECOMPILE_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_PASCAL_STRINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_FORCE_CPU_SUBTYPE_ALL + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_SHORT_ENUMS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_SHADOW + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_MISSING_PARENTHESES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||WARNING_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_PEDANTIC + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_PROTOTYPE_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_SIGN_COMPARE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNDECLARED_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_FUNCTION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_LABEL + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_PARAMETER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_VALUE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_FLATTEN_NIBS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_OTHER_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_OVERRIDING_PLUGINS_AND_FRAMEWORKS_DIR + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_PLUGIN_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_PLUGINS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_ERRORS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_NOTICES + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_FAST_OBJC_DISPATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_OBJC_CALL_CXX_CDTORS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_STRICT_ALIASING + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_FEEDBACK_DIRECTED_OPTIMIZATION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_GENERATE_TEST_COVERAGE_FILES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_INSTRUMENT_PROGRAM_FLOW_ARCS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||LLVM_LTO + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_REUSE_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_NO_COMMON_BLOCKS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_OBJC_GC + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_FAST_MATH + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SYMBOL_SEPARATION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_THREADSAFE_STATICS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_CHAR_IS_UNSIGNED_CHAR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_ASM_KEYWORD + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_CHECK_RETURN_VALUE_OF_OPERATOR_NEW + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_CW_ASM_SYNTAX + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_INPUT_FILETYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_CPP_EXCEPTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_CPP_RTTI + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_TRIGRAPHS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_USE_REGISTER_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||OTHER_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||OTHER_CPLUSPLUSFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_PRECOMPILE_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_PASCAL_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_FORCE_CPU_SUBTYPE_ALL + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_SHORT_ENUMS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_SHADOW + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_MISSING_PARENTHESES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||WARNING_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_PEDANTIC + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_PROTOTYPE_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_SIGN_COMPARE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNDECLARED_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_FUNCTION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_LABEL + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_PARAMETER + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_VALUE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_FAST_OBJC_DISPATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_STRICT_ALIASING + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||LLVM_LTO + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_REUSE_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_NO_COMMON_BLOCKS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_OBJC_GC + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_FAST_MATH + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_THREADSAFE_STATICS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_CHAR_IS_UNSIGNED_CHAR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_ASM_KEYWORD + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_CW_ASM_SYNTAX + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_INPUT_FILETYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_CPP_EXCEPTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_CPP_RTTI + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_TRIGRAPHS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_USE_REGISTER_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||OTHER_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||OTHER_CPLUSPLUSFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_PRECOMPILE_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_PASCAL_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_FORCE_CPU_SUBTYPE_ALL + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_SHORT_ENUMS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_SHADOW + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_MISSING_PARENTHESES + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||WARNING_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_PEDANTIC + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_SIGN_COMPARE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNDECLARED_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_FUNCTION + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_LABEL + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_PARAMETER + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_VALUE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO + + + $class + + CF$UID + 42 + + NS.string + User-Defined||PREBINDING + + + $class + + CF$UID + 42 + + NS.string + User-Defined||PROFILE_PREFIX + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 459 + + + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_GROUP + + 0 + 1 + + $classes + + Xcode3ProjectDocumentLocation + DVTDocumentLocation + NSObject + + $classname + Xcode3ProjectDocumentLocation + + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + wolf3d + Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 467 + + + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/wolf3d.xcodeproj/ + + $classes + + NSURL + NSObject + + $classname + NSURL + + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 470 + + + + {{0, 0}, {1101, 716}} + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 472 + + + CF$UID + 473 + + + CF$UID + 474 + + + CF$UID + 475 + + + CF$UID + 476 + + + CF$UID + 477 + + + NS.objects + + + CF$UID + 461 + + + CF$UID + 478 + + + CF$UID + 480 + + + CF$UID + 461 + + + CF$UID + 483 + + + CF$UID + 491 + + + + LayoutFocusMode + console + variables + LayoutMode + IDEDebuggerAreaSplitView + IDEDebugArea_SplitView + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 479 + + + NS.objects + + + CF$UID + 460 + + + + ConsoleFilterMode + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 481 + + + NS.objects + + + CF$UID + 482 + + + + DBGVariablesViewFilterMode + 2 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 484 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 485 + + + CF$UID + 488 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 486 + + + CF$UID + 487 + + + + VariablesView + 373 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 489 + + + CF$UID + 490 + + + + ConsoleArea + 727 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 492 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 493 + + + CF$UID + 495 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 486 + + + CF$UID + 494 + + + + 373 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 489 + + + CF$UID + 496 + + + + 727 + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 499 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 500 + + + CF$UID + 503 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 501 + + + CF$UID + 502 + + + + IDEEditor + 738 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 504 + + + CF$UID + 505 + + + + IDEDebuggerArea + 214 + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 508 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 509 + + + CF$UID + 511 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 85 + + + CF$UID + 510 + + + + 728 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 85 + + + CF$UID + 512 + + + + 224 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 514 + + + CF$UID + 515 + + + CF$UID + 516 + + + CF$UID + 517 + + + CF$UID + 518 + + + CF$UID + 519 + + + CF$UID + 520 + + + CF$UID + 521 + + + NS.objects + + + CF$UID + 522 + + + CF$UID + 534 + + + CF$UID + 538 + + + CF$UID + 520 + + + CF$UID + 551 + + + CF$UID + 571 + + + CF$UID + 580 + + + CF$UID + 598 + + + + Xcode.IDEKit.Navigator.Symbol + Xcode.DebuggerKit.ThreadsStacksNavigator + Xcode.IDEKit.Navigator.BatchFind + SelectedNavigator + Xcode.IDEKit.Navigator.Issues + Xcode.IDEKit.Navigator.Breakpoints + Xcode.IDEKit.Navigator.Structure + Xcode.IDEKit.Navigator.Logs + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 523 + + + CF$UID + 524 + + + CF$UID + 525 + + + CF$UID + 526 + + + CF$UID + 527 + + + CF$UID + 528 + + + CF$UID + 529 + + + NS.objects + + + CF$UID + 530 + + + CF$UID + 497 + + + CF$UID + 497 + + + CF$UID + 497 + + + CF$UID + 531 + + + CF$UID + 532 + + + CF$UID + 533 + + + + IDEExpandedItems + IDESymbolNavigatorShowHierarchy + IDESymbolNavigatorShowWorkspaceOnly + IDESymbolNavigatorShowClassesOnly + IDESymbolNamePatternString + IDESymbolNavigatorSelectedSymbols + IDESymbolNavigatorShowContainersOnly + + $class + + CF$UID + 90 + + NS.objects + + + + + $class + + CF$UID + 90 + + NS.objects + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 535 + + + CF$UID + 536 + + + CF$UID + 537 + + + NS.objects + + + CF$UID + 482 + + + CF$UID + 460 + + + CF$UID + 533 + + + + IDEStackCompressionValue + IDEThreadsOrQueuesMode + IDEHideAncestorForNonInterestingFrames + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 539 + + + CF$UID + 540 + + + CF$UID + 541 + + + CF$UID + 542 + + + CF$UID + 543 + + + CF$UID + 544 + + + CF$UID + 545 + + + NS.objects + + + CF$UID + 460 + + + CF$UID + 533 + + + CF$UID + 531 + + + CF$UID + 546 + + + CF$UID + 547 + + + CF$UID + 460 + + + CF$UID + 549 + + + + IDEBatchFindNavigatorScrollPosition + IDEBatchFindNavigatorShowsOptions + IDEBatchFindNavigatorReplaceString + IDEBatchFindNavigatorFindString + IDEBatchFindNavigatorSelectedRowIndexes + IDEBatchFindNavigatorFindMode + IDEBatchFindNavigatorCollapsedGroups + enabled + + $class + + CF$UID + 548 + + NSRangeCount + 0 + + + $classes + + NSIndexSet + NSObject + + $classname + NSIndexSet + + + $class + + CF$UID + 550 + + NSRangeCount + 0 + + + $classes + + NSMutableIndexSet + NSIndexSet + NSObject + + $classname + NSMutableIndexSet + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + CF$UID + 554 + + + CF$UID + 555 + + + CF$UID + 556 + + + CF$UID + 557 + + + CF$UID + 558 + + + CF$UID + 559 + + + CF$UID + 560 + + + CF$UID + 561 + + + NS.objects + + + CF$UID + 533 + + + CF$UID + 562 + + + CF$UID + 563 + + + CF$UID + 567 + + + CF$UID + 568 + + + CF$UID + 533 + + + CF$UID + 533 + + + CF$UID + 569 + + + CF$UID + 533 + + + CF$UID + 570 + + + + IDEErrorFilteringEnabled + IDEVisibleRect + IDECollapsedFiles + IDEExpandedIssues + IDESelectedNavigables + IDEShowsByType + IDESchemeFilteringEnabled + IDECollapsedTypes + IDERecentFilteringEnabled + IDECollapsedGroups + {{0, 0}, {467, 886}} + + $class + + CF$UID + 566 + + NS.objects + + + CF$UID + 564 + + + CF$UID + 565 + + + + wolf3d/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/iphone_downloadUserMap.m + wolf3d/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/iphone_downloadSOD.m + + $classes + + NSMutableSet + NSSet + NSObject + + $classname + NSMutableSet + + + $class + + CF$UID + 566 + + NS.objects + + + + $class + + CF$UID + 90 + + NS.objects + + + + $class + + CF$UID + 566 + + NS.objects + + + + $class + + CF$UID + 566 + + NS.objects + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 572 + + + CF$UID + 573 + + + CF$UID + 574 + + + CF$UID + 575 + + + NS.objects + + + CF$UID + 576 + + + CF$UID + 533 + + + CF$UID + 578 + + + CF$UID + 579 + + + + IDECollapsedtemsSet + IDEBreakpointNavigatorFilterOnEnabled + IDESelectedObjects + IDEVisibleRect + + $class + + CF$UID + 577 + + NS.objects + + + + $classes + + NSSet + NSObject + + $classname + NSSet + + + $class + + CF$UID + 12 + + NS.objects + + + {{0, 0}, {259, 832}} + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 581 + + + CF$UID + 582 + + + CF$UID + 583 + + + CF$UID + 584 + + + CF$UID + 585 + + + CF$UID + 586 + + + CF$UID + 587 + + + NS.objects + + + CF$UID + 588 + + + CF$UID + 533 + + + CF$UID + 576 + + + CF$UID + 533 + + + CF$UID + 533 + + + CF$UID + 589 + + + CF$UID + 592 + + + + IDEVisibleRect + IDEUnsavedDocumentFilteringEnabled + IDENavigatorExpandedItemsBeforeFilteringSet + IDERecentDocumentFilteringEnabled + IDESCMStatusFilteringEnabled + IDESelectedObjects + IDEExpandedItemsSet + {{0, 0}, {467, 908}} + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 590 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 591 + + + + wolf3d + + $class + + CF$UID + 577 + + NS.objects + + + CF$UID + 593 + + + CF$UID + 595 + + + CF$UID + 596 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 591 + + + CF$UID + 594 + + + + Resources + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 591 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 591 + + + CF$UID + 597 + + + + Other Sources + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 599 + + + CF$UID + 600 + + + CF$UID + 601 + + + CF$UID + 602 + + + NS.objects + + + CF$UID + 603 + + + CF$UID + 604 + + + CF$UID + 533 + + + CF$UID + 579 + + + + IDELogNavigatorExpandedItemsStateKey + IDELogNavigatorSelectedObjectsStateKey + IDELogNavigatorRecentFilterStateKey + IDELogNavigatorVisibleRectStateKey + + $class + + CF$UID + 90 + + NS.objects + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 605 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 606 + + + + Debug wolf3dlite : Recording + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 608 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 609 + + + CF$UID + 611 + + + CF$UID + 613 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 18 + + + CF$UID + 610 + + + + 468 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 14 + + + CF$UID + 612 + + + + 1101 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 614 + + + CF$UID + 615 + + + + IDEUtilitiesArea + 260 + wolf3d.xcodeproj + {{193, 224}, {1829, 1028}} + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 619 + + + CF$UID + 620 + + + CF$UID + 621 + + + CF$UID + 622 + + + CF$UID + 623 + + + CF$UID + 624 + + + CF$UID + 625 + + + CF$UID + 626 + + + CF$UID + 627 + + + CF$UID + 628 + + + NS.objects + + + CF$UID + 497 + + + CF$UID + 629 + + + CF$UID + 460 + + + CF$UID + 1057 + + + CF$UID + 1062 + + + CF$UID + 1065 + + + CF$UID + 1096 + + + CF$UID + 1097 + + + CF$UID + 533 + + + CF$UID + 533 + + + + BreakpointsActivated + DefaultEditorStatesForURLs + DebuggingWindowBehavior + ActiveRunDestination + ActiveScheme + LastCompletedPersistentSchemeBasedActivityReport + DocumentWindows + RecentEditorDocumentURLs + AppFocusInMiniDebugging + MiniDebuggingConsole + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 630 + + + CF$UID + 631 + + + CF$UID + 632 + + + CF$UID + 633 + + + NS.objects + + + CF$UID + 634 + + + CF$UID + 646 + + + CF$UID + 1015 + + + CF$UID + 1026 + + + + Xcode.IDEKit.EditorDocument.DebuggerLogDocument + Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project + Xcode.IDEKit.EditorDocument.SourceCode + Xcode.IDEKit.CocoaTouchIntegration.EditorDocument.CocoaTouch + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 635 + + + CF$UID + 637 + + + CF$UID + 639 + + + NS.objects + + + CF$UID + 641 + + + CF$UID + 644 + + + CF$UID + 645 + + + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 636 + + + x-xcode-log://4BF82FB6-F0D7-4DDF-B6AE-4585D10E874A + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 638 + + + x-xcode-log://DEBBC139-B188-4803-B26F-26EA15213A40 + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 640 + + + x-xcode-log://28B63DA2-5E7A-4CF4-B710-F42908E00231 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 642 + + + NS.objects + + + CF$UID + 643 + + + + DBGConsoleLogEditorScrollRange + {0, 0} + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 642 + + + NS.objects + + + CF$UID + 643 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 642 + + + NS.objects + + + CF$UID + 643 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 647 + + + NS.objects + + + CF$UID + 648 + + + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 41 + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 73 + + + CF$UID + 74 + + + CF$UID + 75 + + + CF$UID + 76 + + + CF$UID + 77 + + + NS.objects + + + CF$UID + 649 + + + CF$UID + 650 + + + CF$UID + 656 + + + CF$UID + 657 + + + CF$UID + 1014 + + + + Xcode3ProjectInfoEditor + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 80 + + + NS.objects + + + CF$UID + 651 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 652 + + + CF$UID + 654 + + + + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 85 + + + CF$UID + 653 + + + + 170 + + $class + + CF$UID + 87 + + NS.keys + + + CF$UID + 83 + + + CF$UID + 84 + + + NS.objects + + + CF$UID + 85 + + + CF$UID + 655 + + + + 931 + Xcode3BuildSettingsEditor + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 658 + + + + + $class + + CF$UID + 462 + + documentURL + + CF$UID + 95 + + selection + + CF$UID + 660 + + timestamp + + CF$UID + 659 + + + 334881995.84233099 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 98 + + + CF$UID + 99 + + + CF$UID + 661 + + + NS.objects + + + CF$UID + 662 + + + CF$UID + 102 + + + CF$UID + 663 + + + + Xcode3BuildSettingsEditorLocations + Xcode3BuildSettingsEditor + + $class + + CF$UID + 12 + + NS.objects + + + CF$UID + 664 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 105 + + + CF$UID + 106 + + + CF$UID + 107 + + + CF$UID + 108 + + + CF$UID + 109 + + + CF$UID + 110 + + + NS.objects + + + CF$UID + 665 + + + CF$UID + 1012 + + + CF$UID + 460 + + + CF$UID + 460 + + + CF$UID + 460 + + + CF$UID + 461 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 666 + + + CF$UID + 667 + + + CF$UID + 668 + + + CF$UID + 669 + + + CF$UID + 670 + + + CF$UID + 671 + + + CF$UID + 672 + + + CF$UID + 673 + + + CF$UID + 674 + + + CF$UID + 675 + + + CF$UID + 676 + + + CF$UID + 677 + + + CF$UID + 678 + + + CF$UID + 679 + + + CF$UID + 680 + + + CF$UID + 681 + + + CF$UID + 682 + + + CF$UID + 683 + + + CF$UID + 684 + + + CF$UID + 685 + + + CF$UID + 686 + + + CF$UID + 687 + + + CF$UID + 688 + + + CF$UID + 689 + + + CF$UID + 690 + + + CF$UID + 691 + + + CF$UID + 692 + + + CF$UID + 693 + + + CF$UID + 694 + + + CF$UID + 695 + + + CF$UID + 696 + + + CF$UID + 697 + + + CF$UID + 698 + + + CF$UID + 699 + + + CF$UID + 700 + + + CF$UID + 701 + + + CF$UID + 702 + + + CF$UID + 703 + + + CF$UID + 704 + + + CF$UID + 705 + + + CF$UID + 706 + + + CF$UID + 707 + + + CF$UID + 708 + + + CF$UID + 709 + + + CF$UID + 710 + + + CF$UID + 711 + + + CF$UID + 712 + + + CF$UID + 713 + + + CF$UID + 714 + + + CF$UID + 715 + + + CF$UID + 716 + + + CF$UID + 717 + + + CF$UID + 718 + + + CF$UID + 719 + + + CF$UID + 720 + + + CF$UID + 721 + + + CF$UID + 722 + + + CF$UID + 723 + + + CF$UID + 724 + + + CF$UID + 725 + + + CF$UID + 726 + + + CF$UID + 727 + + + CF$UID + 728 + + + CF$UID + 729 + + + CF$UID + 730 + + + CF$UID + 731 + + + CF$UID + 732 + + + CF$UID + 733 + + + CF$UID + 734 + + + CF$UID + 735 + + + CF$UID + 736 + + + CF$UID + 737 + + + CF$UID + 738 + + + CF$UID + 739 + + + CF$UID + 740 + + + CF$UID + 741 + + + CF$UID + 742 + + + CF$UID + 743 + + + CF$UID + 744 + + + CF$UID + 745 + + + CF$UID + 746 + + + CF$UID + 747 + + + CF$UID + 748 + + + CF$UID + 749 + + + CF$UID + 750 + + + CF$UID + 751 + + + CF$UID + 752 + + + CF$UID + 753 + + + CF$UID + 754 + + + CF$UID + 755 + + + CF$UID + 756 + + + CF$UID + 757 + + + CF$UID + 758 + + + CF$UID + 759 + + + CF$UID + 760 + + + CF$UID + 761 + + + CF$UID + 762 + + + CF$UID + 763 + + + CF$UID + 764 + + + CF$UID + 765 + + + CF$UID + 766 + + + CF$UID + 767 + + + CF$UID + 768 + + + CF$UID + 769 + + + CF$UID + 770 + + + CF$UID + 771 + + + CF$UID + 772 + + + CF$UID + 773 + + + CF$UID + 774 + + + CF$UID + 775 + + + CF$UID + 776 + + + CF$UID + 777 + + + CF$UID + 778 + + + CF$UID + 779 + + + CF$UID + 780 + + + CF$UID + 781 + + + CF$UID + 782 + + + CF$UID + 783 + + + CF$UID + 784 + + + CF$UID + 785 + + + CF$UID + 786 + + + CF$UID + 787 + + + CF$UID + 788 + + + CF$UID + 789 + + + CF$UID + 790 + + + CF$UID + 791 + + + CF$UID + 792 + + + CF$UID + 793 + + + CF$UID + 794 + + + CF$UID + 795 + + + CF$UID + 796 + + + CF$UID + 797 + + + CF$UID + 798 + + + CF$UID + 799 + + + CF$UID + 800 + + + CF$UID + 801 + + + CF$UID + 802 + + + CF$UID + 803 + + + CF$UID + 804 + + + CF$UID + 805 + + + CF$UID + 806 + + + CF$UID + 807 + + + CF$UID + 808 + + + CF$UID + 809 + + + CF$UID + 810 + + + CF$UID + 811 + + + CF$UID + 812 + + + CF$UID + 813 + + + CF$UID + 814 + + + CF$UID + 815 + + + CF$UID + 816 + + + CF$UID + 817 + + + CF$UID + 818 + + + CF$UID + 819 + + + CF$UID + 820 + + + CF$UID + 821 + + + CF$UID + 822 + + + CF$UID + 823 + + + CF$UID + 824 + + + CF$UID + 825 + + + CF$UID + 826 + + + CF$UID + 827 + + + CF$UID + 828 + + + CF$UID + 829 + + + CF$UID + 830 + + + CF$UID + 831 + + + CF$UID + 832 + + + CF$UID + 833 + + + CF$UID + 834 + + + CF$UID + 835 + + + CF$UID + 836 + + + CF$UID + 837 + + + CF$UID + 838 + + + CF$UID + 839 + + + CF$UID + 840 + + + CF$UID + 841 + + + CF$UID + 842 + + + CF$UID + 843 + + + CF$UID + 844 + + + CF$UID + 845 + + + CF$UID + 846 + + + CF$UID + 847 + + + CF$UID + 848 + + + CF$UID + 849 + + + CF$UID + 850 + + + CF$UID + 851 + + + CF$UID + 852 + + + CF$UID + 853 + + + CF$UID + 854 + + + CF$UID + 855 + + + CF$UID + 856 + + + CF$UID + 857 + + + CF$UID + 858 + + + CF$UID + 859 + + + CF$UID + 860 + + + CF$UID + 861 + + + CF$UID + 862 + + + CF$UID + 863 + + + CF$UID + 864 + + + CF$UID + 865 + + + CF$UID + 866 + + + CF$UID + 867 + + + CF$UID + 868 + + + CF$UID + 869 + + + CF$UID + 870 + + + CF$UID + 871 + + + CF$UID + 872 + + + CF$UID + 873 + + + CF$UID + 874 + + + CF$UID + 875 + + + CF$UID + 876 + + + CF$UID + 877 + + + CF$UID + 878 + + + CF$UID + 879 + + + CF$UID + 880 + + + CF$UID + 881 + + + CF$UID + 882 + + + CF$UID + 883 + + + CF$UID + 884 + + + CF$UID + 885 + + + CF$UID + 886 + + + CF$UID + 887 + + + CF$UID + 888 + + + CF$UID + 889 + + + CF$UID + 890 + + + CF$UID + 891 + + + CF$UID + 892 + + + CF$UID + 893 + + + CF$UID + 894 + + + CF$UID + 895 + + + CF$UID + 896 + + + CF$UID + 897 + + + CF$UID + 898 + + + CF$UID + 899 + + + CF$UID + 900 + + + CF$UID + 901 + + + CF$UID + 902 + + + CF$UID + 903 + + + CF$UID + 904 + + + CF$UID + 905 + + + CF$UID + 906 + + + CF$UID + 907 + + + CF$UID + 908 + + + CF$UID + 909 + + + CF$UID + 910 + + + CF$UID + 911 + + + CF$UID + 912 + + + CF$UID + 913 + + + CF$UID + 914 + + + CF$UID + 915 + + + CF$UID + 916 + + + CF$UID + 917 + + + CF$UID + 918 + + + CF$UID + 919 + + + CF$UID + 920 + + + CF$UID + 921 + + + CF$UID + 922 + + + CF$UID + 923 + + + CF$UID + 924 + + + CF$UID + 925 + + + CF$UID + 926 + + + CF$UID + 927 + + + CF$UID + 928 + + + CF$UID + 929 + + + CF$UID + 930 + + + CF$UID + 931 + + + CF$UID + 932 + + + CF$UID + 933 + + + CF$UID + 934 + + + CF$UID + 935 + + + CF$UID + 936 + + + CF$UID + 937 + + + CF$UID + 938 + + + CF$UID + 939 + + + CF$UID + 940 + + + CF$UID + 941 + + + CF$UID + 942 + + + CF$UID + 943 + + + CF$UID + 944 + + + CF$UID + 945 + + + CF$UID + 946 + + + CF$UID + 947 + + + CF$UID + 948 + + + CF$UID + 949 + + + CF$UID + 950 + + + CF$UID + 951 + + + CF$UID + 952 + + + CF$UID + 953 + + + CF$UID + 954 + + + CF$UID + 955 + + + CF$UID + 956 + + + CF$UID + 957 + + + CF$UID + 958 + + + CF$UID + 959 + + + CF$UID + 960 + + + CF$UID + 961 + + + CF$UID + 962 + + + CF$UID + 963 + + + CF$UID + 964 + + + CF$UID + 965 + + + CF$UID + 966 + + + CF$UID + 967 + + + CF$UID + 968 + + + CF$UID + 969 + + + CF$UID + 970 + + + CF$UID + 971 + + + CF$UID + 972 + + + CF$UID + 973 + + + CF$UID + 974 + + + CF$UID + 975 + + + CF$UID + 976 + + + CF$UID + 977 + + + CF$UID + 978 + + + CF$UID + 979 + + + CF$UID + 980 + + + CF$UID + 981 + + + CF$UID + 982 + + + CF$UID + 983 + + + CF$UID + 984 + + + CF$UID + 985 + + + CF$UID + 986 + + + CF$UID + 987 + + + CF$UID + 988 + + + CF$UID + 989 + + + CF$UID + 990 + + + CF$UID + 991 + + + CF$UID + 992 + + + CF$UID + 993 + + + CF$UID + 994 + + + CF$UID + 995 + + + CF$UID + 996 + + + CF$UID + 997 + + + CF$UID + 998 + + + CF$UID + 999 + + + CF$UID + 1000 + + + CF$UID + 1001 + + + CF$UID + 1002 + + + CF$UID + 1003 + + + CF$UID + 1004 + + + CF$UID + 1005 + + + CF$UID + 1006 + + + CF$UID + 1007 + + + CF$UID + 1008 + + + CF$UID + 1009 + + + CF$UID + 1010 + + + CF$UID + 1011 + + + + + $class + + CF$UID + 42 + + NS.string + Architectures||ADDITIONAL_SDKS + + + $class + + CF$UID + 42 + + NS.string + Architectures||ARCHS + + + $class + + CF$UID + 42 + + NS.string + Architectures||SDKROOT + + + $class + + CF$UID + 42 + + NS.string + Architectures||ONLY_ACTIVE_ARCH + + + $class + + CF$UID + 42 + + NS.string + Architectures||SUPPORTED_PLATFORMS + + + $class + + CF$UID + 42 + + NS.string + Architectures||VALID_ARCHS + + + $class + + CF$UID + 42 + + NS.string + Build Locations||SYMROOT + + + $class + + CF$UID + 42 + + NS.string + Build Locations||OBJROOT + + + $class + + CF$UID + 42 + + NS.string + Build Locations||SHARED_PRECOMPS_DIR + + + $class + + CF$UID + 42 + + NS.string + Build Options||BUILD_VARIANTS + + + $class + + CF$UID + 42 + + NS.string + Build Options||DEBUG_INFORMATION_FORMAT + + + $class + + CF$UID + 42 + + NS.string + Build Options||ENABLE_OPENMP_SUPPORT + + + $class + + CF$UID + 42 + + NS.string + Build Options||GENERATE_PROFILING_CODE + + + $class + + CF$UID + 42 + + NS.string + Build Options||PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR + + + $class + + CF$UID + 42 + + NS.string + Build Options||RUN_CLANG_STATIC_ANALYZER + + + $class + + CF$UID + 42 + + NS.string + Build Options||SCAN_ALL_SOURCE_FILES_FOR_INCLUDES + + + $class + + CF$UID + 42 + + NS.string + Build Options||VALIDATE_PRODUCT + + + $class + + CF$UID + 42 + + NS.string + Code Signing||CODE_SIGN_RESOURCE_RULES_PATH + + + $class + + CF$UID + 42 + + NS.string + Code Signing||OTHER_CODE_SIGN_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Deployment||STRIPFLAGS + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_GROUP + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_OWNER + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_MODE + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_PERMISSIONS_FILES + + + $class + + CF$UID + 42 + + NS.string + Deployment||COMBINE_HIDPI_IMAGES + + + $class + + CF$UID + 42 + + NS.string + Deployment||DEPLOYMENT_LOCATION + + + $class + + CF$UID + 42 + + NS.string + Deployment||DEPLOYMENT_POSTPROCESSING + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_GROUP + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_OWNER + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_MODE_FLAG + + + $class + + CF$UID + 42 + + NS.string + Deployment||DSTROOT + + + $class + + CF$UID + 42 + + NS.string + Deployment||INSTALL_PATH + + + $class + + CF$UID + 42 + + NS.string + Deployment||MACOSX_DEPLOYMENT_TARGET + + + $class + + CF$UID + 42 + + NS.string + Deployment||SKIP_INSTALL + + + $class + + CF$UID + 42 + + NS.string + Deployment||STRIP_INSTALLED_PRODUCT + + + $class + + CF$UID + 42 + + NS.string + Deployment||STRIP_STYLE + + + $class + + CF$UID + 42 + + NS.string + Deployment||TARGETED_DEVICE_FAMILY + + + $class + + CF$UID + 42 + + NS.string + Deployment||SEPARATE_STRIP + + + $class + + CF$UID + 42 + + NS.string + Deployment||IPHONEOS_DEPLOYMENT_TARGET + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_NAME + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_START + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_STOP + + + $class + + CF$UID + 42 + + NS.string + Kernel Module||MODULE_VERSION + + + $class + + CF$UID + 42 + + NS.string + Linking||BUNDLE_LOADER + + + $class + + CF$UID + 42 + + NS.string + Linking||STANDARD_C_PLUS_PLUS_LIBRARY_TYPE + + + $class + + CF$UID + 42 + + NS.string + Linking||DYLIB_COMPATIBILITY_VERSION + + + $class + + CF$UID + 42 + + NS.string + Linking||DYLIB_CURRENT_VERSION + + + $class + + CF$UID + 42 + + NS.string + Linking||DEAD_CODE_STRIPPING + + + $class + + CF$UID + 42 + + NS.string + Linking||LINKER_DISPLAYS_MANGLED_NAMES + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_NO_PIE + + + $class + + CF$UID + 42 + + NS.string + Linking||PRESERVE_DEAD_CODE_INITS_AND_TERMS + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_DYLIB_INSTALL_NAME + + + $class + + CF$UID + 42 + + NS.string + Linking||EXPORTED_SYMBOLS_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||INIT_ROUTINE + + + $class + + CF$UID + 42 + + NS.string + Linking||LINK_WITH_STANDARD_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + Linking||MACH_O_TYPE + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_OPENMP_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||ORDER_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||OTHER_LDFLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||GENERATE_MASTER_OBJECT_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||PRELINK_LIBS + + + $class + + CF$UID + 42 + + NS.string + Linking||KEEP_PRIVATE_EXTERNS + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_RUNPATH_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Linking||SEPARATE_SYMBOL_EDIT + + + $class + + CF$UID + 42 + + NS.string + Linking||PRELINK_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||SECTORDER_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||UNEXPORTED_SYMBOLS_FILE + + + $class + + CF$UID + 42 + + NS.string + Linking||WARNING_LDFLAGS + + + $class + + CF$UID + 42 + + NS.string + Linking||LD_GENERATE_MAP_FILE + + + $class + + CF$UID + 42 + + NS.string + Packaging||COMPRESS_PNG_FILES + + + $class + + CF$UID + 42 + + NS.string + Packaging||APPLY_RULES_IN_COPY_FILES + + + $class + + CF$UID + 42 + + NS.string + Packaging||EXECUTABLE_EXTENSION + + + $class + + CF$UID + 42 + + NS.string + Packaging||EXECUTABLE_PREFIX + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_EXPAND_BUILD_SETTINGS + + + $class + + CF$UID + 42 + + NS.string + Packaging||GENERATE_PKGINFO_FILE + + + $class + + CF$UID + 42 + + NS.string + Packaging||FRAMEWORK_VERSION + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_FILE + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_OTHER_PREPROCESSOR_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_OUTPUT_FORMAT + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_PREPROCESSOR_DEFINITIONS + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + Packaging||INFOPLIST_PREPROCESS + + + $class + + CF$UID + 42 + + NS.string + Packaging||COPYING_PRESERVES_HFS_DATA + + + $class + + CF$UID + 42 + + NS.string + Packaging||PLIST_FILE_OUTPUT_FORMAT + + + $class + + CF$UID + 42 + + NS.string + Packaging||STRINGS_FILE_OUTPUT_ENCODING + + + $class + + CF$UID + 42 + + NS.string + Packaging||WRAPPER_EXTENSION + + + $class + + CF$UID + 42 + + NS.string + Search Paths||ALWAYS_SEARCH_USER_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||FRAMEWORK_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||HEADER_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||LIBRARY_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||REZ_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Search Paths||EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES + + + $class + + CF$UID + 42 + + NS.string + Search Paths||INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES + + + $class + + CF$UID + 42 + + NS.string + Search Paths||USER_HEADER_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||OTHER_TEST_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||TEST_AFTER_BUILD + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||TEST_HOST + + + $class + + CF$UID + 42 + + NS.string + Unit Testing||TEST_RIG + + + $class + + CF$UID + 42 + + NS.string + Versioning||CURRENT_PROJECT_VERSION + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_EXPORT_DECL + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_PREFIX + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_SUFFIX + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSIONING_SYSTEM + + + $class + + CF$UID + 42 + + NS.string + Versioning||VERSION_INFO_BUILDER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_FAST_OBJC_DISPATCH + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_OBJC_CALL_CXX_CDTORS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_STRICT_ALIASING + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_FEEDBACK_DIRECTED_OPTIMIZATION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_GENERATE_TEST_COVERAGE_FILES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_INSTRUMENT_PROGRAM_FLOW_ARCS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_REUSE_STRINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_NO_COMMON_BLOCKS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_OBJC_GC + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_FAST_MATH + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_ENABLE_SYMBOL_SEPARATION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_THREADSAFE_STATICS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_CHAR_IS_UNSIGNED_CHAR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_ASM_KEYWORD + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_CHECK_RETURN_VALUE_OF_OPERATOR_NEW + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_CW_ASM_SYNTAX + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_INPUT_FILETYPE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_CPP_EXCEPTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_CPP_RTTI + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_TRIGRAPHS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_USE_REGISTER_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||OTHER_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||OTHER_CPLUSPLUSFLAGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_PRECOMPILE_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_ENABLE_PASCAL_STRINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_FORCE_CPU_SUBTYPE_ALL + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_SHORT_ENUMS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_SHADOW + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_MISSING_PARENTHESES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||WARNING_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_PEDANTIC + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_PROTOTYPE_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_SIGN_COMPARE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNDECLARED_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_FUNCTION + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_LABEL + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_PARAMETER + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_VALUE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + GCC 4.2 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_FLATTEN_NIBS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_OTHER_FLAGS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_OVERRIDING_PLUGINS_AND_FRAMEWORKS_DIR + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_PLUGIN_SEARCH_PATHS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_PLUGINS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_ERRORS + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_NOTICES + + + $class + + CF$UID + 42 + + NS.string + Interface Builder XIB Compiler - Options||IBC_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_FAST_OBJC_DISPATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_OBJC_CALL_CXX_CDTORS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_STRICT_ALIASING + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_FEEDBACK_DIRECTED_OPTIMIZATION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_GENERATE_TEST_COVERAGE_FILES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_INSTRUMENT_PROGRAM_FLOW_ARCS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||LLVM_LTO + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_REUSE_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_NO_COMMON_BLOCKS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_OBJC_GC + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_FAST_MATH + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_ENABLE_SYMBOL_SEPARATION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_THREADSAFE_STATICS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_CHAR_IS_UNSIGNED_CHAR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_ASM_KEYWORD + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_CHECK_RETURN_VALUE_OF_OPERATOR_NEW + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_CW_ASM_SYNTAX + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_INPUT_FILETYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_CPP_EXCEPTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_CPP_RTTI + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_TRIGRAPHS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_USE_REGISTER_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||OTHER_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||OTHER_CPLUSPLUSFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_PRECOMPILE_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_ENABLE_PASCAL_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_FORCE_CPU_SUBTYPE_ALL + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_SHORT_ENUMS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_SHADOW + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_MISSING_PARENTHESES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||WARNING_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_PEDANTIC + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_PROTOTYPE_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_SIGN_COMPARE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNDECLARED_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_FUNCTION + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_LABEL + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_PARAMETER + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_VALUE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_FAST_OBJC_DISPATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_STRICT_ALIASING + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||LLVM_LTO + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_REUSE_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_NO_COMMON_BLOCKS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_ENABLE_OBJC_GC + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_FAST_MATH + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_THREADSAFE_STATICS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_CHAR_IS_UNSIGNED_CHAR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_ASM_KEYWORD + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_CW_ASM_SYNTAX + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_INPUT_FILETYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_CPP_EXCEPTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_CPP_RTTI + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_TRIGRAPHS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_USE_REGISTER_FUNCTION_CALLS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||OTHER_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||OTHER_CPLUSPLUSFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_PRECOMPILE_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_PREFIX_HEADER + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_ENABLE_PASCAL_STRINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_FORCE_CPU_SUBTYPE_ALL + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_SHORT_ENUMS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_SHADOW + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_MISSING_PARENTHESES + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||WARNING_CFLAGS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_PEDANTIC + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_SIGN_COMPARE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNDECLARED_SELECTOR + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_FUNCTION + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_LABEL + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_PARAMETER + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_VALUE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + + + $class + + CF$UID + 42 + + NS.string + LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO + + + $class + + CF$UID + 42 + + NS.string + User-Defined||PREBINDING + + + $class + + CF$UID + 42 + + NS.string + User-Defined||PROFILE_PREFIX + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 1013 + + + + + $class + + CF$UID + 42 + + NS.string + Deployment||ALTERNATE_GROUP + + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1016 + + + NS.objects + + + CF$UID + 1018 + + + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1017 + + + + $class + + CF$UID + 42 + + NS.string + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/env/fileio.c + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1019 + + + CF$UID + 1020 + + + CF$UID + 1021 + + + CF$UID + 1022 + + + NS.objects + + + CF$UID + 1023 + + + CF$UID + 1024 + + + CF$UID + 533 + + + CF$UID + 1025 + + + + PrimaryDocumentTimestamp + PrimaryDocumentVisibleCharacterRange + HideAllIssues + PrimaryDocumentSelectedCharacterRange + 333054686.18863302 + {2273, 1211} + {3007, 0} + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1027 + + + CF$UID + 1029 + + + NS.objects + + + CF$UID + 1031 + + + CF$UID + 1044 + + + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1028 + + + + $class + + CF$UID + 42 + + NS.string + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/MainMenuView.xib + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1030 + + + + $class + + CF$UID + 42 + + NS.string + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/SettingsView.xib + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1032 + + + CF$UID + 1033 + + + CF$UID + 1034 + + + CF$UID + 1035 + + + NS.objects + + + CF$UID + 1036 + + + CF$UID + 1037 + + + CF$UID + 1035 + + + CF$UID + 1039 + + + + IBDockViewController + SelectedObjectIDs + SelectionProvider + IBCanvasViewController + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 1038 + + + + 7 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1040 + + + CF$UID + 1041 + + + NS.objects + + + CF$UID + 1042 + + + CF$UID + 1043 + + + + ObjectIDToLastKnownCanvasPositionMap + EditedTopLevelObjectIDs + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 461 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1045 + + + CF$UID + 1046 + + + CF$UID + 1047 + + + CF$UID + 1048 + + + NS.objects + + + CF$UID + 1049 + + + CF$UID + 1050 + + + CF$UID + 1048 + + + CF$UID + 1052 + + + + IBDockViewController + SelectedObjectIDs + SelectionProvider + IBCanvasViewController + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 1051 + + + + 3 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1053 + + + CF$UID + 1054 + + + NS.objects + + + CF$UID + 1055 + + + CF$UID + 1056 + + + + ObjectIDToLastKnownCanvasPositionMap + EditedTopLevelObjectIDs + + $class + + CF$UID + 91 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 461 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1058 + + + CF$UID + 1059 + + + NS.objects + + + CF$UID + 1060 + + + CF$UID + 1061 + + + + IDEDeviceLocation + IDEDeviceArchitecture + dvtdevice-iphone:8011cc922b0e4dddd04ece07505f9785549cd9a0 + armv7 + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1063 + + + NS.objects + + + CF$UID + 1064 + + + + IDENameString + wolf3d + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1066 + + + CF$UID + 1067 + + + CF$UID + 1068 + + + NS.objects + + + CF$UID + 1069 + + + CF$UID + 1095 + + + CF$UID + 102 + + + + IDEActivityReportCompletionSummaryStringSegments + IDEActivityReportOptions + IDEActivityReportTitle + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 1070 + + + CF$UID + 1077 + + + CF$UID + 1081 + + + CF$UID + 1086 + + + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1071 + + + CF$UID + 1072 + + + CF$UID + 1073 + + + NS.objects + + + CF$UID + 1074 + + + CF$UID + 1075 + + + CF$UID + 1076 + + + + IDEActivityReportStringSegmentPriority + IDEActivityReportStringSegmentBackSeparator + IDEActivityReportStringSegmentStringValue + 2 + + Build + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1071 + + + CF$UID + 1072 + + + CF$UID + 1073 + + + NS.objects + + + CF$UID + 1078 + + + CF$UID + 1079 + + + CF$UID + 1080 + + + + 4 + : + wolf3d + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1071 + + + CF$UID + 1072 + + + CF$UID + 1073 + + + NS.objects + + + CF$UID + 1082 + + + CF$UID + 1083 + + + CF$UID + 1084 + + + + 1 + + + $class + + CF$UID + 1085 + + NS.data + + YnBsaXN0MDDUAQIDBAUGOzxYJHZlcnNpb25YJG9iamVjdHNZJGFy + Y2hpdmVyVCR0b3ASAAGGoK0HCA8QGhscJCUrMTQ3VSRudWxs0wkK + CwwNDlxOU0F0dHJpYnV0ZXNWJGNsYXNzWE5TU3RyaW5ngAOADIAC + WVN1Y2NlZWRlZNMKERITFBdXTlMua2V5c1pOUy5vYmplY3RzgAui + FRaABIAFohgZgAaACVZOU0ZvbnRXTlNDb2xvctQKHR4fICEiI1ZO + U05hbWVWTlNTaXplWE5TZkZsYWdzgAiAByNAJgAAAAAAABENEF8Q + EUx1Y2lkYUdyYW5kZS1Cb2xk0iYnKClaJGNsYXNzbmFtZVgkY2xh + c3Nlc1ZOU0ZvbnSiKCpYTlNPYmplY3TTCiwtLi8wXE5TQ29sb3JT + cGFjZVdOU1doaXRlgAoQA0IwANImJzIzV05TQ29sb3KiMirSJic1 + NlxOU0RpY3Rpb25hcnmiNSrSJic4OV8QEk5TQXR0cmlidXRlZFN0 + cmluZ6I6Kl8QEk5TQXR0cmlidXRlZFN0cmluZ18QD05TS2V5ZWRB + cmNoaXZlctE9PlRyb290gAEACAARABoAIwAtADIANwBFAEsAUgBf + AGYAbwBxAHMAdQB/AIYAjgCZAJsAngCgAKIApQCnAKkAsAC4AMEA + yADPANgA2gDcAOUA6AD8AQEBDAEVARwBHwEoAS8BPAFEAUYBSAFL + AVABWAFbAWABbQFwAXUBigGNAaIBtAG3AbwAAAAAAAACAQAAAAAA + AAA/AAAAAAAAAAAAAAAAAAABvg== + + + + $classes + + NSMutableData + NSData + NSObject + + $classname + NSMutableData + + + $class + + CF$UID + 91 + + NS.keys + + + CF$UID + 1071 + + + CF$UID + 1087 + + + CF$UID + 1088 + + + CF$UID + 1073 + + + CF$UID + 1089 + + + CF$UID + 1090 + + + NS.objects + + + CF$UID + 1091 + + + CF$UID + 461 + + + CF$UID + 1092 + + + CF$UID + 1094 + + + CF$UID + 461 + + + CF$UID + 461 + + + + IDEActivityReportStringSegmentType + IDEActivityReportStringSegmentDate + IDEActivityReportStringSegmentDateStyle + IDEActivityReportStringSegmentTimeStyle + 3 + + $class + + CF$UID + 1093 + + NS.time + 334881914.23707002 + + + $classes + + NSDate + NSObject + + $classname + NSDate + + Today at 5:45 PM + 106 + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 2 + + + + + $class + + CF$UID + 90 + + NS.objects + + + CF$UID + 1098 + + + CF$UID + 1099 + + + CF$UID + 1101 + + + CF$UID + 635 + + + CF$UID + 637 + + + CF$UID + 639 + + + CF$UID + 1103 + + + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 95 + + + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1100 + + + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/MainMenuView.xib + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1102 + + + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/SettingsView.xib + + $class + + CF$UID + 468 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1104 + + + file://localhost/Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/env/fileio.c + + $top + + State + + CF$UID + 1 + + + $version + 100000 + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/WorkspaceSettings.xcsettings b/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f7f6518 --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/project.xcworkspace/xcuserdata/ryan.gerleve.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceUserSettings_BuildLocationStyle + 2 + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.mode1v3 b/wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.mode1v3 new file mode 100644 index 0000000..df38eff --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.mode1v3 @@ -0,0 +1,1621 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCProjectFormatConflictsModule + Name + Project Format Conflicts List + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + BundleLoadPath + + MaxInstances + n + Module + XCSnapshotModule + Name + Snapshots Tool + + + BundlePath + /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1v3 + FavBarConfig + + PBXProjectModuleGUID + 3D2F13BC13B9527200A88583 + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1v3 + MajorVersion + 33 + MinorVersion + 0 + Name + Default + Notifications + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusErrorsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusErrorsKey + 2 + + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusWarningsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusWarningsKey + 2 + + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusAnalyzerResultsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusAnalyzerResultsKey + 2 + + + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + active-combo-popup + action + NSToolbarFlexibleSpaceItem + debugger-enable-breakpoints + build-and-go + com.apple.ide.PBXToolbarStopButton + get-info + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 297 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 29B97315FDCFA39411CA2CEA + 3D5C0C7513DF8F78008ECBD1 + 3D5C0C7613DF8FAF008ECBD1 + 29B97317FDCFA39411CA2CEA + 3D5C0CFE13DF9AD5008ECBD1 + 3D5C0CFD13DF9ABF008ECBD1 + 3D15A41A13C6BA0B00FBFAA2 + 3D5C0D0F13DF9B82008ECBD1 + 19C28FACFE9D520D11CA2CBB + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 57 + 6 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {297, 1111}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {314, 1129}} + GroupTreeTableConfiguration + + MainColumn + 297 + + RubberWindowFrame + 332 335 1402 1170 0 0 2560 1578 + + Module + PBXSmartGroupTreeModule + Proportion + 314pt + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + wolf_weapon.c + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + wolf_weapon.c + _historyCapacity + 0 + bookmark + 3D1397DB140702710059F453 + history + + 3D61672F13BAC44B005AC9FF + 3D61673013BAC44B005AC9FF + 3D61673113BAC44B005AC9FF + 3D61673213BAC44B005AC9FF + 3D61673313BAC44B005AC9FF + 3DF1A97013BD534400C34057 + 3D3ED7B413BF6D6100C5B1DF + 3DB0C67E13BF8761001A2A76 + 3DB0C6B013BF8BCE001A2A76 + 3DB0C6E413BF9017001A2A76 + 3D746DB813BFB4A70018B535 + 3D27CB1213D4F0B700D4DACC + 3D27CB6613D50A3100D4DACC + 3D24004F13D88BF8009FC7A7 + 3D24005013D88BF8009FC7A7 + 3D24005113D88BF8009FC7A7 + 3D24005213D88BF8009FC7A7 + 3D24005313D88BF8009FC7A7 + 3D24005413D88BF8009FC7A7 + 3D24006813D89342009FC7A7 + 3D24007013D89553009FC7A7 + 3D2401D113D8FCB1009FC7A7 + 3D421AC513D9FF2000F4E5F3 + 3D421ACC13DA003600F4E5F3 + 3DCD716E13DA280B007FCBAD + 3DB48A4513DA3FC50086EB98 + 3DB48A5313DA41B70086EB98 + 3DB48AAF13DA4D4A0086EB98 + 3D86CD9213DCFAB700186487 + 3D86CDD613DD05D500186487 + 3D86CE0613DD098600186487 + 3D86D2BE13DE2CEE00186487 + 3D86D3E113DE3EE900186487 + 3D86D3F613DE40AD00186487 + 3D86D44713DE480000186487 + 3D86D46113DE4A9100186487 + 3D86D58C13DE644B00186487 + 3D86D5A413DE653600186487 + 3D715D8913DF458400E69D06 + 3D5C0C0113DF60BB008ECBD1 + 3D5C0D0413DF9AF4008ECBD1 + 3D5C0F3E13E0E89C008ECBD1 + 3D5C0F5813E0EC8E008ECBD1 + 3D5C0F9C13E0FE33008ECBD1 + 3D5C10AF13E1D311008ECBD1 + 3D5C10B013E1D311008ECBD1 + 3D5C129F13E22E13008ECBD1 + 3D5C12A813E22F6C008ECBD1 + 3D5C12AB13E22F6C008ECBD1 + 3D5C12AC13E22F6C008ECBD1 + 3D5C12AD13E22F6C008ECBD1 + 3D5C12AE13E22F6C008ECBD1 + 3D5C12B013E22F6C008ECBD1 + 3D5C12B113E22F6C008ECBD1 + 3D5C12B313E22F6C008ECBD1 + 3D5C12B513E22F6C008ECBD1 + 3D5C12E613E236D0008ECBD1 + 3D5C12E713E236D0008ECBD1 + 3D5C12E813E236D0008ECBD1 + 3D5C12E913E236D0008ECBD1 + 3D64A89713E260850017C7E8 + 3D64A89913E260850017C7E8 + 3D64A8BA13E263AC0017C7E8 + 3D64A90413E266680017C7E8 + 3D39A5BF13E32BDA001EC0D3 + 3D39A60613E353FE001EC0D3 + 3D39A62E13E35BB1001EC0D3 + 3D39A63013E35BB1001EC0D3 + 3D39A63113E35BB1001EC0D3 + 3D39A6E913E35C82001EC0D3 + 3D821FEC13E35DBE007A570A + 3D821FED13E35DBE007A570A + 3D821FEE13E35DBE007A570A + 3D821FEF13E35DBE007A570A + 3D821FF013E35DBE007A570A + 3D821FF113E35DBE007A570A + 3D821FF213E35DBE007A570A + 3D821FF313E35DBE007A570A + 3D821FF413E35DBE007A570A + 3DE882E013E360AF00C95AE8 + 3DE882E113E360AF00C95AE8 + 3DE8839B13E3879700C95AE8 + 3D4FE44913F0ADE2005988AF + 3D520A0913F1D33E007F7546 + 3D10C34C13F2E71200DF5856 + 3D10C34E13F2E71200DF5856 + 3D10C34F13F2E71200DF5856 + 3D10C38013F318D200DF5856 + 3D10C3F913F3406100DF5856 + 3D10C3FA13F3406100DF5856 + 3D10C3FB13F3406100DF5856 + 3D10C3FC13F3406100DF5856 + 3D10C3FD13F3406100DF5856 + 3D10C3FE13F3406100DF5856 + 3D10C3FF13F3406100DF5856 + 3D10C40013F3406100DF5856 + 3D10C46813F34B5100DF5856 + 3D10C49F13F3555000DF5856 + 3D10C4B213F359DC00DF5856 + 3D1397901406FE310059F453 + 3D13979D1406FFE00059F453 + 3D13979E1406FFE00059F453 + 3D13979F1406FFE00059F453 + 3D1397A01406FFE00059F453 + 3D1397A11406FFE00059F453 + 3D1397A21406FFE00059F453 + 3D1397A31406FFE00059F453 + 3D1397A41406FFE00059F453 + 3D1397A51406FFE00059F453 + 3D1397A61406FFE00059F453 + 3D1397A71406FFE00059F453 + 3D1397A81406FFE00059F453 + 3D1397A91406FFE00059F453 + 3D1397AA1406FFE00059F453 + 3D1397AB1406FFE00059F453 + 3D1397AC1406FFE00059F453 + 3D1397AD1406FFE00059F453 + 3D1397AE1406FFE00059F453 + 3D1397AF1406FFE00059F453 + 3D1397B01406FFE00059F453 + 3D1397B11406FFE00059F453 + 3D1397B21406FFE00059F453 + 3D1397B31406FFE00059F453 + 3D1397B41406FFE00059F453 + 3D1397B51406FFE00059F453 + 3D1397B61406FFE00059F453 + 3D1397BE140700E30059F453 + 3D1397BF140700E30059F453 + 3D1397C0140700E30059F453 + 3D1397C1140700E30059F453 + 3D1397C2140700E30059F453 + 3D1397C3140700E30059F453 + 3D1397C4140700E30059F453 + 3D1397C5140700E30059F453 + 3D1397C6140700E30059F453 + 3D1397C7140700E30059F453 + 3D1397C8140700E30059F453 + 3D1397C9140700E30059F453 + 3D1397CA140700E30059F453 + 3D1397CB140700E30059F453 + 3D1397CC140700E30059F453 + 3D1397CD140700E30059F453 + 3D1397CE140700E30059F453 + 3D1397CF140700E30059F453 + 3D1397D0140700E30059F453 + 3D1397D31407012A0059F453 + 3D1397D41407012A0059F453 + 3D1397D51407012A0059F453 + 3D1397D61407012A0059F453 + 3D1397D71407012A0059F453 + 3D1397D81407012A0059F453 + 3D1397D91407012A0059F453 + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1083, 1019}} + RubberWindowFrame + 332 335 1402 1170 0 0 2560 1578 + + Module + PBXNavigatorGroup + Proportion + 1019pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 1024}, {1083, 105}} + RubberWindowFrame + 332 335 1402 1170 0 0 2560 1578 + + Module + XCDetailModule + Proportion + 105pt + + + Proportion + 1083pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + 3D13977A1406FB0E0059F453 + 1CE0B1FE06471DED0097A5F4 + 3D13977B1406FB0E0059F453 + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfigUserDefaultsMinorVersion + 2 + ToolbarConfiguration + xcode.toolbar.config.defaultV3 + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + 0 + Layout + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 337}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 1 + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 355}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 373 269 690 397 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 100% + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.shortV3 + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 336003697.48083001 + ToolbarConfigUserDefaultsMinorVersion + 2 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + 3D2F13BD13B9527200A88583 + /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/wolf3d.xcodeproj + + WindowString + 332 335 1402 1170 0 0 2560 1578 + WindowToolsV3 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1300, 723}} + RubberWindowFrame + 1119 187 1300 1005 0 0 2560 1578 + + Module + PBXNavigatorGroup + Proportion + 723pt + + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build Results + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1013 + + GeometryConfiguration + + Frame + {{0, 728}, {1300, 236}} + RubberWindowFrame + 1119 187 1300 1005 0 0 2560 1578 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 964pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + 3D2F13BD13B9527200A88583 + 3D13977C1406FB0E0059F453 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.buildV3 + WindowContentMinSize + 486 300 + WindowString + 1119 187 1300 1005 0 0 2560 1578 + WindowToolGUID + 3D2F13BD13B9527200A88583 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {694, 608}} + {{694, 0}, {828, 608}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {1522, 608}} + {{0, 608}, {1522, 532}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {1522, 1140}} + PBXDebugSessionStackFrameViewKey + + DebugVariablesTableConfiguration + + Name + 241 + Value + 213 + Summary + 349 + + Frame + {{694, 0}, {828, 608}} + RubberWindowFrame + 917 251 1522 1181 0 0 2560 1578 + + RubberWindowFrame + 917 251 1522 1181 0 0 2560 1578 + + Module + PBXDebugSessionModule + Proportion + 1140pt + + + Proportion + 1140pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + 3DF17F6113F438E300ED668A + 1C162984064C10D400B95A72 + 3DF17F6213F438E300ED668A + 3DF17F6313F438E300ED668A + 3DF17F6413F438E300ED668A + 3DF17F6513F438E300ED668A + 3DF17F6613F438E300ED668A + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + WindowString + 917 251 1522 1181 0 0 2560 1578 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.find + IsVertical + + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + SkillViewController.m + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1493, 738}} + RubberWindowFrame + 537 242 1493 1069 0 0 2560 1578 + + Module + PBXNavigatorGroup + Proportion + 1493pt + + + Proportion + 738pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{0, 743}, {1493, 285}} + RubberWindowFrame + 537 242 1493 1069 0 0 2560 1578 + + Module + PBXProjectFindModule + Proportion + 285pt + + + Proportion + 1028pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + + TableOfContents + + 1C530D57069F1CE1000CFCEE + 3DF17F8C13F4414600ED668A + 3DF17F8D13F4414600ED668A + 1CDD528C0622207200134675 + 1CD0528E0623707200166675 + + WindowString + 537 242 1493 1069 0 0 2560 1578 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {817, 731}} + RubberWindowFrame + 1670 635 817 772 0 0 2560 1578 + + Module + PBXDebugCLIModule + Proportion + 731pt + + + Proportion + 731pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + 1C78EAAD065D492600B07095 + 3DF17F6713F438E300ED668A + 1C78EAAC065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.consoleV3 + WindowString + 1670 635 817 772 0 0 2560 1578 + WindowToolGUID + 1C78EAAD065D492600B07095 + WindowToolIsVisible + + + + Identifier + windowTool.snapshots + Layout + + + Dock + + + Module + XCSnapshotModule + Proportion + 100% + + + Proportion + 100% + + + Name + Snapshots + ServiceClasses + + XCSnapshotModule + + StatusbarIsVisible + Yes + ToolbarConfiguration + xcode.toolbar.config.snapshots + WindowString + 315 824 300 550 0 0 1440 878 + WindowToolIsVisible + Yes + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.0950012207031 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.breakpoints + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 25 1065 744 409 0 0 2560 1578 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 25 1065 744 409 0 0 2560 1578 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 3 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + + TableOfContents + + 3D64A8FE13E2664F0017C7E8 + 3D64A8FF13E2664F0017C7E8 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpointsV3 + WindowString + 25 1065 744 409 0 0 2560 1578 + WindowToolGUID + 3D64A8FE13E2664F0017C7E8 + WindowToolIsVisible + + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimatorV3 + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.projectFormatConflicts + Layout + + + Dock + + + Module + XCProjectFormatConflictsModule + Proportion + 100% + + + Proportion + 100% + + + Name + Project Format Conflicts + ServiceClasses + + XCProjectFormatConflictsModule + + StatusbarIsVisible + 0 + WindowContentMinSize + 450 300 + WindowString + 50 850 472 307 0 0 1440 877 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + 0 + + + Identifier + windowTool.refactoring + IncludeInToolsMenu + 0 + Layout + + + Dock + + + BecomeActive + 1 + GeometryConfiguration + + Frame + {0, 0}, {500, 335} + RubberWindowFrame + {0, 0}, {500, 335} + + Module + XCRefactoringModule + Proportion + 100% + + + Proportion + 100% + + + Name + Refactoring + ServiceClasses + + XCRefactoringModule + + WindowString + 200 200 500 356 0 0 1920 1200 + + + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.pbxuser b/wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.pbxuser new file mode 100644 index 0000000..cc67d76 --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/ryan.gerleve.pbxuser @@ -0,0 +1,3284 @@ +// !$*UTF8*$! +{ + 1D6058900D05DD3D006BFB54 /* wolf3d */ = { + activeExec = 0; + executables = ( + 3D2F13A713B9524F00A88583 /* wolf3d */, + ); + }; + 29B97313FDCFA39411CA2CEA /* Project object */ = { + activeArchitecturePreference = armv6; + activeBuildConfigurationName = Debug; + activeExecutable = 3D2F13A713B9524F00A88583 /* wolf3d */; + activeSDKPreference = iphonesimulator4.3; + activeTarget = 1D6058900D05DD3D006BFB54 /* wolf3d */; + addToTargets = ( + 1D6058900D05DD3D006BFB54 /* wolf3d */, + ); + breakpoints = ( + ); + codeSenseManager = 3D2F13B913B9526E00A88583 /* Code sense */; + executables = ( + 3D2F13A713B9524F00A88583 /* wolf3d */, + ); + perUserDictionary = { + "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 198, + 20, + 99, + 99, + 29, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBreakpointsDataSource_ActionID, + PBXBreakpointsDataSource_TypeID, + PBXBreakpointsDataSource_BreakpointID, + PBXBreakpointsDataSource_UseID, + PBXBreakpointsDataSource_LocationID, + PBXBreakpointsDataSource_ConditionID, + PBXBreakpointsDataSource_IgnoreCountID, + PBXBreakpointsDataSource_ContinueID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 731.58349609375, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = 1; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 844, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 804, + 60, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 334771396; + PBXWorkspaceStateSaveDate = 334771396; + }; + perUserProjectItems = { + 3D10C31413F2D7E700DF5856 = 3D10C31413F2D7E700DF5856 /* PBXTextBookmark */; + 3D10C34C13F2E71200DF5856 = 3D10C34C13F2E71200DF5856 /* PBXBookmark */; + 3D10C34E13F2E71200DF5856 = 3D10C34E13F2E71200DF5856 /* PBXBookmark */; + 3D10C34F13F2E71200DF5856 = 3D10C34F13F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35013F2E71200DF5856 = 3D10C35013F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35113F2E71200DF5856 = 3D10C35113F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35213F2E71200DF5856 = 3D10C35213F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35313F2E71200DF5856 = 3D10C35313F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35413F2E71200DF5856 = 3D10C35413F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35513F2E71200DF5856 = 3D10C35513F2E71200DF5856 /* PBXTextBookmark */; + 3D10C35613F2E71200DF5856 = 3D10C35613F2E71200DF5856 /* PBXTextBookmark */; + 3D10C38013F318D200DF5856 = 3D10C38013F318D200DF5856 /* PlistBookmark */; + 3D10C39013F31B5800DF5856 = 3D10C39013F31B5800DF5856 /* PBXTextBookmark */; + 3D10C3F913F3406100DF5856 = 3D10C3F913F3406100DF5856 /* PBXBookmark */; + 3D10C3FA13F3406100DF5856 = 3D10C3FA13F3406100DF5856 /* PBXBookmark */; + 3D10C3FB13F3406100DF5856 = 3D10C3FB13F3406100DF5856 /* PBXBookmark */; + 3D10C3FC13F3406100DF5856 = 3D10C3FC13F3406100DF5856 /* PBXBookmark */; + 3D10C3FD13F3406100DF5856 = 3D10C3FD13F3406100DF5856 /* PBXBookmark */; + 3D10C3FE13F3406100DF5856 = 3D10C3FE13F3406100DF5856 /* PBXBookmark */; + 3D10C3FF13F3406100DF5856 = 3D10C3FF13F3406100DF5856 /* PBXBookmark */; + 3D10C40013F3406100DF5856 = 3D10C40013F3406100DF5856 /* PBXBookmark */; + 3D10C40113F3406100DF5856 = 3D10C40113F3406100DF5856 /* PBXTextBookmark */; + 3D10C40213F3406100DF5856 = 3D10C40213F3406100DF5856 /* PBXTextBookmark */; + 3D10C40313F3406100DF5856 = 3D10C40313F3406100DF5856 /* PBXTextBookmark */; + 3D10C40413F3406100DF5856 = 3D10C40413F3406100DF5856 /* PBXTextBookmark */; + 3D10C40513F3406100DF5856 = 3D10C40513F3406100DF5856 /* PBXTextBookmark */; + 3D10C40713F3406100DF5856 = 3D10C40713F3406100DF5856 /* PBXTextBookmark */; + 3D10C40A13F3406100DF5856 = 3D10C40A13F3406100DF5856 /* PBXTextBookmark */; + 3D10C41C13F3426C00DF5856 = 3D10C41C13F3426C00DF5856 /* PBXTextBookmark */; + 3D10C46613F34B5100DF5856 = 3D10C46613F34B5100DF5856 /* PBXTextBookmark */; + 3D10C46713F34B5100DF5856 = 3D10C46713F34B5100DF5856 /* PBXTextBookmark */; + 3D10C46813F34B5100DF5856 = 3D10C46813F34B5100DF5856 /* PBXBookmark */; + 3D10C46913F34B5100DF5856 = 3D10C46913F34B5100DF5856 /* PBXTextBookmark */; + 3D10C46A13F34B5100DF5856 = 3D10C46A13F34B5100DF5856 /* PBXTextBookmark */; + 3D10C46B13F34B5100DF5856 = 3D10C46B13F34B5100DF5856 /* PBXTextBookmark */; + 3D10C49F13F3555000DF5856 = 3D10C49F13F3555000DF5856 /* PBXTextBookmark */; + 3D10C4A813F3574F00DF5856 = 3D10C4A813F3574F00DF5856 /* PBXTextBookmark */; + 3D10C4B213F359DC00DF5856 = 3D10C4B213F359DC00DF5856 /* PBXTextBookmark */; + 3D10C4B313F359DC00DF5856 = 3D10C4B313F359DC00DF5856 /* PBXTextBookmark */; + 3D10C4D013F3600B00DF5856 = 3D10C4D013F3600B00DF5856 /* PBXTextBookmark */; + 3D10C4D113F3600B00DF5856 = 3D10C4D113F3600B00DF5856 /* PBXTextBookmark */; + 3D24004F13D88BF8009FC7A7 = 3D24004F13D88BF8009FC7A7 /* PBXTextBookmark */; + 3D24005013D88BF8009FC7A7 = 3D24005013D88BF8009FC7A7 /* PBXTextBookmark */; + 3D24005113D88BF8009FC7A7 = 3D24005113D88BF8009FC7A7 /* PBXTextBookmark */; + 3D24005213D88BF8009FC7A7 = 3D24005213D88BF8009FC7A7 /* PBXTextBookmark */; + 3D24005313D88BF8009FC7A7 = 3D24005313D88BF8009FC7A7 /* PBXTextBookmark */; + 3D24005413D88BF8009FC7A7 = 3D24005413D88BF8009FC7A7 /* PBXTextBookmark */; + 3D24006813D89342009FC7A7 = 3D24006813D89342009FC7A7 /* PBXTextBookmark */; + 3D24007013D89553009FC7A7 = 3D24007013D89553009FC7A7 /* PBXTextBookmark */; + 3D24016113D8DB12009FC7A7 = 3D24016113D8DB12009FC7A7 /* PBXTextBookmark */; + 3D2401D113D8FCB1009FC7A7 = 3D2401D113D8FCB1009FC7A7 /* PBXTextBookmark */; + 3D27CB1213D4F0B700D4DACC = 3D27CB1213D4F0B700D4DACC /* PBXTextBookmark */; + 3D27CB6613D50A3100D4DACC = 3D27CB6613D50A3100D4DACC /* PBXTextBookmark */; + 3D39A53413E31686001EC0D3 = 3D39A53413E31686001EC0D3 /* PBXTextBookmark */; + 3D39A5BF13E32BDA001EC0D3 = 3D39A5BF13E32BDA001EC0D3 /* PBXBookmark */; + 3D39A60613E353FE001EC0D3 = 3D39A60613E353FE001EC0D3 /* PBXTextBookmark */; + 3D39A62E13E35BB1001EC0D3 = 3D39A62E13E35BB1001EC0D3 /* PBXBookmark */; + 3D39A63013E35BB1001EC0D3 = 3D39A63013E35BB1001EC0D3 /* PBXBookmark */; + 3D39A63113E35BB1001EC0D3 = 3D39A63113E35BB1001EC0D3 /* PBXBookmark */; + 3D39A6E913E35C82001EC0D3 = 3D39A6E913E35C82001EC0D3 /* PBXBookmark */; + 3D3ED7B413BF6D6100C5B1DF = 3D3ED7B413BF6D6100C5B1DF /* PBXTextBookmark */; + 3D421AC513D9FF2000F4E5F3 = 3D421AC513D9FF2000F4E5F3 /* PBXTextBookmark */; + 3D421ACC13DA003600F4E5F3 = 3D421ACC13DA003600F4E5F3 /* PBXTextBookmark */; + 3D4FE44913F0ADE2005988AF = 3D4FE44913F0ADE2005988AF /* PBXTextBookmark */; + 3D4FE46013F0B0D1005988AF = 3D4FE46013F0B0D1005988AF /* PBXTextBookmark */; + 3D52098013F1A0FE007F7546 = 3D52098013F1A0FE007F7546 /* PBXTextBookmark */; + 3D52098113F1A0FE007F7546 = 3D52098113F1A0FE007F7546 /* PBXTextBookmark */; + 3D52099913F1A3BF007F7546 = 3D52099913F1A3BF007F7546 /* PBXTextBookmark */; + 3D5209D613F1C7A7007F7546 = 3D5209D613F1C7A7007F7546 /* PBXTextBookmark */; + 3D520A0913F1D33E007F7546 = 3D520A0913F1D33E007F7546 /* PBXTextBookmark */; + 3D5C0C0113DF60BB008ECBD1 = 3D5C0C0113DF60BB008ECBD1 /* PBXTextBookmark */; + 3D5C0C3F13DF73BD008ECBD1 = 3D5C0C3F13DF73BD008ECBD1 /* PBXTextBookmark */; + 3D5C0C7A13DF8FCF008ECBD1 = 3D5C0C7A13DF8FCF008ECBD1 /* PBXTextBookmark */; + 3D5C0D0413DF9AF4008ECBD1 = 3D5C0D0413DF9AF4008ECBD1 /* PBXBookmark */; + 3D5C0F3E13E0E89C008ECBD1 = 3D5C0F3E13E0E89C008ECBD1 /* PBXTextBookmark */; + 3D5C0F4013E0E89C008ECBD1 = 3D5C0F4013E0E89C008ECBD1 /* PBXTextBookmark */; + 3D5C0F4813E0E89C008ECBD1 = 3D5C0F4813E0E89C008ECBD1 /* PBXTextBookmark */; + 3D5C0F4A13E0E89C008ECBD1 = 3D5C0F4A13E0E89C008ECBD1 /* PBXTextBookmark */; + 3D5C0F5813E0EC8E008ECBD1 = 3D5C0F5813E0EC8E008ECBD1 /* PBXTextBookmark */; + 3D5C0F9C13E0FE33008ECBD1 = 3D5C0F9C13E0FE33008ECBD1 /* PBXTextBookmark */; + 3D5C106C13E1B45C008ECBD1 = 3D5C106C13E1B45C008ECBD1 /* PBXTextBookmark */; + 3D5C10AF13E1D311008ECBD1 = 3D5C10AF13E1D311008ECBD1 /* PBXTextBookmark */; + 3D5C10B013E1D311008ECBD1 = 3D5C10B013E1D311008ECBD1 /* PBXTextBookmark */; + 3D5C129F13E22E13008ECBD1 = 3D5C129F13E22E13008ECBD1 /* PBXBookmark */; + 3D5C12A813E22F6C008ECBD1 = 3D5C12A813E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12AB13E22F6C008ECBD1 = 3D5C12AB13E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12AC13E22F6C008ECBD1 = 3D5C12AC13E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12AD13E22F6C008ECBD1 = 3D5C12AD13E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12AE13E22F6C008ECBD1 = 3D5C12AE13E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12B013E22F6C008ECBD1 = 3D5C12B013E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12B113E22F6C008ECBD1 = 3D5C12B113E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12B313E22F6C008ECBD1 = 3D5C12B313E22F6C008ECBD1 /* PBXBookmark */; + 3D5C12B513E22F6C008ECBD1 = 3D5C12B513E22F6C008ECBD1 /* PlistBookmark */; + 3D5C12E613E236D0008ECBD1 = 3D5C12E613E236D0008ECBD1 /* PBXBookmark */; + 3D5C12E713E236D0008ECBD1 = 3D5C12E713E236D0008ECBD1 /* PBXBookmark */; + 3D5C12E813E236D0008ECBD1 = 3D5C12E813E236D0008ECBD1 /* PBXBookmark */; + 3D5C12E913E236D0008ECBD1 = 3D5C12E913E236D0008ECBD1 /* PBXBookmark */; + 3D61672F13BAC44B005AC9FF = 3D61672F13BAC44B005AC9FF /* PBXTextBookmark */; + 3D61673013BAC44B005AC9FF = 3D61673013BAC44B005AC9FF /* PBXTextBookmark */; + 3D61673113BAC44B005AC9FF = 3D61673113BAC44B005AC9FF /* PBXTextBookmark */; + 3D61673213BAC44B005AC9FF = 3D61673213BAC44B005AC9FF /* PBXTextBookmark */; + 3D61673313BAC44B005AC9FF = 3D61673313BAC44B005AC9FF /* PBXTextBookmark */; + 3D64A89713E260850017C7E8 = 3D64A89713E260850017C7E8 /* PBXTextBookmark */; + 3D64A89913E260850017C7E8 = 3D64A89913E260850017C7E8 /* PBXTextBookmark */; + 3D64A8BA13E263AC0017C7E8 = 3D64A8BA13E263AC0017C7E8 /* PBXTextBookmark */; + 3D64A90213E266680017C7E8 = 3D64A90213E266680017C7E8 /* PBXTextBookmark */; + 3D64A90413E266680017C7E8 = 3D64A90413E266680017C7E8 /* PBXTextBookmark */; + 3D715D8913DF458400E69D06 = 3D715D8913DF458400E69D06 /* PBXTextBookmark */; + 3D746DB813BFB4A70018B535 = 3D746DB813BFB4A70018B535 /* PBXTextBookmark */; + 3D821FEC13E35DBE007A570A = 3D821FEC13E35DBE007A570A /* PBXBookmark */; + 3D821FED13E35DBE007A570A = 3D821FED13E35DBE007A570A /* PBXBookmark */; + 3D821FEE13E35DBE007A570A = 3D821FEE13E35DBE007A570A /* PBXBookmark */; + 3D821FEF13E35DBE007A570A = 3D821FEF13E35DBE007A570A /* PBXBookmark */; + 3D821FF013E35DBE007A570A = 3D821FF013E35DBE007A570A /* PBXBookmark */; + 3D821FF113E35DBE007A570A = 3D821FF113E35DBE007A570A /* PBXBookmark */; + 3D821FF213E35DBE007A570A = 3D821FF213E35DBE007A570A /* PBXBookmark */; + 3D821FF313E35DBE007A570A = 3D821FF313E35DBE007A570A /* PBXBookmark */; + 3D821FF413E35DBE007A570A = 3D821FF413E35DBE007A570A /* PBXBookmark */; + 3D86CD9213DCFAB700186487 = 3D86CD9213DCFAB700186487 /* PBXTextBookmark */; + 3D86CDD613DD05D500186487 = 3D86CDD613DD05D500186487 /* PBXTextBookmark */; + 3D86CE0613DD098600186487 = 3D86CE0613DD098600186487 /* PBXTextBookmark */; + 3D86D2BE13DE2CEE00186487 = 3D86D2BE13DE2CEE00186487 /* PBXTextBookmark */; + 3D86D32913DE311900186487 = 3D86D32913DE311900186487 /* PBXTextBookmark */; + 3D86D3E113DE3EE900186487 = 3D86D3E113DE3EE900186487 /* PBXTextBookmark */; + 3D86D3F613DE40AD00186487 = 3D86D3F613DE40AD00186487 /* PBXTextBookmark */; + 3D86D44713DE480000186487 = 3D86D44713DE480000186487 /* PBXTextBookmark */; + 3D86D46113DE4A9100186487 = 3D86D46113DE4A9100186487 /* PBXTextBookmark */; + 3D86D58C13DE644B00186487 = 3D86D58C13DE644B00186487 /* PBXTextBookmark */; + 3D86D5A413DE653600186487 = 3D86D5A413DE653600186487 /* PBXTextBookmark */; + 3D86D5A713DE653600186487 = 3D86D5A713DE653600186487 /* PBXTextBookmark */; + 3D86D5D313DE6C3E00186487 = 3D86D5D313DE6C3E00186487 /* PBXTextBookmark */; + 3DB0C67E13BF8761001A2A76 = 3DB0C67E13BF8761001A2A76 /* PBXTextBookmark */; + 3DB0C69413BF89D2001A2A76 = 3DB0C69413BF89D2001A2A76 /* PBXTextBookmark */; + 3DB0C6B013BF8BCE001A2A76 = 3DB0C6B013BF8BCE001A2A76 /* PBXTextBookmark */; + 3DB0C6E413BF9017001A2A76 = 3DB0C6E413BF9017001A2A76 /* PBXTextBookmark */; + 3DB48A4513DA3FC50086EB98 = 3DB48A4513DA3FC50086EB98 /* PBXTextBookmark */; + 3DB48A5313DA41B70086EB98 = 3DB48A5313DA41B70086EB98 /* PBXTextBookmark */; + 3DB48AAF13DA4D4A0086EB98 = 3DB48AAF13DA4D4A0086EB98 /* PBXTextBookmark */; + 3DCD716E13DA280B007FCBAD = 3DCD716E13DA280B007FCBAD /* PBXTextBookmark */; + 3DE882E013E360AF00C95AE8 = 3DE882E013E360AF00C95AE8 /* PBXBookmark */; + 3DE882E113E360AF00C95AE8 = 3DE882E113E360AF00C95AE8 /* PBXTextBookmark */; + 3DE8839B13E3879700C95AE8 = 3DE8839B13E3879700C95AE8 /* PBXTextBookmark */; + 3DE883B013E39C1800C95AE8 = 3DE883B013E39C1800C95AE8 /* PBXTextBookmark */; + 3DE883DC13E3A95300C95AE8 = 3DE883DC13E3A95300C95AE8 /* PBXTextBookmark */; + 3DF17F5D13F438E300ED668A /* PBXTextBookmark */ = 3DF17F5D13F438E300ED668A /* PBXTextBookmark */; + 3DF17F5E13F438E300ED668A /* XCBuildMessageTextBookmark */ = 3DF17F5E13F438E300ED668A /* XCBuildMessageTextBookmark */; + 3DF17F5F13F438E300ED668A /* PBXTextBookmark */ = 3DF17F5F13F438E300ED668A /* PBXTextBookmark */; + 3DF17F6813F438E400ED668A /* PBXTextBookmark */ = 3DF17F6813F438E400ED668A /* PBXTextBookmark */; + 3DF17F6913F438E400ED668A /* PBXTextBookmark */ = 3DF17F6913F438E400ED668A /* PBXTextBookmark */; + 3DF17F6A13F438E400ED668A /* PBXTextBookmark */ = 3DF17F6A13F438E400ED668A /* PBXTextBookmark */; + 3DF17F6B13F438E400ED668A /* PBXTextBookmark */ = 3DF17F6B13F438E400ED668A /* PBXTextBookmark */; + 3DF17F6C13F438E400ED668A /* PBXTextBookmark */ = 3DF17F6C13F438E400ED668A /* PBXTextBookmark */; + 3DF17F6D13F438E400ED668A /* PBXTextBookmark */ = 3DF17F6D13F438E400ED668A /* PBXTextBookmark */; + 3DF17F7213F4390300ED668A /* PBXTextBookmark */ = 3DF17F7213F4390300ED668A /* PBXTextBookmark */; + 3DF17F7313F4390300ED668A /* PBXTextBookmark */ = 3DF17F7313F4390300ED668A /* PBXTextBookmark */; + 3DF17F7413F4390300ED668A /* PBXTextBookmark */ = 3DF17F7413F4390300ED668A /* PBXTextBookmark */; + 3DF17F7513F4390300ED668A /* PBXTextBookmark */ = 3DF17F7513F4390300ED668A /* PBXTextBookmark */; + 3DF17F7813F43BB300ED668A /* PBXTextBookmark */ = 3DF17F7813F43BB300ED668A /* PBXTextBookmark */; + 3DF17F7913F43E2B00ED668A /* PBXTextBookmark */ = 3DF17F7913F43E2B00ED668A /* PBXTextBookmark */; + 3DF17F7A13F43E2B00ED668A /* PBXTextBookmark */ = 3DF17F7A13F43E2B00ED668A /* PBXTextBookmark */; + 3DF17F7B13F43E2B00ED668A /* PBXTextBookmark */ = 3DF17F7B13F43E2B00ED668A /* PBXTextBookmark */; + 3DF17F7C13F43E2B00ED668A /* PBXTextBookmark */ = 3DF17F7C13F43E2B00ED668A /* PBXTextBookmark */; + 3DF17F8313F4414600ED668A /* PBXTextBookmark */ = 3DF17F8313F4414600ED668A /* PBXTextBookmark */; + 3DF17F8413F4414600ED668A /* PBXTextBookmark */ = 3DF17F8413F4414600ED668A /* PBXTextBookmark */; + 3DF17F8513F4414600ED668A /* PBXTextBookmark */ = 3DF17F8513F4414600ED668A /* PBXTextBookmark */; + 3DF17F8613F4414600ED668A /* PBXTextBookmark */ = 3DF17F8613F4414600ED668A /* PBXTextBookmark */; + 3DF17F8713F4414600ED668A /* PBXTextBookmark */ = 3DF17F8713F4414600ED668A /* PBXTextBookmark */; + 3DF17F8813F4414600ED668A /* PBXTextBookmark */ = 3DF17F8813F4414600ED668A /* PBXTextBookmark */; + 3DF17F8913F4414600ED668A /* XCBuildMessageTextBookmark */ = 3DF17F8913F4414600ED668A /* XCBuildMessageTextBookmark */; + 3DF17F8A13F4414600ED668A /* PBXTextBookmark */ = 3DF17F8A13F4414600ED668A /* PBXTextBookmark */; + 3DF17FBC13F4465100ED668A /* PBXTextBookmark */ = 3DF17FBC13F4465100ED668A /* PBXTextBookmark */; + 3DF17FBD13F4465100ED668A /* PBXTextBookmark */ = 3DF17FBD13F4465100ED668A /* PBXTextBookmark */; + 3DF17FBE13F4465100ED668A /* PBXTextBookmark */ = 3DF17FBE13F4465100ED668A /* PBXTextBookmark */; + 3DF17FBF13F4465100ED668A /* PBXTextBookmark */ = 3DF17FBF13F4465100ED668A /* PBXTextBookmark */; + 3DF17FC013F4465100ED668A /* PBXTextBookmark */ = 3DF17FC013F4465100ED668A /* PBXTextBookmark */; + 3DF1800913F447EC00ED668A /* PBXTextBookmark */ = 3DF1800913F447EC00ED668A /* PBXTextBookmark */; + 3DF1800A13F447EC00ED668A /* PBXTextBookmark */ = 3DF1800A13F447EC00ED668A /* PBXTextBookmark */; + 3DF1800B13F447EC00ED668A /* PBXTextBookmark */ = 3DF1800B13F447EC00ED668A /* PBXTextBookmark */; + 3DF1800C13F447EC00ED668A /* PBXTextBookmark */ = 3DF1800C13F447EC00ED668A /* PBXTextBookmark */; + 3DF1800D13F447EC00ED668A /* PBXTextBookmark */ = 3DF1800D13F447EC00ED668A /* PBXTextBookmark */; + 3DF1800E13F447EC00ED668A /* PBXTextBookmark */ = 3DF1800E13F447EC00ED668A /* PBXTextBookmark */; + 3DF1800F13F447EC00ED668A /* PBXTextBookmark */ = 3DF1800F13F447EC00ED668A /* PBXTextBookmark */; + 3DF1801013F447EC00ED668A /* PBXTextBookmark */ = 3DF1801013F447EC00ED668A /* PBXTextBookmark */; + 3DF1801113F447EC00ED668A /* PBXTextBookmark */ = 3DF1801113F447EC00ED668A /* PBXTextBookmark */; + 3DF1801213F447EC00ED668A /* PBXTextBookmark */ = 3DF1801213F447EC00ED668A /* PBXTextBookmark */; + 3DF1801313F447EC00ED668A /* PBXTextBookmark */ = 3DF1801313F447EC00ED668A /* PBXTextBookmark */; + 3DF1801413F447EC00ED668A /* PBXTextBookmark */ = 3DF1801413F447EC00ED668A /* PBXTextBookmark */; + 3DF1801513F447EC00ED668A /* PBXTextBookmark */ = 3DF1801513F447EC00ED668A /* PBXTextBookmark */; + 3DF1801613F447EC00ED668A /* PBXTextBookmark */ = 3DF1801613F447EC00ED668A /* PBXTextBookmark */; + 3DF1801713F447EC00ED668A /* PBXTextBookmark */ = 3DF1801713F447EC00ED668A /* PBXTextBookmark */; + 3DF1801813F447EC00ED668A /* XCBuildMessageTextBookmark */ = 3DF1801813F447EC00ED668A /* XCBuildMessageTextBookmark */; + 3DF1801913F447EC00ED668A /* PBXTextBookmark */ = 3DF1801913F447EC00ED668A /* PBXTextBookmark */; + 3DF1801A13F447EC00ED668A /* PBXTextBookmark */ = 3DF1801A13F447EC00ED668A /* PBXTextBookmark */; + 3DF1801B13F447EC00ED668A /* PBXTextBookmark */ = 3DF1801B13F447EC00ED668A /* PBXTextBookmark */; + 3DF1801C13F447EC00ED668A /* PBXTextBookmark */ = 3DF1801C13F447EC00ED668A /* PBXTextBookmark */; + 3DF1801D13F447EC00ED668A /* PBXTextBookmark */ = 3DF1801D13F447EC00ED668A /* PBXTextBookmark */; + 3DF1801E13F447EC00ED668A /* PBXTextBookmark */ = 3DF1801E13F447EC00ED668A /* PBXTextBookmark */; + 3DF1801F13F447EC00ED668A /* PBXTextBookmark */ = 3DF1801F13F447EC00ED668A /* PBXTextBookmark */; + 3DF1802013F447EC00ED668A /* PBXTextBookmark */ = 3DF1802013F447EC00ED668A /* PBXTextBookmark */; + 3DF1802113F447EC00ED668A /* PBXTextBookmark */ = 3DF1802113F447EC00ED668A /* PBXTextBookmark */; + 3DF1802213F447EC00ED668A /* PBXTextBookmark */ = 3DF1802213F447EC00ED668A /* PBXTextBookmark */; + 3DF1802313F447EC00ED668A /* PBXTextBookmark */ = 3DF1802313F447EC00ED668A /* PBXTextBookmark */; + 3DF1802413F447EE00ED668A /* PBXTextBookmark */ = 3DF1802413F447EE00ED668A /* PBXTextBookmark */; + 3DF1802513F447EE00ED668A /* PBXTextBookmark */ = 3DF1802513F447EE00ED668A /* PBXTextBookmark */; + 3DF1802C13F4481100ED668A /* PBXTextBookmark */ = 3DF1802C13F4481100ED668A /* PBXTextBookmark */; + 3DF1802D13F4481100ED668A /* PBXTextBookmark */ = 3DF1802D13F4481100ED668A /* PBXTextBookmark */; + 3DF1802E13F4481100ED668A /* PBXTextBookmark */ = 3DF1802E13F4481100ED668A /* PBXTextBookmark */; + 3DF1803113F448D100ED668A /* PBXTextBookmark */ = 3DF1803113F448D100ED668A /* PBXTextBookmark */; + 3DF1803213F448D100ED668A /* PBXTextBookmark */ = 3DF1803213F448D100ED668A /* PBXTextBookmark */; + 3DF1803513F449CC00ED668A /* PBXTextBookmark */ = 3DF1803513F449CC00ED668A /* PBXTextBookmark */; + 3DF1803613F449CC00ED668A /* PBXTextBookmark */ = 3DF1803613F449CC00ED668A /* PBXTextBookmark */; + 3DF1803713F449D000ED668A /* PBXTextBookmark */ = 3DF1803713F449D000ED668A /* PBXTextBookmark */; + 3DF1803813F449D000ED668A /* PBXTextBookmark */ = 3DF1803813F449D000ED668A /* PBXTextBookmark */; + 3DF1803913F449D000ED668A /* PBXTextBookmark */ = 3DF1803913F449D000ED668A /* PBXTextBookmark */; + 3DF1803D13F44B6100ED668A /* PBXTextBookmark */ = 3DF1803D13F44B6100ED668A /* PBXTextBookmark */; + 3DF1A97013BD534400C34057 = 3DF1A97013BD534400C34057 /* PBXTextBookmark */; + }; + sourceControlManager = 3D2F13B813B9526E00A88583 /* Source Control */; + userBuildSettings = { + }; + }; + 29B97316FDCFA39411CA2CEA /* main.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {878, 1019}}"; + sepNavSelRange = "{985, 0}"; + sepNavVisRange = "{0, 985}"; + }; + }; + 32CA4F630368D1EE00C91783 /* wolf3d_Prefix.pch */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {944, 500}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 173}"; + }; + }; + 3D10C31413F2D7E700DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; + name = "iphone_menus.c: 840"; + rLen = 0; + rLoc = 24772; + rType = 0; + vrLen = 2116; + vrLoc = 23518; + }; + 3D10C34C13F2E71200DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3DE8827813E35E5000C95AE8 /* shoot.png */; + }; + 3D10C34E13F2E71200DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */; + }; + 3D10C34F13F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC320F6B3222004123C5 /* wolf_level.h */; + name = "wolf_level.h: 210"; + rLen = 0; + rLoc = 4665; + rType = 0; + vrLen = 1577; + vrLoc = 2964; + }; + 3D10C35013F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF813DF9A8E008ECBD1 /* LegalViewController.h */; + name = "LegalViewController.h: 16"; + rLen = 0; + rLoc = 256; + rType = 0; + vrLen = 263; + vrLoc = 0; + }; + 3D10C35113F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF913DF9A8E008ECBD1 /* LegalViewController.m */; + name = "LegalViewController.m: 12"; + rLen = 0; + rLoc = 218; + rType = 0; + vrLen = 1660; + vrLoc = 0; + }; + 3D10C35213F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */; + name = "iphone_alerts.m: 88"; + rLen = 13; + rLoc = 1762; + rType = 0; + vrLen = 1706; + vrLoc = 474; + }; + 3D10C35313F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */; + name = "iphone_alerts.h: 18"; + rLen = 8; + rLoc = 374; + rType = 0; + vrLen = 419; + vrLoc = 0; + }; + 3D10C35413F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */; + name = "iphone_main.c: 362"; + rLen = 0; + rLoc = 10337; + rType = 0; + vrLen = 1958; + vrLoc = 0; + }; + 3D10C35513F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D101069ACA8001E0547 /* iphone_store.h */; + name = "iphone_store.h: 46"; + rLen = 0; + rLoc = 1635; + rType = 0; + vrLen = 1910; + vrLoc = 0; + }; + 3D10C35613F2E71200DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D24009D13D89BF4009FC7A7 /* iphone_store.m */; + name = "iphone_store.m: 67"; + rLen = 0; + rLoc = 2180; + rType = 0; + vrLen = 2601; + vrLoc = 0; + }; + 3D10C38013F318D200DF5856 /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = 8D1107310486CEB800E47090 /* Info.plist */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/Info.plist; + rLen = 0; + rLoc = 9223372036854775808; + }; + 3D10C39013F31B5800DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF513DF9A5D008ECBD1 /* CreditsViewController.h */; + name = "CreditsViewController.h: 14"; + rLen = 0; + rLoc = 253; + rType = 0; + vrLen = 308; + vrLoc = 0; + }; + 3D10C39D13F3212A00DF5856 /* WolfSlider.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 207}"; + }; + }; + 3D10C39E13F3212A00DF5856 /* WolfSlider.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 477}"; + }; + }; + 3D10C3E213F33AB700DF5856 /* SkillViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 966}}"; + sepNavSelRange = "{232, 0}"; + sepNavVisRange = "{0, 482}"; + }; + }; + 3D10C3E313F33AB700DF5856 /* SkillViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1139, 1547}}"; + sepNavSelRange = "{942, 0}"; + sepNavVisRange = "{1007, 1714}"; + }; + }; + 3D10C3F913F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */; + }; + 3D10C3FA13F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */; + }; + 3D10C3FB13F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3DE8827C13E35E5000C95AE8 /* slider_bar.png */; + }; + 3D10C3FC13F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = C81E121B13E225FB00B1049A /* slider.png */; + }; + 3D10C3FD13F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3DE8825113E35E5000C95AE8 /* button_right.png */; + }; + 3D10C3FE13F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35E6E1A113F321A50010F530 /* settings_slider_white.png */; + }; + 3D10C3FF13F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35E6E1A013F321A50010F530 /* settings_slider_grey.png */; + }; + 3D10C40013F3406100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35E6E19F13F321A50010F530 /* settings_slider_blue.png */; + }; + 3D10C40113F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C39E13F3212A00DF5856 /* WolfSlider.m */; + name = "WolfSlider.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 477; + vrLoc = 0; + }; + 3D10C40213F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = C81E11A813E2112100B1049A /* SettingsViewController.m */; + name = "SettingsViewController.m: 35"; + rLen = 0; + rLoc = 980; + rType = 0; + vrLen = 2425; + vrLoc = 0; + }; + 3D10C40313F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */; + name = "CreditsViewController.m: 15"; + rLen = 0; + rLoc = 382; + rType = 0; + vrLen = 2268; + vrLoc = 0; + }; + 3D10C40413F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4913DF800E008ECBD1 /* LevelSelectViewController.h */; + name = "LevelSelectViewController.h: 18"; + rLen = 0; + rLoc = 522; + rType = 0; + vrLen = 1044; + vrLoc = 0; + }; + 3D10C40513F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86CF8B13DDE51800186487 /* MainMenuViewController.h */; + name = "MainMenuViewController.h: 39"; + rLen = 0; + rLoc = 1171; + rType = 0; + vrLen = 1667; + vrLoc = 0; + }; + 3D10C40713F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */; + name = "MainMenuViewController.m: 72"; + rLen = 0; + rLoc = 2516; + rType = 0; + vrLen = 2629; + vrLoc = 0; + }; + 3D10C40A13F3406100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 74"; + rLen = 0; + rLoc = 2309; + rType = 0; + vrLen = 1987; + vrLoc = 0; + }; + 3D10C41C13F3426C00DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E213F33AB700DF5856 /* SkillViewController.h */; + name = "SkillViewController.h: 19"; + rLen = 0; + rLoc = 264; + rType = 0; + vrLen = 640; + vrLoc = 0; + }; + 3D10C46613F34B5100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0FD613E10204008ECBD1 /* MissionTableViewCell.h */; + name = "MissionTableViewCell.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 234; + vrLoc = 0; + }; + 3D10C46713F34B5100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0FD713E10204008ECBD1 /* MissionTableViewCell.m */; + name = "MissionTableViewCell.m: 37"; + rLen = 0; + rLoc = 771; + rType = 0; + vrLen = 821; + vrLoc = 0; + }; + 3D10C46813F34B5100DF5856 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D5C0F8113E0FC46008ECBD1 /* iphone_preset_4.png */; + }; + 3D10C46913F34B5100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DDD3A2513DF232900967735 /* UIFontButton.h */; + name = "UIFontButton.h: 8"; + rLen = 0; + rLoc = 71; + rType = 0; + vrLen = 71; + vrLoc = 0; + }; + 3D10C46A13F34B5100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C39D13F3212A00DF5856 /* WolfSlider.h */; + name = "WolfSlider.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 207; + vrLoc = 0; + }; + 3D10C46B13F34B5100DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C6E13DF88F8008ECBD1 /* UIFontLabel.h */; + name = "UIFontLabel.h: 4"; + rLen = 0; + rLoc = 60; + rType = 0; + vrLen = 68; + vrLoc = 0; + }; + 3D10C49F13F3555000DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0EB713E0B22A008ECBD1 /* CGGeometry.h */; + name = "CGGeometry.h: 29"; + rLen = 16; + rLoc = 429; + rType = 0; + vrLen = 1734; + vrLoc = 0; + }; + 3D10C4A813F3574F00DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; + name = "LevelSelectViewController.m: 216"; + rLen = 142; + rLoc = 6260; + rType = 0; + vrLen = 2458; + vrLoc = 4784; + }; + 3D10C4B213F359DC00DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B2D0F6B2D9D0085DD28 /* cvar.c */; + name = "cvar.c: 448"; + rLen = 0; + rLoc = 8762; + rType = 0; + vrLen = 1392; + vrLoc = 8089; + }; + 3D10C4B313F359DC00DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */; + rLen = 0; + rLoc = 241; + rType = 1; + }; + 3D10C4D013F3600B00DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C2913DF6836008ECBD1 /* EpisodeViewController.h */; + name = "EpisodeViewController.h: 23"; + rLen = 0; + rLoc = 509; + rType = 0; + vrLen = 515; + vrLoc = 0; + }; + 3D10C4D113F3600B00DF5856 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */; + name = "EpisodeViewController.m: 17"; + rLen = 0; + rLoc = 362; + rType = 0; + vrLen = 1998; + vrLoc = 0; + }; + 3D24004F13D88BF8009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC260F6B3222004123C5 /* wolf_actor_ai.h */; + name = "wolf_actor_ai.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 2095; + vrLoc = 0; + }; + 3D24005013D88BF8009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC280F6B3222004123C5 /* wolf_actors.h */; + name = "wolf_actors.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1888; + vrLoc = 0; + }; + 3D24005113D88BF8009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC340F6B3222004123C5 /* wolf_main.c */; + name = "wolf_main.c: 77"; + rLen = 4; + rLoc = 1842; + rType = 0; + vrLen = 1834; + vrLoc = 0; + }; + 3D24005213D88BF8009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC360F6B3222004123C5 /* wolf_math.h */; + name = "wolf_math.h: 57"; + rLen = 6; + rLoc = 1858; + rType = 0; + vrLen = 2523; + vrLoc = 950; + }; + 3D24005313D88BF8009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC350F6B3222004123C5 /* wolf_math.c */; + name = "wolf_math.c: 175"; + rLen = 44; + rLoc = 5644; + rType = 0; + vrLen = 1377; + vrLoc = 5936; + }; + 3D24005413D88BF8009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC3E0F6B3222004123C5 /* wolf_raycast.h */; + name = "wolf_raycast.h: 62"; + rLen = 14; + rLoc = 1777; + rType = 0; + vrLen = 2085; + vrLoc = 0; + }; + 3D24006813D89342009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D24006913D89342009FC7A7 /* NSString.h */; + name = "NSString.h: 62"; + rLen = 37; + rLoc = 3289; + rType = 0; + vrLen = 4166; + vrLoc = 0; + }; + 3D24006913D89342009FC7A7 /* NSString.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSString.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h; + sourceTree = ""; + }; + 3D24006F13D89553009FC7A7 /* objc.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = objc.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/include/objc/objc.h; + sourceTree = ""; + }; + 3D24007013D89553009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D24007113D89553009FC7A7 /* stdbool.h */; + name = "stdbool.h: 36"; + rLen = 5; + rLoc = 1587; + rType = 0; + vrLen = 1752; + vrLoc = 0; + }; + 3D24007113D89553009FC7A7 /* stdbool.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = stdbool.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/include/stdbool.h; + sourceTree = ""; + }; + 3D24009D13D89BF4009FC7A7 /* iphone_store.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 4381}}"; + sepNavSelRange = "{2180, 0}"; + sepNavVisRange = "{0, 2601}"; + }; + }; + 3D24016113D8DB12009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; + name = "iphone_mapselector.c: 99"; + rLen = 10; + rLoc = 1781; + rType = 0; + vrLen = 1942; + vrLoc = 906; + }; + 3D2401D113D8FCB1009FC7A7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D24006F13D89553009FC7A7 /* objc.h */; + name = "objc.h: 50"; + rLen = 32; + rLoc = 1513; + rType = 0; + vrLen = 2389; + vrLoc = 0; + }; + 3D27CA8E13D4D68200D4DACC /* gles_glue.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = gles_glue.h; + path = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/gles_glue.h; + sourceTree = ""; + }; + 3D27CB1213D4F0B700D4DACC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B6D0F6B2D9D0085DD28 /* video.h */; + name = "video.h: 56"; + rLen = 48; + rLoc = 1357; + rType = 0; + vrLen = 1692; + vrLoc = 0; + }; + 3D27CB6613D50A3100D4DACC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC400F6B3222004123C5 /* wolf_renderer.h */; + name = "wolf_renderer.h: 43"; + rLen = 64; + rLoc = 1186; + rType = 0; + vrLen = 1796; + vrLoc = 0; + }; + 3D2F13A713B9524F00A88583 /* wolf3d */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 1; + configStateDict = { + }; + customDataFormattersEnabled = 1; + dataTipCustomDataFormattersEnabled = 1; + dataTipShowTypeColumn = 1; + dataTipSortType = 0; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = wolf3d; + savedGlobals = { + }; + showTypeColumn = 0; + sourceDirectories = ( + ); + variableFormatDictionary = { + "error-ALenum-AL_CheckErrors" = 1; + "internalFormat-int-TM_FindTexture" = 1; + }; + }; + 3D2F13B813B9526E00A88583 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + repositoryNamesForRoots = { + ../../../ = Rage; + }; + }; + }; + 3D2F13B913B9526E00A88583 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 3D39A53413E31686001EC0D3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73D13BF554400C5B1DF /* wolf3dViewController.h */; + name = "wolf3dViewController.h: 42"; + rLen = 37; + rLoc = 1266; + rType = 0; + vrLen = 1310; + vrLoc = 0; + }; + 3D39A5B513E32943001EC0D3 /* header_advanced.png */ = { + isa = PBXFileReference; + lastKnownFileType = image.png; + name = header_advanced.png; + path = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/menu_art/header_advanced.png; + sourceTree = ""; + }; + 3D39A5B813E32943001EC0D3 /* map_background.png */ = { + isa = PBXFileReference; + lastKnownFileType = image.png; + name = map_background.png; + path = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/menu_art/map_background.png; + sourceTree = ""; + }; + 3D39A5B913E32943001EC0D3 /* submenus_background_image.png */ = { + isa = PBXFileReference; + lastKnownFileType = image.png; + name = submenus_background_image.png; + path = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/menu_art/submenus_background_image.png; + sourceTree = ""; + }; + 3D39A5BF13E32BDA001EC0D3 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D39A5B813E32943001EC0D3 /* map_background.png */; + }; + 3D39A5E613E34E01001EC0D3 /* string.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = string.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/include/string.h; + sourceTree = ""; + }; + 3D39A60613E353FE001EC0D3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D39A5E613E34E01001EC0D3 /* string.h */; + name = "string.h: 89"; + rLen = 36; + rLoc = 3492; + rType = 0; + vrLen = 1984; + vrLoc = 2561; + }; + 3D39A62113E35B11001EC0D3 /* menu.png */ = { + isa = PBXFileReference; + lastKnownFileType = image.png; + name = menu.png; + path = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/menu_art/menu.png; + sourceTree = ""; + }; + 3D39A62E13E35BB1001EC0D3 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D39A5B513E32943001EC0D3 /* header_advanced.png */; + }; + 3D39A63013E35BB1001EC0D3 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D39A5B913E32943001EC0D3 /* submenus_background_image.png */; + }; + 3D39A63113E35BB1001EC0D3 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D39A62113E35B11001EC0D3 /* menu.png */; + }; + 3D39A6E913E35C82001EC0D3 /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D3ED73D13BF554400C5B1DF /* wolf3dViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 691}}"; + sepNavSelRange = "{984, 22}"; + sepNavVisRange = "{0, 1310}"; + sepNavWindowFrame = "{{84, 595}, {788, 915}}"; + }; + }; + 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 2964}}"; + sepNavSelRange = "{593, 0}"; + sepNavVisRange = "{0, 1409}"; + }; + }; + 3D3ED7B413BF6D6100C5B1DF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED7B513BF6D6100C5B1DF /* NSDate.h */; + name = "NSDate.h: 11"; + rLen = 31; + rLoc = 221; + rType = 0; + vrLen = 1068; + vrLoc = 0; + }; + 3D3ED7B513BF6D6100C5B1DF /* NSDate.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSDate.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSDate.h; + sourceTree = ""; + }; + 3D421AC513D9FF2000F4E5F3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B500F6B2D9D0085DD28 /* opengl_draw.c */; + name = "opengl_draw.c: 206"; + rLen = 9; + rLoc = 4779; + rType = 0; + vrLen = 1872; + vrLoc = 3566; + }; + 3D421ACC13DA003600F4E5F3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC410F6B3222004123C5 /* wolf_sprites.c */; + name = "wolf_sprites.c: 235"; + rLen = 40; + rLoc = 5703; + rType = 0; + vrLen = 1729; + vrLoc = 5164; + }; + 3D4FE44913F0ADE2005988AF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC700F6B3295004123C5 /* misc.h */; + name = "misc.h: 35"; + rLen = 0; + rLoc = 1264; + rType = 0; + vrLen = 2106; + vrLoc = 0; + }; + 3D4FE46013F0B0D1005988AF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; + name = "wolf3dAppDelegate.m: 279"; + rLen = 0; + rLoc = 9434; + rType = 0; + vrLen = 2006; + vrLoc = 8428; + }; + 3D52098013F1A0FE007F7546 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */; + name = "iphone_wolf.h: 369"; + rLen = 15; + rLoc = 11050; + rType = 0; + vrLen = 2098; + vrLoc = 8919; + }; + 3D52098113F1A0FE007F7546 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 43AF6B940F996DA200777569 /* iphone_sys.m */; + name = "iphone_sys.m: 296"; + rLen = 0; + rLoc = 8198; + rType = 0; + vrLen = 2358; + vrLoc = 4419; + }; + 3D52099913F1A3BF007F7546 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */; + name = "iphone_loop.c: 1191"; + rLen = 0; + rLoc = 26976; + rType = 0; + vrLen = 1843; + vrLoc = 24128; + }; + 3D5209D613F1C7A7007F7546 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72B5FF380F7E5C3D00C8A372 /* hud.c */; + name = "hud.c: 138"; + rLen = 0; + rLoc = 4152; + rType = 0; + vrLen = 3677; + vrLoc = 2723; + }; + 3D520A0913F1D33E007F7546 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC300F6B3222004123C5 /* wolf_doors.c */; + name = "wolf_doors.c: 347"; + rLen = 0; + rLoc = 7887; + rType = 0; + vrLen = 2112; + vrLoc = 7271; + }; + 3D5C0C0113DF60BB008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C0213DF60BB008ECBD1 /* EAGLDrawable.h */; + name = "EAGLDrawable.h: 52"; + rLen = 48; + rLoc = 2542; + rType = 0; + vrLen = 2657; + vrLoc = 0; + }; + 3D5C0C0213DF60BB008ECBD1 /* EAGLDrawable.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = EAGLDrawable.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/OpenGLES.framework/Headers/EAGLDrawable.h; + sourceTree = ""; + }; + 3D5C0C2913DF6836008ECBD1 /* EpisodeViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 991}}"; + sepNavSelRange = "{509, 0}"; + sepNavVisRange = "{0, 515}"; + }; + }; + 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 3406}}"; + sepNavSelRange = "{3136, 11}"; + sepNavVisRange = "{2340, 1184}"; + }; + }; + 3D5C0C3F13DF73BD008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 29B97316FDCFA39411CA2CEA /* main.m */; + name = "main.m: 30"; + rLen = 0; + rLoc = 985; + rType = 0; + vrLen = 985; + vrLoc = 0; + }; + 3D5C0C4913DF800E008ECBD1 /* LevelSelectViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 989}}"; + sepNavSelRange = "{522, 0}"; + sepNavVisRange = "{0, 1044}"; + }; + }; + 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 4394}}"; + sepNavSelRange = "{1292, 11}"; + sepNavVisRange = "{490, 1720}"; + sepNavWindowFrame = "{{15, 658}, {788, 915}}"; + }; + }; + 3D5C0C6E13DF88F8008ECBD1 /* UIFontLabel.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{60, 0}"; + sepNavVisRange = "{0, 68}"; + }; + }; + 3D5C0C6F13DF8920008ECBD1 /* UIFontLabel.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {878, 1019}}"; + sepNavSelRange = "{197, 0}"; + sepNavVisRange = "{0, 204}"; + }; + }; + 3D5C0C7A13DF8FCF008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C6F13DF8920008ECBD1 /* UIFontLabel.m */; + name = "UIFontLabel.m: 11"; + rLen = 0; + rLoc = 197; + rType = 0; + vrLen = 204; + vrLoc = 0; + }; + 3D5C0CF513DF9A5D008ECBD1 /* CreditsViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 995}}"; + sepNavSelRange = "{253, 0}"; + sepNavVisRange = "{0, 308}"; + }; + }; + 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 1261}}"; + sepNavSelRange = "{780, 11}"; + sepNavVisRange = "{0, 1487}"; + }; + }; + 3D5C0CF813DF9A8E008ECBD1 /* LegalViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 997}}"; + sepNavSelRange = "{256, 0}"; + sepNavVisRange = "{0, 263}"; + }; + }; + 3D5C0CF913DF9A8E008ECBD1 /* LegalViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 884}}"; + sepNavSelRange = "{487, 11}"; + sepNavVisRange = "{0, 1516}"; + }; + }; + 3D5C0D0413DF9AF4008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */; + }; + 3D5C0DE013E05D4D008ECBD1 /* TriviaViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {878, 1017}}"; + sepNavSelRange = "{507, 13}"; + sepNavVisRange = "{0, 635}"; + }; + }; + 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 1599}}"; + sepNavSelRange = "{794, 11}"; + sepNavVisRange = "{0, 1517}"; + }; + }; + 3D5C0EB713E0B22A008ECBD1 /* CGGeometry.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = CGGeometry.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers/CGGeometry.h; + sourceTree = ""; + }; + 3D5C0F3E13E0E89C008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0F3F13E0E89C008ECBD1 /* UIScreen.h */; + name = "UIScreen.h: 38"; + rLen = 156; + rLoc = 1470; + rType = 0; + vrLen = 2617; + vrLoc = 0; + }; + 3D5C0F3F13E0E89C008ECBD1 /* UIScreen.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = UIScreen.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIScreen.h; + sourceTree = ""; + }; + 3D5C0F4013E0E89C008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + name = "wolf3dViewController.m: 214"; + rLen = 0; + rLoc = 5669; + rType = 0; + vrLen = 2050; + vrLoc = 1644; + }; + 3D5C0F4813E0E89C008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0DE013E05D4D008ECBD1 /* TriviaViewController.h */; + name = "TriviaViewController.h: 20"; + rLen = 13; + rLoc = 507; + rType = 0; + vrLen = 635; + vrLoc = 0; + }; + 3D5C0F4A13E0E89C008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DDD3A2313DF231100967735 /* UIFontButton.m */; + name = "UIFontButton.m: 14"; + rLen = 0; + rLoc = 228; + rType = 0; + vrLen = 228; + vrLoc = 0; + }; + 3D5C0F5813E0EC8E008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0F5913E0EC8E008ECBD1 /* UIColor.h */; + name = "UIColor.h: 14"; + rLen = 70; + rLoc = 211; + rType = 0; + vrLen = 2557; + vrLoc = 0; + }; + 3D5C0F5913E0EC8E008ECBD1 /* UIColor.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = UIColor.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIColor.h; + sourceTree = ""; + }; + 3D5C0F9C13E0FE33008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0F9D13E0FE33008ECBD1 /* UITableViewCell.h */; + name = "UITableViewCell.h: 17"; + rLen = 134; + rLoc = 347; + rType = 0; + vrLen = 3016; + vrLoc = 0; + }; + 3D5C0F9D13E0FE33008ECBD1 /* UITableViewCell.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = UITableViewCell.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/UIKit.framework/Headers/UITableViewCell.h; + sourceTree = ""; + }; + 3D5C0FD613E10204008ECBD1 /* MissionTableViewCell.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 234}"; + }; + }; + 3D5C0FD713E10204008ECBD1 /* MissionTableViewCell.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{771, 0}"; + sepNavVisRange = "{0, 821}"; + sepNavWindowFrame = "{{61, 616}, {788, 915}}"; + }; + }; + 3D5C106C13E1B45C008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */; + name = "TriviaViewController.m: 90"; + rLen = 0; + rLoc = 2302; + rType = 0; + vrLen = 2187; + vrLoc = 926; + }; + 3D5C10AF13E1D311008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B2E0F6B2D9D0085DD28 /* cvar.h */; + name = "cvar.h: 104"; + rLen = 11; + rLoc = 3049; + rType = 0; + vrLen = 2668; + vrLoc = 2343; + }; + 3D5C10B013E1D311008ECBD1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC330F6B3222004123C5 /* wolf_local.h */; + name = "wolf_local.h: 125"; + rLen = 6; + rLoc = 2346; + rType = 0; + vrLen = 1133; + vrLoc = 1295; + }; + 3D5C129F13E22E13008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 43CF02FE0F56974E00E4A23D /* Default.png */; + }; + 3D5C12A813E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 350CCFCD13DF8DED003303AB /* mission_bg.png */; + }; + 3D5C12AB13E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35048ABD13E0D51600516B10 /* iphone_preset_1.png */; + }; + 3D5C12AC13E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35048AD613E0E98800516B10 /* difficulty_star1.png */; + }; + 3D5C12AD13E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35048AD713E0E98800516B10 /* difficulty_star2.png */; + }; + 3D5C12AE13E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35048AD813E0E98800516B10 /* difficulty_star3.png */; + }; + 3D5C12B013E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D5C0F7F13E0FC46008ECBD1 /* iphone_preset_2.png */; + }; + 3D5C12B113E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D5C0F8013E0FC46008ECBD1 /* iphone_preset_3.png */; + }; + 3D5C12B313E22F6C008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3555CC3F13E2001A006E7D2F /* button_highlight.png */; + }; + 3D5C12B513E22F6C008ECBD1 /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = 4364BF3E0F5CB25900F29317 /* dist.plist */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/dist.plist; + rLen = 0; + rLoc = 9223372036854775808; + }; + 3D5C12E613E236D0008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 3D5C0D0913DF9B41008ECBD1 /* main_bg.png */; + }; + 3D5C12E713E236D0008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 350CCF9A13DF8B0E003303AB /* episode_bg.png */; + }; + 3D5C12E813E236D0008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 43CF02EC0F56955F00E4A23D /* wolf3d_icon.png */; + }; + 3D5C12E913E236D0008ECBD1 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 43E341280F9BB4B6003C5D00 /* wolf3dlite_icon.png */; + }; + 3D61672F13BAC44B005AC9FF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B4C0F6B2D9D0085DD28 /* openal_binding.h */; + name = "openal_binding.h: 173"; + rLen = 35; + rLoc = 8398; + rType = 0; + vrLen = 1324; + vrLoc = 7074; + }; + 3D61673013BAC44B005AC9FF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B4D0F6B2D9D0085DD28 /* openal_main.c */; + name = "openal_main.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1031; + vrLoc = 0; + }; + 3D61673113BAC44B005AC9FF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B5B0F6B2D9D0085DD28 /* sound.h */; + name = "sound.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1212; + vrLoc = 1712; + }; + 3D61673213BAC44B005AC9FF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B5E0F6B2D9D0085DD28 /* sound_stream.c */; + name = "sound_stream.c: 253"; + rLen = 0; + rLoc = 6205; + rType = 0; + vrLen = 740; + vrLoc = 6142; + }; + 3D61673313BAC44B005AC9FF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B5C0F6B2D9D0085DD28 /* sound_local.h */; + name = "sound_local.h: 109"; + rLen = 0; + rLoc = 2948; + rType = 0; + vrLen = 1001; + vrLoc = 2006; + }; + 3D64A89713E260850017C7E8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B620F6B2D9D0085DD28 /* texture_manager.h */; + name = "texture_manager.h: 170"; + rLen = 7; + rLoc = 3228; + rType = 0; + vrLen = 1698; + vrLoc = 2139; + }; + 3D64A89913E260850017C7E8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B640F6B2D9D0085DD28 /* tga.h */; + name = "tga.h: 40"; + rLen = 7; + rLoc = 1338; + rType = 0; + vrLen = 1581; + vrLoc = 0; + }; + 3D64A89C13E260850017C7E8 /* CGImage.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = CGImage.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers/CGImage.h; + sourceTree = ""; + }; + 3D64A8BA13E263AC0017C7E8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B1E0F6B2D9D0085DD28 /* arch.h */; + name = "arch.h: 153"; + rLen = 43; + rLoc = 2926; + rType = 0; + vrLen = 1518; + vrLoc = 2305; + }; + 3D64A90213E266680017C7E8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE460F6C89F8004123C5 /* EAGLView.m */; + name = "EAGLView.m: 281"; + rLen = 0; + rLoc = 8682; + rType = 0; + vrLen = 2144; + vrLoc = 7496; + }; + 3D64A90413E266680017C7E8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D64A90513E266680017C7E8 /* EAGLView.m */; + name = "EAGLView.m: 281"; + rLen = 19; + rLoc = 9089; + rType = 0; + vrLen = 3199; + vrLoc = 7851; + }; + 3D64A90513E266680017C7E8 /* EAGLView.m */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + name = EAGLView.m; + path = /Users/ryan.gerleve/Downloads/GLSprite/Classes/EAGLView.m; + sourceTree = ""; + }; + 3D715D8913DF458400E69D06 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC370F6B3222004123C5 /* wolf_opengl.c */; + name = "wolf_opengl.c: 61"; + rLen = 0; + rLoc = 1563; + rType = 0; + vrLen = 1603; + vrLoc = 827; + }; + 3D746DB813BFB4A70018B535 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DF1AB0913BE533100C34057 /* CFDate.h */; + name = "CFDate.h: 13"; + rLen = 39; + rLoc = 237; + rType = 0; + vrLen = 1129; + vrLoc = 0; + }; + 3D821FEC13E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FED13E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FEE13E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FEF13E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FF013E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FF113E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FF213E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FF313E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D821FF413E35DBE007A570A /* PBXBookmark */ = { + isa = PBXBookmark; + }; + 3D86CD9213DCFAB700186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B460F6B2D9D0085DD28 /* myopengl.h */; + name = "myopengl.h: 180"; + rLen = 7; + rLoc = 9611; + rType = 0; + vrLen = 5441; + vrLoc = 7555; + }; + 3D86CDD613DD05D500186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B540F6B2D9D0085DD28 /* opengl_texture.c */; + name = "opengl_texture.c: 154"; + rLen = 33; + rLoc = 2921; + rType = 0; + vrLen = 1013; + vrLoc = 2262; + }; + 3D86CE0613DD098600186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */; + name = "wolf_raycast.c: 53"; + rLen = 67; + rLoc = 1523; + rType = 0; + vrLen = 1619; + vrLoc = 1038; + }; + 3D86CE4613DD16D000186487 /* iphone_qgl.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = iphone_qgl.h; + path = /Work/ryan.gerleve/idMobileDepot/Wolfenstein3DPlatinumDepot/wolf3d/code/iphone/iphone_qgl.h; + sourceTree = ""; + }; + 3D86CF8B13DDE51800186487 /* MainMenuViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{1171, 0}"; + sepNavVisRange = "{0, 1667}"; + }; + }; + 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 2379}}"; + sepNavSelRange = "{4363, 11}"; + sepNavVisRange = "{3435, 1684}"; + }; + }; + 3D86D18713DE158A00186487 /* UIApplication.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = UIApplication.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIApplication.h; + sourceTree = ""; + }; + 3D86D2BE13DE2CEE00186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86D18713DE158A00186487 /* UIApplication.h */; + name = "UIApplication.h: 238"; + rLen = 65; + rLoc = 11386; + rType = 0; + vrLen = 5209; + vrLoc = 9140; + }; + 3D86D32913DE311900186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE450F6C89F8004123C5 /* EAGLView.h */; + name = "EAGLView.h: 41"; + rLen = 0; + rLoc = 1275; + rType = 0; + vrLen = 2018; + vrLoc = 0; + }; + 3D86D3E113DE3EE900186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86CE4613DD16D000186487 /* iphone_qgl.h */; + name = "iphone_qgl.h: 1168"; + rLen = 13; + rLoc = 41721; + rType = 0; + vrLen = 2609; + vrLoc = 39874; + }; + 3D86D3F613DE40AD00186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DB0C65013BF861F001A2A76 /* gl.h */; + name = "gl.h: 722"; + rLen = 80; + rLoc = 30230; + rType = 0; + vrLen = 5838; + vrLoc = 28579; + }; + 3D86D44713DE480000186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B250F6B2D9D0085DD28 /* com_string.c */; + name = "com_string.c: 75"; + rLen = 0; + rLoc = 2412; + rType = 0; + vrLen = 2255; + vrLoc = 1331; + }; + 3D86D46113DE4A9100186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86D46213DE4A9100186487 /* stdlib.h */; + name = "stdlib.h: 233"; + rLen = 69; + rLoc = 8088; + rType = 0; + vrLen = 2859; + vrLoc = 6727; + }; + 3D86D46213DE4A9100186487 /* stdlib.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = stdlib.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/include/stdlib.h; + sourceTree = ""; + }; + 3D86D58C13DE644B00186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B580F6B2D9D0085DD28 /* renderer.h */; + name = "renderer.h: 84"; + rLen = 6; + rLoc = 1712; + rType = 0; + vrLen = 1481; + vrLoc = 829; + }; + 3D86D5A413DE653600186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B530F6B2D9D0085DD28 /* opengl_main.c */; + name = "opengl_main.c: 334"; + rLen = 0; + rLoc = 8539; + rType = 0; + vrLen = 1860; + vrLoc = 7318; + }; + 3D86D5A713DE653600186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */; + name = "iphone_downloadUserMap.m: 74"; + rLen = 0; + rLoc = 1810; + rType = 0; + vrLen = 2204; + vrLoc = 915; + }; + 3D86D5D313DE6C3E00186487 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE540F6C8CDE004123C5 /* gles_glue.c */; + name = "gles_glue.c: 65"; + rLen = 19; + rLoc = 1411; + rType = 0; + vrLen = 1756; + vrLoc = 738; + }; + 3DB0C65013BF861F001A2A76 /* gl.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = gl.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/OpenGLES.framework/Headers/ES1/gl.h; + sourceTree = ""; + }; + 3DB0C67E13BF8761001A2A76 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DB0C67F13BF8761001A2A76 /* EAGL.h */; + name = "EAGL.h: 63"; + rLen = 34; + rLoc = 1942; + rType = 0; + vrLen = 1180; + vrLoc = 1203; + }; + 3DB0C67F13BF8761001A2A76 /* EAGL.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = EAGL.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/OpenGLES.framework/Headers/EAGL.h; + sourceTree = ""; + }; + 3DB0C69413BF89D2001A2A76 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 32CA4F630368D1EE00C91783 /* wolf3d_Prefix.pch */; + name = "wolf3d_Prefix.pch: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 173; + vrLoc = 0; + }; + 3DB0C6B013BF8BCE001A2A76 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DB0C6B113BF8BCE001A2A76 /* gl.h */; + name = "gl.h: 190"; + rLen = 44; + rLoc = 6757; + rType = 0; + vrLen = 1366; + vrLoc = 5631; + }; + 3DB0C6B113BF8BCE001A2A76 /* gl.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = gl.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/OpenGLES.framework/Headers/ES2/gl.h; + sourceTree = ""; + }; + 3DB0C6E413BF9017001A2A76 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DB0C6E513BF9017001A2A76 /* EAGLView.m */; + name = "EAGLView.m: 76"; + rLen = 0; + rLoc = 1607; + rType = 0; + vrLen = 1114; + vrLoc = 1051; + }; + 3DB0C6E513BF9017001A2A76 /* EAGLView.m */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + name = EAGLView.m; + path = /Users/ryan.gerleve/Testing/GLSample/Classes/EAGLView.m; + sourceTree = ""; + }; + 3DB48A4513DA3FC50086EB98 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D27CA8E13D4D68200D4DACC /* gles_glue.h */; + name = "gles_glue.h: 64"; + rLen = 7; + rLoc = 1955; + rType = 0; + vrLen = 2003; + vrLoc = 0; + }; + 3DB48A5313DA41B70086EB98 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DCD716D13DA280B007FCBAD /* gl.h */; + name = "gl.h: 53"; + rLen = 34; + rLoc = 2255; + rType = 0; + vrLen = 2874; + vrLoc = 0; + }; + 3DB48AA513DA4CFD0086EB98 /* limits.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = limits.h; + path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/include/i386/limits.h; + sourceTree = ""; + }; + 3DB48AAF13DA4D4A0086EB98 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DB48AA513DA4CFD0086EB98 /* limits.h */; + name = "limits.h: 59"; + rLen = 0; + rLoc = 2925; + rType = 0; + vrLen = 3637; + vrLoc = 31; + }; + 3DCD716D13DA280B007FCBAD /* gl.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = gl.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/OpenGLES.framework/Headers/ES1/gl.h; + sourceTree = ""; + }; + 3DCD716E13DA280B007FCBAD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3DCD716F13DA280B007FCBAD /* glext.h */; + name = "glext.h: 260"; + rLen = 23; + rLoc = 12367; + rType = 0; + vrLen = 3843; + vrLoc = 10458; + }; + 3DCD716F13DA280B007FCBAD /* glext.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = glext.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/OpenGLES.framework/Headers/ES1/glext.h; + sourceTree = ""; + }; + 3DDD3A2313DF231100967735 /* UIFontButton.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {878, 1017}}"; + sepNavSelRange = "{228, 0}"; + sepNavVisRange = "{0, 228}"; + }; + }; + 3DDD3A2513DF232900967735 /* UIFontButton.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 993}}"; + sepNavSelRange = "{71, 0}"; + sepNavVisRange = "{0, 71}"; + }; + }; + 3DE882E013E360AF00C95AE8 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 35048AD913E0E98800516B10 /* difficulty_star4.png */; + }; + 3DE882E113E360AF00C95AE8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D64A89C13E260850017C7E8 /* CGImage.h */; + name = "CGImage.h: 16"; + rLen = 75; + rLoc = 373; + rType = 0; + vrLen = 2886; + vrLoc = 0; + }; + 3DE8839B13E3879700C95AE8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B610F6B2D9D0085DD28 /* texture_manager.c */; + name = "texture_manager.c: 533"; + rLen = 0; + rLoc = 12505; + rType = 0; + vrLen = 2551; + vrLoc = 11118; + }; + 3DE883B013E39C1800C95AE8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */; + name = "iphone_downloadSOD.m: 40"; + rLen = 0; + rLoc = 1105; + rType = 0; + vrLen = 2442; + vrLoc = 0; + }; + 3DE883DC13E3A95300C95AE8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC8E0F6B3363004123C5 /* wolfiphone.h */; + name = "wolfiphone.h: 97"; + rLen = 0; + rLoc = 2082; + rType = 0; + vrLen = 1734; + vrLoc = 349; + }; + 3DF17F5D13F438E300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */; + name = "MainMenuViewController.m: 25"; + rLen = 0; + rLoc = 846; + rType = 0; + vrLen = 1518; + vrLoc = 2627; + }; + 3DF17F5E13F438E300ED668A /* XCBuildMessageTextBookmark */ = { + isa = PBXTextBookmark; + comments = "Use of undeclared identifier 'EpisodeViewController'"; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + fallbackIsa = XCBuildMessageTextBookmark; + rLen = 1; + rLoc = 92; + rType = 1; + }; + 3DF17F5F13F438E300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 16"; + rLen = 0; + rLoc = 636; + rType = 0; + vrLen = 1462; + vrLoc = 0; + }; + 3DF17F6813F438E400ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */; + name = "EpisodeViewController.m: 17"; + rLen = 0; + rLoc = 362; + rType = 0; + vrLen = 1998; + vrLoc = 0; + }; + 3DF17F6913F438E400ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */; + name = "MainMenuViewController.m: 94"; + rLen = 0; + rLoc = 2975; + rType = 0; + vrLen = 2194; + vrLoc = 1768; + }; + 3DF17F6A13F438E400ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E213F33AB700DF5856 /* SkillViewController.h */; + name = "SkillViewController.h: 19"; + rLen = 0; + rLoc = 258; + rType = 0; + vrLen = 640; + vrLoc = 0; + }; + 3DF17F6B13F438E400ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 71"; + rLen = 0; + rLoc = 2222; + rType = 0; + vrLen = 1935; + vrLoc = 0; + }; + 3DF17F6C13F438E400ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4913DF800E008ECBD1 /* LevelSelectViewController.h */; + name = "LevelSelectViewController.h: 18"; + rLen = 0; + rLoc = 522; + rType = 0; + vrLen = 1044; + vrLoc = 0; + }; + 3DF17F6D13F438E400ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; + name = "LevelSelectViewController.m: 317"; + rLen = 32; + rLoc = 8754; + rType = 0; + vrLen = 1782; + vrLoc = 7420; + }; + 3DF17F7213F4390300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; + name = "LevelSelectViewController.m: 317"; + rLen = 32; + rLoc = 8754; + rType = 0; + vrLen = 1782; + vrLoc = 7420; + }; + 3DF17F7313F4390300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */; + name = "CreditsViewController.m: 15"; + rLen = 0; + rLoc = 382; + rType = 0; + vrLen = 2268; + vrLoc = 0; + }; + 3DF17F7413F4390300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */; + name = "TriviaViewController.m: 90"; + rLen = 0; + rLoc = 2302; + rType = 0; + vrLen = 2187; + vrLoc = 926; + }; + 3DF17F7513F4390300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 79"; + rLen = 0; + rLoc = 2412; + rType = 0; + vrLen = 1696; + vrLoc = 502; + }; + 3DF17F7813F43BB300ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 79"; + rLen = 0; + rLoc = 2412; + rType = 0; + vrLen = 1696; + vrLoc = 502; + }; + 3DF17F7913F43E2B00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; + name = "LevelSelectViewController.m: 68"; + rLen = 32; + rLoc = 1931; + rType = 0; + vrLen = 2174; + vrLoc = 854; + }; + 3DF17F7A13F43E2B00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E213F33AB700DF5856 /* SkillViewController.h */; + name = "SkillViewController.h: 19"; + rLen = 0; + rLoc = 258; + rType = 0; + vrLen = 640; + vrLoc = 0; + }; + 3DF17F7B13F43E2B00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 39"; + rLen = 0; + rLoc = 1279; + rType = 0; + vrLen = 2036; + vrLoc = 47; + }; + 3DF17F7C13F43E2B00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 38"; + rLen = 0; + rLoc = 1279; + rType = 0; + vrLen = 2038; + vrLoc = 47; + }; + 3DF17F8313F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 94"; + rLen = 0; + rLoc = 2311; + rType = 0; + vrLen = 1190; + vrLoc = 1454; + }; + 3DF17F8413F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B620F6B2D9D0085DD28 /* texture_manager.h */; + name = "texture_manager.h: 152"; + rLen = 13; + rLoc = 2982; + rType = 0; + vrLen = 1270; + vrLoc = 2567; + }; + 3DF17F8513F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B6C0F6B2D9D0085DD28 /* vector.h */; + name = "vector.h: 38"; + rLen = 27; + rLoc = 1164; + rType = 0; + vrLen = 1609; + vrLoc = 0; + }; + 3DF17F8613F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B2E0F6B2D9D0085DD28 /* cvar.h */; + name = "cvar.h: 104"; + rLen = 11; + rLoc = 3049; + rType = 0; + vrLen = 1763; + vrLoc = 2253; + }; + 3DF17F8713F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */; + name = "iphone_wolf.h: 24"; + rLen = 0; + rLoc = 828; + rType = 0; + vrLen = 1446; + vrLoc = 0; + }; + 3DF17F8813F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B1E0F6B2D9D0085DD28 /* arch.h */; + name = "arch.h: 231"; + rLen = 22; + rLoc = 4362; + rType = 0; + vrLen = 987; + vrLoc = 3839; + }; + 3DF17F8913F4414600ED668A /* XCBuildMessageTextBookmark */ = { + isa = PBXTextBookmark; + comments = "Unknown type name '_boolean'"; + fRef = 72935B6D0F6B2D9D0085DD28 /* video.h */; + fallbackIsa = XCBuildMessageTextBookmark; + rLen = 1; + rLoc = 66; + rType = 1; + }; + 3DF17F8A13F4414600ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B6D0F6B2D9D0085DD28 /* video.h */; + name = "video.h: 65"; + rLen = 0; + rLoc = 1619; + rType = 0; + vrLen = 1109; + vrLoc = 583; + }; + 3DF17FBC13F4465100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; + name = "LevelSelectViewController.m: 68"; + rLen = 32; + rLoc = 1931; + rType = 0; + vrLen = 2210; + vrLoc = 0; + }; + 3DF17FBD13F4465100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E213F33AB700DF5856 /* SkillViewController.h */; + name = "SkillViewController.h: 13"; + rLen = 0; + rLoc = 232; + rType = 0; + vrLen = 482; + vrLoc = 0; + }; + 3DF17FBE13F4465100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */; + name = "iphone_wolf.h: 369"; + rLen = 15; + rLoc = 11050; + rType = 0; + vrLen = 1950; + vrLoc = 0; + }; + 3DF17FBF13F4465100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 11"; + rLen = 0; + rLoc = 235; + rType = 0; + vrLen = 1900; + vrLoc = 0; + }; + 3DF17FC013F4465100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 37"; + rLen = 0; + rLoc = 890; + rType = 0; + vrLen = 1937; + vrLoc = 0; + }; + 3DF1800913F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B6D0F6B2D9D0085DD28 /* video.h */; + name = "video.h: 67"; + rLen = 8; + rLoc = 1619; + rType = 0; + vrLen = 1060; + vrLoc = 653; + }; + 3DF1800A13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B620F6B2D9D0085DD28 /* texture_manager.h */; + name = "texture_manager.h: 43"; + rLen = 0; + rLoc = 1352; + rType = 0; + vrLen = 1359; + vrLoc = 141; + }; + 3DF1800B13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */; + name = "iphone_wolf.h: 78"; + rLen = 13; + rLoc = 1911; + rType = 0; + vrLen = 1019; + vrLoc = 1280; + }; + 3DF1800C13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B2E0F6B2D9D0085DD28 /* cvar.h */; + name = "cvar.h: 104"; + rLen = 11; + rLoc = 3049; + rType = 0; + vrLen = 1763; + vrLoc = 2253; + }; + 3DF1800D13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC330F6B3222004123C5 /* wolf_local.h */; + name = "wolf_local.h: 45"; + rLen = 0; + rLoc = 1175; + rType = 0; + vrLen = 1094; + vrLoc = 287; + }; + 3DF1800E13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 17"; + rLen = 0; + rLoc = 341; + rType = 0; + vrLen = 1299; + vrLoc = 0; + }; + 3DF1800F13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B1E0F6B2D9D0085DD28 /* arch.h */; + name = "arch.h: 157"; + rLen = 47; + rLoc = 3108; + rType = 0; + vrLen = 1127; + vrLoc = 2531; + }; + 3DF1801013F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B340F6B2D9D0085DD28 /* filesystem.h */; + name = "filesystem.h: 66"; + rLen = 3; + rLoc = 1761; + rType = 0; + vrLen = 1516; + vrLoc = 1123; + }; + 3DF1801113F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B2F0F6B2D9D0085DD28 /* fileio.c */; + name = "fileio.c: 121"; + rLen = 0; + rLoc = 3153; + rType = 0; + vrLen = 1027; + vrLoc = 2475; + }; + 3DF1801213F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B530F6B2D9D0085DD28 /* opengl_main.c */; + name = "opengl_main.c: 365"; + rLen = 0; + rLoc = 9134; + rType = 0; + vrLen = 1938; + vrLoc = 8842; + }; + 3DF1801313F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC290F6B3222004123C5 /* wolf_ai_com.c */; + name = "wolf_ai_com.c: 545"; + rLen = 0; + rLoc = 11729; + rType = 0; + vrLen = 1038; + vrLoc = 10943; + }; + 3DF1801413F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CC380F6B3222004123C5 /* wolf_player.c */; + name = "wolf_player.c: 627"; + rLen = 0; + rLoc = 14328; + rType = 0; + vrLen = 1445; + vrLoc = 13063; + }; + 3DF1801513F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */; + name = "iphone_downloadUserMap.m: 74"; + rLen = 0; + rLoc = 1827; + rType = 0; + vrLen = 1742; + vrLoc = 1258; + }; + 3DF1801613F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */; + name = "iphone_mapselector.c: 240"; + rLen = 0; + rLoc = 5836; + rType = 0; + vrLen = 1568; + vrLoc = 5070; + }; + 3DF1801713F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73D13BF554400C5B1DF /* wolf3dViewController.h */; + name = "wolf3dViewController.h: 33"; + rLen = 22; + rLoc = 984; + rType = 0; + vrLen = 1310; + vrLoc = 0; + }; + 3DF1801813F447EC00ED668A /* XCBuildMessageTextBookmark */ = { + isa = PBXTextBookmark; + comments = "Incompatible Objective-C types initializing 'struct NSString *', expected 'struct NSBundle *'"; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + fallbackIsa = XCBuildMessageTextBookmark; + rLen = 1; + rLoc = 26; + rType = 1; + }; + 3DF1801913F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + name = "wolf3dViewController.m: 26"; + rLen = 0; + rLoc = 593; + rType = 0; + vrLen = 1409; + vrLoc = 0; + }; + 3DF1801A13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; + name = "wolf3dAppDelegate.m: 149"; + rLen = 11; + rLoc = 5171; + rType = 0; + vrLen = 2295; + vrLoc = 4407; + }; + 3DF1801B13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF913DF9A8E008ECBD1 /* LegalViewController.m */; + name = "LegalViewController.m: 17"; + rLen = 11; + rLoc = 487; + rType = 0; + vrLen = 1516; + vrLoc = 0; + }; + 3DF1801C13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0CF613DF9A5D008ECBD1 /* CreditsViewController.m */; + name = "CreditsViewController.m: 28"; + rLen = 11; + rLoc = 780; + rType = 0; + vrLen = 1487; + vrLoc = 0; + }; + 3DF1801D13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C2A13DF6836008ECBD1 /* EpisodeViewController.m */; + name = "EpisodeViewController.m: 118"; + rLen = 11; + rLoc = 3136; + rType = 0; + vrLen = 1184; + vrLoc = 2340; + }; + 3DF1801E13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0C4A13DF800E008ECBD1 /* LevelSelectViewController.m */; + name = "LevelSelectViewController.m: 45"; + rLen = 11; + rLoc = 1292; + rType = 0; + vrLen = 1720; + vrLoc = 490; + }; + 3DF1801F13F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D86CF8C13DDE51800186487 /* MainMenuViewController.m */; + name = "MainMenuViewController.m: 137"; + rLen = 11; + rLoc = 4363; + rType = 0; + vrLen = 1684; + vrLoc = 3435; + }; + 3DF1802013F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + name = "wolf3dViewController.m: 26"; + rLen = 11; + rLoc = 545; + rType = 0; + vrLen = 1410; + vrLoc = 0; + }; + 3DF1802113F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D5C0DE113E05D4D008ECBD1 /* TriviaViewController.m */; + name = "TriviaViewController.m: 29"; + rLen = 11; + rLoc = 794; + rType = 0; + vrLen = 1517; + vrLoc = 0; + }; + 3DF1802213F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + rLen = 11; + rLoc = 2197; + rType = 0; + }; + 3DF1802313F447EC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 93"; + rLen = 11; + rLoc = 2197; + rType = 0; + vrLen = 1301; + vrLoc = 0; + }; + 3DF1802413F447EE00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + name = "wolf3dViewController.m: 26"; + rLen = 0; + rLoc = 593; + rType = 0; + vrLen = 1409; + vrLoc = 0; + }; + 3DF1802513F447EE00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 93"; + rLen = 11; + rLoc = 2197; + rType = 0; + vrLen = 1301; + vrLoc = 0; + }; + 3DF1802C13F4481100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 48"; + rLen = 0; + rLoc = 1128; + rType = 0; + vrLen = 1937; + vrLoc = 0; + }; + 3DF1802D13F4481100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; + rLen = 11; + rLoc = 4983; + rType = 0; + }; + 3DF1802E13F4481100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; + name = "wolf3dAppDelegate.m: 144"; + rLen = 11; + rLoc = 4983; + rType = 0; + vrLen = 2838; + vrLoc = 4585; + }; + 3DF1803113F448D100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + name = "wolf3dViewController.m: 26"; + rLen = 0; + rLoc = 593; + rType = 0; + vrLen = 1393; + vrLoc = 0; + }; + 3DF1803213F448D100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 93"; + rLen = 11; + rLoc = 2197; + rType = 0; + vrLen = 1292; + vrLoc = 7; + }; + 3DF1803513F449CC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D3ED73E13BF554400C5B1DF /* wolf3dViewController.m */; + name = "wolf3dViewController.m: 26"; + rLen = 0; + rLoc = 593; + rType = 0; + vrLen = 1393; + vrLoc = 0; + }; + 3DF1803613F449CC00ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 93"; + rLen = 11; + rLoc = 2197; + rType = 0; + vrLen = 1292; + vrLoc = 7; + }; + 3DF1803713F449D000ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; + name = "wolf3dAppDelegate.m: 144"; + rLen = 11; + rLoc = 4983; + rType = 0; + vrLen = 2838; + vrLoc = 4585; + }; + 3DF1803813F449D000ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E213F33AB700DF5856 /* SkillViewController.h */; + name = "SkillViewController.h: 13"; + rLen = 0; + rLoc = 232; + rType = 0; + vrLen = 482; + vrLoc = 0; + }; + 3DF1803913F449D000ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 40"; + rLen = 0; + rLoc = 942; + rType = 0; + vrLen = 1650; + vrLoc = 1071; + }; + 3DF1803D13F44B6100ED668A /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3D10C3E313F33AB700DF5856 /* SkillViewController.m */; + name = "SkillViewController.m: 40"; + rLen = 0; + rLoc = 942; + rType = 0; + vrLen = 1714; + vrLoc = 1007; + }; + 3DF1A97013BD534400C34057 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 72935B5A0F6B2D9D0085DD28 /* sound.c */; + name = "sound.c: 679"; + rLen = 0; + rLoc = 14148; + rType = 0; + vrLen = 456; + vrLoc = 13706; + }; + 3DF1AB0913BE533100C34057 /* CFDate.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = CFDate.h; + path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFDate.h; + sourceTree = ""; + }; + 43AF6B940F996DA200777569 /* iphone_sys.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 4303}}"; + sepNavSelRange = "{8198, 0}"; + sepNavVisRange = "{4419, 2358}"; + sepNavWindowFrame = "{{15, 354}, {1027, 1219}}"; + }; + }; + 43CF03090F56D5C200E4A23D /* iphone_loop.c */ = { + uiCtxt = { + sepNavFolds = "{\n c = (\n {\n l = \"int y\";\n r = \"{46626, 9}\";\n s = 1;\n },\n {\n l = \"int width\";\n r = \"{46637, 13}\";\n s = 1;\n },\n {\n l = \"int height\";\n r = \"{46652, 14}\";\n s = 1;\n },\n {\n l = \"const char * str\";\n r = \"{46668, 20}\";\n s = 1;\n }\n );\n r = \"{0, 46746}\";\n s = 0;\n}"; + sepNavIntBoundsRect = "{{0, 0}, {1432, 24141}}"; + sepNavSelRange = "{43577, 0}"; + sepNavVisRange = "{42853, 1796}"; + sepNavWindowFrame = "{{1292, 246}, {1019, 988}}"; + }; + }; + 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 4953}}"; + sepNavSelRange = "{10337, 0}"; + sepNavVisRange = "{0, 1958}"; + }; + }; + 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 13299}}"; + sepNavSelRange = "{19227, 12}"; + sepNavVisRange = "{18581, 1091}"; + }; + }; + 7229CC260F6B3222004123C5 /* wolf_actor_ai.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {886, 986}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 2095}"; + }; + }; + 7229CC270F6B3222004123C5 /* wolf_actors.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 6097}}"; + sepNavSelRange = "{5082, 32}"; + sepNavVisRange = "{4529, 963}"; + }; + }; + 7229CC280F6B3222004123C5 /* wolf_actors.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {886, 2249}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1888}"; + }; + }; + 7229CC290F6B3222004123C5 /* wolf_ai_com.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 17316}}"; + sepNavSelRange = "{11729, 0}"; + sepNavVisRange = "{10943, 1038}"; + }; + }; + 7229CC2E0F6B3222004123C5 /* wolf_client_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 1911}}"; + sepNavSelRange = "{3978, 7}"; + sepNavVisRange = "{2364, 1718}"; + }; + }; + 7229CC300F6B3222004123C5 /* wolf_doors.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1048, 6721}}"; + sepNavSelRange = "{7887, 0}"; + sepNavVisRange = "{7271, 2112}"; + }; + }; + 7229CC310F6B3222004123C5 /* wolf_level.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 19136}}"; + sepNavSelRange = "{25921, 0}"; + sepNavVisRange = "{25351, 1267}"; + }; + }; + 7229CC320F6B3222004123C5 /* wolf_level.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1160, 3744}}"; + sepNavSelRange = "{4665, 0}"; + sepNavVisRange = "{2964, 1577}"; + }; + }; + 7229CC330F6B3222004123C5 /* wolf_local.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 1807}}"; + sepNavSelRange = "{1175, 0}"; + sepNavVisRange = "{287, 1094}"; + }; + }; + 7229CC340F6B3222004123C5 /* wolf_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 1170}}"; + sepNavSelRange = "{1493, 30}"; + sepNavVisRange = "{956, 1066}"; + }; + }; + 7229CC350F6B3222004123C5 /* wolf_math.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 3965}}"; + sepNavSelRange = "{5248, 40}"; + sepNavVisRange = "{4589, 1055}"; + }; + }; + 7229CC360F6B3222004123C5 /* wolf_math.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {886, 1885}}"; + sepNavSelRange = "{1858, 6}"; + sepNavVisRange = "{950, 2523}"; + }; + }; + 7229CC370F6B3222004123C5 /* wolf_opengl.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 7384}}"; + sepNavSelRange = "{12138, 14}"; + sepNavVisRange = "{11561, 899}"; + }; + }; + 7229CC380F6B3222004123C5 /* wolf_player.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {968, 13663}}"; + sepNavSelRange = "{14328, 0}"; + sepNavVisRange = "{12589, 2243}"; + sepNavWindowFrame = "{{107, 270}, {1027, 1219}}"; + }; + }; + 7229CC390F6B3222004123C5 /* wolf_player.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 2366}}"; + sepNavSelRange = "{2235, 6}"; + sepNavVisRange = "{1926, 786}"; + }; + }; + 7229CC3A0F6B3222004123C5 /* wolf_powerups.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 5382}}"; + sepNavSelRange = "{2761, 34}"; + sepNavVisRange = "{2121, 1079}"; + }; + }; + 7229CC3B0F6B3222004123C5 /* wolf_powerups.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 1118}}"; + sepNavSelRange = "{1190, 4}"; + sepNavVisRange = "{1056, 1269}"; + }; + }; + 7229CC3C0F6B3222004123C5 /* wolf_pushwalls.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1146, 2197}}"; + sepNavSelRange = "{2623, 9}"; + sepNavVisRange = "{1812, 1663}"; + }; + }; + 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {729, 5005}}"; + sepNavSelRange = "{1909, 0}"; + sepNavVisRange = "{1135, 1440}"; + sepNavWindowFrame = "{{15, 658}, {788, 915}}"; + }; + }; + 7229CC3E0F6B3222004123C5 /* wolf_raycast.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {886, 986}}"; + sepNavSelRange = "{1777, 14}"; + sepNavVisRange = "{0, 2085}"; + }; + }; + 7229CC3F0F6B3222004123C5 /* wolf_renderer.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 1352}}"; + sepNavSelRange = "{2266, 13}"; + sepNavVisRange = "{1370, 1358}"; + sepNavWindowFrame = "{{61, 616}, {788, 915}}"; + }; + }; + 7229CC400F6B3222004123C5 /* wolf_renderer.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 819}}"; + sepNavSelRange = "{1460, 11}"; + sepNavVisRange = "{0, 1645}"; + }; + }; + 7229CC410F6B3222004123C5 /* wolf_sprites.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 3640}}"; + sepNavSelRange = "{6481, 14}"; + sepNavVisRange = "{5538, 1330}"; + }; + }; + 7229CC420F6B3222004123C5 /* wolf_sprites.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 5629}}"; + sepNavSelRange = "{1315, 4}"; + sepNavVisRange = "{574, 1309}"; + }; + }; + 7229CC430F6B3222004123C5 /* wolf_sv_ccmds.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 1235}}"; + sepNavSelRange = "{1288, 10}"; + sepNavVisRange = "{0, 1375}"; + }; + }; + 7229CC440F6B3222004123C5 /* wolf_weapon.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1132, 2535}}"; + sepNavSelRange = "{4285, 7}"; + sepNavVisRange = "{3537, 1267}"; + }; + }; + 7229CC5B0F6B3295004123C5 /* asm_arm.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 2951}}"; + sepNavSelRange = "{1163, 0}"; + sepNavVisRange = "{0, 1875}"; + }; + }; + 7229CC700F6B3295004123C5 /* misc.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 2977}}"; + sepNavSelRange = "{1546, 0}"; + sepNavVisRange = "{1173, 1253}"; + }; + }; + 7229CC7C0F6B3295004123C5 /* window_lookup.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 27365}}"; + sepNavSelRange = "{39023, 3}"; + sepNavVisRange = "{38288, 1550}"; + }; + }; + 7229CC8E0F6B3363004123C5 /* wolfiphone.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 1274}}"; + sepNavSelRange = "{2082, 0}"; + sepNavVisRange = "{349, 1734}"; + sepNavWindowFrame = "{{15, 658}, {788, 915}}"; + }; + }; + 7229CE450F6C89F8004123C5 /* EAGLView.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {886, 959}}"; + sepNavSelRange = "{1275, 0}"; + sepNavVisRange = "{0, 2018}"; + }; + }; + 7229CE460F6C89F8004123C5 /* EAGLView.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1065, 6331}}"; + sepNavSelRange = "{8682, 0}"; + sepNavVisRange = "{7496, 2144}"; + sepNavWindowFrame = "{{15, 585}, {1019, 988}}"; + }; + }; + 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {829, 741}}"; + sepNavSelRange = "{1543, 0}"; + sepNavVisRange = "{45, 1743}"; + }; + }; + 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1251, 6643}}"; + sepNavSelRange = "{4983, 11}"; + sepNavVisRange = "{4585, 2838}"; + sepNavWindowFrame = "{{107, 574}, {788, 915}}"; + }; + }; + 7229CE540F6C8CDE004123C5 /* gles_glue.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {729, 1950}}"; + sepNavSelRange = "{3730, 0}"; + sepNavVisRange = "{2336, 1432}"; + sepNavWindowFrame = "{{38, 637}, {788, 915}}"; + }; + }; + 72935B1E0F6B2D9D0085DD28 /* arch.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1244, 3640}}"; + sepNavSelRange = "{3108, 47}"; + sepNavVisRange = "{2531, 1127}"; + }; + }; + 72935B250F6B2D9D0085DD28 /* com_string.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {852, 6253}}"; + sepNavSelRange = "{2412, 0}"; + sepNavVisRange = "{1331, 2255}"; + }; + }; + 72935B270F6B2D9D0085DD28 /* common.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 7358}}"; + sepNavSelRange = "{3873, 10}"; + sepNavVisRange = "{3217, 973}"; + }; + }; + 72935B280F6B2D9D0085DD28 /* common.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 2756}}"; + sepNavSelRange = "{5059, 13}"; + sepNavVisRange = "{4065, 1040}"; + }; + }; + 72935B290F6B2D9D0085DD28 /* common_utils.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 819}}"; + sepNavSelRange = "{1331, 65}"; + sepNavVisRange = "{275, 1162}"; + }; + }; + 72935B2A0F6B2D9D0085DD28 /* console.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 10400}}"; + sepNavSelRange = "{6593, 0}"; + sepNavVisRange = "{6057, 1088}"; + }; + }; + 72935B2D0F6B2D9D0085DD28 /* cvar.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 9880}}"; + sepNavSelRange = "{8762, 0}"; + sepNavVisRange = "{8089, 1392}"; + }; + }; + 72935B2E0F6B2D9D0085DD28 /* cvar.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 2158}}"; + sepNavSelRange = "{3049, 11}"; + sepNavVisRange = "{2253, 1763}"; + sepNavWindowFrame = "{{84, 291}, {1027, 1219}}"; + }; + }; + 72935B2F0F6B2D9D0085DD28 /* fileio.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 4186}}"; + sepNavSelRange = "{3153, 0}"; + sepNavVisRange = "{2475, 1027}"; + }; + }; + 72935B310F6B2D9D0085DD28 /* files.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {829, 2548}}"; + sepNavSelRange = "{4692, 0}"; + sepNavVisRange = "{3740, 1034}"; + }; + }; + 72935B340F6B2D9D0085DD28 /* filesystem.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 1742}}"; + sepNavSelRange = "{1761, 3}"; + sepNavVisRange = "{1123, 1516}"; + }; + }; + 72935B410F6B2D9D0085DD28 /* memory.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 2457}}"; + sepNavSelRange = "{2285, 55}"; + sepNavVisRange = "{1693, 1247}"; + }; + }; + 72935B420F6B2D9D0085DD28 /* memory.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 754}}"; + sepNavSelRange = "{1432, 13}"; + sepNavVisRange = "{89, 1645}"; + }; + }; + 72935B460F6B2D9D0085DD28 /* myopengl.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1328, 10582}}"; + sepNavSelRange = "{9611, 7}"; + sepNavVisRange = "{7555, 5441}"; + }; + }; + 72935B4B0F6B2D9D0085DD28 /* openal_binding.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1058, 5369}}"; + sepNavSelRange = "{1900, 4}"; + sepNavVisRange = "{1757, 568}"; + }; + }; + 72935B4C0F6B2D9D0085DD28 /* openal_binding.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1093, 2431}}"; + sepNavSelRange = "{7743, 34}"; + sepNavVisRange = "{2556, 2945}"; + }; + }; + 72935B4D0F6B2D9D0085DD28 /* openal_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1058, 3406}}"; + sepNavSelRange = "{1937, 15}"; + sepNavVisRange = "{1572, 877}"; + }; + }; + 72935B500F6B2D9D0085DD28 /* opengl_draw.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 3211}}"; + sepNavSelRange = "{4379, 9}"; + sepNavVisRange = "{3590, 1339}"; + sepNavWindowFrame = "{{38, 637}, {788, 915}}"; + }; + }; + 72935B520F6B2D9D0085DD28 /* opengl_local.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 3185}}"; + sepNavSelRange = "{2102, 7}"; + sepNavVisRange = "{1479, 1324}"; + }; + }; + 72935B530F6B2D9D0085DD28 /* opengl_main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1524, 5070}}"; + sepNavSelRange = "{9134, 0}"; + sepNavVisRange = "{8842, 1938}"; + sepNavWindowFrame = "{{61, 616}, {788, 915}}"; + }; + }; + 72935B540F6B2D9D0085DD28 /* opengl_texture.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 3302}}"; + sepNavSelRange = "{4221, 13}"; + sepNavVisRange = "{3530, 743}"; + }; + }; + 72935B580F6B2D9D0085DD28 /* renderer.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {878, 1313}}"; + sepNavSelRange = "{1712, 6}"; + sepNavVisRange = "{829, 1481}"; + }; + }; + 72935B5A0F6B2D9D0085DD28 /* sound.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1098, 10283}}"; + sepNavSelRange = "{12186, 106}"; + sepNavVisRange = "{13567, 711}"; + sepNavWindowFrame = "{{107, 501}, {1019, 988}}"; + }; + }; + 72935B5B0F6B2D9D0085DD28 /* sound.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 1222}}"; + sepNavSelRange = "{2327, 0}"; + sepNavVisRange = "{1148, 1776}"; + }; + }; + 72935B5C0F6B2D9D0085DD28 /* sound_local.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1058, 1599}}"; + sepNavSelRange = "{2979, 0}"; + sepNavVisRange = "{2504, 526}"; + }; + }; + 72935B5D0F6B2D9D0085DD28 /* sound_sfx_id.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1188, 4199}}"; + sepNavSelRange = "{5439, 14}"; + sepNavVisRange = "{4873, 1027}"; + }; + }; + 72935B5E0F6B2D9D0085DD28 /* sound_stream.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 7215}}"; + sepNavSelRange = "{1396, 17}"; + sepNavVisRange = "{988, 1061}"; + }; + }; + 72935B610F6B2D9D0085DD28 /* texture_manager.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1300, 18746}}"; + sepNavSelRange = "{12505, 0}"; + sepNavVisRange = "{11118, 2551}"; + sepNavWindowFrame = "{{472, 365}, {788, 915}}"; + }; + }; + 72935B620F6B2D9D0085DD28 /* texture_manager.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 2366}}"; + sepNavSelRange = "{1352, 0}"; + sepNavVisRange = "{141, 1359}"; + sepNavWindowFrame = "{{15, 658}, {788, 915}}"; + }; + }; + 72935B630F6B2D9D0085DD28 /* tga.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1432, 9945}}"; + sepNavSelRange = "{11418, 9}"; + sepNavVisRange = "{11046, 1134}"; + }; + }; + 72935B640F6B2D9D0085DD28 /* tga.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1065, 1015}}"; + sepNavSelRange = "{1338, 7}"; + sepNavVisRange = "{0, 1581}"; + }; + }; + 72935B680F6B2D9D0085DD28 /* unix_file.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {807, 3731}}"; + sepNavSelRange = "{3898, 0}"; + sepNavVisRange = "{3490, 866}"; + }; + }; + 72935B6C0F6B2D9D0085DD28 /* vector.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 1729}}"; + sepNavSelRange = "{1164, 27}"; + sepNavVisRange = "{0, 1609}"; + }; + }; + 72935B6D0F6B2D9D0085DD28 /* video.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 923}}"; + sepNavSelRange = "{1619, 8}"; + sepNavVisRange = "{653, 1060}"; + }; + }; + 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 5265}}"; + sepNavSelRange = "{1911, 13}"; + sepNavVisRange = "{1280, 1019}"; + sepNavWindowFrame = "{{15, 658}, {788, 915}}"; + }; + }; + 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 57863}}"; + sepNavSelRange = "{24772, 0}"; + sepNavVisRange = "{23518, 2116}"; + sepNavWindowFrame = "{{1311, 491}, {1019, 988}}"; + }; + }; + 72B5FF380F7E5C3D00C8A372 /* hud.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 8125}}"; + sepNavSelRange = "{4152, 0}"; + sepNavVisRange = "{2723, 3677}"; + sepNavWindowFrame = "{{1219, 166}, {788, 915}}"; + }; + }; + 8D1107310486CEB800E47090 /* Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {953, 1018}}"; + sepNavSelRange = "{1319, 0}"; + sepNavVisRange = "{0, 1415}"; + sepNavVisRect = "{{0, 0}, {967, 1018}}"; + sepNavWindowFrame = "{{683, 521}, {1019, 988}}"; + }; + }; + C81E11A713E2112100B1049A /* SettingsViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 995}}"; + sepNavSelRange = "{105, 17}"; + sepNavVisRange = "{0, 1009}"; + }; + }; + C81E11A813E2112100B1049A /* SettingsViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 2561}}"; + sepNavSelRange = "{1571, 0}"; + sepNavVisRange = "{0, 1816}"; + }; + }; + ED0A8D0B1069ACA8001E0547 /* iphone_alerts.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 997}}"; + sepNavSelRange = "{374, 8}"; + sepNavVisRange = "{0, 419}"; + }; + }; + ED0A8D0C1069ACA8001E0547 /* iphone_alerts.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 1534}}"; + sepNavSelRange = "{1762, 13}"; + sepNavVisRange = "{474, 1706}"; + }; + }; + ED0A8D0D1069ACA8001E0547 /* iphone_downloadSOD.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 6890}}"; + sepNavSelRange = "{1105, 0}"; + sepNavVisRange = "{0, 2442}"; + }; + }; + ED0A8D0E1069ACA8001E0547 /* iphone_downloadUserMap.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 2769}}"; + sepNavSelRange = "{1827, 0}"; + sepNavVisRange = "{1258, 1742}"; + }; + }; + ED0A8D0F1069ACA8001E0547 /* iphone_mapselector.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1239, 5798}}"; + sepNavSelRange = "{5836, 0}"; + sepNavVisRange = "{5070, 1568}"; + }; + }; + ED0A8D101069ACA8001E0547 /* iphone_store.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1022, 997}}"; + sepNavSelRange = "{1635, 0}"; + sepNavVisRange = "{0, 1910}"; + }; + }; +} diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..dd98170 --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,19 @@ + + + + + + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/wolf3d.xcscheme b/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/wolf3d.xcscheme new file mode 100644 index 0000000..93a0b46 --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/wolf3d.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/xcschememanagement.plist b/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..3752ecf --- /dev/null +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/xcuserdata/ryan.gerleve.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + wolf3d.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 1D6058900D05DD3D006BFB54 + + primary + + + + + diff --git a/wolf3d/code/iphone/wolf3dAppDelegate.h b/wolf3d/code/iphone/wolf3dAppDelegate.h index 3a14087..1ade451 100644 --- a/wolf3d/code/iphone/wolf3dAppDelegate.h +++ b/wolf3d/code/iphone/wolf3dAppDelegate.h @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -20,22 +23,46 @@ #import #import +#import +#import "iphone_store.h" -@class EAGLView; +@class wolf3dViewController; @interface wolf3dAppDelegate : NSObject { UIWindow *window; - EAGLView *glView; + UINavigationController *navigationController; + wolf3dViewController *viewController; int lastAccelUpdateMsec; - + +@private + UIView *waitingView; // UIAlertView *alertPurchaseSpear; + AVAudioPlayer * player; } @property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet EAGLView *glView; +@property (nonatomic, retain) IBOutlet wolf3dViewController *viewController; +@property (nonatomic, retain) UINavigationController *navigationController; +@property (nonatomic, retain) UIView *waitingView; +@property (nonatomic, retain) AVAudioPlayer *player; + +- (void)initMenuMusicPlayer; + +- (void)startMenuMusic; +- (void)stopMenuMusic; + - (void)restartAccelerometerIfNeeded; +- (void)showOpenGL; +- (void)GLtoMainMenu; +- (void)GLtoPreviousMenu; +- (void)didRotate:(NSNotification *)notification; +- (void)setScreenForOrientation:(UIDeviceOrientation)orientation; + +- (void)dismissWaitingView; @end +// Callback for in-app purchase. +void inAppPurchaseCallback( InAppPurchaseResult result ); diff --git a/wolf3d/code/iphone/wolf3dAppDelegate.m b/wolf3d/code/iphone/wolf3dAppDelegate.m index 64073aa..fe927c2 100644 --- a/wolf3d/code/iphone/wolf3dAppDelegate.m +++ b/wolf3d/code/iphone/wolf3dAppDelegate.m @@ -1,6 +1,9 @@ /* - Copyright (C) 2009 Id Software, Inc. + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -19,6 +22,8 @@ */ #import "wolf3dAppDelegate.h" +#import "MainMenuViewController.h" +#import "wolf3dViewController.h" #import "EAGLView.h" #import #include "../wolfiphone.h" @@ -34,6 +39,8 @@ //used for downloading custom made map extern void FinalizeUserDownload(); +yesNoBoxType_t currentYesNoBox = YESNO_NONE; + #if SPEARSTOREKIT //was used for storekit extern void FinalizeDownload(); @@ -45,7 +52,6 @@ extern void DownloadURLConnection(char *url); -extern int wasCalledFromDownloadInstructionsMenu; extern void iphoneSet2D(); @@ -72,13 +78,51 @@ void SysIPhoneVibrate() { @implementation wolf3dAppDelegate @synthesize window; -@synthesize glView; - +@synthesize viewController; +@synthesize navigationController; +@synthesize waitingView; +@synthesize player; + +- (void)initMenuMusicPlayer { + NSString *soundFilePath = + [[NSBundle mainBundle] pathForResource: @"wondering" + ofType: @"caf"]; + + NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; + + AVAudioPlayer *newPlayer = + [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL + error: nil]; + [fileURL release]; + + if ( s_masterVolume != NULL ) { + newPlayer.volume = s_masterVolume->value * 0.5f; + } else { + newPlayer.volume = 0.2f; + } -- (void)applicationDidFinishLaunching:(UIApplication *)application { - application.statusBarHidden = YES; - application.statusBarOrientation = UIInterfaceOrientationLandscapeLeft; + newPlayer.numberOfLoops = -1; + + self.player = newPlayer; + [newPlayer release]; + + [player prepareToPlay]; +} + +- (void)startMenuMusic { + + [player play]; +} + +- (void)stopMenuMusic { + + [player stop]; +} + + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // get the documents directory, where we will write configs and save games NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; @@ -96,10 +140,11 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application { // start the flow of accelerometer events UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; accelerometer.delegate = self; - accelerometer.updateInterval = 0.01; + accelerometer.updateInterval = 1.0 / 30.0; // do all the game startup work - iphoneStartup(); + //iphoneStartup(); + #if SPEARSTOREKIT //check if user downloaded spear but didn't purchase @@ -115,22 +160,150 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application { } #endif + // Sign up for rotation notifications + [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didRotate:) + name:UIDeviceOrientationDidChangeNotification + object:nil]; + + // Support rendering at native resolution on devices with Retina displays. + if ( [[UIScreen mainScreen] respondsToSelector:@selector(scale)] ) { + deviceScale = UIScreen.mainScreen.scale; + touchCoordinateScale = UIScreen.mainScreen.scale; + } + + // Screen is initially landscape-left. + // BEWARE! For UI*Interface*Orientation, Left/Right refers to the location of the home button. + // BUT, for UI*Device*Orientation, Left/Right refers to the location of the side OPPOSITE the home button!! + [self setScreenForOrientation:UIDeviceOrientationLandscapeRight]; + + // Create the window programmatically instead of loading from a nib file. + self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + + // We will create the OpenGL view here so we can get a context and preload textures, but + // don't actually add the view to the window until the player enters a level. + wolf3dViewController *vc = [[wolf3dViewController alloc] initWithNibName:nil bundle:nil]; + self.viewController = vc; + [self.viewController setActive:NO]; + [vc release]; + + MainMenuViewController *rootController = [[MainMenuViewController alloc] initWithNibName:@"MainMenuView" bundle:nil]; + navigationController = [[UINavigationController alloc] initWithRootViewController:rootController]; + [navigationController setNavigationBarHidden:YES]; + [rootController release]; + + [window addSubview:navigationController.view]; + [window makeKeyAndVisible]; + + return YES; +} + +- (void)showOpenGL { + // Maybe clearing the OpenGL view before displaying will fix the old frame flashing. + // I don't mind if this blocks until a vsync, becasue it's just a menu. + [self.viewController clearAndPresentRenderbuffer]; + + [[navigationController view] removeFromSuperview]; + + [self.viewController setActive:YES]; + [window addSubview:[self.viewController view]]; + + [self.viewController startAnimation]; +} + +- (void)didRotate:(NSNotification *)notification { + UIDeviceOrientation orient = [[UIDevice currentDevice] orientation]; + + [self setScreenForOrientation:orient]; +} + +- (void)setScreenForOrientation:(UIDeviceOrientation) orientation { + // Note the the UIDeviceOrientations are REVERSED from the UIInterface orientations! + switch (orientation) { + case UIDeviceOrientationLandscapeLeft: + deviceOrientation = ORIENTATION_LANDSCAPE_RIGHT; + viddef.width = [UIScreen mainScreen].bounds.size.height * deviceScale; + viddef.height = [UIScreen mainScreen].bounds.size.width * deviceScale; + //[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight; + break; + + case UIDeviceOrientationLandscapeRight: + deviceOrientation = ORIENTATION_LANDSCAPE_LEFT; + viddef.width = [UIScreen mainScreen].bounds.size.height * deviceScale; + viddef.height = [UIScreen mainScreen].bounds.size.width * deviceScale; + //[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; + break; + + default: + break; + } + + float widthRatio = viddef.width / REFERENCE_WIDTH; + float heightRatio = viddef.height / REFERENCE_HEIGHT; + + if ( widthRatio < heightRatio ) { + screenScale = widthRatio; + } else { + screenScale = heightRatio; + } } //this is so that we can respond to alertView events (messageboxes) //but this should only respond to the alertPurchaseSpear - (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { - //this is if they clicked yes to going to the map instructions website - if (wasCalledFromDownloadInstructionsMenu && buttonIndex == 1) { - SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein-3d-classic-platinum/mapinstructions/" ); - return; + if (buttonIndex == 1) { + switch ( currentYesNoBox ) { + case YESNO_BUY_PLATINUM: { + // They clicked yes to buy the platinum edition. + + // Set up a fullscreen view with the activity indicator in the middle while + // we wait for the in-app purchase to complete. + UIView* topView = [[self.navigationController topViewController] view]; + CGRect waitFrame = topView.frame; + + + [waitingView release]; + waitingView = [[UIView alloc] initWithFrame:waitFrame]; + waitingView.backgroundColor = [UIColor blackColor]; + waitingView.opaque = NO; + waitingView.alpha = 0.75; + + + UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + [indicator startAnimating]; + + [waitingView addSubview:indicator]; + // This mask centers the view in its superview + indicator.center = indicator.superview.center; + [indicator release]; + + [topView addSubview:waitingView]; + + // Start the request to the app store + InAppPurchaseSetCallback( inAppPurchaseCallback ); + InAppPurchaseStartPurchase( PLATINUM_UPGRADE_STRING ); + + break; + } + + case YESNO_GO_TO_WEBSITE: + //if they clicked yes to going to the idsoftware website + SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein-3d-classic-platinum/" ); + break; + + case YESNO_DOWNLOAD_INSTRUCTIONS: + //this is if they clicked yes to going to the map instructions website + SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein-3d-classic-platinum/mapinstructions/" ); + break; + + default: + break; + } } - //if they clicked yes to going to the idsoftware website - if (buttonIndex == 1) - SysIPhoneOpenURL( "http://www.idsoftware.com/wolfenstein-3d-classic-platinum/" ); - /* if (alertPurchaseSpear && (alertPurchaseSpear == actionSheet)) { @@ -140,26 +313,47 @@ - (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)but } - (void)applicationWillResignActive:(UIApplication *)application { + [self.viewController stopAnimation]; } - (void)applicationDidBecomeActive:(UIApplication *)application { + [self.viewController startAnimation]; } - (void)applicationWillTerminate:(UIApplication *)application { + [self.viewController stopAnimation]; + + // Save the game. + iphoneShutdown(); +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + [self.viewController stopAnimation]; + + // Save the game. iphoneShutdown(); } + +- (void)dismissWaitingView { + if ( waitingView != nil ) { + [waitingView removeFromSuperview]; + [waitingView release]; + waitingView = nil; + } +} + #if 1 extern char urlbuffer[1024]; - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { // wolf3d:foo should launch wolf3d now... next, add useful URL parameter encoding -#ifdef LITE - iphoneMessageBox("Lite version", "This is a Lite version. You must purchase Wolfenstein3D to get this feature."); - return NO; -#endif + if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) { + iphoneMessageBox("Lite version", "This is a Lite version. You must purchase Wolfenstein3D to get this feature."); + return NO; + } if (!url) return NO; @@ -217,8 +411,10 @@ - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { - (void)dealloc { + [viewController release]; + [navigationController release]; [window release]; - [glView release]; + [super dealloc]; } @@ -232,7 +428,7 @@ - (void)restartAccelerometerIfNeeded { } UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; accelerometer.delegate = self; - accelerometer.updateInterval = 0.01; + accelerometer.updateInterval = 1.0 / 30.0; } } @@ -345,7 +541,38 @@ - (void)download:(NSURLDownload *)download didReceiveDataOfLength:(unsigned)leng } } */ + +- (void)GLtoMainMenu { + [self.navigationController popToRootViewControllerAnimated:NO]; + [viewController setActive:NO]; + [[viewController view] removeFromSuperview]; + [window addSubview:navigationController.view]; +} + +- (void)GLtoPreviousMenu { + [viewController setActive:NO]; + [[viewController view] removeFromSuperview]; + [window addSubview:navigationController.view]; +} + @end +void iphoneStartMainMenu() { + Sound_StopBGTrack(); + iphoneStartMenuMusic(); + numTouches = 0; + numPrevTouches = 0; + wolf3dAppDelegate *app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + [app GLtoMainMenu]; +} + +void iphoneStartPreviousMenu() { + wolf3dAppDelegate *app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + [app GLtoPreviousMenu ]; +} +void inAppPurchaseCallback( InAppPurchaseResult result ) { + wolf3dAppDelegate* app = (wolf3dAppDelegate*)[[UIApplication sharedApplication] delegate]; + [app dismissWaitingView]; +} diff --git a/wolf3d/code/iphone/wolf3dViewController.h b/wolf3d/code/iphone/wolf3dViewController.h new file mode 100644 index 0000000..104adae --- /dev/null +++ b/wolf3d/code/iphone/wolf3dViewController.h @@ -0,0 +1,48 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + +#import + +#import +#import + +@interface wolf3dViewController : UIViewController { + EAGLContext *context; + + BOOL animating; + BOOL active; + NSInteger animationFrameInterval; + CADisplayLink *displayLink; +} + +@property (nonatomic, getter=isActive) BOOL active; +@property (readonly, nonatomic, getter=isAnimating) BOOL animating; +@property (nonatomic) NSInteger animationFrameInterval; + +- (void)startAnimation; +- (void)stopAnimation; +- (void)clearAndPresentRenderbuffer; + +@end diff --git a/wolf3d/code/iphone/wolf3dViewController.m b/wolf3d/code/iphone/wolf3dViewController.m new file mode 100644 index 0000000..1f42394 --- /dev/null +++ b/wolf3d/code/iphone/wolf3dViewController.m @@ -0,0 +1,237 @@ +/* + + Copyright (C) 2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#import + +#import "wolf3dViewController.h" +#import "EAGLView.h" +#import "wolfiphone.h" +//#import "wolf3dAppDelegate.h" + +@interface wolf3dViewController () +@property (nonatomic, retain) EAGLContext *context; +@property (nonatomic, assign) CADisplayLink *displayLink; +@end + +@implementation wolf3dViewController + +@synthesize animating, context, displayLink, active; + + +- (id)initWithNibName:(NSString*)file bundle:(NSBundle*)bundle +{ + // Get the application's window dimensions. + EAGLView *glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; + self.view = glView; + [glView release]; + + EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; + + if (!aContext) + NSLog(@"Failed to create ES context"); + else if (![EAGLContext setCurrentContext:aContext]) + NSLog(@"Failed to set ES context current"); + + self.context = aContext; + [aContext release]; + + [(EAGLView *)self.view setContext:context]; + [(EAGLView *)self.view setFramebuffer]; + + animating = FALSE; + animationFrameInterval = DEFAULT_FRAME_INTERVAL; + self.displayLink = nil; + + // Now that we have a context, we can init the render system. + iphoneStartup(); + + return self; +} + + + +- (void)awakeFromNib +{ + EAGLView *glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; + self.view = glView; + [glView release]; + + EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; + + if (!aContext) + NSLog(@"Failed to create ES context"); + else if (![EAGLContext setCurrentContext:aContext]) + NSLog(@"Failed to set ES context current"); + + self.context = aContext; + [aContext release]; + + [(EAGLView *)self.view setContext:context]; + [(EAGLView *)self.view setFramebuffer]; + + animating = FALSE; + animationFrameInterval = DEFAULT_FRAME_INTERVAL; + self.displayLink = nil; +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)dealloc { + // Stop orientation notifications. + [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; + + // Tear down context. + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + + [context release]; + + [super dealloc]; +} + +- (void)viewWillAppear:(BOOL)animated +{ + [self startAnimation]; + + [super viewWillAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [self setActive:NO]; + + [super viewWillDisappear:animated]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + + [self stopAnimation]; + + // Tear down context. + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + self.context = nil; +} + +- (NSInteger)animationFrameInterval +{ + return animationFrameInterval; +} + +- (void)setAnimationFrameInterval:(NSInteger)frameInterval +{ + /* + Frame interval defines how many display frames must pass between each time the display link fires. + The display link will only fire 30 times a second when the frame internal is two on a display that refreshes 60 times a second. The default frame interval setting of one will fire 60 times a second when the display refreshes at 60 times a second. A frame interval setting of less than one results in undefined behavior. + */ + if (frameInterval >= 1) + { + animationFrameInterval = frameInterval; + + if (animating) + { + [self stopAnimation]; + [self startAnimation]; + } + } +} + +- (void)startAnimation +{ + if ( !animating ) + { + // The UIScreen method is not supported pre-4.0. + // Not worrying about supporting external displays yet, so just create a default display link. + //CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)]; + CADisplayLink *aDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame)]; + [aDisplayLink setFrameInterval:animationFrameInterval]; + [aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + self.displayLink = aDisplayLink; + + animating = TRUE; + } +} + +- (void)stopAnimation +{ + if ( animating ) + { + [self.displayLink invalidate]; + self.displayLink = nil; + animating = FALSE; + } +} + +- (void)drawFrame +{ + // Check out framerate + //CFTimeInterval frameTime = [displayLink duration]; + //CFTimeInterval stamp = [displayLink timestamp]; + + //if ( frameTime < 0.016666 ) { + // NSLog( @"Frame timestamp: %f\n", stamp ); + //} + + //[ (wolf3dAppDelegate *)[UIApplication sharedApplication].delegate restartAccelerometerIfNeeded]; + + if ( !active ) { + // We are in the menus, only need to update sound. + Sound_Update( vnull, vnull, vnull, vnull ); + return; + } + + picTimingClear(); + + [(EAGLView *)self.view setFramebuffer]; + + NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate]; + iphoneFrame(); + + NSTimeInterval gameTime = [NSDate timeIntervalSinceReferenceDate] - startTime; + if ( gameTime > 0.0166 ) { +/* NSLog (@"Frame took %.8f seconds.", gameTime); + NSLog (@" Sound_Update took %.8f seconds.", soundTime ); + NSLog (@" iphoneDrawMenus took %.8f seconds.", menuTime ); + soundTime = 0; + menuTime = 0; + picTimingPrint(); +*/ } + + [(EAGLView *)self.view presentFramebuffer]; + +} + +// Clears the renderbuffer and immediately displays it. +- (void)clearAndPresentRenderbuffer { + qglClear( GL_COLOR_BUFFER_BIT ); + [(EAGLView *)self.view presentFramebuffer]; +} + +@end diff --git a/wolf3d/code/iphone/wolf3d_Prefix.pch b/wolf3d/code/iphone/wolf3d_Prefix.pch index 58ef796..85f830c 100644 --- a/wolf3d/code/iphone/wolf3d_Prefix.pch +++ b/wolf3d/code/iphone/wolf3d_Prefix.pch @@ -1,3 +1,26 @@ +/* + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + // // Prefix header for all source files of the 'wolf3d' target in the 'wolf3d' project // diff --git a/wolf3d/code/wolf/wolf_ai_com.c b/wolf3d/code/wolf/wolf_ai_com.c index 59bf310..0f2bdc8 100644 --- a/wolf3d/code/wolf/wolf_ai_com.c +++ b/wolf3d/code/wolf/wolf_ai_com.c @@ -540,6 +540,9 @@ PRIVATE _boolean AI_CheckSight( entity_t *self ) if( deltax > 0 ) return false; break; + + default: + break; } // trace a line to check for blocking tiles (corners) diff --git a/wolf3d/code/wolf/wolf_client_main.c b/wolf3d/code/wolf/wolf_client_main.c index b6af805..3c6d7ec 100644 --- a/wolf3d/code/wolf/wolf_client_main.c +++ b/wolf3d/code/wolf/wolf_client_main.c @@ -133,8 +133,8 @@ PUBLIC void Client_PrepRefresh( const char *r_mapname ) levelData.musicName[6 + strlen(source)] = '\0'; }*/ - Com_Printf("Starting Music Track: %s\n", levelData.musicName); - Sound_StartBGTrack( levelData.musicName, levelData.musicName ); + //Com_Printf("Starting Music Track: %s\n", levelData.musicName); + //Sound_StartBGTrack( levelData.musicName, levelData.musicName ); Player.playstate = ex_playing; } diff --git a/wolf3d/code/wolf/wolf_level.c b/wolf3d/code/wolf/wolf_level.c index 4b29339..68bc3ee 100644 --- a/wolf3d/code/wolf/wolf_level.c +++ b/wolf3d/code/wolf/wolf_level.c @@ -925,14 +925,17 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname ) fhandle = FS_OpenFile( levelname, 0 ); if( ! fhandle ) { + char errBuffer[1024]; + sprintf( errBuffer, "levelname: %s, could not be found", levelname); + iphoneMessageBox("map filename", errBuffer); Com_Printf( "Could not load map (%s)\n", levelname ); - return NULL; } filesize = FS_GetFileSize( fhandle ); if( filesize < MAPHEADER_SIZE ) { + iphoneMessageBox("map header size", "header size of the map is wrong"); Com_Printf("Map file size is smaller than mapheader size\n"); return NULL; } @@ -944,6 +947,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname ) FS_ReadFile( &signature, 1, 4, fhandle ); if( signature != MAP_SIGNATURE ) { + iphoneMessageBox("map signature", "signature of the map file is invalid"); Com_Printf("File signature does not match MAP_SIGNATURE\n"); return NULL; } @@ -975,6 +979,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname ) if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength + length[ 0 ] + length[ 1 ] + length[ 2 ]) ) { + iphoneMessageBox("map filesize", "filesize is less than MAPHEADER_SIZE + mapNameLength + musicNameLength + etc"); Com_Printf("filesize is less than MAPHEADER_SIZE + mapNameLength + musicNameLength + etc\n"); return NULL; } @@ -993,6 +998,7 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname ) if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength) ) { + iphoneMessageBox("map filesize", "filesize is less than MAPHEADER_SIZE + mapNameLength + musicNameLength"); Com_Printf("filesize is less than MAPHEADER_SIZE + mapNameLength + musicNameLength\n"); return NULL; } diff --git a/wolf3d/code/wolf/wolf_local.h b/wolf3d/code/wolf/wolf_local.h index f0586e4..9bdc8e4 100644 --- a/wolf3d/code/wolf/wolf_local.h +++ b/wolf3d/code/wolf/wolf_local.h @@ -39,6 +39,9 @@ #ifndef __WOLF_LOCAL_H__ #define __WOLF_LOCAL_H__ +#include "filesystem.h" +#include "arch.h" +#include "cvar.h" // Game Version #define WOLFENSTEINWL6 0x00 diff --git a/wolf3d/code/wolf/wolf_main.c b/wolf3d/code/wolf/wolf_main.c index cda6e6c..e667f08 100644 --- a/wolf3d/code/wolf/wolf_main.c +++ b/wolf3d/code/wolf/wolf_main.c @@ -70,9 +70,9 @@ PUBLIC void Game_Init( void ) episode = Cvar_Get( "episode", "0", CVAR_ARCHIVE ); skill = Cvar_Get( "skill", "1", CVAR_ARCHIVE ); -// g_version = Cvar_Get( "g_version", "0", CVAR_ARCHIVE ); g_version = Cvar_Get( "g_version", "1", CVAR_ARCHIVE ); //we should make a #ifdef for "special version" //this version is to come with spear + #ifndef LITE Cmd_AddCommand( "map", Map_f ); diff --git a/wolf3d/code/wolf/wolf_opengl.c b/wolf3d/code/wolf/wolf_opengl.c index 34582d1..194602a 100644 --- a/wolf3d/code/wolf/wolf_opengl.c +++ b/wolf3d/code/wolf/wolf_opengl.c @@ -58,11 +58,12 @@ */ PUBLIC void GL_SetDefaultState( void ) { - pfglClearColor( 1,0, 0.5 , 0.5 ); - pfglCullFace( GL_FRONT ); + pfglViewport( 0,0, viddef.height, viddef.width ); + pfglClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); pfglEnable( GL_TEXTURE_2D ); pfglDisable( GL_DEPTH_TEST ); - pfglDisable( GL_CULL_FACE ); + pfglDisable( GL_ALPHA_TEST ); + pfglEnable( GL_CULL_FACE ); pfglDisable( GL_BLEND ); pfglColor4f( 1, 1, 1, 1 ); pfglShadeModel( GL_FLAT ); @@ -92,12 +93,12 @@ PUBLIC void R_DrawBox( int x, int y, int w, int h, W32 color ) pfglColor4ubv( (GLubyte *) & color ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); pfglVertex2i( x, y ); pfglVertex2i( x, y + h); - pfglVertex2i( x + w, y + h ); pfglVertex2i( x + w, y ); + pfglVertex2i( x + w, y + h ); pfglEnd(); @@ -107,6 +108,41 @@ PUBLIC void R_DrawBox( int x, int y, int w, int h, W32 color ) pfglEnable( GL_TEXTURE_2D ); } +/* +----------------------------------------------------------------------------- + Function: R_DrawBoxFloat + + Parameters: + + Returns: + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void R_DrawBoxFloat( float x, float y, float w, float h, W32 color ) +{ + pfglDisable( GL_TEXTURE_2D ); + +// pfglEnable( GL_BLEND ); +// pfglBlendFunc( GL_SRC_COLOR, GL_DST_COLOR ); + + pfglColor4ubv( (GLubyte *) & color ); + + pfglBegin( GL_TRIANGLE_STRIP ); + + pfglVertex2f( x, y ); + pfglVertex2f( x, y + h); + pfglVertex2f( x + w, y + h ); + pfglVertex2f( x + w, y ); + + pfglEnd(); + + pfglColor3f( 1, 1, 1 ); +// pfglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); +// pfglDisable( GL_BLEND ); + pfglEnable( GL_TEXTURE_2D ); +} /* ==================== @@ -211,11 +247,11 @@ PUBLIC void R_Draw_Wall( float x, float y, float z1, float z2, int type, int tex LoadWallTexture( tex ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); - pfglTexCoord2f( 1.0, 0.0 ); pfglVertex3f( x1, z2, y1 ); pfglTexCoord2f( 0.0, 0.0 ); pfglVertex3f( x2, z2, y2 ); pfglTexCoord2f( 0.0, 1.0 ); pfglVertex3f( x2, z1, y2 ); + pfglTexCoord2f( 1.0, 0.0 ); pfglVertex3f( x1, z2, y1 ); pfglTexCoord2f( 1.0, 1.0 ); pfglVertex3f( x1, z1, y1 ); pfglEnd(); @@ -276,11 +312,11 @@ PUBLIC void R_Draw_Door( int x, int y, float z1, float z2, _boolean vertical, _b LoadWallTexture( tex ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); - pfglTexCoord2f( backside ? 0.0f : 1.0f, 0.0 ); pfglVertex3f( x1, z2, y1 ); pfglTexCoord2f( backside ? 1.0f : 0.0f, 0.0 ); pfglVertex3f( x2, z2, y2 ); pfglTexCoord2f( backside ? 1.0f : 0.0f, 1.0 ); pfglVertex3f( x2, z1, y2 ); + pfglTexCoord2f( backside ? 0.0f : 1.0f, 0.0 ); pfglVertex3f( x1, z2, y1 ); pfglTexCoord2f( backside ? 0.0f : 1.0f, 1.0 ); pfglVertex3f( x1, z1, y1 ); pfglEnd(); @@ -340,7 +376,7 @@ PUBLIC void R_DrawSprites( void ) } R_Bind( twall->texnum ); - pfglBegin( GL_QUADS ); + pfglBegin( GL_TRIANGLE_STRIP ); if ( cropSprites->value && twall->header.numBounds > 0 ) { // draw one or two subrects to avoid blending all the empty space @@ -367,8 +403,8 @@ PUBLIC void R_DrawSprites( void ) pfglTexCoord2f( x1, y1 ); pfglVertex3f( Ex - x1 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y1), -Ey + x1 * 2*sina ); pfglTexCoord2f( x1, y2 ); pfglVertex3f( Ex - x1 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y2), -Ey + x1 * 2*sina ); - pfglTexCoord2f( x2, y2 ); pfglVertex3f( Ex - x2 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y2), -Ey + x2 * 2*sina ); pfglTexCoord2f( x2, y1 ); pfglVertex3f( Ex - x2 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y1), -Ey + x2 * 2*sina ); + pfglTexCoord2f( x2, y2 ); pfglVertex3f( Ex - x2 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y2), -Ey + x2 * 2*sina ); } } else { Ex = Dx = vislist[ n ].x / FLOATTILE; @@ -378,8 +414,8 @@ PUBLIC void R_DrawSprites( void ) pfglTexCoord2f( 0.0, 0.0 ); pfglVertex3f( Ex, UPPERZCOORD, -Ey ); pfglTexCoord2f( 0.0, 1.0 ); pfglVertex3f( Ex, LOWERZCOORD, -Ey ); - pfglTexCoord2f( 1.0, 1.0 ); pfglVertex3f( Dx, LOWERZCOORD, -Dy ); pfglTexCoord2f( 1.0, 0.0 ); pfglVertex3f( Dx, UPPERZCOORD, -Dy ); + pfglTexCoord2f( 1.0, 1.0 ); pfglVertex3f( Dx, LOWERZCOORD, -Dy ); } pfglEnd(); @@ -429,9 +465,9 @@ PUBLIC void R_DrawNumber( int x, int y, int number ) fcol = col * w; pfglTexCoord2f( fcol, 0 ); pfglVertex2i( x, y ); - pfglTexCoord2f( fcol+w, 0 ); pfglVertex2i( x+18, y ); - pfglTexCoord2f( fcol+w, 1 ); pfglVertex2i( x+18, y+32 ); pfglTexCoord2f( fcol, 1 ); pfglVertex2i( x, y+32 ); + pfglTexCoord2f( fcol+w, 1 ); pfglVertex2i( x+18, y+32 ); + pfglTexCoord2f( fcol+w, 0 ); pfglVertex2i( x+18, y ); x -= 18; } @@ -503,9 +539,10 @@ PUBLIC void R_put_line( int x, int y, const char *string ) pfglTexCoord2f( fcol, frow ); pfglVertex2i( mx, y ); - pfglTexCoord2f( fcol+w, frow ); pfglVertex2i( mx+32, y ); - pfglTexCoord2f( fcol+w, frow+h ); pfglVertex2i( mx+32, y+32 ); pfglTexCoord2f( fcol, frow+h ); pfglVertex2i( mx, y+32 ); + pfglTexCoord2f( fcol+w, frow+h ); pfglVertex2i( mx+32, y+32 ); + pfglTexCoord2f( fcol+w, frow ); pfglVertex2i( mx+32, y ); + diff --git a/wolf3d/code/wolf/wolf_player.c b/wolf3d/code/wolf/wolf_player.c index b47617b..4237dda 100644 --- a/wolf3d/code/wolf/wolf_player.c +++ b/wolf3d/code/wolf/wolf_player.c @@ -585,7 +585,7 @@ PUBLIC void PL_Spawn( placeonplane_t location, LevelData_t *lvl ) //gsh iphoneSetLevelNotifyText(); - /* +#if 0 char str[128]; //sprintf( str, "Entering level E%iM%i", currentMap.episode + 1, currentMap.map + 1 ); //gsh @@ -624,10 +624,10 @@ PUBLIC void PL_Spawn( placeonplane_t location, LevelData_t *lvl ) } } else - sprintf( str, "Entering level custom %i", /*currentMap.episode+1,* currentMap.map+1 ); + sprintf( str, "Entering level custom %i", /*currentMap.episode+1,*/ currentMap.map+1 ); iphoneSetNotifyText( str ); - */ +#endif } /* diff --git a/wolf3d/code/wolf/wolf_powerups.c b/wolf3d/code/wolf/wolf_powerups.c index 0e6f08e..dbf023d 100644 --- a/wolf3d/code/wolf/wolf_powerups.c +++ b/wolf3d/code/wolf/wolf_powerups.c @@ -295,13 +295,13 @@ PRIVATE int Pow_Give( pow_t type ) Com_Printf("Spear of Destiny picked up!!\n"); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "sfx/109.wav" ), 1, ATTN_NORM, 0 ); //gsh - iphoneSetNotifyText( "Spear of Destiny" ); -/* //gsh - my_snprintf( szTextMsg, sizeof( szTextMsg ), //this is supposed to load the last level... but it isn't - "loading ; map s%.2d.map\n", 20 ); - Cbuf_AddText( szTextMsg ); - */ + Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "sfx/109.wav" ), 1, ATTN_NORM, 0 ); //gsh + iphoneSetNotifyText( "Spear of Destiny" ); + /* //gsh + my_snprintf( szTextMsg, sizeof( szTextMsg ), //this is supposed to load the last level... but it isn't + "loading ; map s%.2d.map\n", 20 ); + Cbuf_AddText( szTextMsg ); + */ //this might be a bit of a hack. But it works. //Load the last level... gsh diff --git a/wolf3d/code/wolf/wolf_renderer.h b/wolf3d/code/wolf/wolf_renderer.h index dd02be7..ccc8377 100644 --- a/wolf3d/code/wolf/wolf_renderer.h +++ b/wolf3d/code/wolf/wolf_renderer.h @@ -41,6 +41,7 @@ #define __WOLF_RENDERER_H__ extern void R_DrawBox( int x, int y, int w, int h, W32 color ); +extern void R_DrawBoxFloat( float x, float y, float w, float h, W32 color ); extern void R_Draw_Door( int x, int y, float z1, float z2, _boolean vertical, _boolean backside, int tex, int amount ); extern void R_Draw_Wall( float x, float y, float z1, float z2, int type, int tex ); diff --git a/wolf3d/code/wolfiphone.h b/wolf3d/code/wolfiphone.h index 84a2ab4..472828f 100644 --- a/wolf3d/code/wolfiphone.h +++ b/wolf3d/code/wolfiphone.h @@ -1,10 +1,24 @@ /* - * wolfiphone.h - * wolf3d - * - * Created by John Carmack on 3/13/09. - * Copyright 2009 idSoftware. All rights reserved. - * + + Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company. + + This file is part of the WOLF3D iOS v2.1 GPL Source Code. + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ #include @@ -29,6 +43,7 @@ #include #include "iphone/gles_glue.h" + #include #include #include @@ -87,3 +102,10 @@ #include "iphone_alerts.h" +#include + +extern CFAbsoluteTime soundTime; +extern CFAbsoluteTime menuTime; + +void picTimingPrint(); +void picTimingClear(); diff --git a/wolf3d/readme_iWolf_v1x.txt b/wolf3d/readme_iWolf_v1x.txt new file mode 100644 index 0000000..e10572c --- /dev/null +++ b/wolf3d/readme_iWolf_v1x.txt @@ -0,0 +1,22 @@ + +The original Wolfenstein 3D code was written in late 1991 / early 1992 using 16 bit Turbo C and the TASM assembler and targeted at 286 based MSDOS systems with VGA graphics and ideally a bit of extended or expanded memory. + +I released the original source for Wolfenstein 3D many years ago, originally under a not-for-commercial purposes license, then later under the GPL. The old code is still available in various places ( http://www.btinternet.com/~belowe/ ) but it isn't very useful on modern platforms. There are several open source projects that have modernized the code so that it works on 32 bit systems and can take advantage of OpenGL acceleration. I started the iphone version with the Wolf3D Redux codebase ( http://wolf3dredux.sourceforge.net/ ), which apparently incorporated a lot of code from NewWolf ( http://newwolf.sourceforge.net/ ). + +At first, I considered trying to build the iphone version as a patch, but when I decided to turn the little research project into a commercial release (and do it in a hurry), I started making more wholesale changes. The Redux codebase had basically gutted the Quake 2 codebase and grafted Wolfenstein into it, which had some nice points, but it meant that the system code was many times as large as the actual Wolfenstein game code. It wasn't really hurting anything, and I considered leaving it all in, but it was such a mess that I finally flattened everything out and cut out about half of the environment code. No attempt was made to make this project portable, although it wouldn't be very hard to clean that up. + +In the past, Id source releases did not include any data files, and you had to extract data files from a commercially obtained version of the game if you wanted to experiment with the original game data. Because it isn't possible for users to tear open an app bundle from the App Store to get at the data, I am including it with the source code to make it easy. You are on-your-honor to buy a copy at the App Store before using the data. :-) The source code is under the GPL, but the data is still strictly copyright Id Software with no license given to distribute outside this code release package or to use for any commercial purpose. You are certainly free to replace all the data and make commercial applications, as long as the code is made available under the GPL. + +/newCode/wolf The 32 bit Wolfenstein code +/newCode/env The Quake 2 derived code +/newCode/iphone The newly written iphone code and xcode project files +/newCode/Tremor Unodified ogg Tremor code for the background music +/base Game data + +I can't say there is a lot of really good code here -- the wolf code is mutated, the quake 2 code is vestigial, and the new code was written in a hurry, but it does all hang together as a pretty fun game to play, and a good testbed for various things. + +If anyone does build another quality commercial application based on this code, let us know, and we can probably do some kind of cross linking. + +John Carmack +2009/03/20 + diff --git a/wolf3d/scripts/scrubBase.pl b/wolf3d/scripts/scrubBase.pl index 00ce786..a297595 100644 --- a/wolf3d/scripts/scrubBase.pl +++ b/wolf3d/scripts/scrubBase.pl @@ -10,26 +10,10 @@ } if ( -d "$dst/base/maps" ) { - print "Scrubbing maps for $prod.\n"; - chdir "$dst/base/maps"; - opendir( DIR, "." ); - my @files = readdir( DIR ); - closedir( DIR ); - #print "Candidates are: " . join( " ", @files ) . "\n"; - @files = grep { /^w[1-9]\d\.map$/ || /^w0[3-9]\.map$/ } @files; - #print "Filtered are: " . join( " ", @files ) . "\n"; - unlink @files; # copy appropriate splash image if ( -f "$src/../code/iphone/default_$prod.png" ) { print "Copying default_$prod.png as default splash image.\n"; `cp $src/../code/iphone/default_$prod.png $dst/Default.png`; } - - # copy appropriate victory image - if ( -f "$src/../code/iphone/victory_$prod.tga" ) { - print "Copying victory_$prod.tga as victory image.\n"; - `rm $dst/base/iphone/victory_256.5551`; - `cp $src/../code/iphone/victory_$prod.tga $dst/base/iphone/victory_256.tga`; - } } diff --git a/wolf3d/wolfextractor/adlib/adlib.c b/wolf3d/wolfextractor/adlib/adlib.c new file mode 100644 index 0000000..a0c6cfb --- /dev/null +++ b/wolf3d/wolfextractor/adlib/adlib.c @@ -0,0 +1,359 @@ +/* + + Copyright (C) 2004-2005 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * adlib.c: Interface to adlib hardware. + * + * Author: Michael Liebscher + * + * Acknowledgement: + * Portion of this code was derived from Wolfenstein3-D, and was originally + * written by Id Software, Inc. + * + * Portion of this code was derived from code written by DarkOne the Hacker. + * + */ + +#include +#include + + +#include "adlib.h" +#include "fmopl.h" + +#include "../../../common/arch.h" +#include "../../../common/common_utils.h" +#include "../memory/memory.h" + + +#define OPL_INTERNAL_FREQ 3600000 // The OPL operates at 3.6MHz +#define OPL_NUM_CHIPS 1 // Number of OPL chips +#define ADLIB_FREQ 22050 // in Hz + + +// Registers for the AdLib card +#define alFMStatus 0x388 // Read +#define alFMAddr 0x388 // Write +#define alFMData 0x389 // Write + +// Register addresses +// Operator stuff +#define alChar 0x20 +#define alScale 0x40 +#define alAttack 0x60 +#define alSus 0x80 +#define alWave 0xe0 +// Channel stuff +#define alFreqL 0xa0 +#define alFreqH 0xb0 +#define alFeedCon 0xc0 +// Global stuff +#define alEffects 0xbd + + +// This table maps channel numbers to carrier and modulator op cells +PRIVATE W8 carriers[ 9 ] = { 3, 4, 5,11,12,13,19,20,21 }, + modifiers[ 9 ] = { 0, 1, 2, 8, 9,10,16,17,18 }; + +PRIVATE FM_OPL *hAdLib = NULL; + + + +/* +----------------------------------------------------------------------------- + Function: ADLIB_Init() -Start adlib hardware. + + Parameters: Nothing. + + Returns: 1 on success, otherwise 0. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean ADLIB_Init( W32 freq ) +{ + hAdLib = OPLCreate( OPL_TYPE_YM3812, OPL_INTERNAL_FREQ, freq ); + + if( hAdLib == NULL ) + { + printf( "Could not create AdLib OPL Emulator\n" ); + + return false; + } + + OPLWrite( hAdLib, 0x01, 0x20 ); /* Set WSE=1 */ + OPLWrite( hAdLib, 0x08, 0x00 ); /* Set CSM=0 & SEL=0 */ + + return true; +} + +/* +----------------------------------------------------------------------------- + Function: ADLIB_Init() -Shutdown adlib hardware. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void ADLIB_Shutdown( void ) +{ + OPLDestroy( hAdLib ); +} + +/* +----------------------------------------------------------------------------- + Function: ADLIB_SetFXInst() -Shutdown adlib hardware. + + Parameters: inst -[in] Valid pointer to Instrument structure. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE void ADLIB_SetFXInst( Instrument *inst ) +{ + W8 c, m; + + m = modifiers[ 0 ]; + c = carriers[ 0 ]; + + + OPLWrite( hAdLib, m + alChar, inst->mChar ); + OPLWrite( hAdLib, m + alScale, inst->mScale ); + OPLWrite( hAdLib, m + alAttack, inst->mAttack ); + OPLWrite( hAdLib, m + alSus, inst->mSus ); + OPLWrite( hAdLib, m + alWave, inst->mWave ); + OPLWrite( hAdLib, c + alChar, inst->cChar ); + OPLWrite( hAdLib, c + alScale, inst->cScale ); + OPLWrite( hAdLib, c + alAttack, inst->cAttack ); + OPLWrite( hAdLib, c + alSus, inst->cSus ); + OPLWrite( hAdLib, c + alWave, inst->cWave ); + + OPLWrite( hAdLib, alFeedCon, 0 ); +} + +/* +----------------------------------------------------------------------------- + Function: ADLIB_DecodeSound() -Decode adlib sound. + + Parameters: sound -[in] Valid pointer to AdLibSound structure. + buffer -[in/out] Hold decoded sound data. + length -[out] Length of sound data. + + Returns: 1 on success, otherwise 0. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC W8 ADLIB_DecodeSound( AdLibSound *sound, W8 *buffer, W32 *length ) +{ + Instrument inst; + W32 alLengthLeft; + W32 alBlock; + W8 *alSound, s; + W16 *ptr; + + + inst = sound->inst; + alBlock = ( (sound->block & 7) << 2 ) | 0x20; + alLengthLeft= *((PW32)sound->common.length); + alSound = sound->data; + + *length = alLengthLeft * 157 * 2; // 157[.5] = 22050 / 140 + + if( *length > MAX_WAV_SIZE ) + { + return 0; + } + + ptr = (PW16) buffer; + + OPLWrite( hAdLib, alFreqL, 0 ); + OPLWrite( hAdLib, alFreqH, 0 ); + + ADLIB_SetFXInst( &inst ); + + while( alLengthLeft ) + { + s = *alSound++; + if( ! s ) + { + OPLWrite( hAdLib, alFreqH+0, 0 ); + } + else + { + OPLWrite( hAdLib, alFreqL+0, s ); + OPLWrite( hAdLib, alFreqH+0, alBlock ); + } + if( ! ( --alLengthLeft ) ) + { + OPLWrite( hAdLib, alFreqH+0, 0 ); + } + YM3812UpdateOne( hAdLib, ptr, 157 ); + ptr += 157; + } + + + return 1; +} + + + + + + + +W16 *sqHack, *sqHackPtr; +W32 sqHackLen, sqHackSeqLen; +W32 sqHackTime; +W32 alTimeCount; + +#define ADLIB_MUSIC_SPEED 44100 +#define ADLIB_MUSIC_BYPS (ADLIB_MUSIC_SPEED*2) // bytes per second (16 bit) + +typedef struct +{ + W16 length; + W16 values[ 1 ]; + +} musicGroup_t; + +musicGroup_t *music; + +/* +----------------------------------------------------------------------------- + Function: ADLIB_LoadMusic() -Setup music decoder. + + Parameters: musbuffer -[in] musicGroup_t data structure. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void ADLIB_LoadMusic( void *musbuffer ) +{ + music = (musicGroup_t *)musbuffer; + sqHackPtr = music->values; + sqHackLen = music->length; + sqHackTime = alTimeCount = 0; +} + +/* +----------------------------------------------------------------------------- + Function: ADLIB_UpdateMusic() -Decode adlib music sound. + + Parameters: size -[in] Number of bytes to write to buffer. + buffer -[in/out] Hold decoded sound data. + + Returns: 1 on success, otherwise 0. + + Notes: Data written to buffer is 44100/16/mono + +----------------------------------------------------------------------------- +*/ +PUBLIC W32 ADLIB_UpdateMusic( W32 size, void *buffer ) +{ + W8 *al; //[2] {a, v} (register, value) + W16 *ptr; + W32 n; + W32 AdLibTicks; + _boolean flag = false; + + + AdLibTicks = size; + + ptr = (PW16)buffer; + + for( n = 0 ; n < AdLibTicks; ++n ) + { + while( sqHackLen && (sqHackTime <= alTimeCount) ) + { + al = (PW8)sqHackPtr++; + sqHackTime = alTimeCount + *sqHackPtr++; + OPLWrite( hAdLib, al[ 0 ], al[ 1 ] ); + sqHackLen -= 4; + } + alTimeCount++; + + + // now we'll get AdLib Output! + YM3812UpdateOne( hAdLib, ptr, 63 ); + ptr += 63; + + if( sqHackLen <= 0 ) + { + return (long)ptr - (long)buffer; + } + } + + return AdLibTicks * ADLIB_MUSIC_BYPS / 700; +} + + +/* +----------------------------------------------------------------------------- + Function: ADLIB_getLength() -Get music length in milliseconds. + + Parameters: musbuffer -[in] musicGroup_t data structure. + + Returns: On success length in milliseconds. + + Notes: Data written to buffer is 44100/16/mono + +----------------------------------------------------------------------------- +*/ +PUBLIC W32 ADLIB_getLength( void *musbuffer ) +{ + W16 *Ptr, Len; + W32 Time; + W32 alTime; + + Ptr = ((musicGroup_t*)musbuffer)->values; + Len = ((musicGroup_t*)musbuffer)->length; + Time = alTime = 0; + + + for( ; ; ) + { + while( Len && Time <= alTime ) + { + Ptr++; + Time = alTime + *Ptr++; + Len -= 4; + } + alTime++; + if( Len <= 0 ) + { + break; + } + } + + return alTime * 1000 / 700; // in milliseconds +} \ No newline at end of file diff --git a/wolf3d/wolfextractor/adlib/adlib.h b/wolf3d/wolfextractor/adlib/adlib.h new file mode 100644 index 0000000..f95523c --- /dev/null +++ b/wolf3d/wolfextractor/adlib/adlib.h @@ -0,0 +1,90 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * adlib.h: Interface to adlib hardware. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Wolfenstein 3-D, and was originally + * written by Id Software, Inc. + * + */ + + /* + Notes: + + This module is implemented by adlib.c + */ + +#ifndef __ADLIB_H__ +#define __ADLIB_H__ + + +#include "../../../common/arch.h" + + +#define MAX_WAV_SIZE 100000 + + +typedef struct +{ + W8 mChar, cChar, + mScale, cScale, + mAttack, cAttack, + mSus, cSus, + mWave, cWave, + nConn, + + // These are only for Muse - these bytes are really unused + voice, + mode, + unused[ 3 ]; + +} Instrument; + +typedef struct +{ + char length[4]; + char priority[2]; + +} SoundCommon; + +typedef struct +{ + SoundCommon common; + Instrument inst; + W8 block; + W8 data[ 1 ]; + +} AdLibSound; + + +extern W8 ADLIB_Init(); +extern void ADLIB_Shutdown(); + +extern W8 ADLIB_DecodeSound( AdLibSound *sound, W8 *buffer, W32 *length ); + + + +#endif /* __ADLIB_H__ */ + diff --git a/wolf3d/wolfextractor/adlib/fmopl.c b/wolf3d/wolfextractor/adlib/fmopl.c new file mode 100644 index 0000000..cf8101e --- /dev/null +++ b/wolf3d/wolfextractor/adlib/fmopl.c @@ -0,0 +1,1032 @@ +/* tab setting : 4 + * + * FM OPL2 synth + * + * Copyright (C) 1999,2000 Tatsuyuki Satoh , MultiArcadeMachineEmulator development + * Modified for Wolfenstein 3D by Steven Fuller + * Future Modifications by DarkOne for WolfGL! (wolfgl.narod.ru) + */ +#include +#include +#include +#include +#include + +#include "fmopl.h" + +#ifndef INLINE + + #define INLINE __inline + +#endif + +void logerror(const char *text, ...); + +#ifndef PI + + #define PI 3.14159265358979323846 + +#endif + +/* -------------------- for debug --------------------- */ +/* #define OPL_OUTPUT_LOG */ +#ifdef OPL_OUTPUT_LOG + static FILE *opl_dbg_fp = NULL; + static FM_OPL *opl_dbg_opl[16]; + static int opl_dbg_maxchip,opl_dbg_chip; +#endif + +/* -------------------- preliminary define section --------------------- */ +/* attack/decay rate */ +#define OPL_ARRATE 141280 /* RATE 4 = 2826.24ms @ 3.6MHz */ +#define OPL_DRRATE 1956000 /* RATE 4 = 39280.64ms @ 3.6MHz */ + +#define FREQ_BITS 24 /* frequency turn */ + +/* counter bits = 20, octave 7 */ +#define FREQ_RATE (1<<(FREQ_BITS-20)) +#define TL_BITS (FREQ_BITS+2) + +/* final output shift, limit minimum and maximum */ +#define OPL_OUTSB (TL_BITS+3-16) /* OPL output final shift 16bit */ +#define OPL_MAXOUT (0x7fff<=LOG_LEVEL ) logerror x + +/* --------------------- subroutines --------------------- */ + +INLINE int Limit( int val, int max, int min ) { + if ( val > max ) + val = max; + else if ( val < min ) + val = min; + + return val; +} + +/* ----- key on ----- */ +INLINE void OPL_KEYON(OPL_SLOT *SLOT) +{ + /* sine wave restart */ + SLOT->Cnt = 0; + /* set attack */ + SLOT->evm = ENV_MOD_AR; + SLOT->evs = SLOT->evsa; + SLOT->evc = EG_AST; + SLOT->eve = EG_AED; +} +/* ----- key off ----- */ +INLINE void OPL_KEYOFF(OPL_SLOT *SLOT) +{ + if( SLOT->evm > ENV_MOD_RR) + { + /* set envelope counter from envleope output */ + SLOT->evm = ENV_MOD_RR; + if( !(SLOT->evc&EG_DST) ) + SLOT->evc = (ENV_CURVE[SLOT->evc>>ENV_BITS]<eve = EG_DED; + SLOT->evs = SLOT->evsr; + } +} + +/* ---------- Envelope Generator & Phase Generator ---------- */ +/* return : envelope output */ +INLINE UINT32 OPL_CALC_SLOT( OPL_SLOT *SLOT ) +{ + /* calculate envelope generator */ + if( (SLOT->evc+=SLOT->evs) >= SLOT->eve ) + { + switch( SLOT->evm ){ + case ENV_MOD_AR: /* ATTACK -> DECAY1 */ + /* next DR */ + SLOT->evm = ENV_MOD_DR; + SLOT->evc = EG_DST; + SLOT->eve = SLOT->SL; + SLOT->evs = SLOT->evsd; + break; + case ENV_MOD_DR: /* DECAY -> SL or RR */ + SLOT->evc = SLOT->SL; + SLOT->eve = EG_DED; + if(SLOT->eg_typ) + { + SLOT->evs = 0; + } + else + { + SLOT->evm = ENV_MOD_RR; + SLOT->evs = SLOT->evsr; + } + break; + case ENV_MOD_RR: /* RR -> OFF */ + SLOT->evc = EG_OFF; + SLOT->eve = EG_OFF+1; + SLOT->evs = 0; + break; + } + } + /* calculate envelope */ + return SLOT->TLL+ENV_CURVE[SLOT->evc>>ENV_BITS]+(SLOT->ams ? ams : 0); +} + +/* set algorythm connection */ +static void set_algorythm( OPL_CH *CH) +{ + INT32 *carrier = &outd[0]; + CH->connect1 = CH->CON ? carrier : &feedback2; + CH->connect2 = carrier; +} + +/* ---------- frequency counter for operater update ---------- */ +INLINE void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT) +{ + int ksr; + + /* frequency step counter */ + SLOT->Incr = CH->fc * SLOT->mul; + ksr = CH->kcode >> SLOT->KSR; + + if( SLOT->ksr != ksr ) + { + SLOT->ksr = ksr; + /* attack , decay rate recalculation */ + SLOT->evsa = SLOT->AR[ksr]; + SLOT->evsd = SLOT->DR[ksr]; + SLOT->evsr = SLOT->RR[ksr]; + } + SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); +} + +/* set multi,am,vib,EG-TYP,KSR,mul */ +INLINE void set_mul(FM_OPL *OPL,int slot,int v) +{ + OPL_CH *CH = &OPL->P_CH[slot/2]; + OPL_SLOT *SLOT = &CH->SLOT[slot&1]; + + SLOT->mul = MUL_TABLE[v&0x0f]; + SLOT->KSR = (v&0x10) ? 0 : 2; + SLOT->eg_typ = (v&0x20)>>5; + SLOT->vib = (v&0x40); + SLOT->ams = (v&0x80); + CALC_FCSLOT(CH,SLOT); +} + +/* set ksl & tl */ +INLINE void set_ksl_tl(FM_OPL *OPL,int slot,int v) +{ + OPL_CH *CH = &OPL->P_CH[slot/2]; + OPL_SLOT *SLOT = &CH->SLOT[slot&1]; + int ksl = v>>6; /* 0 / 1.5 / 3 / 6 db/OCT */ + + SLOT->ksl = ksl ? 3-ksl : 31; + SLOT->TL = (int)((v&0x3f)*(0.75/EG_STEP)); /* 0.75db step */ + + if( !(OPL->mode&0x80) ) + { /* not CSM latch total level */ + SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); + } +} + +/* set attack rate & decay rate */ +INLINE void set_ar_dr(FM_OPL *OPL,int slot,int v) +{ + OPL_CH *CH = &OPL->P_CH[slot/2]; + OPL_SLOT *SLOT = &CH->SLOT[slot&1]; + int ar = v>>4; + int dr = v&0x0f; + + SLOT->AR = ar ? &OPL->AR_TABLE[ar<<2] : RATE_0; + SLOT->evsa = SLOT->AR[SLOT->ksr]; + if( SLOT->evm == ENV_MOD_AR ) SLOT->evs = SLOT->evsa; + + SLOT->DR = dr ? &OPL->DR_TABLE[dr<<2] : RATE_0; + SLOT->evsd = SLOT->DR[SLOT->ksr]; + if( SLOT->evm == ENV_MOD_DR ) SLOT->evs = SLOT->evsd; +} + +/* set sustain level & release rate */ +INLINE void set_sl_rr(FM_OPL *OPL,int slot,int v) +{ + OPL_CH *CH = &OPL->P_CH[slot/2]; + OPL_SLOT *SLOT = &CH->SLOT[slot&1]; + int sl = v>>4; + int rr = v & 0x0f; + + SLOT->SL = SL_TABLE[sl]; + if( SLOT->evm == ENV_MOD_DR ) SLOT->eve = SLOT->SL; + SLOT->RR = &OPL->DR_TABLE[rr<<2]; + SLOT->evsr = SLOT->RR[SLOT->ksr]; + if( SLOT->evm == ENV_MOD_RR ) SLOT->evs = SLOT->evsr; +} + +/* operator output calculator */ +#define OP_OUT(slot,env,con) slot->wavetable[((slot->Cnt+con)/(0x1000000/SIN_ENT))&(SIN_ENT-1)][env] +/* ---------- calculate channel ---------- */ +INLINE void OPL_CALC_CH( OPL_CH *CH ) +{ + UINT32 env_out; + OPL_SLOT *SLOT; + + feedback2 = 0; + /* SLOT 1 */ + SLOT = &CH->SLOT[SLOT1]; + env_out=OPL_CALC_SLOT(SLOT); + if( env_out < EG_ENT-1 ) + { + /* PG */ + if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); + else SLOT->Cnt += SLOT->Incr; + /* connection */ + if(CH->FB) + { + int feedback1 = (CH->op1_out[0]+CH->op1_out[1])>>CH->FB; + CH->op1_out[1] = CH->op1_out[0]; + *CH->connect1 += CH->op1_out[0] = OP_OUT(SLOT,env_out,feedback1); + } + else + { + *CH->connect1 += OP_OUT(SLOT,env_out,0); + } + }else + { + CH->op1_out[1] = CH->op1_out[0]; + CH->op1_out[0] = 0; + } + /* SLOT 2 */ + SLOT = &CH->SLOT[SLOT2]; + env_out=OPL_CALC_SLOT(SLOT); + if( env_out < EG_ENT-1 ) + { + /* PG */ + if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); + else SLOT->Cnt += SLOT->Incr; + /* connection */ + outd[0] += OP_OUT(SLOT,env_out, feedback2); + } +} + +/* ---------- calculate rythm block ---------- */ +#define WHITE_NOISE_db 6.0 +INLINE void OPL_CALC_RH( OPL_CH *CH ) +{ + UINT32 env_tam,env_sd,env_top,env_hh; + int whitenoise = (int)((rand()&1)*(WHITE_NOISE_db/EG_STEP)); + INT32 tone8; + + OPL_SLOT *SLOT; + int env_out; + + /* BD : same as FM serial mode and output level is large */ + feedback2 = 0; + /* SLOT 1 */ + SLOT = &CH[6].SLOT[SLOT1]; + env_out=OPL_CALC_SLOT(SLOT); + if( env_out < EG_ENT-1 ) + { + /* PG */ + if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); + else SLOT->Cnt += SLOT->Incr; + /* connectoion */ + if(CH[6].FB) + { + int feedback1 = (CH[6].op1_out[0]+CH[6].op1_out[1])>>CH[6].FB; + CH[6].op1_out[1] = CH[6].op1_out[0]; + feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT,env_out,feedback1); + } + else + { + feedback2 = OP_OUT(SLOT,env_out,0); + } + }else + { + feedback2 = 0; + CH[6].op1_out[1] = CH[6].op1_out[0]; + CH[6].op1_out[0] = 0; + } + /* SLOT 2 */ + SLOT = &CH[6].SLOT[SLOT2]; + env_out=OPL_CALC_SLOT(SLOT); + if( env_out < EG_ENT-1 ) + { + /* PG */ + if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); + else SLOT->Cnt += SLOT->Incr; + /* connectoion */ + outd[0] += OP_OUT(SLOT,env_out, feedback2)*2; + } + + // SD (17) = mul14[fnum7] + white noise + // TAM (15) = mul15[fnum8] + // TOP (18) = fnum6(mul18[fnum8]+whitenoise) + // HH (14) = fnum7(mul18[fnum8]+whitenoise) + white noise + env_sd =OPL_CALC_SLOT(SLOT7_2) + whitenoise; + env_tam=OPL_CALC_SLOT(SLOT8_1); + env_top=OPL_CALC_SLOT(SLOT8_2); + env_hh =OPL_CALC_SLOT(SLOT7_1) + whitenoise; + + /* PG */ + if(SLOT7_1->vib) SLOT7_1->Cnt += (2*SLOT7_1->Incr*vib/VIB_RATE); + else SLOT7_1->Cnt += 2*SLOT7_1->Incr; + if(SLOT7_2->vib) SLOT7_2->Cnt += ((CH[7].fc*8)*vib/VIB_RATE); + else SLOT7_2->Cnt += (CH[7].fc*8); + if(SLOT8_1->vib) SLOT8_1->Cnt += (SLOT8_1->Incr*vib/VIB_RATE); + else SLOT8_1->Cnt += SLOT8_1->Incr; + if(SLOT8_2->vib) SLOT8_2->Cnt += ((CH[8].fc*48)*vib/VIB_RATE); + else SLOT8_2->Cnt += (CH[8].fc*48); + + tone8 = OP_OUT(SLOT8_2,whitenoise,0 ); + + /* SD */ + if( env_sd < EG_ENT-1 ) + outd[0] += OP_OUT(SLOT7_1,env_sd, 0)*8; + /* TAM */ + if( env_tam < EG_ENT-1 ) + outd[0] += OP_OUT(SLOT8_1,env_tam, 0)*2; + /* TOP-CY */ + if( env_top < EG_ENT-1 ) + outd[0] += OP_OUT(SLOT7_2,env_top,tone8)*2; + /* HH */ + if( env_hh < EG_ENT-1 ) + outd[0] += OP_OUT(SLOT7_2,env_hh,tone8)*2; +} + +/* ----------- initialize time tabls ----------- */ +static void init_timetables( FM_OPL *OPL , int ARRATE , int DRRATE ) +{ + int i; + double rate; + + /* make attack rate & decay rate tables */ + for (i = 0;i < 4;i++) OPL->AR_TABLE[i] = OPL->DR_TABLE[i] = 0; + for (i = 4;i <= 60;i++){ + rate = OPL->freqbase; /* frequency rate */ + if( i < 60 ) rate *= 1.0+(i&3)*0.25; /* b0-1 : x1 , x1.25 , x1.5 , x1.75 */ + rate *= 1<<((i>>2)-1); /* b2-5 : shift bit */ + rate *= (double)(EG_ENT<AR_TABLE[i] = (int)(rate/ARRATE); + OPL->DR_TABLE[i] = (int)(rate/DRRATE); + } + for (i = 60;i < 76;i++) + { + OPL->AR_TABLE[i] = EG_AED-1; + OPL->DR_TABLE[i] = OPL->DR_TABLE[60]; + } +#if 0 + for (i = 0;i < 64 ;i++){ /* make for overflow area */ + LOG(LOG_WAR,("rate %2d , ar %f ms , dr %f ms \n",i, + ((double)(EG_ENT<AR_TABLE[i]) * (1000.0 / OPL->rate), + ((double)(EG_ENT<DR_TABLE[i]) * (1000.0 / OPL->rate) )); + } +#endif +} + +/* ---------- generic table initialize ---------- */ +static int OPLOpenTable( void ) +{ + int s,t; + double rate; + int i,j; + double pom; + + /* allocate dynamic tables */ + if( (TL_TABLE = (INT32*)malloc(TL_MAX*2*sizeof(INT32))) == NULL) + return 0; + if( (SIN_TABLE = (INT32**)malloc(SIN_ENT*4 *sizeof(INT32 *))) == NULL) + { + free(TL_TABLE); + return 0; + } + if( (AMS_TABLE = (INT32*)malloc(AMS_ENT*2 *sizeof(INT32))) == NULL) + { + free(TL_TABLE); + free(SIN_TABLE); + return 0; + } + if( (VIB_TABLE = (INT32*)malloc(VIB_ENT*2 *sizeof(INT32))) == NULL) + { + free(TL_TABLE); + free(SIN_TABLE); + free(AMS_TABLE); + return 0; + } + /* make total level table */ + for (t = 0;t < EG_ENT-1 ;t++){ + rate = ((1< voltage */ + TL_TABLE[ t] = (int)rate; + TL_TABLE[TL_MAX+t] = -TL_TABLE[t]; +/* LOG(LOG_INF,("TotalLevel(%3d) = %x\n",t,TL_TABLE[t]));*/ + } + /* fill volume off area */ + for ( t = EG_ENT-1; t < TL_MAX ;t++){ + TL_TABLE[t] = TL_TABLE[TL_MAX+t] = 0; + } + + /* make sinwave table (total level offet) */ + /* degree 0 = degree 180 = off */ + SIN_TABLE[0] = SIN_TABLE[SIN_ENT/2] = &TL_TABLE[EG_ENT-1]; + for (s = 1;s <= SIN_ENT/4;s++){ + pom = sin(2*PI*s/SIN_ENT); /* sin */ + pom = 20*log10(1/pom); /* decibel */ + j =(int)(pom/EG_STEP); /* TL_TABLE steps */ + + /* degree 0 - 90 , degree 180 - 90 : plus section */ + SIN_TABLE[ s] = SIN_TABLE[SIN_ENT/2-s] = &TL_TABLE[j]; + /* degree 180 - 270 , degree 360 - 270 : minus section */ + SIN_TABLE[SIN_ENT/2+s] = SIN_TABLE[SIN_ENT -s] = &TL_TABLE[TL_MAX+j]; +/* LOG(LOG_INF,("sin(%3d) = %f:%f db\n",s,pom,(double)j * EG_STEP));*/ + } + for (s = 0;s < SIN_ENT;s++) + { + SIN_TABLE[SIN_ENT*1+s] = s<(SIN_ENT/2) ? SIN_TABLE[s] : &TL_TABLE[EG_ENT]; + SIN_TABLE[SIN_ENT*2+s] = SIN_TABLE[s % (SIN_ENT/2)]; + SIN_TABLE[SIN_ENT*3+s] = (s/(SIN_ENT/4))&1 ? &TL_TABLE[EG_ENT] : SIN_TABLE[SIN_ENT*2+s]; + } + + /* envelope counter -> envelope output table */ + for (i=0; i= EG_ENT ) pom = EG_ENT-1; */ + ENV_CURVE[i] = (int)pom; + /* DECAY ,RELEASE curve */ + ENV_CURVE[(EG_DST>>ENV_BITS)+i]= i; + } + /* off */ + ENV_CURVE[EG_OFF>>ENV_BITS]= EG_ENT-1; + /* make LFO ams table */ + for (i=0; ifreqbase = (OPL->rate) ? ((double)OPL->clock / OPL->rate) / 72 : 0; + + /* make time tables */ + init_timetables( OPL , OPL_ARRATE , OPL_DRRATE ); + /* make fnumber -> increment counter table */ + for( fn=0 ; fn < 1024 ; fn++ ) + { + OPL->FN_TABLE[fn] = (int)(OPL->freqbase * fn * FREQ_RATE * (1<<7) / 2); + } + /* LFO freq.table */ + OPL->amsIncr=(int)(OPL->rate ? (double)AMS_ENT*(1<rate * 3.7 * ((double)OPL->clock/3600000) : 0); + OPL->vibIncr=(int)(OPL->rate ? (double)VIB_ENT*(1<rate * 6.4 * ((double)OPL->clock/3600000) : 0); +} + +/* ---------- write to OPL registers ---------- */ +void OPLWrite(FM_OPL *OPL, int r, int v) +{ + OPL_CH *CH; + int slot; + int block_fnum; + + switch(r&0xe0) + { + case 0x00: /* 00-1f:controll */ + switch(r&0x1f) + { + case 0x01: + /* wave selector enable */ + OPL->wavesel = v&0x20; + if(!OPL->wavesel) + { + /* preset compatible mode */ + int c; + for(c=0;cmax_ch;c++) + { + OPL->P_CH[c].SLOT[SLOT1].wavetable = &SIN_TABLE[0]; + OPL->P_CH[c].SLOT[SLOT2].wavetable = &SIN_TABLE[0]; + } + } + return; + case 0x02: /* Timer 1 */ + break; + case 0x03: /* Timer 2 */ + return; + case 0x04: /* IRQ clear / mask and Timer enable */ + return; + case 0x08: /* MODE,DELTA-T : CSM,NOTESEL,x,x,smpl,da/ad,64k,rom */ + OPL->mode = v; + return; + } + break; + case 0x20: /* am,vib,ksr,eg type,mul */ + slot = slot_array[r&0x1f]; + if(slot == -1) return; + set_mul(OPL,slot,v); + return; + case 0x40: + slot = slot_array[r&0x1f]; + if(slot == -1) return; + set_ksl_tl(OPL,slot,v); + return; + case 0x60: + slot = slot_array[r&0x1f]; + if(slot == -1) return; + set_ar_dr(OPL,slot,v); + return; + case 0x80: + slot = slot_array[r&0x1f]; + if(slot == -1) return; + set_sl_rr(OPL,slot,v); + return; + case 0xa0: + switch(r) + { + case 0xbd: + /* amsep,vibdep,r,bd,sd,tom,tc,hh */ + { + UINT8 rkey = OPL->rythm^v; + OPL->ams_table = &AMS_TABLE[v&0x80 ? AMS_ENT : 0]; + OPL->vib_table = &VIB_TABLE[v&0x40 ? VIB_ENT : 0]; + OPL->rythm = v&0x3f; + if(OPL->rythm&0x20) + { +#if 0 + usrintf_showmessage("OPL Rythm mode select"); +#endif + /* BD key on/off */ + if(rkey&0x10) + { + if(v&0x10) + { + OPL->P_CH[6].op1_out[0] = OPL->P_CH[6].op1_out[1] = 0; + OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT1]); + OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT2]); + } + else + { + OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1]); + OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2]); + } + } + /* SD key on/off */ + if(rkey&0x08) + { + if(v&0x08) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT2]); + else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2]); + }/* TAM key on/off */ + if(rkey&0x04) + { + if(v&0x04) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT1]); + else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1]); + } + /* TOP-CY key on/off */ + if(rkey&0x02) + { + if(v&0x02) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT2]); + else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2]); + } + /* HH key on/off */ + if(rkey&0x01) + { + if(v&0x01) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT1]); + else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1]); + } + } + } + return; + } + /* keyon,block,fnum */ + if( (r&0x0f) > 8) return; + CH = &OPL->P_CH[r&0x0f]; + if(!(r&0x10)) + { /* a0-a8 */ + block_fnum = (CH->block_fnum&0x1f00) | v; + } + else + { /* b0-b8 */ + int keyon = (v>>5)&1; + block_fnum = ((v&0x1f)<<8) | (CH->block_fnum&0xff); + if(CH->keyon != keyon) + { + if( (CH->keyon=keyon) ) + { + CH->op1_out[0] = CH->op1_out[1] = 0; + OPL_KEYON(&CH->SLOT[SLOT1]); + OPL_KEYON(&CH->SLOT[SLOT2]); + } + else + { + OPL_KEYOFF(&CH->SLOT[SLOT1]); + OPL_KEYOFF(&CH->SLOT[SLOT2]); + } + } + } + /* update */ + if(CH->block_fnum != (unsigned int)block_fnum) + { + int blockRv = 7-(block_fnum>>10); + int fnum = block_fnum&0x3ff; + CH->block_fnum = block_fnum; + + CH->ksl_base = KSL_TABLE[block_fnum>>6]; + CH->fc = OPL->FN_TABLE[fnum]>>blockRv; + CH->kcode = CH->block_fnum>>9; + if( (OPL->mode&0x40) && CH->block_fnum&0x100) CH->kcode |=1; + CALC_FCSLOT(CH,&CH->SLOT[SLOT1]); + CALC_FCSLOT(CH,&CH->SLOT[SLOT2]); + } + return; + case 0xc0: + /* FB,C */ + if( (r&0x0f) > 8) return; + CH = &OPL->P_CH[r&0x0f]; + { + int feedback = (v>>1)&7; + CH->FB = feedback ? (8+1) - feedback : 0; + CH->CON = v&1; + set_algorythm(CH); + } + return; + case 0xe0: /* wave type */ + slot = slot_array[r&0x1f]; + if(slot == -1) return; + CH = &OPL->P_CH[slot/2]; + if(OPL->wavesel) + { + /* LOG(LOG_INF,("OPL SLOT %d wave select %d\n",slot,v&3)); */ + CH->SLOT[slot&1].wavetable = &SIN_TABLE[(v&0x03)*SIN_ENT]; + } + return; + } +} + +/* lock/unlock for common table */ +static int OPL_LockTable(void) +{ + num_lock++; + if(num_lock>1) return 0; + /* first time */ + cur_chip = NULL; + /* allocate total level table (128kb space) */ + if( !OPLOpenTable() ) + { + num_lock--; + return -1; + } + return 0; +} + +static void OPL_UnLockTable(void) +{ + if(num_lock) num_lock--; + if(num_lock) return; + /* last time */ + cur_chip = NULL; + OPLCloseTable(); +} + +/* ---------- update chip ----------- */ +void YM3812UpdateOne(FM_OPL *OPL, void *buffer, int length) +{ + int i; + int data; + OPLSAMPLE *buf = (OPLSAMPLE *)buffer; + UINT32 amsCnt = OPL->amsCnt; + UINT32 vibCnt = OPL->vibCnt; + UINT8 rythm = OPL->rythm&0x20; + OPL_CH *CH,*R_CH; + + if( (void *)OPL != cur_chip ){ + cur_chip = (void *)OPL; + /* channel pointers */ + S_CH = OPL->P_CH; + E_CH = &S_CH[9]; + /* rythm slot */ + SLOT7_1 = &S_CH[7].SLOT[SLOT1]; + SLOT7_2 = &S_CH[7].SLOT[SLOT2]; + SLOT8_1 = &S_CH[8].SLOT[SLOT1]; + SLOT8_2 = &S_CH[8].SLOT[SLOT2]; + /* LFO state */ + amsIncr = OPL->amsIncr; + vibIncr = OPL->vibIncr; + ams_table = OPL->ams_table; + vib_table = OPL->vib_table; + } + R_CH = rythm ? &S_CH[6] : E_CH; + for( i=0; i < length ; i++ ) + { + /* channel A channel B channel C */ + /* LFO */ + ams = ams_table[(amsCnt+=amsIncr)>>AMS_SHIFT]; + vib = vib_table[(vibCnt+=vibIncr)>>VIB_SHIFT]; + outd[0] = 0; + /* FM part */ + for(CH=S_CH ; CH < R_CH ; CH++) + OPL_CALC_CH(CH); + /* Rythn part */ + if(rythm) + OPL_CALC_RH(S_CH); + /* limit check */ + data = Limit( outd[0] , OPL_MAXOUT, OPL_MINOUT ); + /* store to sound buffer */ + buf[i] = data >> OPL_OUTSB; + } + + OPL->amsCnt = amsCnt; + OPL->vibCnt = vibCnt; +#ifdef OPL_OUTPUT_LOG + if(opl_dbg_fp) + { + for(opl_dbg_chip=0;opl_dbg_chipmode = 0; /* normal mode */ + /* reset with register write */ + OPLWrite(OPL,0x01,0); /* wavesel disable */ + OPLWrite(OPL,0x02,0); /* Timer1 */ + OPLWrite(OPL,0x03,0); /* Timer2 */ + OPLWrite(OPL,0x04,0); /* IRQ mask clear */ + for(i = 0xff ; i >= 0x20 ; i-- ) OPLWrite(OPL,i,0); + /* reset OPerator paramater */ + for(c=0; cmax_ch; c++) + { + OPL_CH *CH = &OPL->P_CH[c]; + /* OPL->P_CH[c].PAN = OPN_CENTER; */ + for(s = 0 ; s < 2 ; s++ ) + { + /* wave table */ + CH->SLOT[s].wavetable = &SIN_TABLE[0]; + /* CH->SLOT[s].evm = ENV_MOD_RR; */ + CH->SLOT[s].evc = EG_OFF; + CH->SLOT[s].eve = EG_OFF+1; + CH->SLOT[s].evs = 0; + } + } +} + +/* ---------- Create a virtual YM3812 ---------- */ +FM_OPL *OPLCreate(int type, int clock, int rate) +{ + char *ptr; + FM_OPL *OPL; + int state_size; + int max_ch = 9; /* normaly 9 channels */ + + if( OPL_LockTable() ==-1) return NULL; + /* allocate OPL state space */ + state_size = sizeof(FM_OPL); + state_size += sizeof(OPL_CH)*max_ch; + + /* allocate memory block */ + ptr = (char*)malloc(state_size); + if(ptr==NULL) return NULL; + /* clear */ + memset(ptr,0,state_size); + + OPL = (FM_OPL *)ptr; ptr+=sizeof(FM_OPL); + OPL->P_CH = (OPL_CH *)ptr; ptr+=sizeof(OPL_CH)*max_ch; + + /* set channel state pointer */ + OPL->type = type; + OPL->clock = clock; + OPL->rate = rate; + OPL->max_ch = max_ch; + /* init grobal tables */ + OPL_initalize(OPL); + /* reset chip */ + OPLResetChip(OPL); +#ifdef OPL_OUTPUT_LOG + if(!opl_dbg_fp) + { + opl_dbg_fp = fopen("opllog.opl","wb"); + opl_dbg_maxchip = 0; + } + if(opl_dbg_fp) + { + opl_dbg_opl[opl_dbg_maxchip] = OPL; + fprintf(opl_dbg_fp,"%c%c%c%c%c%c",0x00+opl_dbg_maxchip, + type, + clock&0xff, + (clock/0x100)&0xff, + (clock/0x10000)&0xff, + (clock/0x1000000)&0xff); + opl_dbg_maxchip++; + } +#endif + return OPL; +} + +/* ---------- Destroy a virtual YM3812 ---------- */ +void OPLDestroy(FM_OPL *OPL) +{ +#ifdef OPL_OUTPUT_LOG + if(opl_dbg_fp) + { + fclose(opl_dbg_fp); + opl_dbg_fp = NULL; + } +#endif + OPL_UnLockTable(); + free(OPL); +} diff --git a/wolf3d/wolfextractor/adlib/fmopl.h b/wolf3d/wolfextractor/adlib/fmopl.h new file mode 100644 index 0000000..b7682b7 --- /dev/null +++ b/wolf3d/wolfextractor/adlib/fmopl.h @@ -0,0 +1,134 @@ +/* tab setting : 4 + * + * FM OPL2 synth + * + * Copyright (C) 1999,2000 Tatsuyuki Satoh , MultiArcadeMachineEmulator development + * Modified for Wolfenstein 3D by Steven Fuller + * Future Modifications by DarkOne for WolfGL! (wolfgl.narod.ru) + */ +#ifndef __FMOPL_H_ +#define __FMOPL_H_ + +// Register addresses +// Operator stuff +#define alChar 0x20 +#define alScale 0x40 +#define alAttack 0x60 +#define alSus 0x80 +#define alWave 0xe0 +// Channel stuff +#define alFreqL 0xa0 +#define alFreqH 0xb0 +#define alFeedCon 0xc0 +// Global stuff +#define alEffects 0xbd + +#define OPL_OUTPUT_BIT 16 + +typedef unsigned char UINT8; /* unsigned 8bit */ +typedef unsigned short UINT16; /* unsigned 16bit */ +typedef unsigned long UINT32; /* unsigned 32bit */ +typedef signed char INT8; /* signed 8bit */ +typedef signed short INT16; /* signed 16bit */ +typedef signed long INT32; /* signed 32bit */ + +#if (OPL_OUTPUT_BIT==16) +typedef INT16 OPLSAMPLE; +#endif +#if (OPL_OUTPUT_BIT==8) +typedef unsigned char OPLSAMPLE; +#endif + +/* ---------- OPL one of slot ---------- */ +typedef struct fm_opl_slot +{ + INT32 TL; /* total level :TL << 8 */ + INT32 TLL; /* adjusted now TL */ + UINT8 KSR; /* key scale rate :(shift down bit) */ + INT32 *AR; /* attack rate :&AR_TABLE[AR<<2] */ + INT32 *DR; /* decay rate :&DR_TALBE[DR<<2] */ + INT32 SL; /* sustin level :SL_TALBE[SL] */ + INT32 *RR; /* release rate :&DR_TABLE[RR<<2] */ + UINT8 ksl; /* keyscale level :(shift down bits) */ + UINT8 ksr; /* key scale rate :kcode>>KSR */ + UINT32 mul; /* multiple :ML_TABLE[ML] */ + UINT32 Cnt; /* frequency count : */ + UINT32 Incr; /* frequency step : */ + /* envelope generator state */ + UINT8 eg_typ; /* envelope type flag */ + UINT8 evm; /* envelope phase */ + INT32 evc; /* envelope counter */ + INT32 eve; /* envelope counter end point */ + INT32 evs; /* envelope counter step */ + INT32 evsa; /* envelope step for AR :AR[ksr] */ + INT32 evsd; /* envelope step for DR :DR[ksr] */ + INT32 evsr; /* envelope step for RR :RR[ksr] */ + /* LFO */ + UINT8 ams; /* ams flag */ + UINT8 vib; /* vibrate flag */ + /* wave selector */ + INT32 **wavetable; +} OPL_SLOT; + +/* ---------- OPL one of channel ---------- */ +typedef struct fm_opl_channel +{ + OPL_SLOT SLOT[2]; + UINT8 CON; /* connection type */ + UINT8 FB; /* feed back :(shift down bit) */ + INT32 *connect1; /* slot1 output pointer */ + INT32 *connect2; /* slot2 output pointer */ + INT32 op1_out[2]; /* slot1 output for selfeedback */ + /* phase generator state */ + UINT32 block_fnum; /* block+fnum : */ + UINT8 kcode; /* key code : KeyScaleCode */ + UINT32 fc; /* Freq. Increment base */ + UINT32 ksl_base; /* KeyScaleLevel Base step */ + UINT8 keyon; /* key on/off flag */ +} OPL_CH; + +/* OPL state */ +typedef struct fm_opl_f { + UINT8 type; /* chip type */ + int clock; /* master clock (Hz) */ + int rate; /* sampling rate (Hz) */ + double freqbase; /* frequency base */ + UINT8 address; /* address register */ + UINT32 mode; /* Reg.08 : CSM , notesel,etc. */ + /* FM channel slots */ + OPL_CH *P_CH; /* pointer of CH */ + int max_ch; /* maximum channel */ + /* Rythm sention */ + UINT8 rythm; /* Rythm mode , key flag */ + + INT32 AR_TABLE[75]; /* attack rate tables */ + INT32 DR_TABLE[75]; /* decay rate tables */ + UINT32 FN_TABLE[1024]; /* fnumber -> increment counter */ + /* LFO */ + INT32 *ams_table; + INT32 *vib_table; + INT32 amsCnt; + INT32 amsIncr; + INT32 vibCnt; + INT32 vibIncr; + /* wave selector enable flag */ + UINT8 wavesel; +} FM_OPL; + +/* ---------- Generic interface section ---------- */ +#define OPL_TYPE_YM3812 0 + +FM_OPL *OPLCreate(int type, int clock, int rate); +void OPLDestroy(FM_OPL *OPL); + +void OPLResetChip(FM_OPL *OPL); +void OPLWrite(FM_OPL *OPL,int a,int v); +unsigned char OPLRead(FM_OPL *OPL,int a); + +void YM3812UpdateOne(FM_OPL *OPL, void *buffer, int length); + +#endif /* __FMPOL_H */ +/* end of file */ + + + diff --git a/wolf3d/wolfextractor/filesys/file.c b/wolf3d/wolfextractor/filesys/file.c new file mode 100644 index 0000000..319d127 --- /dev/null +++ b/wolf3d/wolfextractor/filesys/file.c @@ -0,0 +1,383 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 1997-2001 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * file.c: Portable file system services. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Quake II, and was originally + * written by Id Software, Inc. + * + */ + +#include +#include + +#include "file.h" +#include "../../../common/common_utils.h" +#include "../string/com_string.h" +#include "../memory/memory.h" + + + +/* +----------------------------------------------------------------------------- + Function: DOSTIME -Convert the date y/n/d and time h:m:s to a four byte + DOS date and time (date in high two bytes, time in low + two bytes). + + Parameters: + y -[in] year + c -[in] month + d -[in] day + h -[in] hour + m -[in] minute + s -[in] second + + Returns: dos time + + Notes: +----------------------------------------------------------------------------- +*/ +// dos time start date is January 1, 1980 +#define DOSTIME_STARTDATE 0x00210000L + +#define DOSTIME( y, c, d, h, m, s ) ( ((y) < 1980) ? DOSTIME_STARTDATE : (((W32)(y) - 1980) << 25) | ((W32)(c) << 21) | ((W32)(d) << 16) | ((W32)(h) << 11) | ((W32)(m) << 5) | ((W32)(s) >> 1) ) + + +/* +----------------------------------------------------------------------------- + Function: UnixTimeToDosTime -Converts Unix time_t into DOS format. + + Parameters: + t -[in] unix time to convert. + + Returns: + Unix time_t in DOS format, rounded up to the next two second + boundary. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W32 UnixTimeToDosTime( time_t *t ) +{ + time_t t_even; + struct tm *s; + + // Round up to even seconds. + t_even = (time_t)(((W32)(*t) + 1) & (~1)); + + s = localtime( &t_even ); + if( s == (struct tm *)NULL ) + { + // time conversion error; use current time instead + t_even = (time_t)(((W32)time(NULL) + 1) & (~1)); + s = localtime( &t_even ); + } + + return DOSTIME( s->tm_year + 1900, s->tm_mon + 1, s->tm_mday, + s->tm_hour, s->tm_min, s->tm_sec ); +} + + + + +///////////////////////////////////////////////////////////////////// +// +// File path/name manipulation +// +///////////////////////////////////////////////////////////////////// + + +PUBLIC char *FS_SkipPath( char *pathname ) +{ + char *last; + + last = pathname; + while( *pathname ) + { + if( *pathname == '/' ) + { + last = pathname + 1; + } + pathname++; + } + + return last; +} + + +PUBLIC void FS_StripExtension( char *in, char *out ) +{ + while (*in && *in != '.') + *out++ = *in++; + *out = 0; +} + + +PUBLIC char *FS_FileExtension( char *in ) +{ + static char exten[ 8 ]; + int i; + + while (*in && *in != '.') + in++; + + if (!*in) + return ""; + + in++; + for (i=0 ; i<7 && *in ; i++,in++) + exten[i] = *in; + + exten[i] = 0; + return exten; +} + + +PUBLIC void FS_FileBase( char *in, char *out ) +{ + char *s, *s2; + + s = in + strlen( in ) - 1; + + while( s != in && *s != '.' ) + { + s--; + } + + for( s2 = s ; s2 != in && *s2 != '/' ; s2-- ) + { + ; + } + + if( s - s2 < 2 ) + { + out[ 0 ] = 0; + } + else + { + s--; + strncpy( out, s2 + 1, s - s2 ); + out[ s - s2 ] = 0; + } +} + + +PUBLIC void FS_FilePath( char *in, char *out ) +{ + char *s; + + s = in + strlen(in) - 1; + + while (s != in && *s != '/') + s--; + + strncpy (out,in, s-in); + out[s-in] = '\0'; +} + + + + + + +///////////////////////////////////////////////////////////////////// +// +// File I/O functions +// +///////////////////////////////////////////////////////////////////// + + +/* +----------------------------------------------------------------------------- + Function: FS_FileLength() -Calculate file position. + + Parameters: filestream -[in] Pointer to valid FILE structure. + + Returns: The position as an offset relative to the beginning of + the stream. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC SW32 FS_FileLength( FILE *filestream ) +{ + SW32 pos; + SW32 end; + + pos = ftell( filestream ); + fseek( filestream, 0, SEEK_END ); + + end = ftell( filestream ); + fseek( filestream, pos, SEEK_SET ); + + return end; +} + +/* +----------------------------------------------------------------------------- + Function: + + Parameters: + + Returns: + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void FS_Read( void *buffer, int len, FILE *f ) +{ + int block, remaining; + int read; + W8 *buf; + int tries; + + buf = (PW8)buffer; + + // read in chunks for progress bar + remaining = len; + tries = 0; + + + #define MAX_READ 0x10000 // read in blocks of 64k + + while( remaining ) + { + block = remaining; + if( block > MAX_READ ) + { + block = MAX_READ; + } + read = fread( buf, 1, block, f ); + if( read == 0 ) + { + // we might have been trying to read from a CD + if( ! tries ) + { + tries = 1; + } + else + { + printf( "FS_Read: 0 bytes read" ); + } + } + + if( read == -1 ) + { + printf( "FS_Read: -1 bytes read" ); + } + + remaining -= read; + buf += read; + } +} + +/* +----------------------------------------------------------------------------- + Function: + + Parameters: + + Returns: + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC SW32 FS_FOpenFile( const char *filename, FILE **file ) +{ + *file = fopen( filename, "rb" ); + if( ! *file ) + { + *file = NULL; + + return -1; + } + + return FS_FileLength( *file ); + +} + +/* +----------------------------------------------------------------------------- + Function: + + Parameters: + + Returns: + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC SW32 FS_LoadFile( const char *path, void **buffer ) +{ + FILE *fhandle; + W8 *buf; + long length; + + buf = NULL; // quiet compiler warning + +// look for it in the filesystem or pack files + length = FS_FOpenFile( path, &fhandle ); + if( ! fhandle ) + { + if( buffer ) + { + *buffer = NULL; + } + + return -1; + } + + if( ! buffer ) + { + fclose( fhandle ); + return length; + } + + buf = MM_MALLOC( length ); + *buffer = buf; + + FS_Read( buf, length, fhandle ); + + fclose( fhandle ); + + return length; +} + +/* +----------------------------------------------------------------------------- + Function: + + Parameters: + + Returns: + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void FS_FreeFile( void *buffer ) +{ + MM_FREE( buffer ); +} diff --git a/wolf3d/wolfextractor/filesys/file.h b/wolf3d/wolfextractor/filesys/file.h new file mode 100644 index 0000000..1bb6e14 --- /dev/null +++ b/wolf3d/wolfextractor/filesys/file.h @@ -0,0 +1,118 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 1997-2001 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * file.h: Access methods to file system services. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Quake II, and was originally + * written by Id Software, Inc. + * + */ + +/* + Notes: + This module is implemented by file.c + + Non-portable methods are implemented in: + win32/win_file.c for Windows + unix/unix_file.c for unix + +*/ + +#ifndef __FILE_H__ +#define __FILE_H__ + +#include +#include + +#include "../../../common/arch.h" + + +// filename/path manipulation +extern char *FS_SkipPath( char *pathname ); +extern void FS_StripExtension( char *in, char *out ); +extern char *FS_FileExtension( char *in ); +extern void FS_FileBase( char *in, char *out ); +extern void FS_FilePath( char *in, char *out ); + + + +extern W32 UnixTimeToDosTime( time_t *t ); + + +///////////////////////////////////////////////////////////////////// +// +// PORTABLE FILE SYSTEM SERVICES +// +///////////////////////////////////////////////////////////////////// +extern SW32 FS_FileLength( FILE *filestream ); +extern void FS_Read( void *buffer, int len, FILE *f ); +extern SW32 FS_FOpenFile( const char *filename, FILE **file ); +extern SW32 FS_LoadFile( const char *path, void **buffer ); +extern void FS_FreeFile( void *buffer ); + + + + + + + +///////////////////////////////////////////////////////////////////// +// +// NON-PORTABLE FILE SYSTEM SERVICES +// +///////////////////////////////////////////////////////////////////// +extern W8 FS_Mkdir( const char *dirname ); +extern W8 FS_ChangeCurrentDirectory( const char *path ); + +extern _boolean FS_DeleteFile( const char *filename ); +extern _boolean FS_RemoveDirectory( const char *pathname ); + + +// directory/file attributes +#define FA_ARCH 0x01 +#define FA_HIDDEN 0x02 +#define FA_RDONLY 0x04 +#define FA_DIR 0x08 +#define FA_SYSTEM 0x10 + +// pass in an attribute mask of things you wish to REJECT +extern char *FS_FindFirst( const char *path, W32 musthave, W32 canthave ); +extern char *FS_FindNext( W32 musthave, W32 canthave ); +extern void FS_FindClose( void ); + + +struct filestats +{ + W32 attributes; /* The following attributes are defined as FA_ARCH to FA_SYSTEM*/ + W32 creationtime; /* Time when file data last modified */ + W32 lastaccesstime; /* Time when file data last accessed */ + W32 lastwritetime; /* Time when file data last modified */ +}; + +extern _boolean FS_GetFileAttributes( const char *filename, struct filestats *fs ); + + +#endif /* __FILE_H__ */ diff --git a/wolf3d/wolfextractor/filesys/unix/glob.c b/wolf3d/wolfextractor/filesys/unix/glob.c new file mode 100644 index 0000000..068e300 --- /dev/null +++ b/wolf3d/wolfextractor/filesys/unix/glob.c @@ -0,0 +1,183 @@ +/* +Copyright (C) 1997-2001 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include +#include "glob.h" + +/* Like glob_match, but match PATTERN against any final segment of TEXT. */ +static int glob_match_after_star(char *pattern, char *text) +{ + register char *p = pattern, *t = text; + register char c, c1; + + while ((c = *p++) == '?' || c == '*') + if (c == '?' && *t++ == '\0') + return 0; + + if (c == '\0') + return 1; + + if (c == '\\') + c1 = *p; + else + c1 = c; + + while (1) { + if ((c == '[' || *t == c1) && glob_match(p - 1, t)) + return 1; + if (*t++ == '\0') + return 0; + } +} + +/* Return nonzero if PATTERN has any special globbing chars in it. */ +static int glob_pattern_p(char *pattern) +{ + register char *p = pattern; + register char c; + int open = 0; + + while ((c = *p++) != '\0') + switch (c) { + case '?': + case '*': + return 1; + + case '[': /* Only accept an open brace if there is a close */ + open++; /* brace to match it. Bracket expressions must be */ + continue; /* complete, according to Posix.2 */ + case ']': + if (open) + return 1; + continue; + + case '\\': + if (*p++ == '\0') + return 0; + } + + return 0; +} + +/* Match the pattern PATTERN against the string TEXT; + return 1 if it matches, 0 otherwise. + + A match means the entire string TEXT is used up in matching. + + In the pattern string, `*' matches any sequence of characters, + `?' matches any character, [SET] matches any character in the specified set, + [!SET] matches any character not in the specified set. + + A set is composed of characters or ranges; a range looks like + character hyphen character (as in 0-9 or A-Z). + [0-9a-zA-Z_] is the set of characters allowed in C identifiers. + Any other character in the pattern must be matched exactly. + + To suppress the special syntactic significance of any of `[]*?!-\', + and match the character exactly, precede it with a `\'. +*/ + +int glob_match(char *pattern, char *text) +{ + register char *p = pattern, *t = text; + register char c; + + while ((c = *p++) != '\0') + switch (c) { + case '?': + if (*t == '\0') + return 0; + else + ++t; + break; + + case '\\': + if (*p++ != *t++) + return 0; + break; + + case '*': + return glob_match_after_star(p, t); + + case '[': + { + register char c1 = *t++; + int invert; + + if (!c1) + return (0); + + invert = ((*p == '!') || (*p == '^')); + if (invert) + p++; + + c = *p++; + while (1) { + register char cstart = c, cend = c; + + if (c == '\\') { + cstart = *p++; + cend = cstart; + } + if (c == '\0') + return 0; + + c = *p++; + if (c == '-' && *p != ']') { + cend = *p++; + if (cend == '\\') + cend = *p++; + if (cend == '\0') + return 0; + c = *p++; + } + if (c1 >= cstart && c1 <= cend) + goto match; + if (c == ']') + break; + } + if (!invert) + return 0; + break; + + match: + /* Skip the rest of the [...] construct that already matched. */ + while (c != ']') { + if (c == '\0') + return 0; + c = *p++; + if (c == '\0') + return 0; + else if (c == '\\') + ++p; + } + if (invert) + return 0; + break; + } + + default: + if (c != *t++) + return 0; + } + + return *t == '\0'; +} + diff --git a/wolf3d/wolfextractor/filesys/unix/glob.h b/wolf3d/wolfextractor/filesys/unix/glob.h new file mode 100644 index 0000000..f59cb10 --- /dev/null +++ b/wolf3d/wolfextractor/filesys/unix/glob.h @@ -0,0 +1,21 @@ +/* +Copyright (C) 1997-2001 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +int glob_match( char *pattern, char *text ); diff --git a/wolf3d/wolfextractor/filesys/unix/unix_file.c b/wolf3d/wolfextractor/filesys/unix/unix_file.c new file mode 100644 index 0000000..5fdf2cb --- /dev/null +++ b/wolf3d/wolfextractor/filesys/unix/unix_file.c @@ -0,0 +1,337 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 1997-2001 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * unix_file.c: Handles non-portable file services. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * Portion of this code was derived from Quake II, and was originally + * written by Id Software, Inc. + * + */ + +#include +#include +#include +#include +#include +#include +#include + + + +#include "../../../../common/arch.h" +#include "../../../../common/common_utils.h" +#include "../../string/com_string.h" +#include "glob.h" +#include "../file.h" + +PRIVATE char findbase[ 128 ]; +PRIVATE char findpath[ 128 ]; +PRIVATE char findpattern[ 128 ]; +PRIVATE DIR *fdir; + + +/* +----------------------------------------------------------------------------- + Function: FS_Mkdir() -Creates a new directory. + + Parameters: dirname -[in] Pointer to a NUL-terminated string that specifies + the path of the directory to be created. + + Returns: On success nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W8 FS_Mkdir( const char *dirname ) +{ + int ret_val = mkdir( dirname, S_IRUSR | S_IWUSR | S_IXUSR ); + + if( ret_val == -1 && errno == EEXIST ) + { + return 1; + } + + return (W8)(! ret_val); +} + +/* +----------------------------------------------------------------------------- + Function: FS_ChangeCurrentDirectory() -Changes the current directory + + Parameters: path -[in] Pointer to a NUL-terminated string that specifies + the path to the new directory. + + Returns: On success nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W8 FS_ChangeCurrentDirectory( const char *path ) +{ + return ! chdir( path ); +} + +/* +----------------------------------------------------------------------------- + Function: FS_GetFileAttributes() -Retrieves attributes for a specified file + or directory. + + Parameters: filename -[in] Pointer to a NUL-terminated string that + specifies a file or directory. + fs -[in] Pointer to a filestats structure that receives the + attribute information. + + + Returns: On success true, otherwise false. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean FS_GetFileAttributes( const char *filename, struct filestats *fs ) +{ + struct stat st; + + fs->attributes = 0; + + if( stat( filename, &st ) == -1 ) + { + return false; + } + + if( st.st_mode & S_IFDIR ) + { + fs->attributes |= FA_DIR; + } + + fs->creationtime = st.st_ctime; + fs->lastaccesstime = st.st_atime; + fs->lastwritetime = st.st_ctime; + + return true; +} + +/* +----------------------------------------------------------------------------- + Function: CompareAttributes() -Compare directory and file attributes. + + Parameters: path -[in] Specifies the path to compare file attributes. + musthave -[in] File or directory must have these attributes. + canthave- [in] File or directory can not have these attributes. + + Returns: On success true, otherwise false. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE _boolean CompareAttributes( const char *path, W32 musthave, W32 canthave ) +{ + struct stat st; + + if( stat( path, &st ) == -1 ) + { + return false; + } + + if( ( st.st_mode & S_IFDIR ) && ( canthave & FA_DIR ) ) + { + return false; + } + + if( ( musthave & FA_DIR ) && !( st.st_mode & S_IFDIR ) ) + { + return false; + } + + return true; +} + +/* +----------------------------------------------------------------------------- + Function: FS_FindFirstFile() -Searches a directory for a file. + + Parameters: path -[in] Pointer to a NUL-terminated string that specifies + a valid directory or path and file name. + musthave -[in] File or directory must have these attributes. + canthave- [in] File or directory can not have these attributes. + + Returns: On success string of file name or directory, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *FS_FindFirst( const char *path, W32 musthave, W32 canthave ) +{ + struct dirent *d; + char *p; + + if( fdir ) + { + printf( "FS_FindFirst without close\n" ); + + return NULL; + } + + FS_FilePath( path, findbase ); + cs_strlcpy( findpattern, FS_SkipPath( path ), sizeof( findpattern ) ); + + if( ! *findbase ) + { + if( (fdir = opendir( "." )) == NULL ) + { + return NULL; + } + } + else + { + if( (fdir = opendir( findbase )) == NULL ) + { + return NULL; + } + } + + while( (d = readdir( fdir )) != NULL ) + { + if( ! *findpattern || glob_match( findpattern, d->d_name ) ) + { + if( ! *findbase ) + { + cs_strlcpy( findpath, d->d_name, sizeof( findpath ) ); + } + else + { + cs_snprintf( findpath, sizeof( findpath ), "%s/%s", findbase, d->d_name ); + } + + if( CompareAttributes( findpath, musthave, canthave ) ) + { + return findpath; + } + } + } + + return NULL; + +} + +/* +----------------------------------------------------------------------------- + Function: FS_FindNext -Continues a file search from a previous call to + the FS_FindFirst function. + + Parameters: musthave -[in] File or directory must have these attributes. + canthave- [in] File or directory can not have these attributes. + + Returns: On success string of file name or directory, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *FS_FindNext( W32 musthave, W32 canthave ) +{ + struct dirent *d; + + if( fdir == NULL ) + { + return NULL; + } + + while( (d = readdir( fdir ) ) != NULL) + { + if( ! *findpattern || glob_match( findpattern, d->d_name ) ) + { + if( ! *findbase ) + { + cs_strlcpy( findpath, d->d_name, sizeof( findpath ) ); + } + else + { + cs_snprintf( findpath, sizeof( findpath ), "%s/%s", findbase, d->d_name ); + } + + if( CompareAttributes( findpath, musthave, canthave ) ) + { + return findpath; + } + } + } + + return NULL; +} + +/* +----------------------------------------------------------------------------- + Function: FS_FindClose() -Closes the search handle. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void FS_FindClose( void ) +{ + if( fdir ) + { + closedir( fdir ); + } + + fdir = NULL; +} + +/* +----------------------------------------------------------------------------- + Function: FS_DeleteFile() -Deletes an existing file. + + Parameters: filename -[in] Pointer to a NUL-terminated string that + specifies the file to be deleted. + + Returns: If successful the return value is nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean FS_DeleteFile( const char *filename ) +{ + return( ! unlink( filename ) ); +} + +/* +----------------------------------------------------------------------------- + Function: FS_RemoveDirectory() -Deletes an existing empty directory. + + Parameters: pathname -[in] Pointer to a NUL-terminated string that + specifies the directory to be deleted. + + Returns: If successful the return value is nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean FS_RemoveDirectory( const char *pathname ) +{ + return( ! rmdir( pathname ) ); +} diff --git a/wolf3d/wolfextractor/filesys/win32/win_file.c b/wolf3d/wolfextractor/filesys/win32/win_file.c new file mode 100644 index 0000000..abbbe83 --- /dev/null +++ b/wolf3d/wolfextractor/filesys/win32/win_file.c @@ -0,0 +1,398 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * win_file.c: Handles non-portable file services. + * + * Author: Michael Liebscher + * Date: 2004 + * + * + */ + +#include +#include + +#include "../file.h" +#include "../../string/com_string.h" +#include "../../../../common/arch.h" +#include "../../../../common/common_utils.h" + + + +PRIVATE char findbase[ MAX_PATH ]; +PRIVATE char findpath[ MAX_PATH ]; +PRIVATE HANDLE FindHandle; + + +/* +----------------------------------------------------------------------------- + Function: FS_Mkdir() -Creates a new directory. + + Parameters: dirname -[in] Pointer to a NUL-terminated string that specifies + the path of the directory to be created. + + Returns: On success nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W8 FS_Mkdir( const char *dirname ) +{ + BOOL ret_val = CreateDirectory( dirname, NULL ); + + if( ret_val == 0 && GetLastError() == ERROR_ALREADY_EXISTS ) + { + return 1; + } + + return (W8)ret_val; +} + +/* +----------------------------------------------------------------------------- + Function: FS_ChangeCurrentDirectory() -Changes the current directory + + Parameters: path -[in] Pointer to a NUL-terminated string that specifies + the path to the new directory. + + Returns: On success nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W8 FS_ChangeCurrentDirectory( const char *path ) +{ + return SetCurrentDirectory( path ); +} + + + +/* +----------------------------------------------------------------------------- + Function: FS_FileTimeToUnixTime() -Converts file time to UNIX time format. + + Parameters: FILETIME -[in] Pointer to a FILETIME structure containing the + file time to convert to UNIX date and time format. + + Returns: On success nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE W32 FS_FileTimeToUnixTime( FILETIME *ft ) +{ + time_t days; + SYSTEMTIME st; + + static const W16 ydays[] = + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; + + + + if( ! FileTimeToSystemTime( ft, &st ) ) + { + return 0; + } + + + // Protection from overflow + if( (ft->dwHighDateTime < 0x019DB1DEUL) || + ((ft->dwHighDateTime == 0x019DB1DEUL) && + (ft->dwLowDateTime < 0xD53E8000UL)) ) + { + return 0; + } + + if( (ft->dwHighDateTime > 0x0236485EUL) || + ((ft->dwHighDateTime == 0x0236485EUL) && + (ft->dwLowDateTime > 0xD4A5E980UL)) ) + { + return 0; + } + + + #define leap(y) (((y)%4 == 0 && (y)%100 != 0) || (y)%400 == 0) + #define nleap(y) (((y)-1969)/4 - ((y)-1901)/100 + ((y)-1601)/400) + + // set 'days' to the number of days into the year + days = st.wDay - 1 + ydays[ st.wMonth-1 ] + (st.wMonth > 2 && leap( st.wYear )); + + // now set 'days' to the number of days since 1 Jan 1970 + days += 365 * (time_t)(st.wYear - 1970) + (time_t)(nleap(st.wYear)); + + + return (time_t)(86400L * days + 3600L * (time_t)st.wHour + + (time_t)(60 * st.wMinute + st.wSecond)); +} + +/* +----------------------------------------------------------------------------- + Function: FS_GetFileAttributes() -Retrieves attributes for a specified file + or directory. + + Parameters: filename -[in] Pointer to a NUL-terminated string that + specifies a file or directory. + fs -[in] Pointer to a filestats structure that receives the + attribute information. + + + Returns: On success true, otherwise false. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean FS_GetFileAttributes( const char *filename, struct filestats *fs ) +{ + WIN32_FILE_ATTRIBUTE_DATA fdata; + + fs->attributes = 0; + + if( ! GetFileAttributesEx( filename, GetFileExInfoStandard, &fdata ) ) + { + return false; + } + + + if( fdata.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE ) + fs->attributes |= FA_ARCH; + if( fdata.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) + fs->attributes |= FA_HIDDEN; + if( fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY ) + fs->attributes |= FA_RDONLY; + if( fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + fs->attributes |= FA_DIR; + if( fdata.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM ) + fs->attributes |= FA_SYSTEM; + + + // Convert FILETIME to UNIX time. + fs->creationtime = FS_FileTimeToUnixTime( &fdata.ftCreationTime ); + fs->lastaccesstime = FS_FileTimeToUnixTime( &fdata.ftLastAccessTime ); + fs->lastwritetime = FS_FileTimeToUnixTime( &fdata.ftLastWriteTime ); + + return true; +} + +/* +----------------------------------------------------------------------------- + Function: CompareAttributes() -Compare directory and file attributes. + + Parameters: found -[in] Specifies the file attributes of the file found. + musthave -[in] File or directory must have these attributes. + canthave- [in] File or directory can not have these attributes. + + Returns: On success true, otherwise false. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE _boolean CompareAttributes( W32 found, W32 musthave, W32 canthave ) +{ + if( ( found & FILE_ATTRIBUTE_READONLY ) && ( canthave & FA_RDONLY ) ) + return false; + + if( ( found & FILE_ATTRIBUTE_HIDDEN ) && ( canthave & FA_HIDDEN ) ) + return false; + + if( ( found & FILE_ATTRIBUTE_SYSTEM ) && ( canthave & FA_SYSTEM ) ) + return false; + + if( ( found & FILE_ATTRIBUTE_DIRECTORY ) && ( canthave & FA_DIR ) ) + return false; + + if( ( found & FILE_ATTRIBUTE_ARCHIVE ) && ( canthave & FA_ARCH ) ) + return false; + + + + if( ( musthave & FA_RDONLY ) && !( found & FILE_ATTRIBUTE_READONLY ) ) + return false; + + if( ( musthave & FA_HIDDEN ) && !( found & FILE_ATTRIBUTE_HIDDEN ) ) + return false; + + if( ( musthave & FA_SYSTEM ) && !( found & FILE_ATTRIBUTE_SYSTEM ) ) + return false; + + if( ( musthave & FA_DIR ) && !( found & FILE_ATTRIBUTE_DIRECTORY ) ) + return false; + + if( ( musthave & FA_ARCH ) && !( found & FILE_ATTRIBUTE_ARCHIVE ) ) + return false; + + return true; +} + +/* +----------------------------------------------------------------------------- + Function: FS_FindFirstFile() -Searches a directory for a file. + + Parameters: path -[in] Pointer to a NUL-terminated string that specifies + a valid directory or path and file name. + musthave -[in] File or directory must have these attributes. + canthave- [in] File or directory can not have these attributes. + + Returns: On success string of file name or directory, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *FS_FindFirst( const char *path, W32 musthave, W32 canthave ) +{ + WIN32_FIND_DATA FindFileData; + + if( FindHandle ) + { + printf( "FS_FindFirst without close\n" ); + + return NULL; + } + + FS_FilePath( path, findbase ); + + FindHandle = FindFirstFile( path, &FindFileData ); + + if( FindHandle == INVALID_HANDLE_VALUE ) + { + return NULL; + } + + + + if( CompareAttributes( FindFileData.dwFileAttributes, musthave, canthave ) ) + { + if( ! *findbase ) + { + cs_strlcpy( findpath, FindFileData.cFileName, sizeof( findpath ) ); + } + else + { + cs_snprintf( findpath, sizeof( findpath ), "%s/%s", findbase, FindFileData.cFileName ); + } + + return findpath; + } + + + return FS_FindNext( musthave, canthave ); +} + +/* +----------------------------------------------------------------------------- + Function: FS_FindNext -Continues a file search from a previous call to + the FS_FindFirst function. + + Parameters: musthave -[in] File or directory must have these attributes. + canthave- [in] File or directory can not have these attributes. + + Returns: On success string of file name or directory, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *FS_FindNext( W32 musthave, W32 canthave ) +{ + WIN32_FIND_DATA FindFileData; + + if( FindHandle == INVALID_HANDLE_VALUE ) + { + return NULL; + } + + while( 1 ) + { + if( FindNextFile( FindHandle, &FindFileData ) == 0 ) + { + return NULL; + } + + if( CompareAttributes( FindFileData.dwFileAttributes, musthave, canthave ) ) + { + break; + } + } + + if( ! *findbase ) + { + cs_snprintf( findpath, sizeof( findpath ), "%s", FindFileData.cFileName ); + } + else + { + cs_snprintf( findpath, sizeof( findpath ), "%s/%s", findbase, FindFileData.cFileName ); + } + + return findpath; +} + +/* +----------------------------------------------------------------------------- + Function: FS_FindClose() -Closes the search handle. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void FS_FindClose( void ) +{ + if( FindHandle != INVALID_HANDLE_VALUE ) + { + FindClose( FindHandle ); + } + + FindHandle = 0; +} + +/* +----------------------------------------------------------------------------- + Function: FS_DeleteFile() -Deletes an existing file. + + Parameters: filename -[in] Pointer to a NUL-terminated string that + specifies the file to be deleted. + + Returns: If successful the return value is nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean FS_DeleteFile( const char *filename ) +{ + return DeleteFile( filename ); +} + +/* +----------------------------------------------------------------------------- + Function: FS_RemoveDirectory() -Deletes an existing empty directory. + + Parameters: pathname -[in] Pointer to a NUL-terminated string that + specifies the directory to be deleted. + + Returns: If successful the return value is nonzero, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean FS_RemoveDirectory( const char *pathname ) +{ + return RemoveDirectory( pathname ); +} diff --git a/wolf3d/wolfextractor/hq2x.c b/wolf3d/wolfextractor/hq2x.c new file mode 100644 index 0000000..f220eb6 --- /dev/null +++ b/wolf3d/wolfextractor/hq2x.c @@ -0,0 +1,2917 @@ +/* + hq2x filter + ---------------------------------------------------------- + Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + + + +#include +#include + + + +#define INLINE __inline + + +static int LUT16to24[65536]; +static int RGBtoYUV[65536]; +static int YUV1, YUV2; +const int Ymask = 0x00FF0000; +const int Umask = 0x0000FF00; +const int Vmask = 0x000000FF; +const int trY = 0x00300000; +const int trU = 0x00000700; +const int trV = 0x00000006; + +INLINE void Interp1( unsigned char *pc, int c1, int c2 ) +{ + *((int*)pc) = (c1*3+c2) >> 2; +} + +INLINE void Interp2(unsigned char *pc, int c1, int c2, int c3) +{ + *((int*)pc) = (c1*2+c2+c3) >> 2; +} + +INLINE void Interp5(unsigned char *pc, int c1, int c2) +{ + *((int*)pc) = (c1+c2) >> 1; +} + +INLINE void Interp6(unsigned char *pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*5+c2*2+c3)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*2 + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*2 + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +INLINE void Interp7(unsigned char *pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*6+c2+c3)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*6 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*6 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +INLINE void Interp9(unsigned char *pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*2+(c2+c3)*3)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*3 ) & 0x0007F800) + + (((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*3 ) & 0x07F807F8)) >> 3; +} + +INLINE void Interp10(unsigned char *pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*14+c2+c3)/16; + + *((int*)pc) = ((((c1 & 0x00FF00)*14 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x000FF000) + + (((c1 & 0xFF00FF)*14 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x0FF00FF0)) >> 4; +} + + +#define PIXEL00_0 *((int*)(pOut)) = c[5]; +#define PIXEL00_10 Interp1(pOut, c[5], c[1]); +#define PIXEL00_11 Interp1(pOut, c[5], c[4]); +#define PIXEL00_12 Interp1(pOut, c[5], c[2]); +#define PIXEL00_20 Interp2(pOut, c[5], c[4], c[2]); +#define PIXEL00_21 Interp2(pOut, c[5], c[1], c[2]); +#define PIXEL00_22 Interp2(pOut, c[5], c[1], c[4]); +#define PIXEL00_60 Interp6(pOut, c[5], c[2], c[4]); +#define PIXEL00_61 Interp6(pOut, c[5], c[4], c[2]); +#define PIXEL00_70 Interp7(pOut, c[5], c[4], c[2]); +#define PIXEL00_90 Interp9(pOut, c[5], c[4], c[2]); +#define PIXEL00_100 Interp10(pOut, c[5], c[4], c[2]); +#define PIXEL01_0 *((int*)(pOut+4)) = c[5]; +#define PIXEL01_10 Interp1(pOut+4, c[5], c[3]); +#define PIXEL01_11 Interp1(pOut+4, c[5], c[2]); +#define PIXEL01_12 Interp1(pOut+4, c[5], c[6]); +#define PIXEL01_20 Interp2(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_21 Interp2(pOut+4, c[5], c[3], c[6]); +#define PIXEL01_22 Interp2(pOut+4, c[5], c[3], c[2]); +#define PIXEL01_60 Interp6(pOut+4, c[5], c[6], c[2]); +#define PIXEL01_61 Interp6(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_70 Interp7(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_90 Interp9(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_100 Interp10(pOut+4, c[5], c[2], c[6]); +#define PIXEL10_0 *((int*)(pOut+BpL)) = c[5]; +#define PIXEL10_10 Interp1(pOut+BpL, c[5], c[7]); +#define PIXEL10_11 Interp1(pOut+BpL, c[5], c[8]); +#define PIXEL10_12 Interp1(pOut+BpL, c[5], c[4]); +#define PIXEL10_20 Interp2(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_21 Interp2(pOut+BpL, c[5], c[7], c[4]); +#define PIXEL10_22 Interp2(pOut+BpL, c[5], c[7], c[8]); +#define PIXEL10_60 Interp6(pOut+BpL, c[5], c[4], c[8]); +#define PIXEL10_61 Interp6(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_70 Interp7(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_90 Interp9(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_100 Interp10(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL11_0 *((int*)(pOut+BpL+4)) = c[5]; +#define PIXEL11_10 Interp1(pOut+BpL+4, c[5], c[9]); +#define PIXEL11_11 Interp1(pOut+BpL+4, c[5], c[6]); +#define PIXEL11_12 Interp1(pOut+BpL+4, c[5], c[8]); +#define PIXEL11_20 Interp2(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_21 Interp2(pOut+BpL+4, c[5], c[9], c[8]); +#define PIXEL11_22 Interp2(pOut+BpL+4, c[5], c[9], c[6]); +#define PIXEL11_60 Interp6(pOut+BpL+4, c[5], c[8], c[6]); +#define PIXEL11_61 Interp6(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_70 Interp7(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_90 Interp9(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_100 Interp10(pOut+BpL+4, c[5], c[6], c[8]); + + + +int Diff( unsigned int w1, unsigned int w2 ) +{ + YUV1 = RGBtoYUV[w1]; + YUV2 = RGBtoYUV[w2]; + return ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ); +} + +void hq2x_32( unsigned char *pIn, unsigned char *pOut, int Xres, int Yres, int BpL ) +{ + int i, j, k; + int prevline, nextline; + int w[10]; + int c[10]; + int pattern; + int flag; + + // +----+----+----+ + // | | | | + // | w1 | w2 | w3 | + // +----+----+----+ + // | | | | + // | w4 | w5 | w6 | + // +----+----+----+ + // | | | | + // | w7 | w8 | w9 | + // +----+----+----+ + + for( j = 0; j < Yres; ++j ) + { + if( j > 0 ) + prevline = -Xres*2; + else + prevline = 0; + + if( j < Yres-1 ) + nextline = Xres*2; + else + nextline = 0; + + for( i = 0; i < Xres; ++i ) + { + w[2] = *((unsigned short*)(pIn + prevline)); + w[5] = *((unsigned short*)pIn); + w[8] = *((unsigned short*)(pIn + nextline)); + + if( i > 0 ) + { + w[1] = *((unsigned short*)(pIn + prevline - 2)); + w[4] = *((unsigned short*)(pIn - 2)); + w[7] = *((unsigned short*)(pIn + nextline - 2)); + } + else + { + w[1] = w[2]; + w[4] = w[5]; + w[7] = w[8]; + } + + if( i < Xres-1 ) + { + w[3] = *((unsigned short*)(pIn + prevline + 2)); + w[6] = *((unsigned short*)(pIn + 2)); + w[9] = *((unsigned short*)(pIn + nextline + 2)); + } + else + { + w[3] = w[2]; + w[6] = w[5]; + w[9] = w[8]; + } + + pattern = 0; + flag = 1; + + YUV1 = RGBtoYUV[ w[ 5 ] ]; + + for( k = 1; k <= 9; ++k ) + { + if( k == 5 ) + continue; + + if ( w[ k ] != w[ 5 ] ) + { + YUV2 = RGBtoYUV[ w[ k ] ]; + if( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ) + pattern |= flag; + } + flag <<= 1; + } + + for( k = 1; k <= 9; ++k ) + { + c[ k ] = LUT16to24[ w[ k ] ]; + } + + switch( pattern ) + { + case 0: + case 1: + case 4: + case 32: + case 128: + case 5: + case 132: + case 160: + case 33: + case 129: + case 36: + case 133: + case 164: + case 161: + case 37: + case 165: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_20 + PIXEL11_20 + break; + } + case 2: + case 34: + case 130: + case 162: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + } + case 16: + case 17: + case 48: + case 49: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_21 + break; + } + case 64: + case 65: + case 68: + case 69: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_22 + break; + } + case 8: + case 12: + case 136: + case 140: + { + PIXEL00_21 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + } + case 3: + case 35: + case 131: + case 163: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + } + case 6: + case 38: + case 134: + case 166: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 20: + case 21: + case 52: + case 53: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_21 + break; + } + case 144: + case 145: + case 176: + case 177: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_12 + break; + } + case 192: + case 193: + case 196: + case 197: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_11 + break; + } + case 96: + case 97: + case 100: + case 101: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_22 + break; + } + case 40: + case 44: + case 168: + case 172: + { + PIXEL00_21 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 9: + case 13: + case 137: + case 141: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + } + case 18: + case 50: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 80: + case 81: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_20 + } + break; + } + case 72: + case 76: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 10: + case 138: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + } + case 66: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + } + case 24: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + } + case 7: + case 39: + case 135: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 148: + case 149: + case 180: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_12 + break; + } + case 224: + case 228: + case 225: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_11 + break; + } + case 41: + case 169: + case 45: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 22: + case 54: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 208: + case 209: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 104: + case 108: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 11: + case 139: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + } + case 19: + case 51: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_10 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 146: + case 178: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + } + case 84: + case 85: + { + PIXEL00_20 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_10 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + } + case 112: + case 113: + { + PIXEL00_20 + PIXEL01_22 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_10 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 200: + case 204: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 73: + case 77: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_10 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + } + case 42: + case 170: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + } + case 14: + case 142: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + } + case 67: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + } + case 70: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + } + case 28: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + } + case 152: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + } + case 194: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + } + case 98: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + } + case 56: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + } + case 25: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + } + case 26: + case 31: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + } + case 82: + case 214: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 88: + case 248: + { + PIXEL00_21 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 74: + case 107: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 27: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_21 + break; + } + case 86: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + PIXEL11_10 + break; + } + case 216: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 106: + { + PIXEL00_10 + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 30: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + } + case 210: + { + PIXEL00_22 + PIXEL01_10 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 120: + { + PIXEL00_21 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 75: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_22 + break; + } + case 29: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + } + case 198: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + } + case 184: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + } + case 99: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + } + case 57: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + } + case 71: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + } + case 156: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + } + case 226: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + } + case 60: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + } + case 195: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + } + case 102: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + } + case 153: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + } + case 58: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 83: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 92: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 202: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 78: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_22 + break; + } + case 154: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 114: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 89: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 90: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 55: + case 23: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_0 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 182: + case 150: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + } + case 213: + case 212: + { + PIXEL00_20 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_0 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + } + case 241: + case 240: + { + PIXEL00_20 + PIXEL01_22 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_0 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 236: + case 232: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 109: + case 105: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_0 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + } + case 171: + case 43: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + } + case 143: + case 15: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + } + case 124: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 203: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_11 + break; + } + case 62: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 211: + { + PIXEL00_11 + PIXEL01_10 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 118: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_12 + PIXEL11_10 + break; + } + case 217: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 110: + { + PIXEL00_10 + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 155: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_12 + break; + } + case 188: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + } + case 185: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + } + case 61: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + } + case 157: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + } + case 103: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + } + case 227: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + } + case 230: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + } + case 199: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + } + case 220: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 158: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 234: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_11 + break; + } + case 242: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 59: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 121: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 87: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 79: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_22 + break; + } + case 122: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 94: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 218: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 91: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 229: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_11 + break; + } + case 167: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 173: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 181: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_12 + break; + } + case 186: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_12 + break; + } + case 115: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 93: + { + PIXEL00_12 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 206: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 205: + case 201: + { + PIXEL00_12 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 174: + case 46: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + } + case 179: + case 147: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_20 + PIXEL11_12 + break; + } + case 117: + case 116: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 189: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + } + case 231: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + } + case 126: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 219: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 125: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_0 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_11 + PIXEL11_10 + break; + } + case 221: + { + PIXEL00_12 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_0 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_10 + break; + } + case 207: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_10 + PIXEL11_11 + break; + } + case 238: + { + PIXEL00_10 + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 190: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_11 + break; + } + case 187: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_10 + PIXEL11_12 + break; + } + case 243: + { + PIXEL00_11 + PIXEL01_10 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_0 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 119: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_0 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_12 + PIXEL11_10 + break; + } + case 237: + case 233: + { + PIXEL00_12 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 175: + case 47: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + } + case 183: + case 151: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_20 + PIXEL11_12 + break; + } + case 245: + case 244: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 250: + { + PIXEL00_10 + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 123: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 95: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_10 + PIXEL11_10 + break; + } + case 222: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 252: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 249: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 235: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 111: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 63: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 159: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 215: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 246: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 254: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 253: + { + PIXEL00_12 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 251: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 239: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 127: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 191: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_11 + PIXEL11_12 + break; + } + case 223: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 247: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 255: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + } + pIn += 2; + pOut += 8; + } + pOut += BpL; + } +} + +void InitLUTs( void ) +{ + int i, j, k, r, g, b, Y, U, V; + + for( i = 0; i < 65536; ++i ) + { + + LUT16to24[i] = ((i & 0xF800) << 8) | + ((i & 0x07E0) << 5) | + ((i & 0x001F) << 3); + } + + for( i = 0; i < 32; ++i ) + for( j = 0; j < 64; ++j ) + for( k = 0; k < 32; ++k ) + { + r = i << 3; + g = j << 2; + b = k << 3; + + Y = (r + g + b) >> 2; + U = 128 + ((r - b) >> 2); + V = 128 + ((-r + 2*g -b)>>3); + + RGBtoYUV[ (i << 11) | (j << 5) | k ] = (Y<<16) | (U<<8) | V; + } +} + + diff --git a/wolf3d/wolfextractor/hq2x.h b/wolf3d/wolfextractor/hq2x.h new file mode 100644 index 0000000..3b0cd7c --- /dev/null +++ b/wolf3d/wolfextractor/hq2x.h @@ -0,0 +1,32 @@ +/* + hq2x filter + ---------------------------------------------------------- + Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef __HQ2X_H__ +#define __HQ2X_H__ + +extern void InitLUTs( void ); + +extern void hq2x_32( unsigned char *pIn, unsigned char *pOut, + int Xres, int Yres, int BpL ); + + +#endif /* __HQ2X_H__ */ + diff --git a/wolf3d/wolfextractor/loaders/tga.c b/wolf3d/wolfextractor/loaders/tga.c new file mode 100644 index 0000000..7227c60 --- /dev/null +++ b/wolf3d/wolfextractor/loaders/tga.c @@ -0,0 +1,531 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 1997-2001 Id Software, Inc. + Copyright (C) 1995 Spencer Kimball and Peter Mattis + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * tga.c: Handle Targa file format. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * Portion of this code was derived from Quake II, and was + * originally written by id Software, Inc. + * + * Portion of this code was derived from The GIMP -- an image manipulation + * program, and was originally written by Spencer Kimball and Peter Mattis. + */ + +#include +#include + +#include "../../../common/arch.h" +#include "../memory/memory.h" +#include "../../../common/common_utils.h" + + +/* +----------------------------------------------------------------------------- + Function: rle_write -Run length encode scanline. + + Parameters: fp -[in] Pointer to valid FILE structure. + buffer -[in] Scanline data. + width -[in] Image scanline width. + bytes -[in] Bytes per pixel. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void rle_write( FILE *fp, + W8 *buffer, + W32 width, + W32 bytes ) +{ + SW32 repeat = 0; + SW32 direct = 0; + W8 *from = buffer; + W32 x; + + for( x = 1 ; x < width ; ++x ) + { + if( memcmp( buffer, buffer + bytes, bytes ) ) + { + /* next pixel is different */ + if( repeat ) + { + putc( 128 + repeat, fp ); + fwrite( from, bytes, 1, fp ); + from = buffer + bytes; /* point to first different pixel */ + repeat = 0; + direct = 0; + } + else + { + direct += 1; + } + } + else + { + /* next pixel is the same */ + if( direct ) + { + putc( direct - 1, fp ); + fwrite( from, bytes, direct, fp ); + from = buffer; /* point to first identical pixel */ + direct = 0; + repeat = 1; + } + else + { + repeat += 1; + } + } + + if( repeat == 128 ) + { + putc( 255, fp ); + fwrite( from, bytes, 1, fp ); + from = buffer + bytes; + direct = 0; + repeat = 0; + } + else if( direct == 128 ) + { + putc( 127, fp ); + fwrite( from, bytes, direct, fp ); + from = buffer + bytes; + direct = 0; + repeat = 0; + } + + buffer += bytes; + } + + if( repeat > 0 ) + { + putc( 128 + repeat, fp ); + fwrite( from, bytes, 1, fp ); + } + else + { + putc( direct, fp ); + fwrite( from, bytes, direct + 1, fp ); + } +} + + +/* +----------------------------------------------------------------------------- + Function: WriteTGA -Write targa image file. + + Parameters: filename -[in] Name of TGA file to save as. + depth -[in] Bytes per pixel. (16, 24 or 32). + width -[in] Width of image. + height -[in] Height of image. + Data -[in] Raw image data. + upsideDown -[in] Is the data upside down? 1 yes, 0 no. + rle -[in] Run Length encode? 1 yes, 0 no. + + Returns: 0 on error, otherwise 1. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W8 WriteTGA( const char *filename, W16 bpp, W16 width, W16 height, + void *Data, W8 upsideDown, W8 rle ) +{ + W16 i, x, y, BytesPerPixel; + W8 *scanline; + W8 header[ 18 ]; + FILE *filestream; + W8 *ptr = (PW8) Data; + W8 temp; + + BytesPerPixel = bpp >> 3; + + filestream = fopen( filename, "wb" ); + if( filestream == NULL ) + { + printf( "Could not open file (%s) for write!\n", filename ); + return 0; + } + + memset( header, 0, 18 ); + header[2] = rle ? 10 : 2; + + header[12] = width & 255; // width low + header[13] = width >> 8; // width high + + header[14] = height & 255; // height low + header[15] = height >> 8; // height high + + header[16] = bpp & 255; // pixel size + + if( upsideDown ) + { + header[17] |= 1 << 5; // Image Descriptor + } + + + fwrite( header, sizeof( W8 ), sizeof( header ), filestream ); + + + + scanline = (PW8) MM_MALLOC( width * BytesPerPixel ); + if( scanline == NULL ) + { + fclose( filestream ); + return 0; + } + + for( y = 0; y < height; ++y ) + { + W32 k = 0; + + for( i = 0; i < (width * BytesPerPixel); ++i ) + { + scanline[ k++ ] = ptr[ (height - y - 1) * width * BytesPerPixel + i ]; + } + + + + if( bpp == 24 || bpp == 32 ) + { + // swap rgb to bgr + for( x = 0 ; x < (width * BytesPerPixel) ; x += BytesPerPixel ) + { + temp = scanline[ x ]; + scanline[ x ] = scanline[ x + 2 ]; + scanline[ x + 2 ] = temp; + } + } + + + if( rle ) + { + rle_write( filestream, scanline, width, BytesPerPixel ); + } + else + { + fwrite( scanline, sizeof( W8 ), width * BytesPerPixel, filestream ); + } + } + + MM_FREE( scanline ); + + fclose( filestream ); + + return 1; +} + +//======================================================================= + +typedef struct TargaHeader_s { + unsigned char id_length; + unsigned char colormap_type; + unsigned char image_type; + unsigned short colormap_index; + unsigned short colormap_length; + unsigned char colormap_size; + unsigned short x_origin; + unsigned short y_origin; + unsigned short width, height; + unsigned char pixel_size; + unsigned char attributes; +} TargaHeaeder_t; + +static const int TGA_HEADER_SIZE = 18; + +/* +======================== +LoadTGAFromBuffer + +Load a TGA from a buffer containing a TGA file. +======================== +*/ +int LoadTGAFromBuffer( const char *name, const W8 *buffer, const int bufferSize, + W8 **pic, int *width, int *height ) { + int columns, rows, numPixels; + size_t numBytes; + W8 *pixbuf; + int row, column; + const W8 *buf_p; + struct TargaHeader_s targa_header; + W8 *targa_rgba; + + *pic = NULL; + + buf_p = buffer; + + targa_header.id_length = *buf_p++; + targa_header.colormap_type = *buf_p++; + targa_header.image_type = *buf_p++; + + targa_header.colormap_index = *(short *)buf_p; + buf_p += 2; + targa_header.colormap_length = *(short *)buf_p; + buf_p += 2; + targa_header.colormap_size = *buf_p++; + targa_header.x_origin = *(short *)buf_p; + buf_p += 2; + targa_header.y_origin = *(short *)buf_p; + buf_p += 2; + targa_header.width = *(short *)buf_p; + buf_p += 2; + targa_header.height = *(short *)buf_p; + buf_p += 2; + targa_header.pixel_size = *buf_p++; + targa_header.attributes = *buf_p++; + + if ( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 ) { + printf( "LoadTGA( %s ): Only type 2 (RGB), 3 (gray), and 10 (RGB) TGA images supported", name ); + return false; + } + + if ( targa_header.colormap_type != 0 ) { + printf( "LoadTGA( %s ): colormaps not supported", name ); + return false; + } + + if ( ( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 ) && targa_header.image_type != 3 ) { + printf( "LoadTGA( %s ): Only 32 or 24 bit images supported (no colormaps)", name ); + return false; + } + + if ( targa_header.image_type == 2 || targa_header.image_type == 3 ) { + numBytes = targa_header.width * targa_header.height * ( targa_header.pixel_size >> 3 ); + if ( numBytes > bufferSize - TGA_HEADER_SIZE - targa_header.id_length ) { + printf( "LoadTGA( %s ): incomplete file", name ); + return false; + } + } + + columns = targa_header.width; + rows = targa_header.height; + numPixels = columns * rows; + + if ( width ) { + *width = columns; + } + if ( height ) { + *height = rows; + } + + targa_rgba = (W8 *)malloc( numPixels*4 ); + *pic = targa_rgba; + + if ( targa_header.id_length != 0 ) { + buf_p += targa_header.id_length; // skip TARGA image comment + } + + if ( targa_header.image_type == 2 || targa_header.image_type == 3 ) { + unsigned char red,green,blue,alphabyte; + switch( targa_header.pixel_size ) { + case 8: + // Uncompressed gray scale image + for( row = rows - 1; row >= 0; row-- ) { + pixbuf = targa_rgba + row*columns*4; + for( column = 0; column < columns; column++ ) { + blue = *buf_p++; + green = blue; + red = blue; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = 255; + } + } + break; + case 24: + // Uncompressed RGB image + for( row = rows - 1; row >= 0; row-- ) { + pixbuf = targa_rgba + row*columns*4; + for( column = 0; column < columns; column++ ) { + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = 255; + } + } + break; + case 32: + // Uncompressed RGBA image + for( row = rows - 1; row >= 0; row-- ) { + pixbuf = targa_rgba + row*columns*4; + for( column = 0; column < columns; column++ ) { + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = alphabyte; + } + } + break; + default: + printf( "LoadTGA( %s ): illegal pixel_size '%d'", name, targa_header.pixel_size ); + free( *pic ); + *pic = NULL; + return false; + } + } + else if ( targa_header.image_type == 10 ) { // Runlength encoded RGB images + unsigned char red,green,blue,alphabyte,packetHeader,packetSize,j; + + red = 0; + green = 0; + blue = 0; + alphabyte = 0xff; + + for( row = rows - 1; row >= 0; row-- ) { + pixbuf = targa_rgba + row*columns*4; + for( column = 0; column < columns; ) { + packetHeader= *buf_p++; + packetSize = 1 + (packetHeader & 0x7f); + if ( packetHeader & 0x80 ) { // run-length packet + switch( targa_header.pixel_size ) { + case 24: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = 255; + break; + case 32: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + break; + default: + printf( "LoadTGA( %s ): illegal pixel_size '%d'", name, targa_header.pixel_size ); + free( *pic ); + *pic = NULL; + return false; + } + + for( j = 0; j < packetSize; j++ ) { + *pixbuf++=red; + *pixbuf++=green; + *pixbuf++=blue; + *pixbuf++=alphabyte; + column++; + if ( column == columns ) { // run spans across rows + column = 0; + if ( row > 0) { + row--; + } + else { + goto breakOut; + } + pixbuf = targa_rgba + row*columns*4; + } + } + } else { // non run-length packet + for( j = 0; j < packetSize; j++ ) { + switch( targa_header.pixel_size ) { + case 24: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = 255; + break; + case 32: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = alphabyte; + break; + default: + printf( "LoadTGA( %s ): illegal pixel_size '%d'", name, targa_header.pixel_size ); + free( *pic ); + *pic = NULL; + return false; + } + column++; + if ( column == columns ) { // pixel packet run spans across rows + column = 0; + if ( row > 0 ) { + row--; + } + else { + goto breakOut; + } + pixbuf = targa_rgba + row*columns*4; + } + } + } + } + breakOut: ; + } + } + + if ( (targa_header.attributes & (1<<5)) ) { // image flp bit +// R_VerticalFlip( *pic, *width, *height ); + } + + return true; +} + +/* +======================== +LoadTGA + +Load TGA directly from a file. +======================== +*/ +int LoadTGA( const char *name, W8 **pic, int *width, int *height ) { + FILE *f = fopen( name, "rb" ); + int len; + W8 *buf; + int ret; + + if ( !f ) { + return 0; + } + + fseek( f, 0, SEEK_END ); + len = ftell( f ); + fseek( f, 0, SEEK_SET ); + buf = malloc( len ); + fread( buf, 1, len, f ); + fclose( f ); + + ret = LoadTGAFromBuffer( name, buf, len, pic, width, height ); + + free( buf ); + + return ret; +} + diff --git a/wolf3d/wolfextractor/loaders/tga.h b/wolf3d/wolfextractor/loaders/tga.h new file mode 100644 index 0000000..c64bade --- /dev/null +++ b/wolf3d/wolfextractor/loaders/tga.h @@ -0,0 +1,55 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 1997-2001 Id Software, Inc. + Copyright (C) 1995 Spencer Kimball and Peter Mattis + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * tga.h: Handle Targa file format. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * Portion of this code was derived from Quake II, and was + * originally written by id Software, Inc. + * + * Portion of this code was derived from The GIMP -- an image manipulation + * program, and was originally written by Spencer Kimball and Peter Mattis. + */ + + /* + Notes: + + This module is implimented by tga.c + */ + +#ifndef __TGA_H__ +#define __TGA_H__ + +#include "../../../common/arch.h" + + +extern W8 WriteTGA( const char *filename, W16 depth, W16 width, W16 height, + void *Data, W8 upsideDown, W8 rle ); + +int LoadTGA( const char *name, W8 **pic, int *width, int *height ); + +#endif /* __TGA_H__ */ + diff --git a/wolf3d/wolfextractor/loaders/wav.c b/wolf3d/wolfextractor/loaders/wav.c new file mode 100644 index 0000000..23e4245 --- /dev/null +++ b/wolf3d/wolfextractor/loaders/wav.c @@ -0,0 +1,144 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wav.c: Handles wav files. + * + * Author: Michael Liebscher + * Date: 2004 + * + */ + + +#include +#include + +#include "../../../common/arch.h" + +typedef struct +{ + W8 riff[ 4 ]; + W32 TotalLength; + W8 wave[ 8 ]; + W32 LengthFORMAT; + W16 DataType; + W16 ChannelNumbers; + W32 SampleRate; + W32 BytesPerSecond; + W16 BytesPerSample; + W16 BitsPerSample; + W8 data[ 4 ]; + W32 LengthData; + +} wavheader_t; + + +/* +----------------------------------------------------------------------------- + Function: write_wav() -Writes a wav file. + + Parameters: filename -[in] Pointer to a null-terminated string that + specifies the name of the file to save as. + data -[in] Pointer to audio data. + size -[in] Length of audio data. + channels -[in] Number of Channels (0x01 = Mono, 0x02 = Stereo). + sample_rate -[in] Sample Rate in Hz + sample_size -[in] Bytes Per Sample: + 1 = 8 bit Mono, + 2 = 8 bit Stereo or 16 bit Mono, + 4 = 16 bit Stereo + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +void +write_wav( const char *filename, void *data, W32 size, + W16 channels, W32 sample_rate, + W16 sample_size ) +{ + wavheader_t header; + FILE *handle; + + handle = fopen( filename, "wb" ); + if( handle == NULL ) + { + printf( "unable to write wav file\n" ); + return; + } + +// RIFF Chunk + header.riff[ 0 ] = 'R'; + header.riff[ 1 ] = 'I'; + header.riff[ 2 ] = 'F'; + header.riff[ 3 ] = 'F'; + + // Total Length Of Package To Follow + header.TotalLength = size + 36; + +// Format Chunk + header.wave[ 0 ] = 'W'; + header.wave[ 1 ] = 'A'; + header.wave[ 2 ] = 'V'; + header.wave[ 3 ] = 'E'; + header.wave[ 4 ] = 'f'; + header.wave[ 5 ] = 'm'; + header.wave[ 6 ] = 't'; + header.wave[ 7 ] = ' '; + + header.LengthFORMAT = 0x10; // Length Of FORMAT Chunk (always 0x10) + header.DataType = 0x01; // Always 0x01 + + // Channel Numbers (always 0x01 = Mono, 0x02 = Stereo) + header.ChannelNumbers = channels; + + + header.SampleRate = sample_rate; // Sample Rate in Hz + + + header.BytesPerSecond = sample_rate * sample_size * channels; + + + header.BytesPerSample = sample_size; // Bytes Per Sample: 1 = 8 bit Mono, + // 2 = 8 bit Stereo or 16 bit Mono, + // 4 = 16 bit Stereo + + + header.BitsPerSample = sample_size * 8; + +// DATA Chunk + header.data[ 0 ] = 'd'; + header.data[ 1 ] = 'a'; + header.data[ 2 ] = 't'; + header.data[ 3 ] = 'a'; + + // Length Of Data To Follow + header.LengthData = size; + + + + fwrite( &header, sizeof( W8 ), sizeof( wavheader_t ), handle ); + + fwrite( data, sizeof( W8 ), size, handle ); + + fclose( handle ); +} diff --git a/wolf3d/wolfextractor/loaders/wav.h b/wolf3d/wolfextractor/loaders/wav.h new file mode 100644 index 0000000..97e4c37 --- /dev/null +++ b/wolf3d/wolfextractor/loaders/wav.h @@ -0,0 +1,39 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wav.h: Handles wav files. + * + * Author: Michael Liebscher + * Date: 2004 + * + */ + +#ifndef __WAV_H__ +#define __WAV_H__ + +#include "../../../common/arch.h" + +extern void write_wav( const char *filename, void *data, W32 size, + W16 channels, W32 sample_rate, + W16 sample_size ); + + +#endif /* __WAV_H__ */ diff --git a/wolf3d/wolfextractor/mac/mac.c b/wolf3d/wolfextractor/mac/mac.c new file mode 100644 index 0000000..2baffa6 --- /dev/null +++ b/wolf3d/wolfextractor/mac/mac.c @@ -0,0 +1,1083 @@ +/* + + Copyright (C) 2004-2005 Michael Liebscher + Copyright (C) 2000 Steven Fuller + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * mac.c: This module is used to extract data from the Macintosh + * version of Wolfenstein 3-D. + * + * Author: Michael Liebscher + * + * Acknowledgement: + * Portion of this code was derived from code that was originally + * written by Steven Fuller. + * + */ + + + +#include +#include + +#include "mac.h" +#include "../wolf/wolf_def.h" +#include "../../../common/arch.h" +#include "../../../common/common_utils.h" +#include "../loaders/tga.h" +#include "../memory/memory.h" +#include "../string/com_string.h" +#include "../filesys/file.h" + + + + +/* Resource file Palette offsets */ +#define MACPAL 898370L +#define IDPAL 899142L +#define GAMEPAL 946811L +#define INTERPAL 997211L +#define YUMMYPAL 1011345L +#define TITLEPAL 2235007L + +#define PALETTE_SIZE 768 + + + +#define MACBINFILENAME "Wolfenstein 3D" +#define FILETYPECREATOR "APPLWOLF" + + +#define DATAFORKLENGTH 105754L +#define RESFORKLENGTH 2424697L + + +PRIVATE W8 *macPalette; + +PRIVATE FILE *fResHandle; + + +/* +----------------------------------------------------------------------------- + Function: getResourceBlock -Get block of resource data. + + Parameters: offset -[in] Number of bytes from start of file. + length -[in] Length of resource block. + glen -[out] next four bytes after block. + + Returns: NULL on error, otherwise pointer to block of memory. + + Notes: Caller is responsible for freeing memory block. +----------------------------------------------------------------------------- +*/ +PRIVATE W8 *getResourceBlock( W32 offset, W32 length, W32 *glen ) +{ + W8 *buf; + + fseek( fResHandle, offset, SEEK_SET ); + + buf = (PW8)MM_MALLOC( length ); + if( buf == NULL ) + { + printf( "could not malloc data\n" ); + + return NULL; + } + + if( fread( buf, 1, length, fResHandle ) != length ) + { + printf( "read error on resource file\n" ); + + return NULL; + } + + if( fread( glen, 1, 4, fResHandle ) != 4 ) + { + printf( "read error on resource file\n" ); + + return NULL; + } + + *glen = BigLong( *glen ); + + return buf; +} + +/* +----------------------------------------------------------------------------- + Function: + + Parameters: + + Returns: + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void Decode_LZSS( W8 *dst, const W8 *src, W32 Length ) +{ + W32 bitBucket; + W32 runCount; + W32 Fun; + W8 *ptrBack; + + if( ! Length ) + { + return; + } + + bitBucket = (W32) src[ 0 ] | 0x100; + ++src; + + do + { + if( bitBucket & 1 ) + { + dst[ 0 ] = src[ 0 ]; + ++src; + ++dst; + --Length; + } + else + { + runCount = (W32) src[ 0 ] | ((W32) src[ 1 ] << 8); + Fun = 0x1000 - (runCount & 0xFFF); + ptrBack = dst - Fun; + runCount = ((runCount >> 12) & 0x0F) + 3; + if( Length >= runCount ) + { + Length -= runCount; + } + else + { + runCount = Length; + Length = 0; + } + + while( runCount-- ) + { + *dst++ = *ptrBack++; + } + src += 2; + } + + bitBucket >>= 1; + if( bitBucket == 1 ) + { + bitBucket = (W32) src[ 0 ] | 0x100; + ++src; + } + + } while( Length ); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Palette Routines +// +/////////////////////////////////////////////////////////////////////////////// + + +/* +----------------------------------------------------------------------------- + Function: ConvertPaletteToRGB -Convert 256 palette data to RGB. + + Parameters: dst -[in/out] Destination for RGB raw image data. + src -[in] 256 palette data. + length -[in] length of source data. + palette -[in] Pointer to 256*3 array. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void ConvertPaletteToRGB( W8 *dst, W8 *src, W32 length, W8 *palette ) +{ + W32 i; + + for( i = 0 ; i < length ; ++i ) + { + dst[ i * 3 ] = palette[ src[ i ] * 3 ]; + dst[ i * 3 + 1 ] = palette[ src[ i ] * 3 + 1 ]; + dst[ i * 3 + 2 ] = palette[ src[ i ] * 3 + 2 ]; + } +} + +/* +----------------------------------------------------------------------------- + Function: setPalette -Set global palette. + + Parameters: offset -[in] offset of palette in resource file. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void setPalette( W32 offset ) +{ + W32 junk; + + if( macPalette ) + { + MM_FREE( macPalette ); + } + + macPalette = getResourceBlock( offset, PALETTE_SIZE, &junk ); + +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Screen Routines +// +/////////////////////////////////////////////////////////////////////////////// + +PRIVATE void DecodeBJMapImage( W32 offset, W32 length ) +{ + W8 *ptrResource; + W8 *buffer; + char filename[ 32 ]; + W32 junk; + + ptrResource = (PW8)getResourceBlock( offset, length, &junk ); + if( ! ptrResource ) + { + return; + } + + buffer = (PW8) MM_MALLOC( 16 * 16 * 3 ); + + ConvertPaletteToRGB( buffer, ptrResource, 16 * 16, macPalette ); + + cs_snprintf( filename, sizeof( filename ), "%s/bjautomap.tga", DIRPATHPICS ); + + WriteTGA( filename, 24, 16, 16, buffer, 0, 1 ); + + MM_FREE( buffer ); + +} + +PRIVATE void DecodeBJIntermImages( W32 offset, W32 length ) +{ + W32 *ptrResource; + W32 uncomprLength; + W8 *uncompr, *buffer; + W32 indexs[3]; + W16 *ptr; + int width, height, i; + W32 junk; + char filename[ 32 ]; + + ptrResource = (PW32)getResourceBlock( offset, length, &junk ); + if( ! ptrResource ) + { + return; + } + + uncomprLength = BigLong( ptrResource[ 0 ] ); + + uncompr = (PW8)MM_MALLOC( uncomprLength ); + + Decode_LZSS( uncompr, (PW8)&ptrResource[ 1 ], uncomprLength ); + + MM_FREE( ptrResource ); + + memcpy( indexs, uncompr, 12 ); + + indexs[ 0 ] = BigLong( indexs[ 0 ] ); + indexs[ 1 ] = BigLong( indexs[ 1 ] ); + indexs[ 2 ] = BigLong( indexs[ 2 ] ); + + + buffer = MM_MALLOC( 256 * 256 * 3 ); + for( i = 0 ; i < 3 ; ++i ) + { + ptr = (PW16)&uncompr[ indexs[ i ] ]; + width = BigShort( ptr[ 0 ] ); + height = BigShort( ptr[ 1 ] ); + + ConvertPaletteToRGB( buffer, (PW8)&ptr[ 2 ], width * height, macPalette ); + + cs_snprintf( filename, sizeof( filename ), "%s/bj%d.tga", DIRPATHPICS, i ); + + WriteTGA( filename, 24, width, height, buffer, 0, 1 ); + } + + MM_FREE( buffer ); + + MM_FREE( uncompr ); +} + +/* +----------------------------------------------------------------------------- + Function: DecodeScreen -Decode screen from Macintosh resource fork. + + Parameters: + offset -[in] offset in resource file. + length -[in] length of data. + filename -[in] Name of file to save as. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void DecodeScreen( W32 offset, W32 length, const char *filename ) +{ + W8 *ptrResource; + W32 uncomprLength; + W16 *uncompr; + W16 width, height; + W8 *buffer; + W32 junk; + + ptrResource = getResourceBlock( offset, length, &junk ); + if( ! ptrResource ) + { + return; + } + + uncomprLength = BigLong( *((PW32)ptrResource) ); + uncompr = (PW16)MM_MALLOC( uncomprLength ); + + Decode_LZSS( (PW8)uncompr, ptrResource+4, uncomprLength ); + + width = BigShort( uncompr[ 0 ] ); + height = BigShort( uncompr[ 1 ] ); + + buffer = MM_MALLOC( width * height * 3 ); + + ConvertPaletteToRGB( buffer, (PW8)&uncompr[ 2 ], width * height, macPalette ); + + WriteTGA( filename, 24, width, height, buffer, 0, 1 ); + + MM_FREE( buffer ); + MM_FREE( uncompr ); + MM_FREE( ptrResource ); +} + + +/* +----------------------------------------------------------------------------- + Function: RipScreens -Extract screens from Macintosh resource fork. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void RipScreens( void ) +{ + char path[ 256 ]; + + setPalette( MACPAL ); + cs_snprintf( path, sizeof( path ), "%s/macplaypic.tga", DIRPATHPICS ); + DecodeScreen( 899914, 46893, path ); + + setPalette( IDPAL ); + cs_snprintf( path, sizeof( path ), "%s/idpic.tga", DIRPATHPICS ); + DecodeScreen( 899914, 46893, path ); + + setPalette( INTERPAL ); + cs_snprintf( path, sizeof( path ), "%s/intermissionpic.tga", DIRPATHPICS ); + DecodeScreen( 947583, 49624, path ); + + + DecodeBJIntermImages( 1018931, 20766 ); + + + setPalette( GAMEPAL ); + cs_snprintf( path, sizeof( path ), "%s/getpsychedpic.tga", DIRPATHPICS ); + DecodeScreen( 997983, 3256, path ); + + + DecodeBJMapImage( 2391746, 1281 ); + + + + setPalette( YUMMYPAL ); + cs_snprintf( path, sizeof( path ), "%s/yummypic.tga", DIRPATHPICS ); + DecodeScreen( 1002299, 9042, path ); + + setPalette( TITLEPAL ); + cs_snprintf( path, sizeof( path ), "%s/titlepic.tga", DIRPATHPICS ); + DecodeScreen( 2067971, 167032, path ); + + +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Wall Routines +// +/////////////////////////////////////////////////////////////////////////////// + + +/* +----------------------------------------------------------------------------- + Function: obverseWall -Realign wall image. + + Parameters: + src -[in] source data. + width -[in] width of wall image. + height -[in] height of wall image. + + Returns: NULL on error, otherwise pointer to memory block with realigned + wall image data. + + Notes: Caller is responsible for freeing returned memory block. +----------------------------------------------------------------------------- +*/ +PRIVATE W8 *obverseWall( const W8 *src, W16 width, W16 height ) +{ + W8 *target; + W16 w, h; + + target = MM_MALLOC( width * height ); + + for( h = 0; h < height; ++h ) + for( w = 0; w < width; ++w ) + { + target[ h + width * w ] = src[ h * width + w ]; + } + + return target; +} + + +/* +----------------------------------------------------------------------------- + Function: DecodeWall -Decode then save wall data as TARGA image file. + + Parameters: + offet -[in] offset in resource file. + length -[in] length of data. + retval -[out] Length of next block. + filename -[in] Name of file to save as. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void DecodeWall( W32 offset, W32 length, W32 *retval, const char *filename ) +{ + W8 *ptrResource; + W8 *uncompr; + W8 *buffer; + W8 *newwall; + + ptrResource = getResourceBlock( offset, length, retval ); + if( ! ptrResource ) + { + return; + } + + uncompr = (PW8)MM_MALLOC( 128 * 128 ); + + Decode_LZSS( uncompr, ptrResource, 128 * 128 ); + + newwall = obverseWall( uncompr, 128, 128 ); + + buffer = MM_MALLOC( 128 * 128 * 3 ); + ConvertPaletteToRGB( buffer, newwall, 128 * 128, macPalette ); + + WriteTGA( filename, 24, 128, 128, buffer, 0, 1 ); + + MM_FREE( buffer ); + MM_FREE( newwall ); + MM_FREE( uncompr ); + MM_FREE( ptrResource ); +} + + +/* +----------------------------------------------------------------------------- + Function: RipWalls -Extract wall image data from resource fork. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void RipWalls( void ) +{ + int i; + W32 noffset = 702256; + W32 length = 6277; + W32 retval; + char name[ 256 ]; + + for( i = 0 ; i < 35 ; ++i ) + { + cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHWALLS, i ); + DecodeWall( noffset, length, &retval, name ); + + noffset += length + 4; + length = retval; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Sprite Routines +// +/////////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + W16 Topy; + W16 Boty; + W16 Shape; + +} spriteRun; + + + +/* +----------------------------------------------------------------------------- + Function: DecodeSprite -Decode then save sprite data as TARGA image file. + + Parameters: + offet -[in] offset in resource file. + length -[in] length of data. + retval -[out] Length of next block. + filename -[in] Name of file to save as. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void DecodeSprite( W32 offset, W32 length, W32 *retval, const char *filename ) +{ + W8 *ptrResource; + W32 uncomprLength; + W8 *uncompr; + W8 *buffer; + W16 *ptr; + int i, x, width, noffset; + + ptrResource = getResourceBlock( offset, length, retval ); + if( ! ptrResource ) + { + return; + } + + uncomprLength = ptrResource[ 0 ]; + uncomprLength |= ptrResource[ 1 ] << 8; + + uncompr = (PW8)MM_MALLOC( uncomprLength ); + Decode_LZSS( uncompr, ptrResource+2, uncomprLength ); + + + buffer = (W8 *)MM_MALLOC(128 * 128 * 4); + memset( buffer, 0, 128 * 128 * 4 ); + + + ptr = (PW16)uncompr; + + width = BigShort( ptr[ 0 ] ); + + noffset = 64 - width / 2; + for( x = 0 ; x < width ; ++x ) + { + spriteRun *p = (spriteRun *)&ptr[ BigShort( ptr[ x + 1 ] ) / 2 ]; + + while( p->Topy != 0xFFFF ) + { + for( i = BigShort( p->Topy ) / 2; i < BigShort( p->Boty ) / 2; ++i ) + { + *(buffer + (i * 128 + x + noffset) * 4 + 0) = macPalette[ uncompr[ BigShort( p->Shape ) + BigShort( p->Topy ) / 2 + (i - BigShort( p->Topy ) / 2) ] * 3 + 0 ]; + *(buffer + (i * 128 + x + noffset) * 4 + 1) = macPalette[ uncompr[ BigShort( p->Shape ) + BigShort( p->Topy ) / 2 + (i - BigShort( p->Topy ) / 2) ] * 3 + 1 ]; + *(buffer + (i * 128 + x + noffset) * 4 + 2) = macPalette[ uncompr[ BigShort( p->Shape ) + BigShort( p->Topy ) / 2 + (i - BigShort( p->Topy ) / 2) ] * 3 + 2 ]; + *(buffer + (i * 128 + x + noffset) * 4 + 3) = 255; + } + p++; + } + } + + + WriteTGA( filename, 32, 128, 128, buffer, 0, 1 ); + + MM_FREE( buffer ); + MM_FREE( uncompr ); + MM_FREE( ptrResource ); +} + + +/* +----------------------------------------------------------------------------- + Function: RipSprites -Extract sprites from resource fork. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void RipSprites( void ) +{ + int i; + W32 offset = 106345; + W32 length = 524; + W32 retval; + char name[ 256 ]; + + for( i = 0 ; i < 163 ; ++i ) + { + cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHSPRITES, i ); + DecodeSprite( offset, length, &retval, name ); + offset += length + 4; + length = retval; + } + + + offset = 579104; + length = 868; + for( i = 163 ; i < 171 ; ++i ) + { + cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHSPRITES, i ); + DecodeSprite( offset, length, &retval, name ); + offset += length + 4; + length = retval; + } + + offset = 2356530; + length = 7153; + for( i = 171 ; i < 175 ; ++i ) + { + cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHSPRITES, i ); + DecodeSprite( offset, length, &retval, name ); + offset += length + 4; + length = retval; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Item Routines +// +/////////////////////////////////////////////////////////////////////////////// + + +/* +----------------------------------------------------------------------------- + Function: DecodeItem -Convert item data into RGB raw data. + + Parameters: data -[in] data chunk to decode. + pal -[in] palette. + + Returns: On success pointer to RGB data, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE W8 *DecodeItem( W8 *data, W8 *pal ) +{ + W8 *buffer, *mask, *ptr; + int x, y, w, h; + + buffer = (W8 *)MM_MALLOC( 128 * 128 * 4 ); + + memset( buffer, 0, 128 * 128 * 4 ); + + x = data[ 0 ] << 8 | data[ 1 ]; + y = data[ 2 ] << 8 | data[ 3 ]; + w = data[ 4 ] << 8 | data[ 5 ]; + h = data[ 6 ] << 8 | data[ 7 ]; + + data += 8; + mask = data + w * h; + ptr = buffer + 512 * y + x * 4; + + do + { + int w2 = w; + do + { + if( *mask == 0 ) + { + ptr[ 0 ] = pal[ data[ 0 ] * 3 ]; + ptr[ 1 ] = pal[ data[ 0 ] * 3 + 1 ]; + ptr[ 2 ] = pal[ data[ 0 ] * 3 + 2 ]; + ptr[ 3 ] = 255; + } + ptr += 4; + data++; + mask++; + + } while( --w2 ); + + ptr += 4 * (128 - w); + + } while( --h ); + + return buffer; +} + + +/* +----------------------------------------------------------------------------- + Function: RipItems -Extract pic images from resource file. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void RipItems( void ) +{ + W8 *ptrResource; + W8 *ptrDst; + W32 *ptrLong; + W8 *buffer; + W8 **gameItems; + W32 junk; + W32 uncomprLength; + int i; + char name[ 256 ]; + W16 *ptrShape1; + W8 *ptrShape2; + W16 width, height; + W32 offset = 634799L; + W32 length = 67453L; + + + ptrResource = (PW8)getResourceBlock( offset, length, &junk ); + + uncomprLength = BigLong( *((PW32)ptrResource) ); + gameItems = (W8 **)MM_MALLOC( uncomprLength ); + + Decode_LZSS( (PW8)gameItems, ptrResource+4, uncomprLength ); + + MM_FREE( ptrResource ); + + ptrLong = (PW32)gameItems; + ptrDst = (PW8)gameItems; + for( i = 0; i < 47; ++i ) + { + uncomprLength = BigLong( ptrLong[ i ] ); + gameItems[ i ] = ptrDst + uncomprLength; + } + + for( i = 0 ; i < 6 * 4 ; ++i ) + { + cs_snprintf( name, sizeof( name ), "%s/weapon%.2d.tga", DIRPATHPICS, i ); + buffer = DecodeItem( gameItems[ 12 + i ], macPalette ); + WriteTGA( name, 32, 128, 128, buffer, 0, 1 ); + + MM_FREE( buffer ); + } + + for( i = 0 ; i < 47 ; ++i ) + { + ptrShape1 = (PW16)gameItems[ i ]; + width = BigShort( ptrShape1[ 0 ] ); + height = BigShort( ptrShape1[ 1 ] ); + ptrShape2 = (PW8)&ptrShape1[ 2 ]; + + buffer = MM_MALLOC( width * height * 3 ); + + ConvertPaletteToRGB( buffer, ptrShape2, width * height, macPalette ); + + cs_snprintf( name, sizeof( name ), "%s/%.2d.tga", DIRPATHPICS, i ); + WriteTGA( name, 24, width, height, buffer, 0, 1 ); + + MM_FREE( buffer ); + + // Skip over weapon frames + if( 11 == i ) + { + i = 35; + } + } + + MM_FREE( gameItems ); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Midi Routines +// +/////////////////////////////////////////////////////////////////////////////// + + +/* +----------------------------------------------------------------------------- + Function: RipMidi -Extract midi files from resource fork. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void RipMidi( void ) +{ + W8 *ptrResource; + W32 retval; + FILE *fhandle; + char name[ 256 ]; + int i; + W32 offset = 1899536L; + W32 length = 8215L; + + for( i = 0 ; i < 8 ; ++i ) + { + ptrResource = getResourceBlock( offset, length, &retval ); + if( ! ptrResource ) + { + continue; + } + + cs_snprintf( name, sizeof( name ), "%s/%d.mid", DIRPATHMIDI, i ); + fhandle = fopen( name, "wb" ); + if( ! fhandle ) + { + continue; + } + + fwrite( ptrResource, 1, length, fhandle ); + + fclose( fhandle ); + MM_FREE( ptrResource ); + + offset += length + 4; + length = retval; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +// PICT image +// +/////////////////////////////////////////////////////////////////////////////// + +#if 0 + +PRIVATE void DecodePICTimage( W32 offset, W32 length ) +{ + FILE *hfOut; + W8 *ptrResource; + W32 junk; + int i; + + ptrResource = getResourceBlock( offset, length, &junk ); + if( ! ptrResource ) + { + return; + } + + hfOut = fopen( "pict.pct", "wb" ); + if( ! hfOut ) + { + return; + } + + for( i ; i < 512 ; ++i ) + { + fwrite( ptrResource, 1, 0, hfOut ); + } + + fwrite( ptrResource, 1, length, hfOut ); + + fclose( hfOut ); +} + +#endif + +/////////////////////////////////////////////////////////////////////////////// +// +// Parse MacBinary Header +// +/////////////////////////////////////////////////////////////////////////////// + + +/* +----------------------------------------------------------------------------- + Function: parseMacBinaryHead -Parse mac binary header. + + Parameters: Nothing. + + Returns: true if this is Wolfenstein Mac binary file, otherwise false. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE _boolean parseMacBinaryHead( void ) +{ + W32 temp32 = 0; + char name[ 64 ]; + +// +// Check file name +// + fseek( fResHandle, 1, SEEK_SET ); + + // get file name length (range is 1 to 31) + fread( &temp32, 1, 1, fResHandle ); + if( temp32 < 1 || temp32 > 31 ) + { + return false; + } + + fread( name, 1, temp32, fResHandle ); + name[ temp32 - 1 ] = '\0'; + if( strcmp( name, MACBINFILENAME ) != 0 ) + { + return false; + } + +// +// Check file type / creator +// + fseek( fResHandle, 65, SEEK_SET ); + + fread( &name, 1, 8, fResHandle ); + name[ 8 ] = '\0'; + if( strcmp( name, FILETYPECREATOR ) != 0 ) + { + return false; + } + +// +// Check Data Fork length +// + fseek( fResHandle, 83, SEEK_SET ); + + fread( &temp32, 1, 4, fResHandle ); + + temp32 = BigLong( temp32 ); + if( temp32 != DATAFORKLENGTH ) + { + return false; + } + +// +// Check Resource Fork length +// + fread( &temp32, 1, 4, fResHandle ); + + temp32 = BigLong( temp32 ); + if( temp32 != RESFORKLENGTH ) + { + return false; + } + + return true; +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Interface +// +/////////////////////////////////////////////////////////////////////////////// + +/* +----------------------------------------------------------------------------- + Function: ripMac -Interface to Macintosh data extractor. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void ripMac( void ) +{ + char *fname; + char ext[ 256 ]; + + cs_strlcpy( ext, MAC_FEXT, sizeof( ext ) ); + + + fname = FS_FindFirst( ext, 0, FA_DIR ); + FS_FindClose(); + + if( fname == NULL ) + { + // try again with lower case + fname = FS_FindFirst( cs_strlwr( ext ), 0, FA_DIR ); + FS_FindClose(); + + if( fname == NULL ) + { + printf( "Could not find any mac files for read\n" ); + + return; + } + } + + fResHandle = fopen( fname, "rb" ); + if( fResHandle == NULL ) + { + printf( "Could not open file (%s) for read\n", fname ); + + return; + } + + if( ! parseMacBinaryHead() ) + { + printf( "Unknown MacBinary file\n" ); + + fclose( fResHandle ); + + return; + } + + + + FS_Mkdir( DIRPATHPICS ); + FS_Mkdir( DIRPATHSPRITES ); + FS_Mkdir( DIRPATHWALLS ); + FS_Mkdir( DIRPATHMIDI ); + + + printf( "Extracting Midi data...\n" ); + RipMidi(); + + printf( "Decoding Screen data...\n" ); + RipScreens(); + + + setPalette( GAMEPAL ); + + printf( "Decoding Wall data...\n" ); + RipWalls(); + printf( "Decoding Sprite data...\n" ); + RipSprites(); + printf( "Decoding Item data...\n" ); + RipItems(); + + fclose( fResHandle ); +} diff --git a/wolf3d/wolfextractor/mac/mac.h b/wolf3d/wolfextractor/mac/mac.h new file mode 100644 index 0000000..23735f3 --- /dev/null +++ b/wolf3d/wolfextractor/mac/mac.h @@ -0,0 +1,53 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 2000 Steven Fuller + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * mac.h: This module is used to extract data from the Macintosh + * version of Wolfenstein 3-D. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * Portion of this code was derived from code that was originally + * written by Steven Fuller. + * + */ + +#ifndef __MAC_H__ +#define __MAC_H__ + + +/* Directory Paths */ +#define DIRPATHSPRITES "macsprites" +#define DIRPATHWALLS "macwalls" +#define DIRPATHPICS "macpics" +#define DIRPATHMIDI "macmidi" + + + + +extern void ripMac( void ); + + + +#endif /* __MAC_H__ */ + diff --git a/wolf3d/wolfextractor/main.c b/wolf3d/wolfextractor/main.c new file mode 100644 index 0000000..cd8d478 --- /dev/null +++ b/wolf3d/wolfextractor/main.c @@ -0,0 +1,391 @@ +/* + + Copyright (C) 2004-2005 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * main.c: Decode Wolfenstein 3-D data files. + * + * Author: Michael Liebscher + * + */ + + +/* + +This program decodes the following Wolfenstein 3-D/Spear of Destiny files: + +AUDIOHED.xxx -Contains offsets and lengths of the audio in AUDIOT. +AUDIOT.xxx -Contains Adlib audio data. + +VGAHEAD.xxx -Contains data offsets for VGAGRAPH. +VGAGRAPH.xxx -Contains graphic data. +VGADICT.xxx -Contains Huffman dictionary data. + +VSWAP.xxx -Contains audio and graphic data. + +Wolfenstein 3D(tm).mac -Macintosh binary of Wolfenstein 3D + +*/ + +#include +#include + + +#include "../../common/arch.h" +#include "../../common/common_utils.h" +#include "string/com_string.h" +#include "wolf/wolf_def.h" +#include "filesys/file.h" +#include "hq2x.h" +#include "mac/mac.h" + + +#define APP_VERSION "0.01i" + +#define BASEDIR "base/" + + + + +extern void PAK_builder( const char *filename, W16 version ); + + + + +/* +----------------------------------------------------------------------------- + Function: deleteCacheDirectories -Delete directories created when caching. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void deleteCacheDirectories( W16 version ) +{ + FS_RemoveDirectory( GFXWALLDIR ); + FS_RemoveDirectory( MAPDIR ); + FS_RemoveDirectory( LGFXDIR ); + + if( version & WL1_PAK || version & WL6_PAK ) + { + FS_RemoveDirectory( SFXDIR ); + FS_RemoveDirectory( GFXSPRITEDIR ); + FS_RemoveDirectory( LSFXDIR ); + } + + if( version & SDM_PAK || version & SOD_PAK ) + { + FS_RemoveDirectory( SODSFXDIR ); + FS_RemoveDirectory( SODGFXSPRITEDIR ); + FS_RemoveDirectory( SODLSFXDIR ); + } +} + +/* +----------------------------------------------------------------------------- + Function: CheckForDataFiles -Check for data files. + + Parameters: Wolf_Ext -[out] zero nothing found. + Bit 0 high -WL1 data files found. + Bit 1 high -WL6 data files found. + Bit 2 high -SDM data files found. + Bit 3 high -SOD data files found. + Bit 4 high -MAC data files found. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +void CheckForDataFiles( W16 *Wolf_Ext ) +{ + char ext[ 13 ]; + +// +// Wolfenstein 3-D Demo +// + cs_strlcpy( ext, WL1_FEXT, sizeof( ext ) ); + + if( FS_FindFirst( cs_strupr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= WL1_PAK; + } + + FS_FindClose(); + + if( FS_FindFirst( cs_strlwr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= WL1_PAK; + } + + FS_FindClose(); + + +// +// Wolfenstein 3-D +// + cs_strlcpy( ext, WL6_FEXT, sizeof( ext ) ); + + if( FS_FindFirst( cs_strupr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= WL6_PAK; + } + + FS_FindClose(); + + if( FS_FindFirst( cs_strlwr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= WL6_PAK; + } + + FS_FindClose(); + + +// +// Spear of Destiny Demo +// + cs_strlcpy( ext, SDM_FEXT, sizeof( ext ) ); + + if( FS_FindFirst( cs_strupr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= SDM_PAK; + } + + FS_FindClose(); + + if( FS_FindFirst( cs_strlwr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= SDM_PAK; + } + + FS_FindClose(); + + +// +// Spear of Destiny +// + cs_strlcpy( ext, SOD_FEXT, sizeof( ext ) ); + + if( FS_FindFirst( cs_strupr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= SOD_PAK; + } + + FS_FindClose(); + + if( FS_FindFirst( cs_strlwr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= SOD_PAK; + } + + FS_FindClose(); + +// +// Macintosh Wolfenstein 3-D +// + cs_strlcpy( ext, MAC_FEXT, sizeof( ext ) ); + + if( FS_FindFirst( cs_strupr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= MAC_PAK; + } + + FS_FindClose(); + + if( FS_FindFirst( cs_strlwr( ext ), 0, 0 ) ) + { + *Wolf_Ext |= MAC_PAK; + } + + FS_FindClose(); +} + +/* +----------------------------------------------------------------------------- + Function: main -Interface to Wolfenstein data decoder. + + Parameters: Nothing. + + Returns: 0 on success, non-zero otherwise. + + Notes: This is the application entry point. + + 1. Search for Wolfenstein data files. + 2. Decode data accordingly. + +----------------------------------------------------------------------------- +*/ +int main( int argc, char *argv[] ) +{ + W16 Wolf_Ext = 0; // bit 0 high -WL1 extension + // bit 1 high -WL6 extension + // bit 2 high -SDM extension + // bit 3 high -SOD extension + // bit 4 high -MAC extension + + W32 retval; + + +#if 0 + + extern char gamepal[]; + + int test = 0x32 * 3; + printf( "%d, %d, %d\n", gamepal[ test ]<<2, gamepal[ test+1 ]<<2, gamepal[ test+2 ]<<2 ); + return 0; + +#endif + +#if 0 // hack to just fix the red cross health pack sprite + { + void UpdateSingleSprite( const char *srcTGA, const char *destTGA ); + + UpdateSingleSprite( "c:/027.tga", "c:/fixed_027.tga" ); + exit( 0 ); + } +#endif + + printf( "\nWolfExtractor %s %s\n", BUILDSTRING, CPUSTRING ); + printf( "Version %s built on %s at %s\n\n", APP_VERSION, __DATE__, __TIME__ ); + + + if( ! FS_ChangeCurrentDirectory( BASEDIR ) ) + { + printf( "Unable to change into directory (%s)\n", BASEDIR ); + + return 1; + } + + + CheckForDataFiles( &Wolf_Ext ); + if( ! Wolf_Ext ) + { + printf( "No Wolfenstein data files found!\n" ); + + return 1; + } + + InitLUTs(); // This is for hq2x + + if( Wolf_Ext & WL1_PAK ) + { + printf( "\nFound Wolfenstein 3-D demo data files\n" ); + + retval = 0; + + retval = LumpExtractor( WL1_FEXT+1, WL1_LATCHPICS_LUMP_END+5, WL1_PAK ); + retval += PExtractor( WL1_FEXT+1, WL1_PAK ); + retval += AudioRipper( WL1_FEXT+1, 87, 174, WL1_PAK ); + retval += MapRipper( WL1_FEXT+1, WL1_PAK ); + + if( retval != 4 ) + { + printf( "\nAn Error Has Occurred, exiting!\n" ); + + return 1; + } + +//!@# JDC PAK_builder( "wolf_demo.pak", WL1_PAK ); + } + + + if( Wolf_Ext & WL6_PAK ) + { + printf( "\nFound Wolfenstein 3-D data files\n" ); + + retval = 0; + + retval = LumpExtractor( WL6_FEXT+1, WL6_LATCHPICS_LUMP_END, WL6_PAK ); + retval += PExtractor( WL6_FEXT+1, WL6_PAK ); + retval += AudioRipper( WL6_FEXT+1, 87, 174, WL6_PAK ); + retval += MapRipper( WL6_FEXT+1, WL6_PAK ); + + if( retval != 4 ) + { + printf( "\nAn Error Has Occurred, exiting!\n" ); + + return 1; + } + +//!@# JDC PAK_builder( "wolf.pak", WL6_PAK ); + } + + if( Wolf_Ext & SDM_PAK ) + { + printf( "\nFound Spear of Destiny demo data files\n" ); + + retval = 0; + + retval = LumpExtractor( SDM_FEXT+1, 127, SDM_PAK ); + retval += PExtractor( SDM_FEXT+1, SDM_PAK ); + retval += AudioRipper( SDM_FEXT+1, 81, 162, SDM_PAK ); + retval += MapRipper( SDM_FEXT+1, SDM_PAK ); + + if( retval != 4 ) + { + printf( "\nAn Error Has Occurred, exiting!\n" ); + + return 1; + } + + return; + +//!@# JDC PAK_builder( "spear_demo.pak", SDM_PAK ); + } + + if( Wolf_Ext & SOD_PAK ) + { + printf( "\nFound Spear of Destiny data files\n" ); + + retval = 0; + + retval = LumpExtractor( SOD_FEXT+1, 149, SOD_PAK ); + retval += PExtractor( SOD_FEXT+1, SOD_PAK ); + retval += AudioRipper( SOD_FEXT+1, 81, 162, SOD_PAK ); + retval += MapRipper( SOD_FEXT+1, SOD_PAK ); + + if( retval != 4 ) + { + printf( "\nAn Error Has Occurred, exiting!\n" ); + + return 1; + } + +//!@# JDC PAK_builder( "spear.pak", SOD_PAK ); + } + + if( Wolf_Ext & MAC_PAK ) + { + printf( "\nFound Macintosh binary file\n" ); + + ripMac(); + + //PAK_builder( "mac.pak", MAC_PAK ); + } + + +//!@# JDC deleteCacheDirectories( Wolf_Ext ); + + + return 0; +} + diff --git a/wolf3d/wolfextractor/makefile b/wolf3d/wolfextractor/makefile new file mode 100644 index 0000000..e4c72c7 --- /dev/null +++ b/wolf3d/wolfextractor/makefile @@ -0,0 +1,191 @@ +# +# Project: Wolfenstein 3-D Redux +# +# Program: wolfextractor +# + +COMPILER = gcc +CFLAGS = -Wall -c -O2 +LDFLAGS = -s +ODIR = Release + +EXEBASE = wolfextractor +EXE = $(ODIR)/$(EXEBASE) + +DO_CC = $(COMPILER) $(CFLAGS) -o $@ -c $< + + +all: $(EXE) + + + + +clean: + rm -f $(ODIR)/*.o $(EXE) + + +PROGRAM_FILES = $(ODIR)/adlib.o \ + $(ODIR)/fmopl.o \ + $(ODIR)/arch.o \ + $(ODIR)/file.o \ + $(ODIR)/unix_file.o \ + $(ODIR)/glob.o \ + $(ODIR)/com_string.o \ + $(ODIR)/tga.o \ + $(ODIR)/wav.o \ + $(ODIR)/memory.o \ + $(ODIR)/mac.o \ + $(ODIR)/wl6_name.o \ + $(ODIR)/wolf_aud.o \ + $(ODIR)/wolf_gfx.o \ + $(ODIR)/wolf_map.o \ + $(ODIR)/wolf_pal.o \ + $(ODIR)/wolf_pm.o \ + $(ODIR)/zipfile.o \ + $(ODIR)/adler32.o \ + $(ODIR)/compress.o \ + $(ODIR)/crc32.o \ + $(ODIR)/deflate.o \ + $(ODIR)/trees.o \ + $(ODIR)/zutil.o \ + $(ODIR)/hq2x.o \ + $(ODIR)/pak.o \ + $(ODIR)/vorbisenc_inter.o \ + $(ODIR)/main.o + + + +$(EXE): $(PROGRAM_FILES) + ${COMPILER} -o $(EXE) $(PROGRAM_FILES) $(LDFLAGS) -lvorbis -lvorbisenc -logg -lm + + + +#=========================================================================== +# Build +#=========================================================================== + + + +# +# adlib/ +# +$(ODIR)/adlib.o : adlib/adlib.c + $(DO_CC) + +$(ODIR)/fmopl.o : adlib/fmopl.c + $(DO_CC) + +# +# common/ +# +$(ODIR)/arch.o : ../../common/arch.c + $(DO_CC) + +# +# filesys/ +# +$(ODIR)/file.o : filesys/file.c + $(DO_CC) + +# +# filesys/unix/ +# +$(ODIR)/unix_file.o : filesys/unix/unix_file.c + $(DO_CC) + +$(ODIR)/glob.o : filesys/unix/glob.c + $(DO_CC) + +# +# loaders/ +# +$(ODIR)/tga.o : loaders/tga.c + $(DO_CC) + +$(ODIR)/wav.o : loaders/wav.c + $(DO_CC) + +# +# mac/ +# +$(ODIR)/mac.o : mac/mac.c + $(DO_CC) + +# +# memory/ +# +$(ODIR)/memory.o : memory/memory.c + $(DO_CC) + +# +# string/ +# +$(ODIR)/com_string.o : string/com_string.c + $(DO_CC) + +# +# wolf/ +# +$(ODIR)/wl6_name.o : wolf/wl6_name.c + $(DO_CC) + +$(ODIR)/wolf_aud.o : wolf/wolf_aud.c + $(DO_CC) + +$(ODIR)/wolf_gfx.o : wolf/wolf_gfx.c + $(DO_CC) + +$(ODIR)/wolf_map.o : wolf/wolf_map.c + $(DO_CC) + +$(ODIR)/wolf_pal.o : wolf/wolf_pal.c + $(DO_CC) + +$(ODIR)/wolf_pm.o : wolf/wolf_pm.c + $(DO_CC) + +# +# zip/ +# +$(ODIR)/zipfile.o : zip/zipfile.c + $(DO_CC) + +# +# zlib/ +# +$(ODIR)/adler32.o : ../../zlib/adler32.c + $(DO_CC) + +$(ODIR)/compress.o : ../../zlib/compress.c + $(DO_CC) + +$(ODIR)/crc32.o : ../../zlib/crc32.c + $(DO_CC) + +$(ODIR)/deflate.o : ../../zlib/deflate.c + $(DO_CC) + +$(ODIR)/trees.o : ../../zlib/trees.c + $(DO_CC) + +$(ODIR)/zutil.o : ../../zlib/zutil.c + $(DO_CC) + +# +# +# +$(ODIR)/hq2x.o : hq2x.c + $(DO_CC) + +$(ODIR)/pak.o : pak.c + $(DO_CC) + +$(ODIR)/vorbisenc_inter.o : vorbisenc_inter.c + $(DO_CC) + +$(ODIR)/main.o : main.c + $(DO_CC) + + + + diff --git a/wolf3d/wolfextractor/makefile.freebsd b/wolf3d/wolfextractor/makefile.freebsd new file mode 100644 index 0000000..c7a8646 --- /dev/null +++ b/wolf3d/wolfextractor/makefile.freebsd @@ -0,0 +1,190 @@ +# +# Project: Wolfenstein 3-D Redux +# +# Program: wolfextractor +# + +COMPILER = gcc +CFLAGS = -Wall -c -O2 -idirafter /usr/local/include +LDFLAGS = -s +ODIR = Release + +EXEBASE = wolfextractor +EXE = $(ODIR)/$(EXEBASE) + + + +all: $(EXE) + + +VORBISFLAGS = -L/usr/local/lib -lvorbis -lvorbisenc -logg + + +clean: + rm -f $(ODIR)/*.o $(EXE) + + +PROGRAM_FILES = $(ODIR)/adlib.o $(ODIR)/fmopl.o $(ODIR)/arch.o $(ODIR)/file.o $(ODIR)/unix_file.o $(ODIR)/glob.o $(ODIR)/com_string.o $(ODIR)/tga.o $(ODIR)/wav.o $(ODIR)/mac.o $(ODIR)/memory.o $(ODIR)/wl6_name.o $(ODIR)/wolf_aud.o $(ODIR)/wolf_gfx.o $(ODIR)/wolf_map.o $(ODIR)/wolf_pal.o $(ODIR)/wolf_pm.o $(ODIR)/zipfile.o $(ODIR)/adler32.o $(ODIR)/compress.o $(ODIR)/crc32.o $(ODIR)/deflate.o $(ODIR)/trees.o $(ODIR)/zutil.o $(ODIR)/hq2x.o $(ODIR)/pak.o $(ODIR)/vorbisenc_inter.o $(ODIR)/main.o + + + +$(EXE): $(PROGRAM_FILES) + ${COMPILER} -o $(EXE) $(PROGRAM_FILES) $(LDFLAGS) $(VORBISFLAGS) -lm + + + +#=========================================================================== +# Build +#=========================================================================== + +# +# adlib/ +# +$(ODIR)/adlib.o : adlib/adlib.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/fmopl.o : adlib/fmopl.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# common/ +# +$(ODIR)/arch.o : ../../common/arch.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# filesys/ +# +$(ODIR)/file.o : filesys/file.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# filesys/unix/ +# +$(ODIR)/unix_file.o : filesys/unix/unix_file.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/glob.o : filesys/unix/glob.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# loaders/ +# +$(ODIR)/tga.o : loaders/tga.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/wav.o : loaders/wav.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# mac/ +# +$(ODIR)/mac.o : mac/mac.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# memory/ +# +$(ODIR)/memory.o : memory/memory.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# string/ +# +$(ODIR)/com_string.o : string/com_string.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# wolf/ +# +$(ODIR)/wl6_name.o : wolf/wl6_name.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/wolf_aud.o : wolf/wolf_aud.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/wolf_gfx.o : wolf/wolf_gfx.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/wolf_map.o : wolf/wolf_map.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/wolf_pal.o : wolf/wolf_pal.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/wolf_pm.o : wolf/wolf_pm.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i +# +# zip/ +# +$(ODIR)/zipfile.o : zip/zipfile.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# zlib/ +# +$(ODIR)/adler32.o : ../../zlib/adler32.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/compress.o : ../../zlib/compress.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/crc32.o : ../../zlib/crc32.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/deflate.o : ../../zlib/deflate.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/trees.o : ../../zlib/trees.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/zutil.o : ../../zlib/zutil.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +# +# +# + +$(ODIR)/hq2x.o : hq2x.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/pak.o : pak.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/vorbisenc_inter.o : vorbisenc_inter.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + +$(ODIR)/main.o : main.c + ${COMPILER} $(CFLAGS) -E $? | tr -d '\015' > /tmp/temp.i + ${COMPILER} $(CFLAGS) -o $@ /tmp/temp.i + + + + diff --git a/wolf3d/wolfextractor/memory/memory.c b/wolf3d/wolfextractor/memory/memory.c new file mode 100644 index 0000000..faec3d4 --- /dev/null +++ b/wolf3d/wolfextractor/memory/memory.c @@ -0,0 +1,198 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * memory.c: Memory allocation module. + * + * Author: Michael Liebscher + * Date: 2004 + * + * + */ + +#include +#include + +#include "memory.h" + + + +#ifndef PARANOID + + #define PARANOID 0 + +#endif /* PARANOID */ + + +/* +----------------------------------------------------------------------------- + Function: Memory_malloc -Allocates memory blocks. + + Parameters: size -[in] Bytes to allocate. + + Returns: + Void pointer to the allocated space on success, or NULL if + there is insufficient memory available. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void *Memory_malloc( size_t size ) +{ + void *ptr; + ptr = malloc( size ); + + if( ptr != NULL ) + { + +#if PARANOID + + printf( "Memory malloc: %p size:%ld\n", ptr, size ); + +#endif + + return ptr; + } + + + printf( "[memory.c] Could not allocate %d bytes\n", size ); + + return NULL; +} + + +/* +----------------------------------------------------------------------------- + Function: Memory_calloc -Allocates an array in memory with elements + initialized to 0. + + Parameters: + num -[in] Number of elements. + size -[in] Bytes to allocate. + + Returns: + Void pointer to the allocated space on success, or NULL if + there is insufficient memory available. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void *Memory_calloc( size_t num, size_t size ) +{ + void *ptr; + ptr = calloc( num, size ); + + if( ptr != NULL ) + { + +#if PARANOID + + printf( "Memory calloc: %p size:%ld num:%ld\n", ptr, size, num ); + +#endif + + return ptr; + } + + + printf( "[memory.c] Could not allocate %d objects of size %d\n", num, size); + + return NULL; +} + +/* +----------------------------------------------------------------------------- + Function: Memory_realloc -Reallocate memory blocks. + + Parameters: + memblock -[in] Pointer to previously allocated memory block. + size -[in] Bytes to allocate. + + Returns: + A void pointer to the reallocated (and possibly moved) memory + block. The return value is NULL if the size is zero and the + buffer argument is not NULL, or if there is not enough + available memory to expand the block to the given size. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void *Memory_realloc( void *memblock, size_t size ) +{ + void *ptr; + + ptr = realloc( memblock, size ); + + if( ptr != NULL ) + { + +#if PARANOID + + printf( "Memory realloc: %p size:%ld\n", ptr, size ); + +#endif + + return ptr; + } + + printf( "[memory.c] Could not reallocate %d bytes\n", size ); + + return NULL; +} + + +/* +----------------------------------------------------------------------------- + Function: Memory_free -Deallocates or frees a memory block. + + Parameters: + memblock -[in] Previously allocated memory block to be freed. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC void Memory_free( void *memblock ) +{ + if( memblock ) + { + +#if PARANOID + + printf( "Memory free: %p\n", memblock ); + +#endif + + free( memblock ); + } +} + + +PUBLIC void Memory_outofmem( const char *name, const char *file, W32 line ) +{ + + printf( "%s:%ld failed allocation for \"%s\"\n", file, line, name ); + +} diff --git a/wolf3d/wolfextractor/memory/memory.h b/wolf3d/wolfextractor/memory/memory.h new file mode 100644 index 0000000..b41af11 --- /dev/null +++ b/wolf3d/wolfextractor/memory/memory.h @@ -0,0 +1,67 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * memory.h: Memory allocation manager. + * + * Author: Michael Liebscher + * Date: 2004 + * + */ + +/* + Notes: + This module is implemented by memory.c. + +*/ + +#ifndef __MEMORY_H__ +#define __MEMORY_H__ + +#include + +#include "../../../common/arch.h" +#include "../../../common/common_utils.h" + + +// Use the macros + +extern void *Memory_malloc( size_t size ); +extern void *Memory_calloc( size_t num, size_t size ); +extern void *Memory_realloc( void *memblock, size_t size ); +extern void Memory_free( void *memblock ); + +extern void Memory_outofmem( const char *name, const char *file, W32 line ); + + +#define MM_MALLOC( size ) Memory_malloc( (size) ) +#define MM_CALLOC( num, size ) Memory_calloc( (num), (size) ) +#define MM_REALLOC( memblock, size ) Memory_realloc( (memblock), (size) ) + +#define MM_FREE( memblock ) { Memory_free( (memblock) ); ((memblock)) = NULL; } + +#define MM_OUTOFMEM( name ) Memory_outofmem( (name), __FILE__, __LINE__ ) + + + + + + +#endif /* __MEMORY_H__ */ diff --git a/wolf3d/wolfextractor/ogg_static.lib b/wolf3d/wolfextractor/ogg_static.lib new file mode 100644 index 0000000000000000000000000000000000000000..33d39e42045a15a5ac7dbc0090ad9c9480f896b9 GIT binary patch literal 26736 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 + * Date: 2004 + * + */ + +#include + +#include "wolf/wolf_def.h" +#include "mac/mac.h" +#include "memory/memory.h" +#include "../../common/arch.h" +#include "../../common/common_utils.h" +#include "string/com_string.h" +#include "filesys/file.h" +#include "zip/zip.h" + +#include "../../zlib/zlib.h" + + +#define SCRIPTNAME "DEFAULT.CFG" +#define GVERSION_TEXT "set g_version " + +#define SCRIPT_DIR "script" + + +PRIVATE struct zlist *zfchain = NULL; // Zip file chain + + + +/* +----------------------------------------------------------------------------- + Function: writelocalfilechunk() -Zip file. + + Parameters: filename -[in] Pointer to a NUL-terminated string that specifies + the path of the file to zip. + fout -[in] file to zip to. + + Returns: On success pointer to zlist structure, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE struct zlist *writelocalfilechunk( const char *filename, FILE *fout ) +{ + W8 *data; + struct zlist *zentry; + struct filestats fs; + int err; + W8 *compr; + W32 retval; + z_stream c_stream; /* compression stream */ + + + zentry = MM_MALLOC( sizeof( *zentry ) ); + + memset( zentry, 0, sizeof( *zentry ) ); + zentry->next = NULL; + + zentry->versionmadeby = VMB_VFAT; + zentry->versionneeded = 20; + zentry->disknumstart = 0; + zentry->compression_method = CM_DEFLATED; + + zentry->deletefile = 1; + + zentry->uncompressed_size = FS_LoadFile( filename, &data ); + + if( zentry->uncompressed_size == -1 || data == NULL ) + { + printf( "Could not open file (%s)\n", filename ); + MM_FREE( zentry ); + + return NULL; + } + + + FS_GetFileAttributes( filename, &fs ); + + zentry->timedate = UnixTimeToDosTime( &fs.lastwritetime ); + + +// +// Compression +// + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit( &c_stream, Z_DEFAULT_COMPRESSION ); + if( err != Z_OK ) + { + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + + zentry->compressed_size = (zentry->uncompressed_size / 10) + 12 + zentry->uncompressed_size; + + + compr = MM_MALLOC( zentry->compressed_size ); + + + + + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)zentry->compressed_size; + + c_stream.next_in = data; + c_stream.avail_in = (uInt)zentry->uncompressed_size; + + + err = deflate( &c_stream, Z_FINISH ); + if( err != Z_STREAM_END ) + { + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + + err = deflateEnd( &c_stream ); + if( err != Z_OK ) + { + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + + // When using the deflate method, ZLib adds a 2 byte head + // and a 4 byte tail. The head must be removed for zip + // compatability and the tail is not necessary. + zentry->compressed_size = c_stream.total_out - 6; + +// +// End of compression +// + + + zentry->crc32 = crc32( 0, data, zentry->uncompressed_size ); + + cs_strlcpy( zentry->filename, filename, sizeof( zentry->filename ) ); + zentry->filename_length = strlen( zentry->filename ); + + zentry->offset = ftell( fout ); + + // Write header to file + if( ! zip_writelocalfileheader( zentry, fout ) ) + { + printf( "Error writing local header to zip file\n" ); + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + // Write data to file + retval = fwrite( compr+2, 1, zentry->compressed_size, fout ); + if( retval != zentry->compressed_size ) + { + printf( "Error writing data after local header to zip file\n" ); + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + MM_FREE( compr ); + MM_FREE( data ); + + + return zentry; +} + +/* +----------------------------------------------------------------------------- + Function: writecentralchunk() -Write central headers for Zip file. + + Parameters: z -[in] Chain of zlist structures. + fout -[in] file to write to. + + Returns: On success true, otherwise false. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE _boolean writecentralchunk( struct zlist *z, FILE *fout ) +{ + W32 central_offset; + W32 central_size; + W32 num = 0; + struct zlist *ztemp; + + if( z == NULL ) + { + printf( "NULL zip list passed into writecentralchunk().\n" ); + + return false; + } + + central_offset = ftell( fout ); + + ztemp = z; + do + { + ++num; + if( ! zip_writecentral( ztemp, fout ) ) + { + printf( "Error writing central header to zip file\n" ); + return false; + } + + ztemp = ztemp->next; + + } while( ztemp ); + + central_size = ftell( fout ) - central_offset; + + if( ! zip_writeend( num, central_size, central_offset, 0, NULL, fout ) ) + { + printf( "Error writing end header to zip file\n" ); + + return false; + } + + return true; +} + +/* +----------------------------------------------------------------------------- + Function: parsedirectory() -Write central headers for Zip file. + + Parameters: path -[in] path to parse. + fout -[in] zip file to write to. + + Returns: On success pointer to zlist structure, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE _boolean parsedirectory( const char *path, FILE *f ) +{ + char temp[ 256 ]; + char *ptr; + struct zlist *znewnode = NULL; + + + cs_strlcpy( temp, path, sizeof( temp ) ); + + if( strstr( temp, "*" ) == NULL ) + { + cs_strlcat( temp, "/*", sizeof( temp ) ); + } + + // run findfirst once so we can use findnext in a loop. + // This will return the current directory + (void)FS_FindFirst( temp, 0, 0 ); + + // Look for files + while( (ptr = FS_FindNext( 0, FA_DIR )) != NULL ) + { + znewnode = writelocalfilechunk( ptr, f ); + if( znewnode == NULL ) + { + continue; + } + + // add new link to chain + znewnode->next = zfchain; + zfchain = znewnode; + + } + + FS_FindClose(); + + return true; // return pointer to start of chain +} + +/* +----------------------------------------------------------------------------- + Function: addscripttozipfile() -Add script file to zip file. + + Parameters: filename -[in] File name of script file. + fout -[in] zip file to write to. + version -[in] + + Returns: On success pointer to zlist structure, otherwise NULL. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE struct zlist *addscripttozipfile( char *filename, FILE *fout, W16 version ) +{ + W8 *data; + struct zlist *zentry; + struct filestats fs; + int err; + W32 retval; + W8 *compr; + z_stream c_stream; /* compression stream */ + char commandline[ 256 ]; + int value = 0; + FILE *fin; + + fin = fopen( filename, "rb" ); + if( fin == NULL ) + { + return NULL; + } + + retval = FS_FileLength( fin ); + + if( retval == -1 ) + { + printf( "Could not open file (%s)\n", filename ); + + return NULL; + } + + // add g_version command + if( version == SDM_PAK || version == SOD_PAK ) + { + value = 1; + } + else + { + value = 0; + } + cs_snprintf( commandline, sizeof( commandline ), "\n%s%d\n", GVERSION_TEXT, value ); + + + data = MM_MALLOC( retval + strlen( commandline ) + 1 ); + + if( fread( data, 1, retval, fin ) != retval ) + { + printf( "Could not read from file (%s)\n", filename ); + + MM_FREE( data ) + + return NULL; + } + + fclose( fin ); + + memcpy( data + retval, commandline, strlen( commandline ) ); + + + zentry = MM_MALLOC( sizeof( *zentry ) ); + memset( zentry, 0, sizeof( *zentry ) ); + zentry->next = NULL; + + zentry->versionmadeby = VMB_VFAT; + zentry->versionneeded = 20; + zentry->disknumstart = 0; + zentry->compression_method = CM_DEFLATED; + + zentry->deletefile = 0; + + zentry->uncompressed_size = retval + strlen( commandline ); + + FS_GetFileAttributes( filename, &fs ); + + zentry->timedate = UnixTimeToDosTime( &fs.lastwritetime ); + +// +// Compression +// + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit( &c_stream, Z_DEFAULT_COMPRESSION ); + if( err != Z_OK ) + { + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + + zentry->compressed_size = (zentry->uncompressed_size / 10) + 12 + zentry->uncompressed_size; + + + compr = MM_MALLOC( zentry->compressed_size ); + + + + + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)zentry->compressed_size; + + c_stream.next_in = data; + c_stream.avail_in = (uInt)zentry->uncompressed_size; + + + err = deflate( &c_stream, Z_FINISH ); + if( err != Z_STREAM_END ) + { + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + + err = deflateEnd( &c_stream ); + if( err != Z_OK ) + { + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + + // When using the deflate method, ZLib adds a 2 byte head + // and a 4 byte tail. The head must be removed for zip + // compatability and the tail is not necessary. + zentry->compressed_size = c_stream.total_out - 6; + +// +// End of compression +// + + + zentry->crc32 = crc32( 0, data, zentry->uncompressed_size ); + + cs_strlcpy( zentry->filename, filename, sizeof( zentry->filename ) ); + zentry->filename_length = strlen( zentry->filename ); + + zentry->offset = ftell( fout ); + + // Write header to file + if( ! zip_writelocalfileheader( zentry, fout ) ) + { + printf( "Error writing local header to zip file\n" ); + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + // Write data to file + retval = fwrite( compr+2, 1, zentry->compressed_size, fout ); + if( retval != zentry->compressed_size ) + { + printf( "Error writing data after local header to zip file\n" ); + MM_FREE( compr ); + MM_FREE( data ); + MM_FREE( zentry ); + + return NULL; + } + + MM_FREE( compr ); + MM_FREE( data ); + + + return zentry; +} + +/* +----------------------------------------------------------------------------- + Function: deletezlist() -delete zip file chain. + + Parameters: in -[in] zlist structure chain to delete. + deletefile -[in] Delete the file? + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void deletezlist( struct zlist *in, _boolean deletefile ) +{ + struct zlist *z1; + + if( in == NULL ) + { + printf( "NULL zip list passed into deletezlist.\n" ); + + return; + } + + if( deletefile ) + { + printf( "Removing cached files.\n" ); + } + + z1 = in->next; + do + { + if( in ) + { + // delete file + if( deletefile && in->deletefile ) + { + if( ! FS_DeleteFile( in->filename ) ) + { + printf( "Unable to delete file (%s)\n", in->filename ); + } + } + + MM_FREE( in ); + } + + if( z1 ) + { + in = z1; + z1 = in->next; + } + + } while( in ); + +} + +/* +----------------------------------------------------------------------------- + Function: PAK_builder() -Builds a PAK file for Wolfenstein 3-D Redux. + + Parameters: path -[in] game path. + packname -[in] Name of PAK file to create. + version -[in] Versions of game files create/found. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void PAK_builder( const char *packname, W16 version ) +{ + FILE *fout; + + printf( "\n\nGenerating pack file (%s)\nThis could take a few minutes.\n", packname ); + + + fout = fopen( packname, "wb" ); + if( fout == NULL ) + { + printf( "[PAK_builder]: Could not create file (%s)\n", packname ); + return; + } + + + // Script file should be first + zfchain = addscripttozipfile( SCRIPTNAME, fout, version ); + + + if( version & WL1_PAK || version & WL6_PAK || + version & SDM_PAK || version & SOD_PAK ) + { + parsedirectory( MAPDIR, fout ); + parsedirectory( LGFXDIR, fout ); + parsedirectory( GFXWALLDIR, fout ); + parsedirectory( MUSICDIR, fout ); + + if( version & WL1_PAK || version & WL6_PAK ) + { + parsedirectory( SCRIPT_DIR, fout ); + parsedirectory( SFXDIR, fout ); + parsedirectory( GFXSPRITEDIR, fout ); + parsedirectory( LSFXDIR, fout ); + } + + if( version & SDM_PAK || version & SOD_PAK ) + { + parsedirectory( SODSFXDIR, fout ); + parsedirectory( SODGFXSPRITEDIR, fout ); + parsedirectory( SODLSFXDIR, fout ); + } + } + + if( version & MAC_PAK ) + { + parsedirectory( DIRPATHSPRITES, fout ); + parsedirectory( DIRPATHWALLS, fout ); + parsedirectory( DIRPATHPICS, fout ); + parsedirectory( DIRPATHMIDI, fout ); + } + + + if( ! writecentralchunk( zfchain, fout ) ) + { + + deletezlist( zfchain, false ); + + // close and delete zip file. + fclose( fout ); + + FS_DeleteFile( packname ); + + return; + } + + + // close zip file. + fclose( fout ); + + deletezlist( zfchain, true ); + zfchain = NULL; + +} + diff --git a/wolf3d/wolfextractor/string/com_string.c b/wolf3d/wolfextractor/string/com_string.c new file mode 100644 index 0000000..1f44c2e --- /dev/null +++ b/wolf3d/wolfextractor/string/com_string.c @@ -0,0 +1,359 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (C) 1998 Todd C. Miller + Copyright (C) 1997-2001 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * com_string.c: Common string functions done in a portable manner. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * Portion of this code was derived from Quake II, and was originally + * written by Id Software, Inc. + * + * Portion of this code was derived from code that was originally + * written by Todd C. Miller. + * + */ + + +#include +#include + +#include +#include + +#include "com_string.h" +#include "../../../common/arch.h" +#include "../../../common/common_utils.h" + + + +/* +----------------------------------------------------------------------------- + Function: cs_strlcpy -Copies a specified number of characters from a + source string into a buffer. + + Parameters: dest -[in/out] Pointer to a buffer into which the function + copies characters + source -[in] Pointer to a NUL-terminated string from which + the function copies characters. + nMaxLength -[in] Specifies the number of bytes to be copied + from the string pointed to by source into the + buffer pointed to by dest. + + Returns: Returns strlen( source ); if retval >= nMaxLength, truncation + occurred. + + Notes: + At most nMaxLength-1 characters will be copied. Always NUL- + terminates (unless nMaxLength == 0). +----------------------------------------------------------------------------- +*/ +PUBLIC size_t cs_strlcpy( char *dest, const char *source, size_t nMaxLength ) +{ + char *d = dest; + const char *s = source; + size_t n = nMaxLength; + + /* Copy as many bytes as will fit */ + if( n != 0 && --n != 0 ) + { + do + { + if( (*d++ = *s++) == 0 ) + { + break; + } + + } while( --n != 0 ); + } + + /* Not enough room in dest, add NUL and traverse rest of source */ + if( n == 0 ) + { + if( nMaxLength != 0 ) + { + *d = '\0'; /* NUL-terminate dest */ + } + + while( *s++ ) + { + ; + } + } + + return( s - source - 1 ); /* count does not include NUL */ +} + +/* +----------------------------------------------------------------------------- + Function: cs_strlcat -Appends one string to another. + + Parameters: dest -[in/out] Pointer to a NUL-terminated string. The buffer + must be large enough to contain both strings or else + truncation will occur. + source -[in] Pointer to a NUL-terminated string from which + the function copies characters. + nMaxLength -[in] full size of dest, not space left. + + Returns: Returns strlen( source ) + MIN( nMaxLength, strlen( initial dest ) ). + If retval >= nMaxLength, truncation occurred. + + Notes: + At most nMaxLength-1 characters will be copied. Always NUL- + terminates (unless nMaxLength <= strlen( dest ) ). +----------------------------------------------------------------------------- +*/ +PUBLIC size_t cs_strlcat( char *dest, const char *source, size_t nMaxLength ) +{ + char *d = dest; + const char *s = source; + size_t n = nMaxLength; + size_t dlen; + + /* Find the end of dest and adjust bytes left but don't go past end */ + while( n-- != 0 && *d != '\0' ) + { + d++; + } + + dlen = d - dest; + n = nMaxLength - dlen; + + /* No room left to append string */ + if( n == 0 ) + { + return( dlen + strlen( s ) ); + } + + while( *s != '\0' ) + { + if( n != 1 ) + { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; /* NUL-terminate string */ + + return( dlen + (s - source) ); /* count does not include NUL */ + +} + + +/* +----------------------------------------------------------------------------- + Function: cs_strnicmp -Compare characters of two strings without regard to case. + + Parameters: string1, string2 -[in] NUL-terminated strings to compare. + count -[in] Number of characters to compare. + + Returns: 0 string1 identical to string2, -1 otherwise. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC int cs_strnicmp( const char *string1, const char *string2, size_t count ) +{ + char c1, c2; + + if( ! string1 || ! *string1 || + ! string2 || ! *string2 ) + { + return -1; + } + + do + { + c1 = *string1++; + c2 = *string2++; + + if( ! count-- ) + { + return 0; /* strings are equal until end point */ + } + + if( c1 != c2 ) + { + if( TOUPPER( c1 ) != TOUPPER( c2 ) ) /* Uppercase compare */ + { + return -1; /* strings are not equal */ + } + } + + } while( c1 ); + + return 0; /* strings are equal */ +} + +/* +----------------------------------------------------------------------------- + Function: cs_stricmp -Perform an uppercase comparison of strings. + + Parameters: string1, string2 -[in] Null-terminated strings to compare. + + Returns: 0 string1 identical to string2, -1 otherwise. + + Notes: + This is a case insensitive compare. + Calls cs_strnicmp, where count is 99999 +----------------------------------------------------------------------------- +*/ +PUBLIC int cs_stricmp( const char *string1, const char *string2 ) +{ + return cs_strnicmp( string1, string2, 99999 ); +} + +/* +----------------------------------------------------------------------------- + Function: cs_snprintf -Write formatted data to a string. + + Parameters: dest -[out] Storage location for output. + size -[in] Maximum number of characters to store. + format -[in] Format-control string. + ... -[in] Optional arguments. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC void cs_snprintf( char *dest, size_t size, const char *format, ... ) +{ + va_list argptr; + char bigbuffer[ 0x8000 ]; + + va_start( argptr, format ); + (void)vsnprintf( bigbuffer, sizeof( bigbuffer ), format, argptr ); + va_end( argptr ); + + bigbuffer[ sizeof( bigbuffer ) - 1 ] = '\0'; + + cs_strlcpy( dest, bigbuffer, size ); +} + + +/* +----------------------------------------------------------------------------- + Function: cs_strhash -Create a hash id from string. + + Parameters: string -[in] NUL-terminated string. + + + Returns: Hash id. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC W32 cs_strhash( const char *string ) +{ + W32 hash = *string; + + if( hash ) + { + for( string += 1; *string != '\0'; ++string ) + { + hash = (hash << 5) - hash + *string; + } + } + + return hash; +} + + +/* +----------------------------------------------------------------------------- + Function: cs_strupr -Convert a string to uppercase. + + Parameters: string -[in/out] NUL-terminated string to capitalize. + + Returns: + This functions returns a pointer to the converted string. Because + the modification is done in place, the pointer returned is the same + as the pointer passed as the input argument. No return value is + reserved to indicate an error. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC char *cs_strupr( char *string ) +{ + W8 *ptr; + + if( ! string || ! *string ) + { + return string; + } + + ptr = string; + + do + { + *ptr = TOUPPER( *ptr ); + ptr++; + + } while( *ptr ); + + + return string; +} + +/* +----------------------------------------------------------------------------- + Function: cs_strlwr -Convert a string to lowercase. + + Parameters: string -[in/out] NUL-terminated string to convert to lowercase. + + Returns: + This functions returns a pointer to the converted string. Because + the modification is done in place, the pointer returned is the same + as the pointer passed as the input argument. No return value is + reserved to indicate an error. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC char *cs_strlwr( char *string ) +{ + W8 *ptr; + + if( ! string || ! *string ) + { + return string; + } + + ptr = string; + + do + { + *ptr = TOLOWER( *ptr ); + ptr++; + + } while( *ptr ); + + + return string; +} diff --git a/wolf3d/wolfextractor/string/com_string.h b/wolf3d/wolfextractor/string/com_string.h new file mode 100644 index 0000000..fd29649 --- /dev/null +++ b/wolf3d/wolfextractor/string/com_string.h @@ -0,0 +1,79 @@ +/* + + Copyright (C) 2004 Michael Liebscher + Copyright (c) 1998 Todd C. Miller + Copyright (C) 1997-2001 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * com_string.h: Common string functions done in a portable manner. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * Portion of this code was derived from Quake II, and was originally + * written by Id Software, Inc. + * + * Portion of this code was derived from code that was originally + * written by Todd C. Miller. + * + */ + +/* + Notes: + This module is implemented by com_string.c. + +*/ + +#ifndef __COM_STRING_H__ +#define __COM_STRING_H__ + +#include + +#include "../../../common/arch.h" + + +#define ISSPACE( c ) ( ( c ) == ' ' || ( c ) == '\f' || ( c ) == '\n' || ( c ) == '\r' || ( c ) == '\t' || ( c ) == '\v' ) +#define ISUPPER( c ) ( ( c ) >= 'A' && ( c ) <= 'Z' ) +#define ISLOWER( c ) ( ( c ) >= 'a' && ( c ) <= 'z' ) +#define ISALPHA( c ) ( ISUPPER( c ) || ISLOWER( c ) ) +#define TOUPPER( c ) ( ISLOWER( c ) ? (c) - 'a' + 'A' : ( c ) ) +#define TOLOWER( c ) ( ISUPPER( c ) ? (c) - 'A' + 'a' : ( c ) ) + + + +extern size_t cs_strlcpy( char *dest, const char *source, size_t nMaxLength ); +extern size_t cs_strlcat( char *dest, const char *source, size_t nMaxLength ); + + +extern int cs_stricmp( const char *string1, const char *string2 ); +extern int cs_strnicmp( const char *string1, const char *string2, size_t count ); + + +extern void cs_snprintf( char *dest, size_t size, const char *format, ... ); + +extern char *cs_CopyString( const char *in ); + +extern W32 cs_strhash( const char *string ); + +extern char *cs_strupr( char *string ); +extern char *cs_strlwr( char *string ); + + +#endif /* __COM_STRING_H__ */ diff --git a/wolf3d/wolfextractor/vorbis_static.lib b/wolf3d/wolfextractor/vorbis_static.lib new file mode 100644 index 0000000000000000000000000000000000000000..1dad214fb69651950f9197f57b866415f7e0d7ee GIT binary patch literal 257718 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 tSX4Zv;N~R%&y|)`mQ5|1QYZ_op_YYSH#z4 + (c) Kenneth Arnold + (c) Monty + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * vorbisenc_inter.c: Simple Ogg Vorbis interface. + * + * Author: Michael Liebscher + * Date: 2005 + * + * Acknowledgement: + * Portions from oggenc, Copyright 2000-2002, Michael Smith + * Vorbize, (c) Kenneth Arnold + * and libvorbis examples, (c) Monty + * + */ + + +#include +#include +#include + +#include + +#include "../../common/arch.h" +#include "../../common/common_utils.h" + +#define READSIZE 1024 + + +PRIVATE W32 channels; +PRIVATE W32 samplesize; + +PRIVATE W8 *ptrCurrent; +PRIVATE W8 *ptrEnd; + +long read_samples( float **buffer, int samples ) +{ + int sampbyte = samplesize / 8; + SW8 *buf; + long bytes_read; + int i,j; + long realsamples; + + buf = ptrCurrent; + + if( (samples * sampbyte * channels) > (ptrEnd - ptrCurrent) ) + { + bytes_read = ptrEnd - ptrCurrent; + ptrCurrent = ptrEnd; + + if( bytes_read == 0 ) + { + return 0; + } + } + else + { + bytes_read = samples * sampbyte * channels; + ptrCurrent += samples * sampbyte * channels; + } + + + + realsamples = bytes_read / (sampbyte * channels); + + + for( i = 0 ; i < realsamples ; ++i ) + { + for( j = 0 ; j < channels ; ++j ) + { + buffer[j][i] = ((buf[ i * 2 * channels + 2 * j + 1 ] << 8) | + (buf[ i * 2 * channels + 2 * j ] & 0xFF)) / 32768.0f; + } + } + + + return realsamples; +} + +int vorbis_encode( const char *filename, void *data, W32 size, W32 in_channels, W32 in_samplesize, + W32 rate, W32 quality, W32 max_bitrate, W32 min_bitrate ) +{ + FILE *fp; + ogg_stream_state os; + ogg_page og; + ogg_packet op; + + vorbis_dsp_state vd; + vorbis_block vb; + vorbis_info vi; + + ogg_packet header_main; + ogg_packet header_comments; + ogg_packet header_codebooks; + int result; + unsigned int serialno = 0; + + vorbis_comment comments; + + int ret = 0; + int eos; + W32 samplesdone = 0; + W32 packetsdone = 0; + W32 bytes_written = 0; + + + + fp = fopen( filename, "wb" ); + if( fp == NULL ) + { + return 0; + } + + memset( &comments, 0, sizeof( comments ) ); + + channels = in_channels; + samplesize = in_samplesize; + ptrCurrent = (PW8)data; + ptrEnd = (PW8)data + size; + + + vorbis_info_init( &vi ); + + if( vorbis_encode_setup_vbr( &vi, channels, rate, quality ) ) + { + fprintf( stderr, "Mode initialisation failed: invalid parameters for quality\n" ); + vorbis_info_clear( &vi ); + + return 1; + } + + /* do we have optional hard quality restrictions? */ + if( max_bitrate > 0 || min_bitrate > 0 ) + { + struct ovectl_ratemanage_arg ai; + + vorbis_encode_ctl( &vi, OV_ECTL_RATEMANAGE_GET, &ai ); + + ai.bitrate_hard_min = min_bitrate; + ai.bitrate_hard_max = max_bitrate; + ai.management_active = 1; + + vorbis_encode_ctl( &vi, OV_ECTL_RATEMANAGE_SET, &ai ); + } + + /* Turn off management entirely (if it was turned on). */ + vorbis_encode_ctl( &vi, OV_ECTL_RATEMANAGE_SET, NULL ); + + + vorbis_encode_setup_init( &vi ); + + vorbis_analysis_init( &vd, &vi ); + vorbis_block_init( &vd, &vb ); + + ogg_stream_init( &os, serialno ); + + /* Now, build the three header packets and send through to the stream + output stage (but defer actual file output until the main encode loop) */ + + + /* Build the packets */ + ret = vorbis_analysis_headerout( &vd, &comments, + &header_main, &header_comments, &header_codebooks ); + + /* And stream them out */ + ogg_stream_packetin( &os, &header_main ); + ogg_stream_packetin( &os, &header_comments ); + ogg_stream_packetin( &os, &header_codebooks ); + + while( (result = ogg_stream_flush( &os, &og )) ) + { + if( ! result ) + { + break; + } + + ret = fwrite( og.header, 1, og.header_len, fp ); + ret += fwrite( og.body, 1, og.body_len, fp ); + + if(ret != og.header_len + og.body_len) + { + printf( "Failed writing header to output stream\n") ; + ret = 1; + + goto cleanup; /* Bail and try to clean up stuff */ + } + } + + + eos = 0; + + /* Main encode loop - continue until end of file */ + while( ! eos ) + { + float **buffer = vorbis_analysis_buffer( &vd, READSIZE ); + long samples_read = read_samples( buffer, READSIZE ); + + if( samples_read == 0 ) + { + /* Tell the library that we wrote 0 bytes - signalling the end */ + vorbis_analysis_wrote( &vd, 0 ); + } + else + { + samplesdone += samples_read; + + /* Call progress update every 40 pages */ + if( packetsdone >= 40 ) + { + packetsdone = 0; + + // progress bar here + } + + /* Tell the library how many samples (per channel) we wrote + into the supplied buffer */ + vorbis_analysis_wrote( &vd, samples_read ); + } + + /* While we can get enough data from the library to analyse, one + block at a time... */ + while( vorbis_analysis_blockout( &vd, &vb ) == 1 ) + { + + /* Do the main analysis, creating a packet */ + vorbis_analysis( &vb, NULL ); + vorbis_bitrate_addblock( &vb ); + + while( vorbis_bitrate_flushpacket( &vd, &op ) ) + { + /* Add packet to bitstream */ + ogg_stream_packetin( &os, &op ); + packetsdone++; + + /* If we've gone over a page boundary, we can do actual output, + so do so (for however many pages are available) */ + + while( ! eos ) + { + int result = ogg_stream_pageout( &os, &og ); + if( ! result ) + { + break; + } + + ret = fwrite( og.header, 1, og.header_len, fp ); + ret += fwrite( og.body, 1, og.body_len, fp ); + + if(ret != og.header_len + og.body_len) + { + printf( "Failed writing data to output stream\n" ); + ret = 1; + + goto cleanup; /* Bail */ + } + else + { + bytes_written += ret; + } + + if( ogg_page_eos( &og ) ) + { + eos = 1; + } + } + } + } + } + + +cleanup: + + fclose( fp ); + + ogg_stream_clear( &os ); + + vorbis_block_clear( &vb ); + vorbis_dsp_clear( &vd ); + vorbis_info_clear( &vi ); + + return 0; +} diff --git a/wolf3d/wolfextractor/vorbisenc_static.lib b/wolf3d/wolfextractor/vorbisenc_static.lib new file mode 100644 index 0000000000000000000000000000000000000000..04b8289477fb6b291d3cadea52c7188786e5e765 GIT binary patch literal 1134596 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 z zR1eOcn6I3*(myKBTEwHr#kb|GS=`~^lR3CBh7&_hjWgbalLIvX$3AoAaB>^t*m-Wj z(SuV92(Z3*XM*9pytOo zd&=Ax&-H{(TQ`o|`U%yW+Q^G_!C61~9R=5)9KXbw;^3B_CopA<4{8)!I7F>dr@3aS zNo3Y0^-7IWpUC9&nX{hlJLc@Nj}7GK?MKaTRGkwC{KsgluCtszdy|M*z%Y=>;-6LtlwBF=nF^z5Q zS##8wwFajqn4<>dK67yE3J&h~1g+CH*{gN@-^#k|5tzck5)RIJ4E~PUOU82ckTLs& zUEVMD1K&R9Jag#4k)33U^!G4e{b14KV1~TqS)bZl_nF_M#v{y;G;-$-DbMRe#{Ns} zJw#pgICaBZ%c+t4Tw6cz*Guyr4hJu41P+E^B?n*df%80}lR3J1>^wHe#gYC=B5I&V zo1E3y@Lpf1xi8kIID2ovr_VKe1MUztO5V)lqup0@@x?s8*J;@78LnYOd~*N;;+q3w zpFL`$clS}BTzmG&Sr2}C_Q)Y{VIGXIF&=Z^<+$e~%fLU6xohQd+b4gYCFY2a%=HkT zJ~_0uj9ou#B$od0!x*`1>e;(~)~9~Pi`Wo)J^NOM4~aSZ+;dx9#`+guW4T`B^vCR7 zoBE8&-*M}|^@AQUlxIB1k9l=^`5(0myw>q)-D=0!wXEakX6bSUS^qpc^r>O%nf=TA zNuGIq*`7Jh68)j){#y^OQ@pGn>yKEF^^TnW+~+#yW~?dBnYk6TPQ&KHItHQZIni>~ zk8Can8}}!3aAw?cutN?f2K$gX_%dFXQ|IJ@-4rKYZ$8_TGk$uUeMgQyYe28%#9&^| zd>&&%T_B?t;E-};ey(*?ysbH&i78@_<`8?;BQQoj#;MuULF=?l>UWNKtzl}CF=rujQyd%Tt!211%yYsRj-EuF z+lM>f@~pFIpZLBHzy$ny99c{5Tjum7Fzpc-XL_U5x$oJQx0s8wIKsgZ4sMxKi_B4r zJx(nl&m0@iQn+WZoccsADQ|h}M}4_|_1IZVBC1_C_3Uawpm384I|t z{VX$9=g8Tw9#@8+qiEEJ?^gObr~I7Jr&g>ZpS`wzc=mX~MKh%vS3TDAAiYaJ_BKabI&?)AYK zduks!@$$T5WsHr35Bl7rmDBg%L-0}wzVL-^UN7@Gf9%W!IXRHO z{@_`kb)lmy+aqV3^Jh#R+K5XYGfxhX_U=nwzyC%APL2@k_ng6=z8K&aoQUNb%^w-m z=C2R*m~%ec+Xn;Z^(Xeo>BIB-$jvb}=8nvK@;vtJJH%ev_wxni#$#+u{4lmwh)v(M zkzXF8&zgv%jyC9tIWl6Pqdm3|bC5Wo!+w#6pM&6s7;ycfr<}gn(Z_Zbp+{WTD+Y{t z&#e1*7})rJgfr$GIZWeSn|;#PH|t%ekG2g>C5({JU{)aYc=8ms*8}|!r z^s%n}s+_@>`^#7(KA(Ydx1l!M#yp>o`dNNEU*nsLfHij^(qRAY3i52>GZ^OCUp}w? z-k|pey*}?V{qu#j(|Epo#t!qW?>SrJk2+uKd|9JhZaLL_zHo+cesI2U)^LB}OySJQ zXASQPewO0z^||x>NDx0$o$Pa`f4*?0+|1_vY116s-%afgYnRXD!>;A9xs?5lN8s9? zMn8q=2wEgCkl+aD)$>cZ}E=8S@I8q{y6CGP=qJ8<@06#zpvvNfW{in2iQPkZH~^E z?MaujcJ6`R1$*mZ&c6rh%_9TfRXSs~CtW@VL-7Hlu{K9%%(mo(Kp{{F6as}nAy5b$ z6#{eaHrx;SoD>>sb9BaRPr96Y-70*z7eah?G}iFJJpZ5S8?DX75PYWUkU9U~_ct1b zwcbLY5GVu+fkL1VxOEVyJNDuCV$S_=&i&cXu&3_fhtKxb^e`90RrhCqj)7Mz1PXyd zpb#ho3V}kP5GVu+fkL1VCR1PXydpb#ho3V}kP5GVu+fkL1VCR z1PXydpb#ho3V}kP5GVu+fkL1VCR1PXydpb#ho3V}kP5GVu+fkL1VCR1PXydpb#ho3V}kP5GVu+fkNO25%_xey3eoIx%QnsA@qBv_}$lE{k}!Sh2HJE z@l8HES$8pe{ZHo5^*f;WjvK~)-wofb<@akv_sAOl_08{tJMI|9I*%6X2?;qHe! zmxkeV(Efc5+14=ZY_SgZptsN9ne#Uf_Tzyd+G4-&-(|mZZR|~^Ki1iAa&a%^J)GPF z`C)amcbzHyy?P+dln!&)s>AQ|ZolirIeAYqej7=S}_aJI|?&w*=w;twDr%TM&)!o?V9Ao2QRHw$@QwEAB&! zBQc@eT3c=8?h{=5)`xktaa$kRzV$IT4}E}J`}^XL!biJ?y#9=V@#PuQO?8 zRUX*4KJ?exI&QI?^3mooW_wgVcn*5a+~MW`cOQ%oAM>GKed(w5f&D5UW47k8i4XF~ z_M8Q)@-TO~_TqrOXG(M@Tk8Yc>?fZ`!|>XrVYnLfe9*<9>9aa?wn8`PYS3$2|| z)^Q%5_3`JN^^-Ys==jVr=bq44u8#g&9pvPjecMMD+~KVsb5jRBb0#)E)S<85q6XO8 zMdLjMv7h3~n4H)P&Pi~`Ck>zLyx+_L?!I{T!o>-mby*AgSyz2{)@}V}pRM09U43W2 z#%}#NcAwx=y82XK`yNMEJ-Fjm7df(?uJN>SoOSK1BUg9sIe{IR&N&Z4ZLb-d`uhA* zwm7dI+Ff;@r!I&^OzIWfsaNvAANk{p7&PjhF}nG=w+`U=bpKqxaq^rxnG;tVeXX*= zUYqD%i>+UL(uYgx!)fYdn=EVXumKBjX>D3vbd2M>LWx3W&f_hxt<-iuGzTg(bo>0wwXJ6_SIj+dHM1%yb$z- zppOOd&OQxo@eU5zcFYC65cKjkIj~-8ZqBnuOq+T0ygauQp4#JI*&T+5c6d(48aC+i z%+b(g4EH_a^XW6j^8h(E=Q(=X4$bEX#9HLMcHCd z#_S~ahYRn1Dd=3rHDKLq>>mjV_qp~==yBs(m++omPc~*t?4EurbN}13vDNF1vB5si&5fIFs=pt@ z!ecW$h6}g7Gz_nPV;Eix`eM+7LEpMO4DW%qqaXC(*_aD@G3eE^VRMe>c$0VE;vE~t z(fD~5dQ;FVL9|o+vGb?9!|gh|a?bujf**Ch%&0Bjpe(mSA zAjj5u*P<@moYZlSaqEjQbEJwyzYW?JKYp)-o-(^qu?4)RP+*f9j0cIWJdFAM)&*zPUQT$$N1a-gP-n zg&=|c+t!;kxGT(M)F;6iL-p{GupA8XG3=sPAyeX?%k$nYn= zjPqKEjSYmJb(z;pA3bXaJ^UjhPi)bFBV#{U4|-zH7<>Ff=uz|Dd!yTJ%)7>}LI~&R zjM<)aIcs-s$JPRV?(vk4dpM@^dX-y0tbeSD;T#>Xu2u*X0);>!PzV$Pg}}{1V9x!} zd*9T(#rw~c&dplmamSsrcJJ5xY%|u-VV<9v-e_$OhSVYWOw|~3;5UVHOjj!e3V}kP z5GVu+fkNO|5m@K*!>PN?oO}4OF61UUpL0K)bAJ}YH{$(pE{3b_&*D5)t2eP!Ds&-G z2owT^Kp{{F6as}nAy5bu0);>!PzV$Pg+L)t2owT^Kp{{F6as}nAy5bu0);>!PzV$P zg+L)t2owT^Kp{{F6as}nAy5bu0);>!PzV$Pg+L)t2owT^Kp{{F6as}nAy5bu0);>! zPzV$Pg+L)t2owT^Kp{{F6as}nAy5dMTm-%zso$5sx5=gO{Y?!PzanP1onUDDEGU3cjRtl^B#umv&+lkLifxr_ebxB>SvA(^Z3A& zy9&16=eUzHW)3~?O3@u{bMBmTbmqjGqr)1YsmA=OyC1*Lc=PX6*|{`Ke3vZiU=Mox z3|2XR@2Tv`13|RKe&4^#e&^cQn@oSq-EZ=+F38LM>S5^~$jvW>y;e699Ore}Kd5tS>^C)X*P=Lm6ckkuO z)ggv+@>Ykjb8>aaS6SxnF*0N6N87BQb+TU88HVRC1#N}Pz2k$6(ynt1;A(Pw6^0 zM^_!Ww!?7o(lG1ajylm6zv1*#;T!8T_N)i_^Z}eb?&0 zXM^8fGZ(oz;nSZ9T03>+2W?)yJPa=ceIe*$L9bm}JbOHAuLXTh!(LWcm^D%cmbk2wF`C~a>e(h&p8J@rMk^HR2Bf78g-0=*ucAjHu2z}0J zo_X@(x#m3M`S*}8B@CNV@GUC;fNdsbymOyak??bw|28K*Q|AsgU)xjmUhz!WOn+|dGfv(-e_+e=$XYl@$c;0BoQTcmAe>=*{z1Guf(UtM z5bYg7$RA^{M#G0^p66FS7wCIFc*e+m_Fao(&k@$7tz28VHko4&A;X7b_c`aMU${Qu z*&qEZ(_i+T{bXOQA8mVFe{e{jIWPOIU&lSa$n>qfTst|s^r!ro-#R|W{3*{q*(dTd zC;H~4Y%E9R=B8ilm7$aU>)TwWclgj($G(2>sb9Ex zGT-{rw&nUlt}kV9Wv!iKbm+^KD{Fl)?&+$Z?OU04`ZPCvIzQJ(tJm{~EbAGol`(eC zJmC6NUmf+8JI=PfIqmf;SFXMOvX9))`ubp=zGHpCd-as(+kW(3L!#0U2IJYq~9 z=%J4u_W*Q|`Q8Uh^oTo$$l3b}e#l*a^j!l!iG@#MkfSk?8xvXf=U8ma4|`t!A}`t&7a*oz%I2G+F}0SP^*2}MUc%S4%`vRwo($i{Ij$IDfq$M2C^w&*Ec3j} zGM*RCuH2O67(TyQ4}ZkTZ7c>pb0cOe%k$Mgh=8>O@8R5&_38jwyKlbNHi^-z1N^sj zWsHL>E6ErFc|XSX68v-P)j&ZVi( zLRbg;*xP6Dq~>hq$UT4m&kL*nKMibd_P^UF2kXh&ZEL38SJ&LzyVe%0GPSn7_xid% z$fJF4>m$de-^SN=Di3{VD|h|c$|KCRHiq4p56+zS{5wt`?HY_PzqXLnY4O;^M{-x) zH#h?M^WVdMZp~+Ayz_Y$dB*0P<q(WBhxbz*!6HXCBTNAL{#Tw>;};mvz9k&BJ+o+i(4NS92cT>f|~5 zNB!^i#hTceJkMCO)at4uR}a34u72e1U(c^P@}92iQK#kE@02dSvu^9B9cNwpt&U^o zGk31#S;ziZ-gEzci?!in)!mL-wi%my(vALi`{YV(iH-a2b8K$j+wwW1u3TN8E&OUH zuIje_wF#30wLZs2|MH%VG2k@wb?sw0<)81c!G0YZVpUrgf%CtTH0b+-IBWiX5dV(l`K{=0^Zx?H+}Y3xdipGRQ@hj* zHQIaLs4MoGePC@ib9hq-o?8k}!7p6h<&MvDGS-O2JiduZeEbjxALK+MCUT# zxz8cI)wN#bo9Y@%u0MJ9tBzb9`BCY%{(F9nIi;(eI&y8D&)m5=y6VWay;bj_~*K;Y`<{Xvl2Rm(v?Kwsc>h!oaaAInU9pfA`+vj+#EwNp9w!vph z#3PRD)fT%P+j!{H#}9q;)ei1lwow;uEM?hN8S#yyKlGT-`n|quL^s>^bX%D=`hd4O ztH!KvPM$qK*h%7q9(}0(|B?j`oCV;*8OB|KbBQ|!XBhVl&M@v7oLTw*FToBQ&JAp+ zacrnJY^XVG*moLxG3R}aAAG{+kaY?73~TN3vpd!&U+3@zA)E3^9Bo!{eZsNJYaFvB zzIpZf`UKl`*WCKmzdp@#)f%;%;$uF0zRgQaTEEDVWuNNG$9!ljZ++tvET?>D+uUz` zIo6-&4!*I=q;Ah2`p(O9p8B8bPaiGMYtBAfy>-Usi9dZB2S2^_w*Jx2GVOc3)yw0l ze(NjeJ7vdQFF)jYy}94&>wk_s=c!LQbM*Ds<2i=?Y_AV^rk*cltzOTEF*3&miA2~+uGf!P}zVm+MoydET=KIh4H+J|wiT{5IYk6)j z_vQNjn=idGyz5_@{D1PnA)iy#UmuV5JzwL4cb~&xGJMBxeRKGeU-{I!x*u6S0@r@7;JMiM?~g9L>y_cc@9uCGj5YG* zyx@7@Y~Wl#pRq{DHlAsW$sd3DTx2|Uc4C8l_F+DmXMeqZj*Xqv(;buHLp!*7xvy*$$0qw*rQgnL ze;6P5GJ|HsQ&%>Td3x&J*u zocrG!1WxY?B94Ej`Tfgru)TTau!B6;Jy$dLd|$=M5gj>w{UclVJC_!}kM7>fi{IgL zwEs`_;&;N_yUp*n10OI0N3aF&qu6uyi#=jr*bDHt@$QA#C-#ATqk$K=vH$r!N^Ou6 zM1G9Hlznnv7*j9Wp@S~6-hLVbpVpds?i+QXUuqOR>{>nakr9h}R*&3};|CqqNgug- zK3Bxa`siUxTyi9?L>zU|q3^SU-%QA}o$DY+39RUgvCkuN_Q(9A+ik9iJjU7_oiW>! zE@$oRFErM`&RRQ+&Y0~!PzV$Pg+L)t2owT^ zKp{{F6as}nAy5bu0);>!PzV$Pg+L)t2owT^Kp{{F6as}nAy5bu0);>!PzV$Pg+L)t z2owT^Kp{{F6as}nAy5bu0);>!PzV$Pg+L)t2owT^Kp{{F6at07>i~hT#~SW)9ej_D z#P`$C_%0#7V~4Td-@|v~Ku6v1&+ilTyLb4VZb#jWK^*)aM~s|5zfTT2>UJYy9Cgm+ zuMj8%3V}kP5GVw01_GD3?=A0qm#*FWxC=qtjXukTFWTb%cV;)f!End#k=&bT{=mlX zU&NGq3AWy=xckt@KYH!G5`A=#V~@_9dl`1nRGXtSC)OODIrlt%r|_z~AiuwO>US7V zt#=r9E)B!!pmv{6Z^c~DqLBv#-VZE9%YC_jm;Gi>$J$ZuH+yaEcpqoadRV##^0_+g z?{U^nE*5#c&dGZ^%GBxY+Z-M3)ODQmv42qK`1hOjfjP0+8}ehX_#N5Q0^e!M9`fC& z)RW(B%6Fd9`2JJm`@WBUcxsnA!_QdbJg`29o9jXxGWN*Cj@;Vcf!@}QKIE+}_N*

0RX&U_&v{@g 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

Lm$Lq_7hChw7 z?b3XA`$PTL-*5cpJF@-Y9O?Y-ylBs-+w1N=6w=o*AsIs|A%~x zl}mcZ--^kvd+yeJ;Q6NGxm7=u_pKZ!T=TdkuZhVI=j-n`-al8WiL={z8) zd}lT8IPsSc4G&WdaFsuPHG<)nU7O(T*;EX6Tr~da&lZ1N{Ker9AFpvd=FmKfg_Erq z-m~6Z@|0`7ziEp_#H~Ks<(1tSv1UYDF4`xIv56NWj%mNv#%q1dy>@G=PpXe~(yvZ0 z5{oZ>ob8R7+st9M7yOlcZ*H!WbynlV`nRV}?bc5I?G|r@>|y{Stn~_t(;*ldykDK)zDnEiG0Y(Cg;Z6*VAV2 zu}|M>GP&W%w862Zwe5K#X7={~Eiw4a7{$d`tYXAJk6&kNakK4waM{9$aZ9am@3q1;>w;5`yN!MN@*{H|{K&~x&NMC}pX}yE zPBGLER!;b@#f51cmv%O7Hnox;4r9gDW+O1{+4!;%ZMnxq$F1GZ&1Mb4%fA?~r2N?R zi=oYL#?40z-+_5-&2i$NHPt7l^_{lnIep80&JB*R!6q&&J1i+i`7P634#wET<*UtBeyjO`=Lb%h)>nM} zY}JcDTl3|IA9ozayXJc2i;F)gr{c1~?R@G&iUHHy#84aJ5`V^sZ`x+g#tD9L`DfFI z~9SNKMJii;Gtpz#R;+wwO#k0={TlQ>IaDK6Wr z6(0Pjx}0o#T(M8K=_@ao)>}L_!lplMu#GpjX)_1X`p&f!7Z=-%do2cDTw#k_41O@- z*iX4k+pIl4KIY*ZXg+NEWX5PbzQ^K*7YA3d=ow?KdGY2Ni9=4d#%S?KHgU6^*5kCk z#V8LP_-In@Ge-7&TXXhPjBIqg*J3nY?aB*2+w^UHXMW|}dg!;lY~`W3cfRPup1U8|4%R?%JBG z4QbvFt$F#KauMs~J8RERoMJY|6JNF&(>xxFfuHXwZgZsNOTyFm`R?mcF8Rap4HpL+ zY}{~h!W7Rs<=gy>X%|DEZ#6O&Z!zc@BaZgLdT0Dd-XFbldN=hf@pDJ#z4ugSvdiAn zha>Fsytbyq7+*YmrnF~ZjL&CExG*Q~VyGv%1rslwfBVXMkZTyYFy)o+T>IAh7R=?_ z`1_5sHukl;oc2TOpoV!y9cMwi9bA@kG;}5$D0n{ ze&FNYeu__L!K`Jx>G;zw1 z$-D2d$v^QYpU&9kCJ#Bl#v8^ts7;gUvvcQ@c5d=%p4a$cI+N2UAGyt3cE1xpK0b2U z&v9q@J_no$U(&f>Tdk^7*m9XZ;^n*NHvM4Y4p0AK_}=AwM%Y{JZ2aSJwi=gfIl&Qq<8l@&92-6{*=9^W`f0qdaxZ4wIOD1=bb+o1C^(!|zU!2u?#+sPg@>|y{`99xVCu^m~?XS6? zPVM%T{Eb%&9O0*Z;$ifSPy01IZu?Z-v}rQ&*~=r$E%}^yiWTq7Gg}y1e(QQA>(qVZ zo^@FxHk!zdR9Efp?UPOZjoXK0+Uz~H>03P~HyoKZIJUI5Jxp4|X}cu`t{HKH0*kPzBB)9rx@|kpKII3GPcFE#!|^T8)(3XREROtf6=OBO!NtxWUo~RW$Jh9b z5wBR^ygr)Wo1fkvd(ZcLao&)gHQtAjJ;+wwO#cRK_WzUAMHh$}I zvON?7XB_d*vo$^%fAh#^w}sntu?KdWes*nQFOlXGh7EW5gs(53Yc?_Bqj8<$vOQF* zS(j6-s>wsS$Z`702fp<-A2!0)oU=_`ZTM$52Qojem6y2q@WK~&j}ae@E9@SlT*JvH zU)XXv*;*?YZRbJrVbdpK@F$JON9UidxYjs48?LbQjPYUCe9uozxs;DSIjzTOecK!H z$~~^;CifX5d%k!ZKgBrNPBHK%)vmnYvrXUbt>W`<9n!P*Y~|11eI92%^(XdZ3%|!G z*Y?@00Uu&+`0>J%eZKKDj<3BIPc_(mjh}L!wz%TgC!UG?vx`gi7{=qH%OzX&D^BCh zBYwIV`G_Bmt$c8>*XJu=_Tn_2J#No@?f7uyS6mt0YDhizO;a&67khLr!Q zrpA);3txQkc3+rTd%p0+Y>wCFR?OyP9(#=Va815b+?jJVikohI@D%&neA&ar(K_w5 zH%{1#ldm}Ca>}nc8H+!>e(ReJj!m4)3w%$;d*4(4Zii35zwj>Uy!W$XXR^!QV}~Ke ziE(00$$aN*j4x@=+=7|h`4>YyaXo}7mK=8f#_*6^FmulqKY!~*CT5Qj=JIX&z020d zyw%0twV$oEb@Gn#*gC*ZAAYy`+=6Wly0@?Sw665-BcJAKy!lS7xs&eg=`-;spU#4P z|D3SZ*fWD)`!8(T9LgyT@3U)|^p5RJqQxPw6Myo_PYgcwt9`YRN4!2;&(G8Oq^D1Q z@Y?-6;Pv+|zj-#h=ZJltTwdUL;@p3g-@EiYX}|B<`LWyf{wB>OWs=Tx0mgmHTH78clqqEe*N<7_uf_KYnNwe=czrXzO9S(bzay< z&I<1p&LNk3dwzeQeLDHH@i|AWqjqPI7{-b5urRH8*t8tT^o@hx$u}PwPjlVRb}{!j z=E|?L_nL2hbn*D8QNA-?_^`zYPbbdKlW(zR96s>#+@3WlUODBzu*IVDD_%Muv5S|U@$xSwea)Aj@sm&ft)YC2lMYjk_0zjA zzugzM_-VGw<+s<_@ueldy5#4U{P2>0@#VE^$Y)l2$q&D^#+Ll*k}oa!?YHD*26yX1`}AN<|svc0*+mVAE67ngi($?v@B-25=l3FmEB&${PF{x{C&`E2gl z=^W>4?(Qk~dHX?sjyqR-PIbn@^2ZJD%#4S|+c@t0Jv(r~7&m`hY~f(FjmsAo{>E{@ z7$b5u7Ed|$tP)F`gtzwEu;qpWmf$iTCk$+P&T+XFvpi=^yp6|W9KSq_^NS~}d|MxQ zxVY4S&G?*`w%p3YUJ!G}jf2J^9-ZKnSNz&LhOOMRi5PLv*{`*YtARbFZ7;N+@)ZNd zyx7{yx5P5PcqV@}+ha}s+G4Nkm3*&t-ly~Zr}b|?%)L>&wNqQR>OOs^ed1yC*ZLF1h&Smeh(Q_YGSGAQ7IoX<{ zar>IE>6=To>B~+gcYFI}i>G~TugA~UefMEv;KL;rew^Cn)xFw$cU<%AzK@T8w(`W) z^NnBJo)Kh^VSMuGe zwBV#LqRW^Qvm*yMEbo%zK#^KZ>@v$wYFvwrMkj{&#a%BNiYK83`O zho8N0I!jJ*r){4HKKn-u^C(v_V5_q_=DX)C7dAOo=ls)RxbWlQLr(VxOnlynmu>pW0lxK?I~!rspSH&6=EgsJHJG2*%1c~ac;Sn?$B2)vPTBYsqrAe& zXUD1Ov{n0RflJ%j(0thRi5UDz?uY(a+~v*zI)F5JoMwHhA~tvLGPv<~q4?Agk(y5@^7Y<_fcj1hejUpW;6U;cZ3`NL?_-XZ9655ssWk?SsqqJDykd{^(s1w`YlWN$0)y zRA;iw-eZR$#))xaP04)cY>Y3lp0{A&CU^eDP|wFO?HxJn{>B=|bqhx9={NnY7nztj z-adi3Jo39cxmbhKI;)AfbX5=Q^4aIc`_C3X`E2c|cdf;>3s>(AaCpVUiBJBxbRPW*EX#LDLuZ0pp0cg+WHviqFox?`Jr_x1GI^N)Y` z2}i?-v16Niai-72^NXM6$Hy5HE`$DzH4He zV>)~}`P_Z)_xk_)YF`ug9H~!VUf_A+Jb3E&kBjd-b3eNWZaH6INPGP;9d_T35BbRl zzI*E-?6=}r_vdSUzs@hS4ws+&C+}Z={+Hi>?0eq}^UlJ)BerMbEzkA#UQRU;6|3KDarUi+fqFX|`(Y-hy-g8_x%(=M$`U+C8S zygetpFcX_k_1%4Ep2eCz+WF2LCw9gQyX%wh^qX;Z-&qqlemlnVGn;mj@67jFte(O7 zwr(@eQ;hJQ^F6b7-~7_OXB3lP{;lK8vl!uFcfs*kuG6QOy_=kT<(rS#&2MV{C*N}B zKlAQ=CXUzN2fweMGr^jB&a1n#P~Dt^YUolk_BWS2<>J#jk~3$Ddvi+X(5~nERsPd& z-s8J({g=T}Z2H#topb4@aPX1;)Y=~={>Tl}1X6PGVN?N4dHEDkY0Y#vYL*z4g8`k5t9yFUKk2lqU4 zKKC4TW;?%~)oRvRqs>mk8@DFT{oV(ikMQiqJrCTQ`&py5#>Fz0zh?&yK4OTc9WPw% z_{HkIkbfNU;}ApMeDlW-iyua=@}c?4k)4fCvBhdWIK}6KZ^qzLUN8jTj)R$;@+mf6 zvEr&uYy?hzbhh~7q~!%i!Rl+H#=fhL_AX{_4Q5el@D5TCJ;5^RGVD$X?cNk2Mc=dyd4% zw|imo*t4YC;L8SIyK}*Kc5&HfjK+&0r#Q0B7`1WY>b}XRxOmDRX2&_dVdLYUZ+YtX zJnhUd#@G3Jim~(coS6Bs;lqy)7m1r4M(kOu=5wmc$yVLx+_Dv4tm(@RKj$GYaReT%D$kolULql)tzn-*B+g*7{cS>dwvvAHUyy%>42x zuGrV&;**1MT3)K=RYfko=T=uvyY;vXb{eF=&w;6ZN4JO}s_TPcB zv$=||T@3!!h}|XEy?*VBYP!e8Q9j}scU9M7l*?T6Vzs{3pt)z8=gZ6mpBUN9w>6pT zAs=I>^%Vnu9Q?)SL(09J@UXdN4E9qDd^0ZJVrb78{Ed-foYrIJqV6vFXXo#VyM8uy z7d!uJG2rCnl23JED?galVKwir@-NQ4_2c#Zbk70j^n4y@XScS*Uaf5%$;p=AJo~j_ z=Y9_thy912p8LI+)0Xdy!G?=1u2bA%(AL{LvhmASUJv15ci;SJ(tfOF(>7xmH+JGX z*}~KIqd3`$!8YF|@Q_noPPS9rlkMbdZq2W?tB*sj#8~6{a-RL>(wgJQM_gQNab1hi zcy-!iT&sPt_?OG{#Yc>lzqYd>yz$PYQ~jz3-ndRN;-~T9KgIYc)_lL;F zea@{puuZ!<%050@4hpaV&K^GE1wyo zb!X#SzZ!^@-zo0N7M{jOaA(&S@8ny~r+H+HhsJ|%zd!WZABxes;hAycof@B5*=F3+ z+;-cw{Nj`=ZqN3(n-^bvak7*8w0>N49OZ31emV~0Vv@P$ai8k9+r$b#>!V%2c)PFh zYQL{X_Bhhw$-6o2_B{rCT;;jj^vUGHFHSbPxbe_%yYIw>g{cmWtGjmoak1xDd}Foa z;v249ijjuF$4487K7DzC?-Tl&;Zy&+KSPEy-ZR0N^&|bf z(ld#Dp6TWfQ=Fb#a7p_hZvJd@&)^|2@f%O#P``L-_Qv?PreSt}nAS5tnr-^GjypeG z{$Va3lkcbBvfkDSZmy|%lWNr%-JUpM!d=7I3;S5>Qe7LTi?L&}(~Xs@HN*7~#yDI) zbn)}2Z^e9E)_eXQNZWd}Ce@?+QD3_nsAF?CR(oRDs}p>66eAwGdt$cXv*WIfqx%Pc z_G_41V#U)OoB?EVh7nH=C(Ql-EAESL&blt>-Q~XN-udiv+db|Vo?R}#@UC<8+NGxE zVUOdG3%nZPP&b#n*kQw;?hAed1~FIkvZ-f;G?G zzrLDI`8Z&2{r?e~gF0AW`)2OT_J{eHUza^k?4!T)+<5QzQ_t2L$h-WmT~FDkIB}JS zeK7Z%+^hStBAw?p!)yI;Z0E?ALw_3)6doInP+dn;7qk z@K3?wocW#j;+^r~Cbm3b$>s8&e&urco+bW1=&MamTZ3n2CD`JM-Up_Wo0` zyZ^QRL-}3vdD-@l>v?J&+e`MddE1Zf7w5C{=MziZlP>qLK8$gFnC{bS8aGaI4YS+j zh5IQ!^Ss*muJz6B+SqIR%c)Ig|3{_&u>Cz(XXiY(I`?Szkg@JT_anRezp>sm>W7^g z$9$f|Ieo)tOS{j?iQlvv+xu+x3;k5z>BqM`08|N#A?H*wP(DO&yLsceeo9G-GBOuXRh+m4mo6`H_tP%W_iLc%J;Aw64 zcwzb0rmy+tpN8FiU;jPV{Te$@)X95+8hJNRFYgNX@9FnHTW0^6B~Q8dICFYWnP-T5 zWQx6el6hwFpB(V>UOV}-y$p_GzexP@dKnzEX1C1UJtBVhCp|fgJ;pOR;(E-dIZxl2 zLwSVT_4F&|?jPnM-;>X7+x=(17*p^5jZHu86Ye3~?qB~QpM5N!bmRK9AJh3x{g}@_ zK7DKNn8*70(Xi>q{O0(JoLe9Ff8WEIZH~S_=FFa2J8`CaPwZaxOjkqax-;MJ3}O2$ zxu4Tw@QJUpk8W*X8KuJ1c%;o-c55lwZ91c*{?&`o)hgJ#ozuzIWv2RovbO zVAKMSnCb-^PLA3*;qb)^&j!QKT;fglJ6W}1!z~sb(!BBGHBX${uw-J{2|nD~ji=+3 z5596yyD&2ccJblx=_lc7wqlo~7~+*@8ZN#taPh&FgV>3Ds|7y-OSJJ;qxM`He|dX% z!JjmSCyX|Gf}0pG*2FY_V|>C-%(P!?HwSrZmw){6vR8{Rd#uK1tP@YM;I+f&AAk9% z@w#5g-z`}imvh;D(;AuE+#jblo7{=ExoS_}Fve&Lb?SZIn#qBfYqhRM&A<9oqsHwwd#riPdm=u*?0hDV zJxkc~&jw%H`9t_;7ng0uXk4weamI0q3u7E7E}ZeRXT!rz=KU47GnB-aZ~ip#eA%BP z`ecs*zw>og<5zPSw%T&T#a4a7h&^l7d`@*a+2F;Qb7QLp;*jYZe$J!%oou)oFYo5c zZeHfs`obI;@;}8m*{;P9 zR~#|P^sS!Lx3z4I_`}J&Jhffcr253qf7UPijM4g?Y%@lGf5H|Ieo~#qDu;5$8-C_e z?I)i(_*)tCEH-}jy;l5Z&gHV(iqkxo+ubFn-L}Vok#p-N2HUk5jhlmd%^3Qw*3kT1 ze5!$bT>PgmTlH6qdGWz9?ekvYXY8@Ka0DNGxn!4aHo5vnQF7gci$6v(DPhuesO9kuCnXGB$IG`x-8L+Io=u;<~ox zdoFmg(ecJZ7el*oHtlLK>vEdg$tLIG#5ZmDUt}IQ_?ByV6o^y11wO*ot4BiV?rKuX@eJJnfh2KG!2$ zbL3n7noo1e-kkEqXN(kM*6(DCi^g9J-0`#FNg6x(hG{I$w7Rz@#iZw&Pv6?*vg6`y zTwjd2uZ-2de4G7!nR@qopWapM>!kJYykYZ9uwU9Uv>LT)zfnHpgLF_tvkyu-n^L z^h20%AD8u>zXzJXuj?LEkG*YvYGbUuT|M>TtKG!Z=0AUTq2C(ts|{bfIPM$m?w=jQ z?jD>N`IPhIpK(t-#p<5EhQSlIzn_?OUBh>m^R3^tefGKS9`_5+UgqDI6+?}$-8IX>HsPd&$Hdtz$O z@!9^k{yl_!)V{M1t%2WHnvcD14leiSJa6m)vd_EwKF+yUsz;d4il<;7iWy(e^`~IX z<63_4b%s3!+g$1Lizn^f(tCyY;l+gSEDH;_zl%1Oj*kwzbM+n*U)VqFe_z(w*IAUd z=AFCt)!f&+5A122ee&sty@n5yKE-Nm*Ash+JMj}c?Wgu*T+`=OVLz_tsrgzfh2WpLg7I_OtuX8Q`9BFT1B*?&;oh+-uGQXMh@ab&tb- z{kieZ|KI)fkL=$`lY3`&XHaLuu8o`1JoCaBdrYQp*xrBkes(n`V!~8Q^`9y(7H9hIK6^jk(>!Yva3p z$M5|eKl?j&_Gf$g>}|NjSbo#C`|SORo$dHu`vBf>umlDlonJWp zILkAeeP9fBz7Oc*6IZ=Fv*h1gj8|L!a-*w-+VBxC-eMTzON@y#Yf=6<#aC~>+W2AV zVzCo^xWk2^Nh zme?nrVih;va*cn+T~x2+@3rneUoUd^qdm|XncLhSr#741No%b=eZ#0j?OQPu&&R%P z@74~3pEN%4x8xHKzv+v!{xwYFVz29!tdsSzR@TU6o!HDxyS(+Qbv0`K)u$RYZohTU zvdw!UKECY6CyzZ#s*Uk%@U@+JBz|^rJBM*j-rD9BN46QGwph5jxAG}29+(r(+U< z_qP`_f8%^-{;+I&4EFG}D;rIU@z|Q1AO5*+`s}T*e)Gy^Tx@b$k2$y2v^^d_yLRL1 z)qL@@H_uakrx+(&F>qF&Y+^LG>08{1;|tr~;2R%%?bW=yaKvxSnp8i$d`L0i!(}T* z*ka7T%h|`OvsnB|Ipf8_XXcV^&v(H-unz6%S*zmjIh*fpYmJ)+eisgSb{E`3F|1`= z#i)MS@!@r4E3Pp$Y`%P5?D4?DOdCEnVmzMJyt~-Mn%BHnj1h5RPjRco8vaI%a^YLd z8E39JPNIHds}D}nnzQSdOXIl9i)Lqoo9oe7wKpFZI~)Gy7`HLv!Z+^RR#)yN> z9E-ue^UXCX?tBr3`AKdJC^Oujd@vi)giRsFhKf9}TT(I$rfs^eN!+7&q z&F9y*=ik+}M?F`Z`}6GAw%6x=565PY@=t5qPlPRddopRyY{y6x<)1>;vG41){YrGiv!k%o! zpl6JHTAT8M%a-rVZ^y-%uJ$|swKd;k;5pgkw8z+O#!ofabLMxl$+@}97vHq$lauc$ z=iL@}Jk@I2vz=nF$p@h$nEzc}XSTH>epcz{8N_~VT)SHP z8D|*dVY=_(Ja6)6Kkb>GN!=IaKv#2PN#n-Eum+^@8KYdo@XZ!?W7dh>g1P)5_`5pw zw5F}w>30sTdl>t{dbXzR30$q)Etve$`HR!~6}xq(Tl+BOmA$p4+dtPZaln0C)_eXQ zX#T!VO{>S=Hot1rTw&*WR6F)+l}+E;=S!;%f0%gqX3wT}+TCk2ZuWe_$iG;Vzqs&w ztbB1A*Du!2UtIcI`S0qw&(z3V=_&IJ4|~G#>3&U5Tx*e@TyPIz8%v87&#rf_hp=;= zJCAjpwui72$L}F*y!2yOyy57N>)(O6*X$E(>UnMr{Jv5hoG<3#GKYEIvsx_syV@&4u6&%J+n^B;Y6$=j>_&a%C;#(sQZejK0u?~Jh@=6in6QhVRpbUD|F z=k*8vz1IKh7r%b__ka0s@w;|8b9&yw;TBgO_{5O|ewXLb{`}|94;R1k)8>bx++mCp z;}g?7(kCBW`GiZ$ZSupCIS$ivx98<8KKXf`@@tMezp7J{*56*b6`OUeO@8s3) z`R;d^Vojg;cb{^i`J2bg2YzD0^?Op9kDT@x_@+!>Ycc0xOssO}r#62G_pz9oLY{im0x(f2P=n>UuI-zS%-{hwK44u5uudHui=_4sp3tnm*nQJWuH zVh?|6i8}rHCGz~?CC-2!Sz@k#VTm*3FD_A&zqG_We{_lK(@WTYM&}6^AN*6qog$xG zME)OzsMnMinfK-Ln_s?M{^^q6Sn}&jer?IGEcvA+{!QgyT=KI^etOAIEcq)-KDFe# zm;8|>zw_SZ^0g)Y?d8ued3VVhOFsBrhGlzmjV<~7k}od#+LGT{@<%?ixR!is$zNIW z6H9)2$hjQhmB@y3!rv*ZVs{NNJ%+n%NQKG-;gOGZnAqku zYawp?E?xcUYFsULzUq}vvEzcTu5?mO;N=OgCh~9Yxbe0pt@Il$G1S=Zg)o!mF?*Sz)o>~rIN&A;>6+AZ%|gKJmo!{233XwNlcBj!lt zNSd=fB0s{WKWjGUWG>`ni*NdB7th?u$tHH=?v3t`Y+|xK6a#Pghhm6@t98kzxN~j~ z;Z8Z1C%^7pw(Rat_8Ft`6W_@e7mbf(n{gkimH5s3p<2OImzhiPPQItPoou-A#AO~Q zoBhat<{Tf*pIJf`s}=icZu#zOsZZjQ z`xNg`^dBf>(QDtr?m0v$2RRxjUncY zyK~{2w&Lz{lhb23m}(x6+P6lH)7RE~#=yll8y#n z!i2kqk;^_NPtsm&e8$)@#iko8S9=E6Lzwn_K6LT(x6axV6OKKByFB`{xjWD|xUAO) zKQH{`GwZE>*DmukCpoB%eAQDP{N!OR?K}MTo&8|1y6jK(Pd@*Eaj$;~J>Zh#++SXV5 z#KC{&9}oZ5qk7^g_Vk^F>VdDeSo_Ud2d`WS&PqEmmG2Qoi@0#mB)~5HA4?Z`4 z;n~alH!|cYKXZL-KRon2!a-U;d`Zub9diqIa>Bhjz5#MIs~|37>8 z1DE@F{}24?@9CWG=CBYlAroRDG(tECA%slZGK~;I2-!l&w8?}_2#pY8nGixIWHJXK z#6l*7ObEZ%>vf-ZyLSKXI-N6o*}5OQc0KRwb6xN2&*$%5cZa>_cG_|)50}rTPPlf{ zm2uxPO}E`Ix4N_cy(0&NlZo~H@%eRa-KJ~9cA@d7Yvb3QO&=Va-^Suv z&N0!fN85EKTx`~}IWV`m+dd7~#^PJM&^9)X(Ac5%+0Oczsg2Dev>%ISxor>4tq;5Y z`}OH?^;u@eTIhDZx0rs;`j$f5`1Q;d-`Y4g_(1Tx6LrXQk;b~6zWb1p6Z~!izstby zF7UewgGj-bJxlNyzhOyPgz_tgoGU2iaXj6NZCID*9AB&(?jFE0JAdq&&i7`^!kx_WHGI(}XIc^lhUJB!WS#^bkPjNtS8@ej`SZzY^N zen&LZ%i{C=yJ1P0&cEvZAwGxlxS#ID)3nSK2yBqsryYnhjQ$8eDN6IvB+bL#~P1Co@+dAc|P;F{4V~z$lt{G@#A)4Q@(60k?^Z3S@L{Z{K1fO7Z>x~p6Jma*neHC-IwfQmvczKDa4}iV zcuR}rkHzAI%Pp4WON(pULu0Yr%B;?8a<=i?T8z+qHnFVER}pizF_w3nq3vdRZ}SSx zXKJ&wZK1LJ_e*O#-F81lsHbbQwDQn6e803dOWW?pWZkbirp5nHV_Tfid};HWX}cfG zA0NwSYB$q1-s5=hc2z!I{q$5!^Hpb?~a%_e$I(=TXNgi z{Oq32d9j?^nf$f&&HDcPaArT@%Ksb7xNd%Ot$RG|Dp!2i)!)+NxByeS{|o-F67$txsdyb&xPEVd@f`^ zd@f`kdY(nj=R%ervE+bIR=AlEn;-#d$3)hK<8w@c3l% zW7)p)$HKV&SggIxjWHOT$=2NBgqx4GXFK0E9*Y+m%f@75vHqD`ERMmCW3g;J)5Wmy zTW;+_b8h!z`C~D&j*X4B7~x_wmaUPkg`cx+xb{}==QcOS^J9b?i^cSFKbDP&bFx@A z7r&l)rfrO6Yh$r2w|16WyyuC=#(y7qp#t&`1>Z7umRL+!^f^BTP=5?{f~ z`_lgo-{thh_p=lwsMw?OJBXq1{hIukChy492wjwAJ;`JC?C7 z6YE+VzPI{}&%T+sM!b$P@wyx?*&0|(%dM{6Q*6wPZ+);&&W~&C*RwI(x^XNVtJPs{ z@oazi<6u1Y&wAX>x|Y+S{j(m&ZDaH6+BJ}4W!%vHVf%~qm>7d&wJ|VfZ0py?%{eg^ z$H_WO+$U_$zHA?`jN5pwurEs-BNN|;Gs`T7Z@<1@?t39iui6mfITma|kWtI)rP> zIMyH6#MaTu7}M6uw%b0jF|pjrX441Th3nVv%i>v?-$%H)`So}%u)SZ#_f~GPdHylk zd#l5;rS)NL{675nX2vr6@mW5bwc@;IS}Sh1`2JX|uW)U{&CM@kOiMOT_QB+rTiHx~ zFs`+ksSnn%d02g$1IxqBjrGEfk7X9m#%MX$oym`FWubkrj$dXmLi_dOu?^o_UCUX< z>-bl-&)HAt`1qdv&9px_AJ*d>xIb*4@VzD5Ze#b$XWNIhvH1Qva$C4QLd*O%9E)vd z&Sc{Yt!L$y+x`u0$Nk~AwU{W6w{FZOOJTOTTQxe*O3?vvII|Y5Uyz^VihM{5*7g?AOY|wY9Ym-5*wN?U`HR zxEa&>wK^>K`>^^J%da1<%<40@KEjnTjwPF$AKThm9mcSFe$I7gUF*ZPvD}Ym9C=ag^b-sY<%>V#`=eeiff<^q=v~RzO z7)(`|a7*KPGG*p)vfne*4h=t$nz0Oc%rN-}Z$c$8TrjwcPq=Zf%)c z|8_617}hQ{xAvC%{aXyS;daZdE_2qmoDS`u_aT<~{rc_A*01H(x8-)v^XvQl&eV=E z?4D@tEw^@|x%F$gwP)`CoOkZ;%>Q-I;`P+dIXh>$-+lA?V8?=;Ph5N2_DN_Rma~o3 zVg2Rli|rW8`lZA5W&N=}`~5Ebo%u}nH2<1R`}aM&e}vZIKAUY_YiqGW??bkoxg8(N zQrB;9w((g!%WZpTZrlCbufuY__qY4@>&{fqkF&ITeqFz>>HJOpeGm5!j}y*;&(Rzc zfA-6Bhrf5`dBN)-&lSG>bBk@*mi7H>CF3wIW3fHkFqS>5+cClR{@SrmJ7?L>;@J57 zy0&)V+SqX)8h^Sr9M5d)a$HQy(`Kgeht7lRZPzUux8+vXavPJiv3ks{j-Ok7=Cf(T zdTej)tj%;WL+e?69tTTnV`E}&$C}0SbBpQctZ&J$Yxe8X7T?-@oBz(-&K>4FzM0IH zTbcjf>dq#2OZj;L&*AUt-+~sysmeL-{f;B=fHi$etB&1dcpe`&u2bg@?7KnhvyofHFZtjBh&7p@Jjx9r>R*V<0k zpY_RhO#VJtT7TAtIs5k8PS;;(8@pFp zJ#DPEuFToS(sX0>`?UF4TYEqEcjo_oEm_)i$gV9*%kA3a-}~&kVfoTxgl_*jV%mKD zYm+}d{~Qh-&vfsX7IV6GGnLzz{CuYRq1$+FvdpeS%>7utL)*^gy~SOgIR4l|#~3=! z*^I@H;oHV&{VhwZ>Eie?Irn9W>9?KEvyC^K@mU|=bWHZUEaRK)IIZ5YN?{hsW^%f9pf-T|*? zysq(D&UN?i6LyT)XG#0n3a|aFXLZdM!>&2Z*_Ju4q4s%{x&Jd4Yag1koy7_ri;ao7 zKL^&ccGlK%ZnJj&cxX$EWzU`#$NCO^Z}F_H<@Ood;&5ITgZ*1Onr-|s@x6VPw>ZrG zSpIy%#R?sVACI5&{a9?zcs2&hdCXfJ=KMP`i(}`*OylzB=Et!Z%q?+DjA`rSkH>FI zhqkfz%xzp8D`SQ3FF%&GV;S37d&_N1%>DJY^|7&pwzc;5_kaGFSY~tMx-$mj`D3y6 z){Z&Hz_v_$Z?XM-&vv16v3AzR&;7VGV_7^KkDs%SwP9}Kv9VarZJ}#qak!0U&cyNA z7%gYH#b%kUkL7-Qi^npH#oUi=@t89P*C^b+W1m*n#^R5|=4WN0v8-RlV6yjC-(p+N z?bZ+PC7UAgrTdEe@A>x*ax|;i|KESZzjqMahr!=-@R@=4IwpQ@u$;E!|154M^WMbm zeolYg$)C^Mzhe-*e(+k!dkoi}`*F6vr{X!!zi0m{{~ZG!Q~MzC72H<~hj4W%=CL>3 zi(}@o#OoO6!D}dUCjMI`+{RdTjPjX*bG7YkXUDZ2f854(;rwXpgR!hVb6ykKpI=7X zz0ulRyU^UWvkm*R-1dcCe_78G`((L|k8`u}bDTC7nsNBv%4sHh4)7gXhw)jDb%nB@{nbl!^ zmg5!n@7ew9Md|`*>;w5yS=x$a_&}U?W~@~^vkV`^JWa@ zOcvkTvW)iY*l}Y0SuDP{x_%tLt<~}S;dV_3hS*4bZIl<8$ZTjJc8^%}r^!RW?MUs)8=n;^~X>1_+awOd91O_Ul-2N=4rNL+G4ZZ%6$9Bq-|$>me14& z$7JtUv;J6S=Z~Ft_N-`QXB=LySnl`1a<;dzus&l< zSLVlK9mey^_@2r3FW17x>8}ghFoi2)ecR5lFoi3#*c^N4np%5*{aD8LR@Z;exmX|E z&iCw>$0y@6Sxl}U&H5J0-_A0&wfM{#kL7+F)?vBdmTMO}UzXYUtUueAe9y$~Of2`` z^O=BUejkj_m^NPMAZR|E* z+fP;=dQ7rBG?riH$2I$FYVobiZ_Bco_PO7$)#I9T?991;Sk9PCwvAuwu`+ARx^@mShQ(vQtixo-sXrFhv+$8kGlRpN$Rb79d+qgpaFWdRY z0pBx)_RGH6ALGzA7Jq-R9k<*5U<`}LGTR^4p7BCs+IzO+i*pO@gY856urju1zih`c zzGp1v)^F$>Sl8blc>8Z_!214vv$bJ8zAQHTv3fMyF*XxlejgkQUyQ}}7Q@QemSudg zJ>N4X6JJ(lIm?1EyZOAh1yB$B_$~abQZ`=8v@tLzN%l$H| z$DG?acJ5oNYq?)$ZMdIVZf#lDFSBwxR%|W!p2r1~UuN|zK67sO`(PR0`(^Cc%B((f z8;g~(j+ITfKe$$Q{b66WR<@5=#{Mi>zkWIUWAfWteJitLg!LGk@0qL~bH?O$n&Y-@ zEVF(?KQpin`(P~QtjjpohmF(9Ef0;)IM#=?v2n02%dFhimD?GQiTjr2w6&vo9bj&4 z?D`Ncp2cU*J}nk=KZcq8*fGWWmRQELw0&-4uzh6voN@iJSpQaL^X8oV{lRi3TYK&k zwq+Unu>Hh1R&H(lIr-Z;4}W}C-|xf9EIzj}o{iV~^7oHzXMDD|y39k@p4(Z*_S|lD zZJ#o?#A`caTAvn+W#QT~HtRCk{Ft&QFK z;C9BddDwQAGue6TkI(w#m@JOXjXB$e#$g%zu=@6%Wi}5RAGg_~Sm9xIR zr$hT@JsT@?&X@K4c&uY>Ew0sLJd4lV_Pebcb0%(Mvi=#z=EU6Z!`6XijA!rJo-ccE zZJ6_AYsGc3er&C*FP4WZv#~MfTy4H)8%wx87@O^E9yI%~e%L41z{bto#!g!~%UCb8 zEyuvv){oU^J?q!TY4NNMW73v0KFxM4XKvekvy935_2bz#%WWUAy{(&_msZAd)@K}x z#WIeEeXxwVjnB66J!A1@v8^6syO6&h{konX`OIn0i+q;k^`1X}9BIYe7t_6L zAF)5ypRqW0zBoUB|FgY~hi(0}VH-Pl7@PC4|VY%Esat}V7+?1N+TW81i`j^#FwWo^TDHXp{~dyB=sZ9iCC6ir^KljUQ&O5Fz*VA6MUOZoJSW*}~|E?Tzu3*OVk8N0& z=Nw-==2^zvj(?srzU@5n%j`VnHZ${3TbWyq`w7Rjtp7$qxcPCu94F^&$A7q-*NAZC zvnlh>f!Wkwo;u$|AImeYZ)2PPWM6)p<}HK1Z-VpVj$n$#rDEJbw7%b2;C$E|Wd)TF!R%*^{{?j*)%%$+j_PKYq?Q zej9GHwpNdAI45h-r87v=9a9UwPhZz9?L>w z`)&O>S`4f2x8*iV&Ru|W=SZY2ks^_r9&oO|8z~3g0cAU48`60Zlo{_*?_J^wiFaK|L)#4)qJT_@~Z zWjT}8VeTit4P&#NwXxi9%QDunvH0V$e*F06&^CTMs}q|0b;6B>^?6KNJ9@e{R>#ln zyqRg-R^RIKJw2N?;oACT)7koBZgs-tw%xC9WmeyRZ}qs%Y`N99ZK3b2o}UN*J>vRq zx0Ij5;@|1YLEW6M<@|GnL-?uHjOQQESqxyAUOe}i>{?{k9Lu@QKgVpnI7e&4bBldj zJsz93o!1kV+x^duCx1K3xScucGWW;Cc%jET_mB0@HvV;l<6(VnXFoK{Y<$)SxAXPo zk{A0WRro*re{*Z_KfLqjrard<&Ta2p_mY&7;~W$3ZNqrh{9kxg-|t*6=E^*C$6!t~ z{rA68Fh&0EhWB85{Qw9pRiyhk%vrT^jon_Gkb;hjG>^|=+8_I}EH zY7Oo)$KxLJ-~8fzb8N}|GD=_ytC1?E;@ZUw&i6`1KW=iIjN z`(tihmVI5qxA=-mb6&|&r1Cd|dEPt0eAV}ZdF_Y6{LArRUjA_~fAP~`p7(h$Uo~O} z$5(BX^0>T&9r*Wv_QKaqzRYRDzkK(QmHgl4kxT2o;i()|DSR=Quli~*|K#;0n(_eQC8v}D21M`{YX=AedGmO&`PeB4cIZyJ6lu!eL2%i<9Gw@{()p`%6Jyj=E;0% zF&Jm2#JT!0!u@SsxUz76Z)fvk9<_{#e+SPs@ng)^&Q))}{OK<{I=6huAK(ANe3x~O zetmzfmetF@Z+ToS-@au#yME#n(cj1LJ&jD)X`a)ZBj>|om&dUGZ$sF>PhoL*e`Vs| zvNGAfZ^M84fhqLgm$iR;mibCc690QJmUs@XjI;{Us!06r-TME|X}Iy(7&%Vb&O86y z3*B#_bK|@?Cz}iBVdJ-d6PM%VIKzz*#dyW#D02&^a)Qb3U*OzpZUw%+72pYiWaoi8 zD!(&FdBX$2+&=&1+#h^j_;@hK=aS&(h`a7r{i**O!!^f$+56C3hdL_8a`9IG2K#H`&`oU)y8x606-==Z;YiMKq_k5+C;QLjUTnC5#l`q-;Z`WJ9 zu9iHSqXn;8^7EteM}qHbpAP0nj!b*KweyngXzunI*=NLFI z&S|>2SX^6Ed+xINEYDnQji<}4Pd~Sxsm}CsTCOkW#QB6Cr+n6D43^u^zS+OULzAgj zB*a*u`(>t|&)PQIZ`Qv*2eUsHTTefq8VJDk4L6S2{LIC7Gk1_T)-OKiw9j}&8 zcfN${|C1$i4V}w$$CY1hbG3e#HWz z)$HGpv42O#_Rn1Y-B;wcmpU^Bey4^Ilb$YUhI6-&(TW z%Ez|n&xh>A^NT;b&Dz~c{_k^te7skD+s3CA%6lS5x&6F+Y5NyHPgngK#+uxR#jfvyo`Z51DjgRB`PhUm&0rUa{iFM-;f6^A~($)xmUX69t z5WiUz>pCEQwy`V%p6$2DC@^}82GdASQnk< zT#A&tfphCfRS+6s>%>OR{ZL9z$8Qs*v>!RQVXz*AV$^HTaBdT67{dQhmb9gFn@L4b zrql`Hf7m*TEK91{$~pduGS+owJBR;4lgPG{3b(}`mg=A#rBrNM6x@nUy9BpFxzaE; z;j)YB~l^69wya6rBeU?_%Fgq(deoySPxwt6RZc7OWo-7cxfD}kXnE0+)2_P zR4Ek}6m|5~&Gll!h?iKS+ru57= zk}$>lq&%ows>Z|~lzN~ZDdkf9_E9Q;dZkh5F)8UXd;>sAhPIGWpsl1-=*LnTw2hPw zZ7XF!d_0VGna~bW7POO;4ec!DKsbC+ZxMup7RrTis6u(ro>D%vw^RV(0L9iqXg{e4 z!eNQBVrW&V1X@ihh2o_$h~IIHb>+|sQU$c4R0;8$jyUt6m8ELvK&b{gNUDVnmg*oJ z$Y@ay{ak8*4v`um9KP7v1mU2CnjsvjPz!W~)CwIXwLwQq?GO%C)a!tblRBXjq%H^t zD7JP(CrdrhDN-+Vn$!p3z(c)$=-1L>=nQE9!Xb#QgAfiuXb5^p8ipR0MxaNeQRq== z40>D|ht8EIp!1|j=zNK%&Tpk?=mIGYx=;#07fB1Di={;9QYi^SAdD&*x?Dlp ztE4pOYAGGMR?2|>C}l#|OIgqjQZ{sxlmp!?ErM>9a-rL#Jm^nSK6Hmv0Np7SLU&0; z&^=Nybgxtb-7l3w4@hOu#!@--BdG$~RH}s5kgA|HrD|v`sRmkGs)g2->Y(+cdT4#A z0op)ngf^0zpgyS?dO~V}{wlRXPfBf2ztj#rC3Qf5lRBZNr7mc()D1l&rEMJHUXaqE z7o{BNd8rT@kcy!}sdTFdHzbuouS(U>D^er$veXQ{CKdiT!o49CL2pXs(CbnyG%VFa zBU0`*5pGnN=wqn>`lnO` zeJXYA7~v+QPUsUUZRZI0g_I6`Ddj+)ONG#+R1EPuo3XAnH^N0rZBUHV4Mj-B)8Kf^+VW+*qZcOge#Jgp`S__(7{qJ^b;u` z`k7S!Muhu?)BqhSwL*tT-B7XA3zbNN(BaZJbeJ>=9VwN(8R5#Ls&^yYF;d=p5w29q zhmMejK8$e3OT*9!(gbvzv~WDal}kxbg_QC|gsYTNp;M$R=wvA$I!P*oPL&qow@JT} z5}{v9Y0&9X4pb%OLe)|cbe2>Bohem8=SZV5k*-D>gU*(sVt#PUmBYq>FT9%=t3!OL8QAtN`ZbSr9r=!$`c~pB~k@+sZ;WP@9wnwM*I1pQHllcBu&Zv(&bBr0bB{p*y4= z=q_mx>Xe3|uHe?xNO!l?3*8f}2i-4?L-$FO(1TLJdXes7sSN6oDxh8|uwkToOzMKV zrEcf}sb`}|_k=VE^-04}e{gGhr2C813q2x5UmWTFD#bxhN|RScy2X;aD$+e8B|=Y2 z>CoS#Oz2r@v^mnfAdNvUO3_zGy62^2Xh2GZ2BpDkBHfTQ1idPaL$64IYa`vuQX=%4 zR0h2+)j-2i9W)}fwMIHz5_r9Wa7lm?Z;W)KQWErzln%WuErR|b1F0Lr z#Q{+kL+?wY(3mt1jZ4|>k#0iDfj*H6ppT_8=$}#r^r@75TcrC!N`bzVGNI3?Ek=!a6;mQij)DILN| zfEGE>22vrECKW^JQU&xQsSesiYJfJAqO+r1h7<>FDkVc(NSRQklnrG`4ckV!Eu}_i zD=97~%4JIdXj>@-+D6KPww7|B?WEeBqTG&B9ki3w4DBFwLOD`5v`8vl6yCH&C#697QgL3CE09W{{iRB1KdBztS89X~ zklLVwq#meH>Vt};%sr#r&!oJ9C|4{c?;quUBBekFOJny%xe{p{`lS?if0R2kSP%Mz zlm;CpWjq??j+8Q?qoiEu2&ot0ES1wgR$4Rx&u~IX1jMNGpFBLx%)NsT*pPdZ8w1;agFzSxSU(3qc=g5NV;aRLFguF9J*1Ogl>@v-idPUQs9Fqce~UD zwMpI3%~E|)wEMHv0O9h9@wGyC1nWT^QZLjg^&b}Px}?R>z0wGDkK_)Ic6Up0(0$Uv zn7ER_Z%7+AWs)p=YFF=y_=p8jzw-i*|!jQB|~iK`Mq` zl=^=a?S`bq(5uo2^orzu9qnG0;-J^0{4=B78&U!Erc?^OE>%OrQY|zhWtBmxsSH{{s)qQh%vje51*B$Zq13uUj7yZ-pp~U===;(Dw30Lgts*t97~@u# znxHkLc4#%J7fO=)p=7D{`!Oy>s)N>+nxVC%PUr_xH?)ql7+Oyng;J$)C`~F^Eyn#& zDuvdUs-TUe253X63ED&&Up>a9OB2w>Qt6s8ZZoM2+FYuJHkBHo45=ByLkiY!BqhdW zNu$t@CAW5r+e%7;@bH0pDbUtZFSMQ12W>A6LEB0b5FS3z!mShI@Bjhjt{3ALNqNxD zQZa;w1#GQ^c9g22U8L>}V%+Xh5449g0PQA?L3jv2+X*O73TznT_Lfqiy`*$#U#S7Y zEgdb|HjQxyNL8D~xO}M^+DFQ7ig7=Y3ZR3fQs|&yJ*ZHsg^Hy5>tbB7)BqhKwL(9a zx}l#*z0fbD{`MGmn6wx=TpEFXDY@HXT!|D1l}g>W$G9@72Rd3BfR2*Jpd+OT=oqQJ zBgP#sbwDRbz0h&e5L7OWKo!y?bh4CqM~pj3N`_9A>h6wll~O%)iqry~E_FdwQV&!u zC3nTRUr8y@uci9?VqA^X0G%zhLT5?c(3w&%bdI#}!5H@&DG@qfN`uama-do%7pjxS zpn7Q>x=@OHD8^kNr9i)v(xBfVPhn`k+5Zi=iu} z^xhbEwX_Iomhzw$X}B-OT_-g>5#ySqM(7Hu4QiG8o{4eSNd3^Y(lB(BGzr}(ML!$k zZjq{9h;eOFHFUF7I~?O~m+GKDNzKr0QYX|dbweFeudQlIo#5rB>+AQag0F z)C1is4MJVgFw`v-jK;Y8q(bO^sSJ8Zs(~Jq>Y%?!!|%kn9%%%6SSlQgagRww(Bo1$ z^r%z|^-A?npEU4cjO&*Mp{JxV=t(JVJjVT1S_u73>V%$^x}fKzeh81txNeL=eJuPe#tlhH(6ChaWsDn< zilDcoa_CK|7J5UfhyEe8K<`Lh(5Tb{jY)}dvF=?d33^XThdz`RK_5tY&_9D)hELE>a89Pb!C2lG4_V zb*o6}(5g}nw6atPB}&Cml2ie$A=N>vOAXKur05OsJ4Y!FT2o4f)|N7%6e$}@l^QmT zb?Zot(7ICG#`wG;1)vS26li@Z3;Lmy18pePX2iNpq&nzFQZux%)Cr|a-B5;9x+#9c zE|o!BNY&8hQX{mP)C_GYjbz5Ut))?D8_8`E>wYXHL0M7?lr7b7g-=UT1GIzG3T-cS zL)%Hc(2i1EcC6b)3P8I`DbUVR7PLspfpVn+Xb-6j+Fh!E_L6!Q;ky7*FSMsL2<;<{ zL;2DqR1n;{YpmN>8iMwd()Pf22BdW8ASnkrP%4BDkcy$7NEOger8=lcYJiHRvbcpt#~#cf7O^I!Q`}PLZ;qN@)>nbM-eV_mhB3!Nc#9ue!#k-DIBrGDsaX#}c~ z#-Lg$>*!clCuKvwmGU8eXu&E%zmdwJ-$_Zw#Jb;0$+=#NrAbgeW3 zT_cS_*GbW*#JU@#WT;h2h1#S#=vJu(xCghH0ZNeCpn%i?Eew`D80+xC zoV`ISNqx{NQq@Da21?b?e5nD#2XnM&gOa2UC|OGE!Lxug`Y7)9!FrG3$wO*~@Pi1n z?d!+gUK)nhkw&2(N_9`+$wR7#R+b8$#RQYo~zR0ZuRH9&b%6O=D4`pG<3Amu{)OGVIr zQU$cHR0SO%)s)P0KapyogQX_uAgKc?l)9iIDY|r?E0*G*L!@Nr=Tav0GbtPTh13B3 zQfh-rqzylcbd!;Vu9%(Ujw=@Xd zCk-DT=N^> z>V=+^2B9aUai~w4g!-j|ljGdeQW^9&sRDXdYN(2Hi={^B8ENwLIQN3&eii3lloFxm zrF3XO%7g}`mg+b+B(*}XN?p(^(qiakX%Ko%O09`=Z%Ap-n^HFPx>NuSOGVI#6n%D_ z8f!YnuNa4R`>fjhaZ4oYa$e_t!1CZIsAwNW#!O( zsRo)SH9@gb3$#FLi<$4fC$&Q>NIg)3GzbNxVQ8V$G;h93l$xQHr4H!(QXj-0ap3+7 zts>RUpYK+e>Y+8H7HBo83rdoDpkyg|!F;!tlnMPn%7)gFidLBKQlw&NZK-GBeD_1C z7g}E$gw~VBp;T!SN|VaIKi{QG<w~9y`&y!cc~ZJ zLmGtgrOe;WcLh=ww7--G?I)E$`$}cd0a8WdeD@Qn5;|C_gAS5fphBq)Dw0b6Fy9qR zrO+W#6@-uN7-<89kM~d$^b4t=X}&v5DufP~${>6QN4*-TM5=>IrD5nOX%ae8ioRmL zJ4Q;qX1*(v(x9WIx@+gV zbdppCoho(QFyH-3>V$qR^+Bgg!%&qp3RO!DH_mr8QX_P>)CQd;^+0Dzeb715;*R<5 zH_`xfzBCG*Cq>^e-_=S1s7@;AobT$TLg+%N47xz7fqo~|LBE%Vp^K$Ss6mRpYrbog zn(m$N{vhSuH{V?%> z0@p4jLLE{Wbf;7U{aLDm?v~oNS>QUQcIYlCaoYv%J}C*hUrLAWl@>u=QXbSTb#1@E z^+?^&!_s01AKb78qtJuWIP@1Od#45NF)0UnTq=O@u?{WDpkAp0>XVWeEpYu(3iOne z2|X$0L4TDBpub6hT^6`!rG?OQQYwUxaOfi&S}ZMs2Bf;(7PvvF9(qY?fnJolpckYb z=w&H+_XX}%DH9r!vY}yV@m>qu8&b{Q3*2i`E%bLO`tSwrKxrZLQz;obR7!)6kTRiT zr7Y+~DH}RXS_GXTgfsv>Ee%1>OT*AB(g^grlv=vLt*@tt3}|C18`@mTg?=m*K-)`&(9Tj3w1-pz z?IV>!2TJA8Po)azP^l6+Lh67{kh-B$q(11^(g1X}Gz^_DjX)PlqtK<&ICO?hbzTg`OGD6#(kQg5Gy$zCMIX7qtt-Vr8%P1@M^YlRg_HzsBc(t)NU6}SQW~_U zR018Y@1~SPM@v=E2~sU|iqru8T55*QmRg|mrB>)dsU5mh>VU40x}a;NZs-Q72f9@n zhwhTxQCNE^06i=vL61wR&{I+d^qiCly(DEpf0uHgx1>eTdr}_sk(3X8CKW&t`b}I7 z6ff07D@sk!s!}VorqltgD|JH~NIlSxq+VzXsUO-#S`6(V4MMw0L(rbmFtnePScY>! zN`VfQ(xD@yEa+Hi5p<%I51l3zKxasW(794E^joO}x=1R6E|bcktE39(k5UVCtJDtN zA$39bNWIVlQXlk))DJx&4M0yzgV6KRF!YKv0=+JcL2par(EHLP^s(fQUf@2LqM<1L z8Q8MKvD0c|T)LOV&-&~8!+ zmXe`ANh#1>QYv)6Q~*6H6+=%-WzaKHCG?_H1-&X&LvKp8&^uBc^r6%MeIhkNUrNnT zjILZQP`uOztthoat4bZvn$iF?qASfHbh$JHy(tYtZ%ZT4s5A}*TTDRvsB99tLUPAi zi)bj=Vj&c4kq8~7ev_a(rDW(GwM~KEmC~VLiwtOO)yssAma?E=i)<*^A{Pp_$b+I3 zB_G;bDuCXT3ZXHn1PZn&h3-=1GAKq{%b{S43Mkm38hT4xYoOb7m8zXm9rV7o)=#Mk z3bts54pEDiDYZ`3YnxIh6l~E2Md^I&o>C9=f%@p3(qbssVgUM+`WT$j&{VzQDUCtF z7UR(V>SJO`lhB9i!sgyf`Toop&Qgk&6H}V>eWrD5el|w zf({LyWm9T_{;57%r_=!jTXaJ6)S_!j-Ba~?rqmAwTP%hiP>X>n4MHEQkD)1zLctbe z&@a_ud`c5j^(Lnjcbv5dKx^q}UpS>iXhMA?O(_)$_K^lXq(0K8lrdE=b4ppzeEl_V zHuQ<& zfcT%d!f*bk%Br9Ul~qrb)j*LdtDP#VgQ8THd>^iuQVR3~DFa$d%7jv+ENEpZ8(Kli zfxag#g5soHXr7ceRhADWsH^~rmkObPR0PeJilGHk3A9iug<_>LXl^Bebs61SLw%(6c%YTA=5oRwz|l+o1KN zb|_j(>c;b$lniYsWk6|CF0{Us4{aoMKY-^tsRzoC2B1x(F=%6H0@_q^eR%$pqM_mL{Q}Nr`{Qv$B*79U|30he}QV z!1YQhdwYTVxl|4n2lXDFsig|&NU0Vom71Z$rB>)DDd~MYdrQesxs(CnSA-aIE`(no zLix~fQsHNKMwg19lcaK}LaK#Mkm{k6rN)?ecbe1$RY~p8sZuX=iqsFCF4fM9cV|d- z(3w&*R4sKvzm~e8v!u%T@$Ouy3aXXrp>w2G=xnJSI!{W8k9WV7QlZ~TSx}vn51lU+ zLKjHA3GwbCsSj$9hM?a|6VQc{`(C`eSSnu_?=F)npg%~pP@~igT`ILgmrF_Ck9Su| z$xySD0bMEOLRU!n(A84?s`2iRQUi3I)C#po-O#mCFLb>WmmKeIk^)ehlmgu-WkEMc zInd2g0n{#)LAOd3(4V9}=nko7?Ra;ml(|m4yG_c1ZkO_)yQI3bcz3T<58WrVKwVN7 zbdS^n-7ocR7VjRC`k@|a7K~G6_TgSU6rFy7e8s8?~JtIv(&q{&pc>Kr;p_B%VOWDu|QUUb7R0Mq_HSHPiK9QQC zPo)lMLh6G)mKH;wN!feFyDy{y=yRzEiqNkE(+`MuU#ctvaw^OGNxX}ZvY=Qg4~mvb zpeU&fnkV%^3#4IazBCFYNG-+jZlTl#tswP4-B4~=)LNSV;eQZ}@j z)K?PkR+Rdom4fvSi+8I^Sx}PHba=d5Q)-5OAay{=QXjO2v=~}T8ayuEtt$;dsnR&K zjubdP-mNVqLhDJ%Rq<{EDFxb4%7oISJZOEX0NO|j{3_o4NLmPGNU6{!QZ}@)vDf(B8qa`gpgG zlz3sh+fzz{_L6EZig)`2!~2c89_I_Mm!8NwGM(4rGM zOX`Nsl``(cvw)Nd1;31t3;jlA#n5?DDfC;Z^&UJ6NNo_lmVn6JP`xw&T_6oX7fC7I zcovXSp++eSxNveS^m+GLaq+#f4sp(-n0Z4g&!PA434_z75V|Xf% z3ZPc06uM5ThW;qkLN`bgkK?I8nuKnV7WUyeLP~>fk}{xMrL1T1q#$KO9a27YyHpC@ zCY3{XNR>l)Qjn^kyQO-lQ)-3ol-i+tq|(>$q#%_+-BLAlpVSE5D>Xw8NF%S~NkJNg z{vx?I@N6L^K@UkO&?8bW^tjXq^+`j}W6}ilsN~+n(}NWEKAs+=0Q5I01?rcwpeLmq z=xM2T98U^T9W)>{L(fW`&@)mu^t==|fhPqi0KF`wK!Z{i^rDmly&@GruS&I_;+a88 zn#41MlnjkX8PFS2F7&#T54|OIe~xDcsRw#j8h}QnG3ae+0(wt!aRK+C6b+3_NzeyU z2K2s^1$`vttQ2scNQ~fxb{#G4#1q3PosZ z`>FwlFZG~a2NWyyLebI?6eW#7_$m+T)h7j9ywm^%q*iEw)D6v-dZ7eqWVL`>Q5uC- zlHBS6hcDqEUJ`^a@IWaLzGefJt{HInS`1VMB}vr~zHo!GMrdWJ8Cp#mNeQ?$rBMi9 zcR@Y3cEBY|Nf5p&gR&F|Uvhymp|z#bbpvi)X(Bb?)|V!sG-=^_0rx{G4O&mifHsht ze;9BZOD)hQQYVxy^+Ov;1JIA8p^SjrTpETlr3q*=Y2l^;x2co_Z6T#>6L3G4QlYJ- zEGSFLhqjUmp>3pv+XmeBQX-Tir9sV|fbdZAsV z@*M(h52*smlWL*erDkY1sTJB&D&8sJ_K`}UeWgk$U#f@pmKve`q@i5`?m%f6DwHOm z1Eht!2HgHq5_FJMynDd?R4RdfCRIX3QayCA)Cm1tYJ(1uhVlaLP^o;cfID2OfJ&uW z=rE}n`lZwg9U&#<2i(z8GIWfT0hLL)&{0x8bgWePlYl!xDuODca_D%e7CKIW0pc;*Jcsv!wuZj+6q` zNLkQXQVw*kGyYN5-dCJ0~T!g<~ST`qM&S4oM-2i(;rv}{h(m2#A#hn&#*GVbRAEh+t2C1mHZj$<;Tcv?>0`5=J zAcQYoVa#LD?NZ#i0e73U5V}K3x-j7Gl9Hjjr3|Q3%7yNf@}YaAxQhbreklNTODWKO zQWkWtlmk5=)m{>C4@-5>U!-QJN9u$glDeTsq|!?R?s2IM>XWLW$D~H+QK=bvLK^u) zz&$06LVuIoqc2fZSt zHV53R(qK!#{avd2W5B&6)k7}_bwj|tDK$VNQY-X^)D68Z^+In+SvLjTJ5o0Eu9Odr zN~O@-QaSXVRCx!U52Pw+T&jmYkXoVlrFQ5esq=n3A4px$r&2#OA&o#EOJmSyQtJbF zK9JfVhhJ^r$sGDZWdqRX(hwA(t&I=i`9NxdVx@K{TIz+Oq<(0gl=Cp252Qs ztuK{A8%b5rCQ<{mvD5@@Dvd+<5+e3d+Y5LWkcwW!bA(h3Wk_SM;Q2rrhqjjDhVXnK zr9fLrY0x%OV@z{LiF1Y?H~=jjpqYt5W?57RH$kdmQ1DFfPF%7u25@}WJYxCuNTNC9YHDFw=xvY@@C9B4mj;uAa{NRv>Z zwD40rA4qA?{!#{XkktGco)4rJ=x0(VR3!C72TKFc&!yZi@Khk>K_yZ#^b4sHIz+05 zekqON-%iI@y09+e(2-JHM1sSY)KHcJ;R|?B8g!J@7?t3Tm6{;@+7(;dA$&0c>V@!i z5~v?KPFfh3;7*hhp_8OEs6xttPLOh;lcm}~f;&yBgQ}!v=v1i_Iz{S+PL~!#)zT>R zYiS%hOUg?~aA!-=DtdHPpXD~D~%;3xC^Cm z==W0GY6-4hN`Wqr(x8i^jCB*-rBWu;DCI(zNX5{_QYmzqRK9V7yF#jfu9Rw_CaD>^ zTxx}`l8S$n;I5TQpcbhTx<;ypu9h01KT7$VCb%1<0_aAm6l#^Kq3fku=q71mvjlgm zGzqm!3pY=2w@7Kw%~A$*o7B8Tg1bX%f&MIYLLE{+^e1Tmx>L%{N^ti`c~F;B4BahN zLU&2k(7n>w)(P$bX&ib`irXf^;n%4+CR3pMr8MXvsd3u`_lVR4^-Ar~U!-2>VW}T_ zR7%<*!95`*Lw}VrApANNedI!qOZm`~QVH}osS0{Zs)3%7igrwJ&q)P4CAjCM=$#YX z(^4F?SW1Rol#2F9aIZ+k(2!ICy)4y1FG&s1t5Vbc3GQ{N8G1wNfQF?$=nwUhdz=fp--f;LlWHQQaSX6R0B;)P0(jj3-qNlT9V+R@M{O$1E6Rr`j-hVQc8v* zq*MsM)s!~~bf?Go>hmxflXmzOxT1{$!)|3LrCAbtR6(g?JURCQ{CTVJY%(xe9Hhf*7~p40(tASIrb;L@dZXd@{T`jIqRo!~Z; zqR&Whn@Ry_3#kp-SZaqhk$Rx5q^>g)+>fQ~vlHCrQVx_Etao05+g9p@wvz^-Y-t?Y zMw*1Sm!caI_)9kIk2q+Nlnm`CWkNeh+0f3?_{9lsH)#UeT?$;1;Buu@Xjds6+C!>= z@M|yh(FE-&wLtqwJ(nlAy`^3#UrN6s!R;?)KnF;RpaQ7~+D|Hh4wM#OmEaDR2B0Eo z6vD5<&~J2ef;&hGKtGiVu1#=js)2qk)j{|L7@}mh;Jzx05C-EgN)gS2=ovKJ{bjp5#D+Qf$NJTp3zRZ<^PI;vD zI+c+4k`%qvkcxGxBi*KxyM^lmouWx)It57;I`wYgT0o}}(w#buk?zr{=5?+&bgCtl z>(oTLS10!-t}S%(knYwgnpCY*0_m?hC6OM`sj7`@2A!%&_v_?&ldA%qyrf#4Vn`3^ zlt_9|r)1LKbxP^vsz9ey(&IX1k?M3RAUA$PW~m2TszK&Nt2gHE-iCv|EjJ)u*C z^t4U|{ah93R7m1WKFn?+VI#vI`Re?@5 zq&IbHB(>?(M%t`X2k9-H0zY$Api?xdL#KGsJ36J1-qtCN^qx-Hqz`lo9WujJV;&_v zqEjZRUZ)(=KXu9{HR)79dP%23QbeZ`(k7isN$on7lit^(rlCh2$i z)g+HjHKZ9j)sg%<)syzqseu%u(+KHsom{aqT=6=2NyqCHASLM(B%P{LEGb2&IMO*f zC6Ll}N+g}9QxYjlrxMcTI#rVLbgCg;uTwp#P^Tu+TAi9nr8>2c?$D`~RHaiJ>3*Hs zNwqrp4`V%aiXk=X6i0eqr$kbVP9f6kI;D`>bV?P5lR-H0Q{W{f=zSgOc zG^|q#>1UnVNMky6k|yb^s(zA3rvcIood!vMorX#K=`=!$(P@lyh)%AQq1)(W#L1t4>8EmpPJ2Q_Yb~^6FGY+C!&mQb4C# z(w}vzBL#J8ARVq#BPm{|Cerab4Um#`8Ya!tX^fPrlP7M5YoShFQie`G(h8jdq->p{ zNtf#sB<1N8OS)dCcv7KG38b|;C6P*XN+#W*Q;1ZhQx54vopMQ?I^{VjpVY0bz)2+} z)1s7gpMJF5NtI4rm6K{orbQj;Gkr#?cTxjstL~-INi8JPB0{RuEn1z_=G3)2sf%P< z^pXzJM_Ip<21q@6j6o-jkW7nF(tsXg%t@{zCtA3jNKixJX#J;tb$#z_5o4A)T;$xAXVe5B)b3%`>BPF=KBd{f-Tg{-bTsu_4l+wqeIcNMC6ib!?3EwKmt$6Wih@ZP(^; z%u5>5=5x$X`bJy8v1rn_+Db^nI+c?Ctp62eHR%AIYDh6U)sptosg5*Lr+U&1of=3U zof=8gbZT;}nY5d>7SgUdMMz$qT1nG&Y9sBUQ#;A0QwM3PPMxF!b?PD=q*E_xAD#M1 z=DRrtNc(CVB<-iu5NUs%hDm$qG(y@_r%{smZjLe16m72f8ROs0;USst;qa2o_i*?~ z=6g8&q=R*f0O>nDlR=XC{;gQjUi$mc;+zyun#32Zco*%Y%wuM_e$Z{RNM;rCNM;rC zNoExaNM;oZNoEy_NM;pENM;pENoEzw9jhdnRj4AFRj4MJRj47ERj4JIRj4DGRj4PK zRcIiYRcIucRcIoaRcI!eRcIlZRfv$xDzuW!DzuTzDzuZ#Ds+%W^c-}O%qnz|{-S5M zm*m%}pJdi!fMnKVkYv_lh-B7dnB>+i#zw`c9MrQS+9rJNq*9gdRqb{ zvmUV|vmS9IvmWszvmOZ~vmS{gvmQw#vmVJLvmPPGQb=Y!Qb}e#(nw}K(n)4LGDv1U zGD&7VvPfn3Q1-?ib!TXN=RlsN=art%1LHD zDoJKNs!3)QYDi`kYDs1l>PTi4>PhCPXd;={+Gf&1eO=PxqzGx6UWHaC)y$fB#i=Dd zqFdBCsh-3?FXK3Ba8lEWGhFZK--y*t`dFtfQlCx(q|bF4CVi#T2#H_&M=ztKpLBA~ znc@0PCpRfd?=N1`G@X2;-E{Jk_S7jv+Fz$k(t$eVkPg);pLC>7MWk6em5^rZR7yHU zr%KZ4I#rR*(y4~DK&M*LQl08Z=j#+9aY4b>x02j?HrgC(Cr!~dK-y2w-!Li0ToaNG z(aDp<`z@XPq+@jokP>x@CY`KPkQCA>mUO00ailbz@<|yw6_HlxR8Gp)shV`TPIaU_ zof=8k>(oRl)Tx=YR;LK5RHs(b9Xhp>s&wig-LF$8saB_9l6jpTAx+oMeAKZq(k|M{ zPvQvGsgmT=sg~r`sm@9Dr2p!(Km*Af-Hjx3bT^Sk^`k9LijaQO)=K(Cr#2^blFaej zMHst%LMuo%%`pnK~y8lJ?d%L^A6!Ofu^+LfS_^ zI_4zTX%p+=CI$4P9w+%pW<3HVvmVhTvmQZ`S&vvJ#gWW<#5*a0#6O#5PfR44^++O_ z^++b|r5_EE%zC7d%zC7f%zC7e%zC7g%z9*y_SbE*NM_&7C;drV0m;l&Dap)LxsxhM zX0ED8X0ED9X0B>TX0Ga-R8KPdZUf28Ril$yNM^1gBr{j7Br{j-Br{hXPU<9?x$1IK zFUibRKgrD10LjeNAj!N}z9+KI23m5S!sb5K| zNT2IeOZrNu2GVyrHIshQsfF~LP7zX+-rL(q({ySl?WR*FX-}QHNc-y4OFBR&Z~6?^ zVLAm#N9z<%I!>n~(j1*qNON^cCC%3L)#=(;(^JIt`It&}oG9 zicX`XjXI5yw&)bIc;XBaBweX3)=6=sqxJqA@1!J>Ip-vk{-RrioRs3!r8+5tWPX}K zCh0BRBFjnHqj+639rbPkiYTcsHNkvXwiIYl6=DMVubd2t=(y=PivD&H~t0B$O z)q)GZ3DURgP zDV{V#rv#E;rwo$0$CF8VUboG1Qa0&$vu`*lpJZATkS@_J3Y}Es)Rj1?l4S0`RFPiN zEvlVVLpni^QR}1zl4;RMYSt~9oYd^pwKyq4GFO7Fq(t3cn`7;y+1ffB>m;41tvrMK z**aB{PSdHDl%!J~iElLE6|A207o8eN<5!0y^QzHA3hGCjoz&u_2q{)S+DbY^r#8~T zI<-5ggLJ62PLg>|=^~9^JCZ{B(S9clkPg>2=%gXi5!!~GG(tK|+bAhcr!mrzI=Pnd zUQ#DFY5XdZbgDKl=|G))r17gr()d**>16$AH0czbVn_)(#gXRf6i+g#%Gr_KD(sx*>zH;ld?!=-_0hC z&n{_vcAb<*8lPR#`0SF#XP0EIhl-q3LK>f4CzX@NXV*zpr19A$jn6J=e0E7^=sBn( zjn6J=e0E9Wvr8JEUDEjMlE!D3G(Ni|v+uT(QgqK9Bs07HBs04MBs05%Bs051Bs06i zBs04sBs06CP8xHPYx%^!>n54m^^nZ$dY$AWnc4M|%s05NUjNN#nCiGWXm@N#>s0m}9O?u1fXmhnr;X zxp_$Do|~6s?z#C$=AN6MG(Ni|bI&cBWbV1ekjy=|Aj#ZwizNm07;z+X&n=#0?ztt9 z%ssb6lDX%WL^Ai>l1Y2(wjt8^?2^nqw^Wk32bxA2pIy@U?2>}IZ6@hpow7)7opMQL zcJoMPc8f@6c1uWRc1uZScFRd-b}LC{cB@EccB@Hdc557~C7Ic+BbnK)Cz;u8Aeq^1 zB$?T5BAMB3CYjl7A(`2Ykj(71lFaP3k<9G2lg#XPkj(6MlFaOOk<9G&lFaP(lg#W6 zkj(53lFaN5lgylskj$KplFXcrk<6UB&Y!rW=_Q#t^^wfIkr z(|D4Z(*%;aH`?q=aPVs+45jUzU^1`^!p_nYAjCnYC)tZn~FR(o~%qNM^1Y zNoKAhBr{j7PHH2WxoRhwx#}R9x#}dDx$1RNKgrD10LjeNpp!;OX0Ap_X0FCaX0F^T zCg#fHBrnO#mCs3jl9{Uj$;?$W$;?#@$;?%dWacWCWacW4WacWKWacV?WacW7WacWF zw5y)06w)F3s7)n(ukY8Tk$%!Co%FL#8Kg6Hi%im4I%Sbg*D0GcPp2Hx0XpT9Vsy$Q z?Wt2fiEp9iinf4swoZj4z8w@RBAu&K2`Npdb&>qNiVLD$`7<~3{@>*)OL3Q_d1gg6 zHs7*i$BvDP4p4tsAL%rl=33Af3VIhUUb1vhJrwTB$>L|}T^?1I84Map4JL*Y{&v~V z$|vUs6T*YxP%tK(7R_IAF9vw$8UFpp$HLyV@BLEz?vApGOzOgCyNX*qyKY{$r7Sn- zTfI-kDtGwLb3R!;Dg0aUCU@~yQLBc-nZf9FI|^45Wz9D>5VDc~Fb0TFYzs4i35B@W&XWfp~$At?ien4;WOjEdSOX0Ne<$=jxl^spF zdOPp>;EUpoQN^3xbNULq!)!-!C>V%QmH$*YU*6^9WX4P$3$?Y-xY(_p^xuUG$_86XT)TzGnmoHP_ zo8Vf`tomKir1NwlxKe4RT26CK_o>g9>6vHZJ&TugN5*G9HRuap79CCxMwf+x{;kZzQl^^|@cyi_tw89`24X@zIz4JVcLOpH2Sp#hd9-FF|V1-|KDb3$=N+y|wN2 z?hR)B+L%~>4_$8iy8GL{uRrPkxixgtZtJ$Jp5E8ZN_0oMw{(3P-f%_a=9MeDL&ff{ zE!`!>!>aSQwr%J>-;Kp+^YY~lV=Kow8ev+Yf_HF14K&AYi=-RFnSw`TijX28t*g-#+^AH%1pPt=~KKKSM7 zdL6R#IxJeu&f#4W9%dMSUvkFM?#!USo7^4IGq~>O@cGV~yf~BgGfSSJr|!YaBEx*v z_37kI6)&qBG~wYNAFIeqs(3k*2D^3fjj=AZs546%saHSl+vTcwR(&C_qB)12 zHmk?5?%RAEtX*$*PwQ&u*=7a7K4%w(hF8r)*y9)>WRZXSvO1Q^&Ei zdwx>aTiv&%sxH*hjW_SwA{wu6Vj#Qydi5MQO3Z=bkD9q|6+Nu%+q$B!>-@g1n*D|)(rr8QM*F3S;)bkMo&ucZGj&C0Y{vI_PWLo899hcQK>?e?6B?9q)4M%D%1@=P%#b*Huxh z`m3l5(vd5?XIWZnc#*rzR~*sjqHkBKDs{-3o#>|PuTDCd ztv7Ae{m}89(n;4ksl`d{PNEa`(L0mXU+U|c>SK~?s!#o`_NZwtP8n{!yT&XD=S7EW z{;B>kU|Ih7sd~;;YB%*2POUgQs_dNTbv>&BIqG1%JW4N4xQlagnQ6o92baEBLdUPF z-owBB_}F{DmmN|3QWZy+Yh`|t+HK9*u2>!8WyR_UW{G@Z{~8{PF1tq^s^*iJvU}K0 zPEs5C9`F#@#WVSk?MHJ=8$=LXfMzKWFb=FvT&+i2S3zAgOAhX1%H|I+nlh4*Fk)8$?4 z{ST?LW6#`{;tesyug9?Sa){0C*T>v>y*+aW)JV0u>+|}1<_@Y)>&&MEJ#&ZDr}gI3 z!JfIp>eB}E=}^zy5%p=K`E(;f4D`j0{fYl74UWsa(4Qx*So1Nv`M_`bd;qBy}asp<*Uy7`c>y^ z{i;(Dx_e63ryKgGOjc)&JJXp|_4`jT=Jb})h@(6onk=?@3mRP?X}xKu@w-ha!Eh)cp+hB&($;N^@$4dXm*@ z6s0>d+>@*pq$tCY5jC|)rXwuNNqnNG*~61D$H0kBBDhZDnW~Q|{7-$Xb|!pczSDy~ zX4u0Fd%6d^KHchF-xFHz=J0ceQ=-Eqcc}wGzaVB(Kw)=A%tj6@Yf+O`$9$*>RUgI9 z7>gEnN0uxNkA}aWSX;kZ+p1^uxrC)))If#zdM=8B99rHxDxPemgRW0`l?rm*<8qFT z%OdUS0p_pbrBYJ&dAZ?Z%C0R4U*j&jwlI8#r|kA3m?Ji3@`j3PRXoMZb5}2g;djFu zUscCbPf-H%RUC;?N7J`@Z#9R~vWbNZIFmcEkkO7zEM$x$6AKx1WMUy>9hq3jI7cQH zGTspu@&Z0luS(&!UsWqMv8DRBGF$2#SD$lj=?@ie4i#?<6~7VU3Ny$H={|JO*IjYD zIyC#bUR9IF89dg!Xm&@vv^&tHUQNyAMpV~EC-2_Xt*+Fj+%&0scXJ%C`h@A}>sqyW zWnZ^?XsLBK;9aR)4)SzMoBV&CqAqQoRp^lcU4srE0PJit5$1 z)G~KpQKJqX{XXGOx{IBERO)6+!q)_5Mb`bi+Fx;(x-g!7V*Vb*k*MO=-E%e-{!lS5 zs%&l`ylI8*A=YVZw%}gfgL?5&FIzizJMS7^hkRl8S}p|6aj#H6@x$7M4;t^qJ${(n zuX`yT@~W4iMd6HSb=?+RvNT8Ce=(h=2V=`h?ulUnc(e)jFyu=m;GuafikR)6fi=Bpw`%b&hE*%L$9K8>K}j5ji6<@dyJoKpVY zFTATNzQr|Z)oyHeOn9Mt=D*%6OLNb9f7XuK_vA2zob-Y-OZsUzJI%W~u_DD^8D14A zPCC|=Ke>2%l*)yByY(lN%qJfGiJSL7YL#F2&MEK~wuf)=h2JvIh_^yz^L^p7eY1Wp zD=*d)e}k7-eBaDF)Cn`ZL%ot$l>F7tC+fK3APuPfZ2Po{tDUnM{}_IQ_c8f#;lzn< zc}u_^8;s&DPh444cyWNy)%%37ckl6G%;jJpYSpW1x>@Nt^Sun)GSBat@#m*5!+3sdCTEbiimEmGIda*^bM))yIJx2s zSNL@QF6Nhdyz4#F$u51}-I48dwS8(g zm(|@{w*AVc#1^*{tG#ei_y!NFAG>YKs!6?(tt9m;Eys8Nng7~UHs7r-W{X?B8w2p; z95Q~_*Ccfa`t?`qO?s34#iRo`3!8Km$y~dt-^=qDEvCAjCYf{09!&Wo+SG5hG4^)5 z`WVu0u3WBu{kQtfHfnX;E}uT@JWLyY&+L$o<3GTS2K_!OW@)$}n)mquvzPBPXQ?}! zy2%}m+oTqkFY2@1a^@YMko6Von$0m(sRMytVz+xZqJ8T9dyYEE zjbHFy?&ChjG_we|x&Gi}KBLSNUc!wLclaDnSqj-(mZnZ8vBj;vIT;?VoX?8FH{a&s z%*{})@F_1I#FGjC^y6c5GQ2##D2f)dexAL`wR(2NDUY4qn=**@eFI$&$n@3Ix@4I zO7id@Kbez1&9$_8({IvmBsIr={&u;JWwzKTR=}%g|0y2fCeM=a4bgq;Q`q^|Y)a-& zGwn0NXSlgV!+Du~*4=xRXT_>r`nt?szigwr^62$$=nHMoZ@#yl>t42T54tuRbu{T& zI-hvS8Ga3Loxy)%C)hB;J*!`etA5QTW|FR>0>KwH<95E-yS9r*r9RIBcu6sWmpFbsB;NCttT;S>5 zM;|*k@6zl4uS#=Q9jNa7BIrad-pJOo(a0jV<@$Ep-$R-#!lj_Q!(#%-W$wmD|}3iG3T9I zj_&ops~(P8wQFzsyW_3*R=1YkDID0o8)3Vrc*CUalZ!V@Hci5QGX-pXnQzrTeO)V= zDlbQO@4@O>^ksO|^XPNG>s&NMwtd|fde^fO@U7_LrpEcpxBbE=+`|dFx4MJlO^&4X z0=;y{JLyIz&1U_~qYFqc>$erS7w2!By(CQ^=Lu@RG5cQc zk{msgH%;kVk+Xf$#4b6`b5~7p_qV-E3Y^LUyHc~R)Equ}&ae4pee*n<=egB5;rY?w zrGd1CYR}xz7d?KfbFw-OoW?IQ=Cl*9%kHdH8#ONw{%g5vbz7Og=v>_O7qZi zkvYCwql*iJ@vc>eh3`~%N&4pb>?W!{>VN9PcNVF__3FsAUG&ejyJA7_tackgm*TOW_B)oBA)Bm?1>VFGpWj63sI#OFVKPP-{*5#A_w@y8z zMpBQektY9d0T@0vhLc;uf(@Td=_@%_O-Y6O*opbzpiT+T4=xI?jMGo0Z+$%l;iWO* z(>>vp3B|4cg%eYeMxCw!&BmqBb>I3n)nKuzreMM4lg#9p6KUUi)gnAUhW#wOGM<*I zm&+%cngtWxg_ovr(5szsVR2;2BHjrYO0uD5AP#%6Zt@yor?^-?mWr z+%%qcT;JM$RenQ;vt_0*JU@+ViR8XD>IBHcYSSjR%jt>^68qMwohp1o?8KCfw+{uA zxDYoFu_I2*(nMRInId&(Ca!Ny$9NaxlQZ5$I$f+C-r2?YwAfuFxOl0I;}Dt`vwc$c zx8eDT;d7JJW|^5u>swo`+Rsm&*e7S1%NSkS$E#HM+~mIX&D5B=cj{hL2h8~Vj~@&f zG+LS%o*x=t!M^of)UaTw1{SH`+-KTQd2XWaerZbI`cYU_wfYyRLsT7RFRE*biSB1@ z32)R{4?3RB`~-BL6A!CKe&z_f5RvE*oFMLj1 zS!qy(CCO!#v06f9rE!G5c`1F>@j4{-RVNZwu9y|kXGHZPx<#LNvq+nCx}CI9rwB>C z74qwU>8ZYy;CCIt+?#YJN!`}=yUru2yM})KFDcdCHNUF{GpW@{UpPs9SCqQ> zVN$kZrA}%jse2ZF*N0B}!%6CEBj(YQN$S3X-<9bk^}7a*sox=JQXffO1NmJZE?rDY za?+(vx{jpYjQU--I_YjFJ>(?yTkh0#kKffwQkNip{k!eVg^T+AbS5#8uHnl@)r9hK zSw#QkN{?{0lo!1;{Hl8KvM!g_MP{zspUGlJ(rdqYUaV@tPT}E&*`s&GvUAeP&PnG= zilV+10sW^>|Ctd!w?N%a+0gZApSlm(y`gvdwhetNvcgOAdO~a672dVnNz(TpdC?1> zo8J>!eDO z$V6zH2fcny+-}M)gnd$pU?_v`di-8E> zQuoUFKOe^1shH;CTE(}>ysP1>l3dgKxq^w|D_=K6cM;5js2BaYH|^4`-~8yu)z>8X zf*!X70^(ZiOyw&+nIC7zrFHXaF0q$y3~ye!BK-FG;SZL7r3%!&vp&6j zN0C0(>0FY!w(;w$ZnbTG*R{Xg$~92YDJlPIx&MccZ#tP0SHAj#5BK<8mQE_ov*0|y zmzDB^o}~*oY5TjQgJ}zvOl(kiblr|6t7hs?^-YR(JMyPbJnB~4r|+Sw-u$k^=s%)U zBI$FT)R-al2Oo^B|Ncym>0m)n@Y4g?~DC2){KGr`~4vb*szJ>#2z`?>gtMI-O5q zySAFg=B_%J?Tzj0;t6o)jvYM6!$I?gS8uSQ?I-*%9MadNy4j}hT+Lmz3$H4%>W;|v z-B#)gz7_g5Lz*4IFH!%~7^^)2XT2y>!Fy2jREJ9}jn}>&f5KeBG4W zJLiWtE?;SCxNhTJgnCmS%i*cIEaN18PO{!=bNuMn@D+*Xlk>~w#rLg9Szh7ZqikMi z<*bPAW*P0w+us!=vkPBN`kv{X>blyoS4d_T=_8q4MD0&zfz%sU({?}7x4P}2r0qK0 z|2OsVqQ0bdxkktTHgBcXKdR?^%2?*>l!JO%S&e|&k9Yz;vs^p(~ zhdt{+I#-?gUGXHdXQ?gNxo4flXX<0BOTFcDx%eTP?A2=7Jd0<2GpBE6$**i7(pQ2b7E;7UFK0Q zr`LJ<(qj5DeBFb68L{Cdarzy4vVMmiUzQdKpA%n}63x-e3*<)52+?zX=U^_oDt27< zS$g>%i^`V7>Q!EP`JNNkJAsKN3^eBr-6VdzNlNtOlmPFu^jF5M9eE`?#CVBmh~oxZ=a{$(r=y@DuTv4 z=DqBkw`Z0-gM{bBa{FybT=NHKU+DYq*BgGF8h(Al-~p3gFPrP;n&JP#+_Z@Qzi?n> z-@L?Gk-lXy;U%H61zs*MR-E6r%*T9<57(}4fZXVw^ZV*u!*c_3-dOFPGkWVW;kh2- zuHglNIUgdg7al-?BK7E=yun%!qn=1q{*>95d2jLZCe&Hn-evmz?%e#L?!oaq<>vly zRN1`P@B;T`?+@~_u4Zhm=dy^-^O6~6!sA!=&5h|>kr?L2+q_WUTpt_1f^Fu@wezyn zHm~g4cYMCMvC=oGZ%LLpWGBvG`psRI{hlw&ycJxql2=vJl#5)oldbFv?40_(sJq;cd&~8?;lZ2RI@OYX(?{zQPUDULK?Q)I(ou&W2P_^S@^7vQ4)eKB?C0}&)m3c>9mVM}^ zE4fFf9!Hj#4+PScOae9Q zWdWZZm3=|}1>>qVW^zw>Rwz7|Lv56_$;1VdOPKG zBwfgbNU0EYrW_LT2okfO-On3J_P6CTBwff9rlCN{K}f%l(~$-t7phkLvxuGBybcKo zc|_H4zS~)|Ny(pW89@4lsDCBUAmk9F{~){7nM#7Tr+ft7Bg*=J033*4!p?0ew zBtF&_ADcfWYK}q*M9o4ZnG3O<&oqx%FQf{|7xIj%Il^xB5i%@f1j&fAYXa<2K_SN@ zF-O`p=P6;wrm_By?M2dsJc#5AX+i3RsNd#Y&t<^Qe$?07e8<>wFw!e(LaOFiyCz2o zHxzgFvmOZvc>+lnvI!{_@)go3WGZhD0w>r#ABGHwnt4d0sJRR&6tZ5`Z~?t@3!hYy zWJ?<|AVmF!@ev{FUt7nXWVbp3NfVNSGz+-`DG^etTAgh7^Ar*-q)pXuX|{8lhm<7S zvWthYgdByG2uW2nA-mPpNUxA`#CN(~^DiV{NIOz5{j0C^ep6PM7^Nxd={xl zj*zR71R>?BRf^r}Ur4*CX;(F8*fr|67{mzi@$Xtng&c>Z3sFCxuJla1pBt5M8N73w ztC3+L>Ze<`2vI*DY4~irmHK(ddFR*?y(?e#7ovVvTb+;<*JDI^~m5mJT3=Ggtbq$Jmttw^O1*X}M?rjQt< z@=Cka=}NA)B^wzPQiik&sYeR(>{f3pxz?5;q+iJHdvM(%Bp%7S&Th3>$tqj&kv1WJ zL#l){BfjhHR((j9kTE3r2D|1!Znk-aBqPZ;+BFv=r9w)OVIfZ-EkfFm=9}z(zEM(W zi)9B=_p8uXS}e!iu}n zsA(0Fi&Sp1doDx#M@G3OQ?LGWx&DDf3wa%h71E6)3i%I`D`Yb7DT{=tcdMZj?6FQp z(uFKTa)jg|1wvLM4MOfmI)uD{_-ET=eTXCo8AdXMOp9i8A$uV;LXJTqLe4?l{AiS& zbC`<+h1`au2zdy}5Ym7|gtQ^PB)jJ?klJKhCjW^&O30s)Aor4YZqIQ@x#;;c#4UPW ziR6e@g-FAxc0czcRbs5?kS0;njwFbFwj!;f=4WJB$e!F4=nUCo9fOPsNkwA0U9t0d zU4$eGxdzDV^D@Gz;+@z*${L5OJMh_dFNL7P1n_7jhF) zD&#JtTFAplyO5WWE+Jh=^jY@kKO;dQyT@>D5fY0e3ppOi7qSp(6mm6^aIQU81(GYI z9;p}d8qzG}Z6qem?&mAjO32g$IWCskH9^FeVaq8h9 zKqLA%KijZHBLLqw{!i)(y7D?yFd+waoG^9kx6-cv?wMd(gN@Pq(1LE6e_q+wk z7xEvZM98E=Ig1L}7pWI=DAFtBG{pCbJysUd^rGoLlNUM;I$gq&Dh-(+S)gY1}#C;?) zCgecG%a0!3`Mgd+l7yUxoq)kXO5;wyh>mwvd$oEK^5YJIASC){y zkt!j_B5gv>MRIqy$GQ@!5mJhD2zeOk7xFaX-^1=_3z974OGJIs$Idx)AI;fD$N@-! zkmHe3At9tiNER|G8gQs_n zbu5x0-nmvx?c?mfTNfq0C z0x~FSmLhI3`ZY+qkaDEpD0{4WWUR`TH;|Cn!cP$Qy>`t{NQh2~+w&(RRBesh{XTh z?&lPwK*(~WazH z(jsb>Bke+R5cN%dJI_(YNRE()5ikGfduL4xk|1h6LXt$y5Rxk77o zf7@f7jZ}%6OOa?%a|;qDkPS%7Gxk{9kX%tSinNNF8HpUZLiR^I&)WSQ zj}!@6h`3*{YpzB@qNWT<5;YGasX`i%A|aa*PqW?g=Sa+Jwzy_<1tMfWq*X{f(kXgA z3F#L#=OaUW+y2fy;Re-8)ZC5aZLn+piHsaN*=qF`GA85;#KS)++u8GPNI;0^L}o+C zUyv*zry#*&?S3+m1R>WWDMHGT3?Y9*%7ru`jY2w*ky-Xw-ynYe>D$g{F>Ma7l|uf6 zqzE}2DHL)#QY+*FWZ*cv=hcY&cw4HGSRwyJ5{0~s)C&0s85Z&bQZ&czd1jKjBW=rJ zh?{@VxAU2vg5-*RQjq~6mm(>mRWVY2lHE@&k}t-338@k_9f)7_(}&cFno*=fi2o$6 z^iHwIItJ+#au(uAwregx0z$4rQiYTuMM54!f~VR2ypE&`=|xI~{D4#o*@3hR+3#eI zN+HK1p^!b+A|zeNl}L^dz9Yg_Afys$5b_k#FJv=PGT$C+0BI8P2Qnzce+t*(LJmaY zQtW<`kQ^Zy$k17K%_=0AYRjESmXODgJR#2@T|(Ygt{gE=(L!ED;)Q&OBn$Z*$rrK%DHRfZD#zCc_E;w( znL-vLc|vlLA|W>+O+xNNx`aH7M1N?H^&XNWWC+O;GWj${7qUB2C*(+^O~{#u_hWmk z93)OiF_I?aek4msJ<=wm6$y0NJ%5VS_u8@p85FW#h|&A(nq!bE(eo*YSMRKldRuVyu57Euy9kNfP~hgtUvAACOTYGf!uq@3+S~5^;ZOO9~P%WF?X;F^K02yXTXTTp`PmLLt{9l|m|zS|JZ0 zokCtfJYU*lbs`Oew)}wf3fXNw_ZYvjYl29OkYkZ_A?F~aLaspKhU|XIkW3+UNTraM zky;^J5YIPuKVKk4LMEkf?)|~8i9rg4%t2a&EJQlRSXoGys3}5H#aQV2eL$hXMoPj;(a&tR4L0Wp&~DXafnuEUTLAt9tv$a17s$Yn^UkaftQkVlY)OYE^C zNQ;mjq(jILNWT!*nOuEcYWEY3#0r^>4CUE1OOY`l*CM`a?3ywpM#x{0bRo|o1wuNI zmTT>PzD0V4Oh1dMz0R(QL3~1vLPA2$L~?{&iZtZg{j5XUh14R$LS8^ztL#>9AUQ%l zMVf{Dfu!7Iw~9{X_!4pg(k|p2Bti6(i8Kf)KzujbJ>QF@7uxbHk|cV52gwvQUm(4r z=0_w~)XY4aYg!?3Na1RGtTT~1Ar~VZLJE<7A-5xbz7>4uvGX{RB4i^nw8pOa6p3DI z%NUX-WY2S4t}G!3B2_|8Lh6N_hj@$ao(qs@A@?BhLY_pDg)}4iLOPLpA>SjZ>+P{- zp3AHXIUH#eG8c&mITslbas?89o85CM(sa8mk0V1uHXyNKyQT|C6!IlfD`Zj{*Dd9C zs{@dZN?T4se0SNBfusw$8p#zs--6_cng@{qQS$=gy2tMMBcw)*{vDDn`q^~>XX7fn zRV?EF&6ascw2%vsSRn;SqLB4Su8>ENA|bCKp(#_WeZCJ#7cz?E2${K%bEc3#Aq_%i zBM~7>kdm49SouhmkUNojA&(=?LYj~vAsvX%XZQRKlD@kwyDs7=5ON4oE#xGmUdUNU zuaHX-*B*AyB}iybTOL8Og}j243h6|ug?xs%{B}QoAZbGOPv@)^uxn-`G5gw*j${kD z0%;dx-H3!l&-WtrqSZ6V(0+E$9Z07beLFHDY9=jao<%=C#J#`WPaG02MEZsFBPB8RSbrc*LiSz4)s7JLohYM1PDbJmwEH;^NfvSg zQYYkIq)A94(k5gx(k0|W#CwoE*7r!VkQqxkBL(f6IK+RjE%T8SAuEs!A-PDokW!>g z$YV(AVRp|OkrE->kcg0YoQK37Ys)I6P)IrA7X93h zREwIIkaAJeiNq$@J^zT*iP62w)V*B0CKhQv&X&`Wq#9c;LPA1TBWXhJMY4oEic|@C z4XGE>i{w6TkM%23C}gkmc$Exl1dTl$eSA-^G2LiWgF=0(pj zNSCNdLK5GxdtQdberU@LNP&>Mk#-?ZAVIOsFCe~;?0!B*dfRRJ9;yA<7T*P&!^IXJ zhQx_2JROPewp(3@pLQ(S!(kp5rNV%x#MQVlof@BZaW9@SxqYF6} zDHU=CQY~aD(k|pWWLQWglJKQH)<2PSAzP3FA^k|HkZ+M;A-i0}HOYVMo)1Mjw%c+# z;v2Fh3rQDp1JWXTUWX)zp8t+ii&n29z2De9_ad!g^#39QqGm=mGcWpyMn*(UA`xMQVh+i*yJXLh^sK$J*s$_GcjnBV9t0kU=45BGDsu zKbIi!LW+?pA%92egtQ>dLOwv+gnWvO3Hcp~|H&SGze_mJ|JRm8#64=uA|z4B`X@-T=TmyLQnxl~#(ep`2Q1rYE$q=osN5*!s z`>8^b#904A;&!!bHX%XLPp4`nYKD0wo{!{1KppaXTL?Km3ijYT; zLLsjrwL*H3frIR^enH%SvBjUuwSm7ISLxBEF1$rodtid2c3Wr$z&b170MYKoB#A+<fzma|+ z?;xRL?6HQBbRpBO<}51Y&q#rgIHW;H3eqp+Vx%O&9;+B>67mo-DC9Y0RLDjo?l`-j zPml~DV@T2ocFlfyoNa_0hg1qlMQVkdhja?L9`PmGJ>P>=&9UX*NV|}B#FJ##e2xT! ze2)|f+3gxyon*H<9El0pl7i$3xd>?$aubp&dM-seh14OQ)9s!&APw_v`2-m{&6Z!0 zUQx6Awe&1TKL8mLHFJ=d6uX}cr1eZ&u17|M+=axRW!Kari9()7YK6RyRHxdlzC$X{ zwq>{LI6t3bODy6)*OpU|T+#E{NW7@I63G^0-G)Tc?0z0cGR5exAwkhk50bXfZZ(Qj zEwW|re6BZy9D~#gNkN*0EJ22ZT#LBU?Vj&MTF(}Uy*`59>vvfK4sXNrFI zN2-LJfQ*V(=}6M0_E^^1~Mk(VkG`@yXUn?XRa-^i2F)gUPcmyypN;^=|>8Mj3Jdm_ATHHAmjwZeU&}d zLL?yMG9*^W4M?Vtdyq;YjYz^ZcF*r1*+RZTs)e|2e?`)SJcg7A*?>fZY(qi?cF$u-p^$xUV&4#Q6w)Rn35mba?k7XF60!>E zD6(trL1Na}@=qjR$Q#I*80!P1S=4-o#ILpc@!rfCfFBmP^BVGSB=$C2PDgTuWFjSE zn=eO7Ma_DoU&y0KbA{dW2E=uTExkypkROp6F&j~ZoNYwSpOBP0?S4)~k}GY=KwNj( zavjntKW=VBW zDOwdG*`nqiq(sc>-&H?ieqKSUMXRl(ve2d z>KbI^@Ag=CBKcx_o<#hQ*fkrFLebB=NQS7{j?@eB+{!ugA9g>7AO%9^A}vBPkf7-2 z5~N1RTEtav_xvytdcu}hkT}tE7m_M!zC+qY&F@I2sM)uOJxa*&NbXbiSm{WWkgJi1 zko8E1kSfI8VE5CABno*O>HVi&vmNpN%a*BYIKG7Z2}u)j1X3boK2j|t8yOR_7V$RP zV?Bt(2x&s%g}jbr3)zNL3;7L6de-iF-?hxDkOZVw$XQ6EkY&h#kX4AU$?o}XWaK$p z8jVXqVY{27UeniG-aR=c02NZ?IdRv}qJDv<^u|3J#cSkEDC zqUJp$<}JJDZ;{asTfFPop7(4y6e$;SGEygIBNb^BH91J>`*uI;kfIN4c@#I$lq>5QB zM*L!a9!5N8*gdzXR%hC>74eGa{u7cbYP_YK!^Jb*4;c{Kb39TjS}jsFXW3(2gA|II za>Si#*F1{&h5Q>y5%M+?5%M*Xw!rSkQ^vKrkiQ_ELQX`=ML#J>NYrE_!$Q^|35)Ep z9!3U4%}Yp%??xYE1Q?&mP1Sx5*O6S5pB7yVp@BwuCsQ-*{@t4EQ_tL>VNh*z}g zLrO%=uSkEM-70Vg`_IR=oPczSnng&isJQ|u6mk>NDCDn5myqX>nosSqI+0dUGmJEd z8qb~VheGy2hJ_>`iJ#d$FGLDIx8)kdFKQ}~8d38Y(jcS>=@;@I5<6h`{2h|}g)K8G z*`q|w;YhitITfi9vHHOC`OLPE%(kSxS^nced( zNawY-Jb;XeR?i~?qULR6L`V-3d!60Se~~;P{=c$?`F72*NUEqg8|f4^*~oy9YmvYz zyPrFdEFn)Jb=TW9TaYACqkgJ%tEl-6=@c@(n)A;Mc0UIrMM6$Re1&#R7Lq39W~55U z-AJnFrxtOGniix{NH;Qai#^tVkvdVc$KO~%QF9pLU2V5I0ZA6J2&op5hZGjst?oc_ zMa>gPov4W*O+wy528Dc$q^+@go_0UatJs!n2)PI;xXbQm4bm*61{o9bEK)A|*?=V9 zZTIsj5)!R`Ln`mFYxaMT{aLg+4k-~e3z7aRyHy^N{hKX!BAuer z`3~t4vfD$P!>3HQUJK%oR#B6JG>Dokq(#Wp$gq%dBypJ0f4j#2C}WA5cqCQSq#&6> zmLiox@{v&?cOx}_w#WK6(kg1+M%qQq7f7#=5yW?Z-OuiI-0=`{G?E;&YtBK6gj|la z3R#P!i+=7xJO|tTJcD>etGAJiL+qMwkWNuE?J?$1)C7_GL+w_lB5`-vasg5!YHmRi zM9sZONJt%0AY=nlE94U-yV@S>52Rew?DshLh(yh?NQscSNVAX?i0f~5&xJ_nep?&7`vti@r#;KWK7iT{!jM9W9?Q4BFREd zK}v7tyUx1qUHf)NYpeTV?tVy_yoJ3&yWHkQU79o_%)J~nF95n%XJ`>Rl)EtVmh?-=iT}T?@O1AsC3ds>t zfp|}|Yo10DM9rH>lBoF{Nfq)VQY2*eXLuDB5|4O8_E>31m8iKAi54~MkvJjuAz4D2 zka{5>AVa6yWBrJfh#KFsY|lKq<}f5$$ZRA{$Wo+P$n{9(8FoMSAtj>bS)^Rlv?Db_ zdXWwxzalAT+CA^v#G0OK%WNcB$P%PP$km8n^m8i`5jB5D+Rw3jeg%nNV9Ps5UWP57 zAdM?+`5qa*#Fk0Vv2R>ziy!gj*b+o)g&c>(UuM^wjzokkLDDX_Yc4_hgjPT-VtBEJqTB+@SgqavPFyv)!s13EXN+6OyvlmiLf? zb+-Hm@!V<47*frz6yEs?;(vkj{3Eu+AVhqFA@^R*U?CcIKDzif#`V&(jnvu zq+duelFYAV-Z`s(MOwvi`VWJt(~NZ?h| z&m_8Zxz0hF#>HGYT&DUFvJP=a?9m@Vyh2)#fROi*SRtPvnL>U=a)j*t5?2lz?6GDc zO+wB_B0?@gI)vmQ?$_;p!bm{KKak$H?3z|&NXRzC)o#~}AU+{cFSGv$iAFMnBqGrt z+5Id=;)Gm{Bnw%GqzSnjDG~BCQZHl+GW4-M)|ZI4%ND*o$G;!5Wp5-|$X}3rAtxjC zLe4`{d+dI0KnjK2g)|EJ2NDs|gp3Gz7xDDkJ#R;Hg?L_JEFlLWl|mAcS|O(+okFsZ zej$ZOaGO2)-;g*V&mxIJwje1&K0*qGe2+8>+3i)X^ggr4IvmLt5<(hh!|@WDHSz=*LbF4tYeYVA-m@^q)LpQqgsi6 zijly#cB_Yx%gyabsLW+d^f;0*7N0>t)@re6-d#tk&uaHZTfRI~|SRuC~ znL-{z@`P+a5`MGC+J=OLj3OCAW^CY`DP(`7M#%9yAt50vkUSyzNRf~=NRyBnq+dug(z=H|)`!TD zknfPdo_5WYH#ok8?15woITEQBat0E;kKNBDNVFl2f5)%mOKQqN63la!j3lD)|?44N=OgLIw6;U91(IA$o8k&J{v#|3;8fe&(mzp z?I5$H&o@EVNX-F|T~hORkl|x(pC^4AcWgPHx{$3P z>&MxeJ3xA*=Eoo#rRH}aTZH@>0kf*g>Vc_4eFW;Mt@A#VT~ zImz~UAIKabp99&_V{3j0(jzs$2f0IPy1s*>3mE~@b&l6xxm(p z2N^G<7i6B0OF=dWSq5@Q$lE}MgnSs}sF2TtjJVJq{Tm?Dh1>(OO~?_DSr^$=C-1?r zq~_TmYo+D_kc~oK0?N@h`JA zzXs`%KKFynl2woTK0eE`YAndn%Wa?OAk(Dga*&=YY|V0z8A4tIvPQ@aAV-9J3goVN zw$Gg)qxvm505TxtFCe?5&m;a5`=&{VWcU)>`4=F2uD0YMkOySd$REI2YMuddNXP_`G1u5WF9w+@ zWD&@SwYKJsAU#s^K9JE;vmIo-kUK!;3Hb@gHX(lmIrKVvtP_5Srvj-t17yTM+nVQs zj27}jkl8}|L2eha7G&-lY@f{_>!s$?ARDFTTOeD6{1D_WA%{SY2s!>oIMy5Ov7Qcc zKx(Fe3`)&Ef~*ztN|5bBt^?UE-`{eg?tWVrI0&8)(QD3 z$POWY1lcWQ#7}W;eB2&u9LN?S=Ywn)@-mQ}Lgs@!AY?7bs886={{}Mm7E3-0vR23* zkgY;~1+rbpA3zQWIsR_kpKrCDp9V7Pla@RWWKhVOA;=*Jzki$aW2{QIG zw$C<@*+RYn(zCB_84~gpknKW#2Ga8-+xbC|K_QR*1tu@#=^(cYc@D@SAs2&;yTf)K0J-(6 zmaGFgAmk>HF*|L|e}Hrg`69?>A$vhae$B4BA7uA8EqTm7d@jCa$yktCLZ*TYNaq)T zERmW4kbP3~I*=pZww>Pxa)TWGvmkS&&-cTs-FDUQK&E}ylH>2eGnyp+ z+de%Y(}m0ixmn0EkR3wa3bI?s`$6s&@(GX;zp=;qCde2ezXCaM*w#D@@_>+0zrt1b zM_Y3?$S5Jt1(_w}WgzQ>Tmv%p0o&(aK`s;WagYr{z6!Eg$R3bALVg3%^`Py1+`X9L zLzavI*(>B+kl{yc&1{fSLS6~7PRLr2Swe0MHGi>vJ{!niEx8k9hmijU*(v1MUt^a! zYFC{OGD65ykWoS|0U0M`F34OV*MTe%ay`hcf49fl4zfeYcR_Xv*$;A;kUxM7d)W3F zegK9-#)9lSeuVk+rt?7#33&xb*Kk{NHONRI{|qui$W0(~gxm%)`Xt-uhalsH90Hjx zpqybh#W$n_x8g=_^G67nUGZ9;wuGV2uE z`2mo%LLU3yc)AcW7G$T82_O#$nFTU@lmw}EUG@^z5CLhb=M zEaWdBJ5IGnf8uZO=@!xra!|-cAV-A!6Ug|}Y@g*I^Mw2h$gn5dnva3>2>BYw5+OeY zStH~C$gM*D4`jcPCmqD~GsYgP7i5Q!OF<3_SpsrI$ZC*zPqlq+02wdjlcDBmw&u=2 zo^HvnL2eN8FvwORr~MXt!C1R$3dkWL{|ItK$YPM;&#p*6mZ;$nUkhwxW z53*9o_dwPO`8miAArFGwE#$;MV86J~9_wt7X+ma#%oB1Y$Vwqsf!r+QEg*Lb`7p@Z zi|nz!3UaHEpMmTbazDsnAxA;RzR>nL<$tgb3Yi3Q^kQ2x8)W>8EO`~kJR$2qRtk9s z$lXG21-V(sH$%;fZRcMHGRu;`fsFVEOP+W?o)d&j1eyC1TXPA>fRLpiD}}rsWSx+W zAUlM73}mN}Z-5M&ZI87dWQ35vf{YR}@-UvYgghB!u8>}kl|n89>AAul>uQi0Lf#HC zN63djmI(O|kS#*K1F~JneIP>v_E^XM5j&BP(IA_JOa$2`*|*Zx{1oKmt1bB>$ZR3UKY;lNIT>WPkmrC*zsB}?G02f? zEm;E6dz~e31X(L&Gsq3n`6D2krDhk%2sze0p=OQk{5OzYa`eYPi02LIb2iB4SKC!D z0@?Q(OBRD15b_3)!$STIr0cbI)y*J1LcR(zUC1v$)~~gzj(}_wa?+n+C}bSSHX-ML z>=QB@Zuf4LC7G;W+ATz*(2lzko`iogUt9hd#vw)TqfiyJ{N)XZnHJ>LDqiUlGlT*7jhHGCLx~!*(&4?ki9~F3bJ3w z|ALIY#U5+qQM`jfo(a+`WID)9A^!lfR>%^NO+wa#Ty~p1)`vg_gnS8PjgTLJY!LEG zkUNC@1>`OvPxw1_kgwWfO$51F$SjcCh0F)pEo24AQ6c{VGG?dk{85mBuUYa9ko7|D z0of+xe?e{+()BPt7ebx{GV<%T^AwQFzG2B_AVWfygKQSE9%P%4cY*8^ax2I|A-h4w zf72f8K9C+E{|7Q%$P@k#pFtr{16eQRJdo`|E(f{c+xA%3g4`iw6Uad!9|bugra8F>LOu*KUC38J*8j?``US{FArFFV7V?;3n7oitAp3+&0y!+?5|ACg zx5pX;*(KyHAa@Jd0&-Bu$3aFPvVC@ebPL%J^1y?(=I9WYn0g-iuG zBIFW~;eWNO=7LNUavjJ_A=iU!{F`019pnZf-v!w!WIxDuA%6flAY}OQ$8?Q6YCDew zdEoDsoDVYkVM|^CGE>OaAajKLGss3EH-X$PlnN0aUeZHo(VEf$VDJCjmvK3^XkS~FZ8fH8H6lBZs zmOKEmSIA=@g~<=MHDf`>2$=wKnUGl^n}jR@IeCQb^Jb7)LOuwxLC9?&n}vKGr0WFR z=N^zXLjD5MeUhzt;-m4o5Yi2@L&!xSd*oRE1ag2)f*cZZBghdU zw}1?vWLMn|GEK;jK$Zx(A7s`!cGZZ-;awJT2FO++(?GThxftYtkO7d9lWpg9AP-Ej z$!H-RUkb= z-U2dD$cI5@oM%^k6=YDz&p6Xj}IUwX!AfwK= zHS0je33&&|CL!BEHe6s=?E+bMp(VcpnLfjkzkv*Ufh8xNgwMNlehSD;sW}hiGC9`E zK<>WC_89`1B}d-~vSg;Mxdr58>AVZ%$i=qimmniwWXWGZE_<;hPk21eLTb(inJYCH zf(#0|1Z1m_r69Y7tOwcnQhTheAUmYy3m{vh=KCPG3i&z6ejyKljC+~w{J4{0_;O30 z1u{%(W`Jyzn#)192w4bnmyp+k%$#F8zZc~0xt4qmWYjAy`A?9!LJokOEPW1x?2$f? zegd8)WYsf3?zqx+J|ARIYOVm;B{eHR_6m6|$nZYf=SGluLbij<=(ja{KzgL+K9E7F z`76j;A&-0_?vO&pfQ*`NJ3klXjsZ(v4st+NtpqtFHE#wvD&$=t-3x7>TR`Rr`4-3> zLhc2bA>?l$dxVTU1$QJNqd`V4vd5YXvPQ^1f{b2jYnFk`keauE%#xb-fy@>1F_29{ zz6Nqo$UcxgSJ`770l7nJP8@}OM{3Rh88&EFO$6x`G7Dt8ki{T9EA6T`fecB_7LY-y z`83E{AzudBF65^my;s}Le*&4l#*)XLifITr6Xbx9X&}R-&rFcfQZpZ9)T?dh*MZD^ zjU_jMJRqw+1F}|Xz74Wb$d5pF3i$)b^w-+X!%xG}-(bmDkatCQCjAvSz&{yFsSC*^+xe4y?1}w;*$*=J+S!8k3`+4s!4u&qkj!#m(=_OWUr8WL5BZ}?Q;~QTgWM+@h)F) zYbJq=mYP{0!)~xO{U9d`Sq3sw$Xh`+3HdO{-WzS7uYe3n%}+rdkeWjv!`@?89RcYT za?+FWX%g~mkm>KUt1bpvCuBazE+N-}td%}*0_l;O_k-*gay!V__uFIb1=%Y#e*hUT zHOD>$SDlc@f~*uW4rI5G3qfxEpgmR}$QG$t1F~0Y-T`tz$W0)lw%R_Q1z9KL`ygZg z-PZgLWR}z%cRHSNRQO~JID+np8{DU z4t}!^4)SL>kLu$?j*(Ky$kRw7a1DU{D&n^d@A;CS@j%{y;3s+{J8fN$<+j%_5kkq^YWKe3Z09h+! z5y*BS>p;5iu$|urGW_e7d>&-Bkh?&(2)PgBsC51#$bPAL%+qo7Z`jUffUMhP$ps+O zziG)UK!$zGl9eEPzh=o=keO2RK9F1G=sQ4emZRSlR(;#{`2)zt-IhFNEaohRXMo%w zHRpkxEJuGa$jwr-7-YMU^&k&?#~$m$AV-CK8D#i(ZOvYgQ9|wonI+_5ka4LG}n4 z4{}(@#UMTV?XebvTqfj=AZvu&1hPTM$3X57@(qx~LiU5)@N0Xlhe37;IrU834~2At z3_oC3Jr87>kSjoD3%L$thmadVb_v-Ia<`CggB%p{W02AJ*`xmvq+7^i$Kg8sA6qjX zWZ3LD`W%6CLtdI>G_lG{0)!+A-@FKEaX9uZ9fz6df`$lg%%knM92WdFmK90lomUX}0rZkXvP9=Y!lJ6PpEcSXR9Xr0YD}=Q@z#Lf!^4Qpimp zgBWO?5&1nGLdJ&QSE zm5{4I=3HQFUI(&L$lF2I2>AfWIw79|*(~I{Alrrf5@dHG@htuXvhqTEUXOYX?$0x< z&*>m{ztECykRw87g3O$0YhDR5=VD8)1=%pml6QgJeu*VFgB-lnk}rUa`X@{71Q{!n z-v`nwHHScE3OS}5K0;0cSt8_VAV-8u1le$zJ^BS8d*tXZ0U7mDTXO}-Y$1z6A0cl9 z*(&7SAl)yseLf7bQ^;pP_Q>_~6_D94x2wJjvO&mCLLVUyg3OX@<53gvRFJNOcs-8> z86j7~IUsjSpP3*Bg>SB{kll$y z=RblR6f$BWe6FxQPX-y6NbEBKWVeu+AWL3hSIr4EiNsY`g_^n6=M5mkUunsWAlro8 z3NrJ`y7SpX3)c))yBPkNb^QNv$DE#CeRt#!--3UHB)z&FtHNKyy2jvX=Inum^H(n( zdr=^dz~9FmGZOz>*AAxa+$Vbl2& zsq=|N=aY)gCl;L_U)5ZQw&5MQ{pbQ*&fys0uidHhu}Rjcaj`8z-R zHvWyFcom{YPjJM)C4#^8eLodM&-9eS=d`Nk$@t&!*Z*A5j~hzt*VQ#Sbv`ZnnD_lj zsMXG=6`e;{HRD2C{Pp$6fA$AW=Sx!O(M9KAqMb(Ic6Zb+B2rBdrQG$9DBC%kQi9Zu9i2kG<-~6z4UzstLEtaL51hiid7$ z&TCIP*4TJn=3Rb9(Rpmq`HZRtH?Qh?y!c6U>t=^UP{h?eo_U9DQ};Gcm0S zHR|)M!so2QXM9yN3u6!O!962qf4}j0QR+M%K6-6DyINKIoN!71TN29_AeOi)rINX7-C))2i-b z&J*NVzrEu1xJA|XvG1f+p$5k?*Wtu!mA%5di#g*qin9n$L*Ys2!142OqL8cp`c>*Y zshD#Q^5c#PE5cv1mfX9r@%d|76>4;1=YTY;uD$KPcQmUWJvkmV)aa_o)vEeEJ^MH3 zVWY0k{j{_y)abcSsaDx@pH!TCZ&foR{4f4KZP?fFZ;sUGJ~4IftbTv)cO3X^VnH0nG`+` zK_RSqq&&f15CT5;Zn<;8rsmv#oBD*BW4l5h{Gw|oMicvhgiF0^JBfWZz7R>%d1Kd! zH#VJ*nG#(?jlLJvHA$aM=kL3=S#@e!6>2Joj zj;rPzoTro6JKIG_^x8PTx;8F`U0>g_6$1P3tC1{W@0JhWtR>8hc=!KKR=_Dwuz@|r1q-K$p5pHP>~U$Nq<*06p3#7^rOwy&Sm zX+1-K{e({b61K0WVt)Q%J;V0(RP@#}^w%#K>|eF2yKMlPcIeRh7FHdY<{i$NFmcU< zco8@bUfR+jOsc(uq#ZiYvl(P^==e^inu-3U;H51Np#$IV!a>pw9r%vB9hkOsnAGts zB<;|l{VYNUrX4!avp9>;foV$zz3hq>8h7eJRlf)0PCY2=_h6j&m@u(-O;4YG2AdXM z>URkDSm(nL8%Wr`-uY-W>lwDM=b-Wv2*+pGzMez!)-%l4hdri!f?n!(kRde&v4Mo` z>p3KEJ;V0(9Fn)5Vf%Ux$y?7bUmxD&DIKrDJnhhdXW1y2{!IN2VazPa8%Wr`o@4UX zGi+baF?s75`s-y2$=6HRzMhKSdWP-mspzd|=&heHAzlP6??4fE>OoPpsCzK()Pu5q z55_G$jGhg|)-Tn^Nw9;+tP)3$1XH(>B78Ym!9$`=LzmeWVvWLW-dN`lGdaxbu0d-N!J;06IJmf=Oo{Pk7J>)}P_K>(! z4_-)q55}E(@G|myFmCH1AM&z?#GQIj*6+c%QxD4eJs1}~!tcZkuDGuCw-Tz~ODPLl z`^cxl$kfM?yki&dlDA!$ckIIHwYV_v*oE_J=@RlqgDX~C(-(jDEtIVyi@zVGEdBIxNZSzX&55Cg$d*TY~SJz(MclGN2pRo}`9 zec{mpnVDZ1RttxgT(fZ1lD?KS{Lxey^{-wtl;h&ij@G13S`1w+O+|~5YDHXYvB=Tt z>7>Qb)zVb77^zmowHAvUt#dkQF?6*w6)i@p6>+V_B1da-CoP7qmZqY`NVOuawOHh6 z;Sa{zFL{QpmZqY`NVOuawOHh8g*#%)Cvi$&3R|>nnrWpd*9y4Nvg`E*(c5WS3|%cv zMT?PYMO z!#{9Q6@(p>D>cflz6sb;2Ujd#T&y%fu@8r=bsyF+ABB_FqtJ+>Fc_mSuY4_ThR%tu zWaw&XDq4(GE8<#}lw79-V)xYlBkqs7h8(_-jqX)0QbR4d|Ii$$(hx?%ZR_HJgLh^xy| zcj-(kzgLkxnb(T8l-_w7Av!TK0VMX>n=QHq&ya#eKM% zovznuaWnL^7`oHaRJ0iBv?8vj#Uf`~+-iNTPSfJja$1aXt?TKx>unCIoE@Z8{u!i{{oU|T#pajnIosyi>6>d4%oo%y#v9O%-jt!S~UYVqN~S+82$ zp*<~z?zA)&Ek>#paXl>-In&|}?P)P|wKNqiMyeHYt;Hf&E8Q1-Eql{2H}L9BIH&%p zqH3FIrG>dxz>Sveu5ThA96T+C?zA)&Ek>#pajnH7XIhi%Q}(s&`Q+2$(sEjiaxFV8 z7CBmcp7FF8y3^8Bro~9LBCe;!B3CO7#MkOHE&oxfy6hO`T6S72a>BCNbZE2cmrLMV_otCcGPa>aZylF9Xr=_WAF;cCF>uIsbnHC>< ze64iSEm}6swA^XMgEd-qeLk)9(Bo^Rutm$JnO2JOX$9P9g;(CARQTBVk5V?#XOG?v ze?E|Bayo8UolTy^lMyN}Tp>Ol*a4?y%se3ttq>Ctiq!2K-|`f3&v%5Fc|samAtoXe zX@1nIvj}mwcZ8UELK<2jCL$DR5@Jay#0}LEV&(~HXoZ-FP^3wSC8ZGeEJui$C#0bj zVj@D3CLxx1Lg|j;3fa3&edlLS8>&!BGNC}-#c~aCpK^qlc@xsm3NaC(NRtpt$_a6Y za)s;=vI%iv)l-GM3B`H}+0HT{?oEymGjBo~S|KJfp-7VuOUenk8zPt4^T;N|g~f!J zWI~~t+c}$1+O*sWrOcm@4Rt~($%F!>Po^4gfElX#sSvFfIOtaNQgz8;TORCNy#4XDaV&(~HXoZ-FP^4)> zEGdP!A2~wIJRuFO5EBuKGzqb!6ykp52r=`7G_*oYL@3fE#FA2o`;jBW%oEbk3NaC( zNRtptJfU=#a)tamSan_M4|^(i3mlSCd86*Lfp(; zp$-$`!m6hVc@wI4!D>RfSSG~%$Pr@ZO-Ms4#6%_(X_^pA$_a7Ha)mlfhzpAeG0B9? zHN+B6C~aA;P|ExX*-$5xl1wO2PAI%^cERw5`nzD6SmU0a>bI%OKit+pch8jhzpY+` zG6X-Zrcgw242t!Yuf^Znc20C9Lsv^v(PE@p5!YHQG8aspxqEvNx>{UXrJ}`1wIcSr z$4`2laj*5J#n9E#RJ0hWR>Z}jooR8$^|TneTAGR$Bh`wy)?$&P#eLV)V(4mVDq4(G zE8<#20sHIqlIKqBX)$!C zrKxB!Qmu$$JElds+k!nR;Yq7}D;tuU;F?6*w6)i@p z6>+V_B1elmw5P?;)zVb77^zmowHAvUE$+~s7DHD{Q_*6iS`pV;EONEdUDVgIw^(xn zuRcl6Zwxd?%x~akMN#BvafkM_7`oHaRHns9rxkIn#UfX$!?gJ1(4u8$nQ6Jx;=@5T zJMGTxuFAMWd(&d*YH2E3jC5KN*VAH=GcE4$zLuRwer<7S)i%>|r^SbZG!ff9pH|w& zeXSI>Ov|R3R*Ldz1>8(4yz(9ng0=r}P$ZdlPus(R35the>CDC z48|bLD_^Va;hmItY^sbqv^On=u9l{v#YnXxuBXK!M~geO zr^V3K(p0nk!nR;Yq7}D z;tuU;F?6*w6)i@p6>+V_B3CQjMSU%Mi#0d!>eJ#s9B7nlg?^2e?XI6h?$DkVLw8!5 z%Cs1%R>ZXyi=1h3hxWDX`Q+2$(yDEyl@{h&c3Qe#r^OxG(_-jOOHx>}lw79-V)xYlBktCjB2zE;Z(y!y2G z4+k3MTImL^MUEDCXitlwJ1tFRT8vaH;(A&va3Y3y zafkM%#n7FWrlQ42wIZ&k#Uf`~+@XD~bkZ$aHqEr$X~lyzT6TRtt+b8%S}APNvT3H3 zqI_BbH(KG9_izxd5&z+!NHXooZ4U<~D0bnHHT%EQu?h1*=+Y{!2cZ!MVK4?^Uin(w zp*<~zu9l{v#YnXxuC-WHb?0SMDRYPRv>3Wtnu-=9)rz>*Vv(c89oo}k=xS*yT8vaH z;#!MEjuv-lPm7_erKxB!Qmu$Av7=*_(#BfmiRp^RMzXN6c?YW<^otXz{_p z(_-jOOH-K^Bb`>nwHAw9tq#-Df7vddmZq7OJFU2)(X#J_eiHdS<4ud9J1tE`i;+$% z;#!ME&b0VE@ZHJS{mL zn=l`QF0Imf5E^k124fKBm9NF;8BdF$tEH)EF;cCFYb_R4-Fewm%6y*jv>3Wtnu-=9 z)rz>*Vv(c8=NV6np{u2-XfaZ)h-)ntIa++4@w6DaTAGR$Bh`wy)?$&Xm2Musmc8ki z8+i5p`;Sr@b{_e)#pk7}ZKmZ;E3Rm?YOX zvB;SgpJ#k6dp`NJxU`%Wqg*TWYqV_ld|K(D$Ja_>%d~8oO)EvYR=|x`c;!7xg-?Y4 zC{-kxc5mCGlnIJwmXI}1OHRio%m<-M<^9o!gD@C_Ft2-VQRA|us` zxYlA()t#43)qu}4o)$w_OH+V_B1enQGoBVh zS4&gTVx(FT*IF!cwbFgT*RnSab4#k;fB#WRqg*T9lC;Rt;`5BB#n7FWrZO!?sugiP zEf%?29j2uZJNdLU&9qY2T+2>N*Xt*d&okb%7`oHaRJ0hWR>bwRSmaEL&ojPOI_VZI zn`T<>wD>4hU0Xb~qs8YLPm7_erKxB!(rHCpPm4vaRyr?V%g!Uew){t_Y7mTat4=<&5u z*fK4fW?CuAwE}LY6<&FdQsF}IAEk;U)1KP)C}o1;nI&Y+(~{G%3G+edQh9$g;vfvh zAj~UYi_bHj7DHD{)B63Xj>t&0BCfSqRCVWNQ#Ii8jHkuW)zVb77^zmowHAvUEk4h9 zS`1w+O+|~5YDHXYvB=Tl^Ngp((ACmZv>2&Y#I+WST&;BT@U>cQN!9!BKT2toYo%L~ z7CBmcp7FF8y3^8Bro~9LBCe;!B3G-!wDe)e+`y}|)il#eU2`ovEnTmlL_W`W(_-jO zOH55MBCe;!B4=8Bp7FIh zO^Zv*X)(&RLcd1KcF(7k9(sJO6t+yurrESolxqdtXoXkaqf~g0{YR-H$+W}wdAa|6 z784ZDEbU(c22~C7K{#nW2#q)hgZ=J&f2vA8&p0RA{;y!`Qn_q2QY}78X;HOawfH>a zX)$!CrKwDdk!nR;Pm4v47N2K4Erza^rlQ42wIZ&ySmbE&dB)RX=xS*yT8vaH;#!ME zjusyrJS~Q|r^RQMYTCM9r^N>cPm7^DElov>kxnb( zdRi=Uro{&bU#ru!xU`%Wqg*TWYqV_ld|GM0^tDphGA)~C(@IgU6>y^!UU|E4c#r*E zxJXLvWv$yV6K@}0*8Y1MIH*mXVHB~MhRy6a$m2ZtvPG`Lc8sM=eL0O)j#(xbIptVZ z9l>5iI6QYo@9k((Uyh5bSml^ya*7}G0Ws4ryR>XIqs6K98+IT zW0hl;$wf{%mU(jAD_uFJzMRG?$1IbJoN_Gl<u}+RzCKov;$1-28)8uq-EheXNE|(e?axyt>k=;tThq{wv>Q7E%m1CC4 zMb62w%$ppy+ZMTW`fYMH&gJ~c#RD2S+oG6U+H_mwQraeG<6JIf#pD7va^Ypme!i@I zL(ihjKKzGK-Jh#XP;8kYYyK3%>DYw%ICN>1*3;04!!Q`LFt2k!nR;Yq7}D;^ygTF?6*w6)i@p6>+V_B1encrl-Zw z)zVb77^zmowHAvUEpC{e7DHD{Q_*6iS`pV;EONEdZOhlP_cXKLRF|c{QEQZIg?^2e z?XH(RH%U*6p*t;2Wm=3>E8<#J1t$W)8fYHX)$!C zrKxB!Qmu&VX|c$eR@;_bT_OxywCpT1Eq7Ynj-BrLw9=mGPb-BjS~ktJQj||C;AUFk zmA4NEYyao!A}O``({t51etSneBolAL!;`Z6{T=nvCUu5k7gw>FhRy6a$XkwJ-zU^^ zPxQ{XNqspkcI234a*EeL0O)j#(xb zIptX9$#Iu-<(T?%8mk<$OfGWDvCNa>Ug^p)_2o2HIcAw$dR@Ya?CQh$SKD%PmVjPE63EA(^%!0Wpa^Ij%A)4cT`u7sV}Fo$}!92BBvb7e7SW0 zY>{iZyT%LF-_f(IkV|*htjv?+j_S%W^(UvXPL5e77da=#GGDIKKyy@O7Iaw^m<~vG>lQx#pQ7!(1^2jUo%HqsXO&V{n7@6&bfEYMv=F%oStM zD6-I1`khl>Fnu?blai+%iSYvnevn6=TpS zve2C(H{mu#dw%5?<;EnWE;IBEwuU2F(;%=uWZI0|724 z#;uBW%7tRf6y>3yI7&Iiw0pNrF~zNlHZK%YSWYnnc8cM3+p|I2kNa_huOA$)S-5KH z!0LtQil6YWLpuYOEgev>Wa;81kyMWwJw2=XmWOd-O%0Y6q^~=#$UtAwA_INlG|e&k zCS|XCve)NiuP0}(r(~~tv)5DOYYe41!RkdauYR2*t6wL<>eorG`gIbkex0PMUnimJ z*GZ=ObrPw59VBpN;Jo{W7A{*k*gsUgORI(!UbAoovX!e|-M4sf#r*z3l&9AVRxDfD zzkDEqYghIStysQrS^ui5`uYc6Rs9am{J|9qu0nC1tr%Le@R~XdotLjzx@zJ4rTsYg zHT}z1rTz^~za6BdOP8%&J-BLNQM|H$U|{L;#g;E#-G9x%s>VE+_N`jIGMsOHw2E~P zTwvGbHA|N-TEY3G!v3KpeTxQHU|`o6(m%iM8%Nl;Y{dX(%h^>&!?3Wbe`u)T_*ks$ zUzG~00ragJ>c3_v{_$9>vp7t~(v@y)Mf1|MBUDPUWg_RSSU&jbu0Dt@4A;a;3=@Zd zN4yqrml<3-^lB4z^;K`?s->^NRF|xPZD`uC=E&h4tS_5bnGTRfS7+6VCQ4UcBZG3x ze8n~Ca86)5R65tfZQ;=BmG)Hn^m%^5=to$9PAGnJ1*76=EVnk>*FOI*Sk=+8rTgo{)xCh=~YA znuJ(V3h@!$5n|>EX=sI*h)|?Sh$W>EAIKdcW}c9SR)~oRMVf?I;t7R4E&HjS%TneG z*-(X2k_iRsc9v_158KX!n0Z1PS|KJP6loG-NjV`tTDwAa2=&7~d)iQiya~kvxr?(2 zg+~wnEt^t3H`TYVLMSb)PEv(Zl1(U33WXQNgJ(>=FRk~IY=jf~oIhg1x`x+h!T}&^ z-5DgyFOf2=2OtRt(9kH<991uoP{-SNd45gi32~vkBhpfYxHCveDa6~jBgD)T($G$b zi3mlSCd86bi1%nmh?ys(p%r2xLXjpRmXt!gM>|5yJRuFO5EBuKGzqb!6yiPF5n|>E zX=sI*h)|?Sh$W>EZ;6f&GfzlEE5t;EB27Xp@r2S{(-pG!T65nE9~9oftDY*9--w%f z3fazbAL8$5I6}<432A7Bn8<`8O+qXwC&b?+afR%8WE0}TVnR$Zq0o#%wzEu#|J?yc zh?zGb4ef-Oh)|?Sh$ZEO_@5RLQFCtGa;6ELTTr9g;M5E$c8$hlw?AI zazf#Sx0&PmuYa4!{25VPCPC&qv1KdIc)3cN#y`!%(XgxzibsHn?N0zU%7<2D^~`L* zkr7rhZJR%;xP=#|)gqhl?dZhSWu{N z=PgwjIVzeN6$Vx%!l=T6LWO&7slv!n(afkYuqqKo6&5%u=?>$mwA_5~zB>PTsQO50 zk*cISPqEToE8O@?6-LffG&56SU{xZFt}G~~!aqmyRNAM)WmQ8_ai$WhYZcqoPK8e& zr3xcwDw-J;26ieDMimwmQ{h94r(*rhMum5r%krr(P?gZBR2Aw%M{$B`wma1ZYF%@+5M`Fg`|0XI?h z#+F%{rUdmVG|=l>Pcu~UcB|8r$Wh@kJ55<+RqDI66jUp%3U8XF3L{5FGcy$iRwcqX z6&4gKylIvyj2sosj0yv*5@A$fL7~E%W~su+QPIq(Ft92SMimwmD!gfyDvTTz&5Q~I zs}f;UVL_q7J5{N|$WhVEs4%c95k?gjI4bE*<*C@4SpD=@H?*0kq(D^y^j6wW5Pya! zRTw!_(afkYuqqKo6&4gz;m;7Biam3k3YS$4Ma7v)tgcmTS34E{3{k2ua;Bo0QDI=G z5@A$fK`|Bn4B@F*f1L`Km%T*Yp&GL>u_Z93H|p}^Tj zQRr`@MPR4a(-VH+3ID83-L?ML0u0y9H!f+m*s@)d$pw)wY~F@EiSL6@dEp9iGj)WR zc|saiZ$>&A6A_9uFR41mOCv?x7#$&Io{)xCh=~YAnjf_k;`ZnWG4q5pv_ecoDAFXv zl2VA9q$9-46VlKMF%h9ilMqWvA#Rn95Hn9mLo38Ygd$BsEb)ZWoyQfjccuCU!=5%& zp_F7ofx3(3qUH|n2r=^}q@fjJB0`ZSA(oUA;txlzkR3ucAugpu`Pe=g?)*#NO`xcfrGi`y`w=H6enYqIi3mlSgjiAv@eb_>G4q5pv_ecoDAFXvl2V9wXh(>dC#0bjVj@D3 zCLxx1Lh1hF3fX&;xygi!&-t@29xcD?HT8K(Da1RpBgD*`kcM_bOk_flCLxx1LhTdM zTYoko4OPgS5ch>JE?q1id;SBK?u6{EzYwya3g!DkbV&O`^TOK~kox;V9%R1RKbOIu z7aCsNh7mRQ{<2+@dC#0bjVj@D3CLxyS6&qZ6 zhjxURc|samAtoXeX%b>dDa1RpBgD)T($ESq5ur$v5KBrS-k}{KW}c9SR)~oRMVf?I zQVQ`7?FcdRgfz55OhhQsB*YR=$iM4_>q~F_<|b2yDwN;#ntBSQl2V9wXlFvqya{P& zg_y{MB27Xp@r2qZq<8OZLK>=&HzDo|VO+YH`$CM;P28Q3z4aGDHdLXMWD^RM6ACZ9 zeF0AXzK{o*@1&NW7aCsNh7mRQ{<2+@c7&LDLK<2j zCL$DR5@Ly7vB8yhXh(>dC#0bjVj@D3CLxxTLcBveLd-lN4XqFp5sEYkv7{8@9oi9M z<_T$Ng_wv?q)CV+r4aAXju10XNJA^cM1&$uLM-uw{JUPbzFPN%GE|}buGiF4D3z2# zyhA$^V&+XqLo38YCKPEBVu>fzJ|Vq(o7-?WV+~cvn-KSfaxwRX7^R!IJE4^M6SAQS zr6ikBpqx;6;q41>^7n;2$b5TR_JxKQw_!xhy}xYNWclgK!YZs!UlN{vLvi}e3s;DD zXh(>dC#0bjVj@D3CLxwooq2%-SKgr=A!eSChE|A)2t}HNSW*h{4($jr^Mo|CLQF&` z(j>%^QiykGM~Imxq@fjJB0`ZSA(oUvyhA%e%se3ttq>CtiZlta#1r!Gdg1zN-51JG zh4Q;zQ%|8(QVQ`7?M#T7Hz5tJ5EGeDq)CV+o>2RQ^ww|og>c3is*pD!?hEB&`PjGp zK2ls}Z~cXk4OJ*5*@Ob+gu)ANU%+wweIXCBcl4Z=eWBsSZ5UB=?=RamS$=`Y!YZs! zUlN{vLvi}e3s;DDXh(>dC#0bjVj@D3CLxyS6&qZ6hjxURc|samAtoXeX%b>dDa1Rp zBgD)T($ESq5ur$v5KBrS-k}{KW}c9SR)~oRMVf?IQVQ`7?FcdRgfz55OhhQsB*ch?ys(p%r2xLXjpRmUu$`Z8%);dZ#say)smx{5IUwQz(^`Li~reoCz`WCZwSi zVj>fYGzqc96KbE3{sUpzgfvtkZ$h!2Lah_xKfvWoh?zGb4XqFpnNXxjh$ZEO_|JK{ zLiRke32|Z7Q-!<<#d-?a&fLnwwZ?x$%oVb`bs=O!6-r4qp+G4VUU*wMocygk4>I4$ zEn9iRi=7iuvt5_%nk>ISWTCttlJN8!iqmgixI)}i9U*3(kcRd95st=0gd$BsEU7y4 z0tu_RsX9W;JRuFO5EBuKGzqb!6ym1p2r=`7G_*oYL@3fE#FA2oo2nzk%oEbk3NaC( zNRtptN+E8lju10XNJA^cM1&$uLM$nTxT!iq%se3ttq>CtiZlta#1l$4L|4e(EX`dn zd>VA0SE2ki+|*OZc9u^WH&sW7nKvN~tq>ELP^3wSCFO*;BfCQOJhBOKVbxQGya{nD z5989sG9hlNju10%LK<2jCNiN&(}Y-3PKZ0QE7V~^Tv$wqNhTDUQOI`ACY1JFS14uv zglwo2N=YUZD22icZ!5Tl(Fkoit&*~%MU?3{?2?YeB&WclgKLU}(V;psONr{BDA zg}A9YLd-lN4eR$K9F2(xMVf?IQg!A95>|6lb%dCCLK<2jCL$DR5@Jay#7)%^V&(~H zXoZ-FP^3wSC8ZEIRY!=KC#0bjVj@D3CLxxTLfljxA!eSChE|A)2t}HNSW*gcQ+0%x zc|samAtoXeX%b?ICzNi8u8_T1nvE)a8vLzXl1wPwhNYww;-=~dG4m#*p`8#D5sEZT zh$Ws-`-F7E%_gLw3Z<5rkeQG!mirJlRcAuXya{P&g_wv?q-jDdDJR5z*A+^q>I>OW zg}e#H15wB>&L))hT~{b&zK{)7C?(m10;N!R;cex(I50maRPF3mlc!skHv7FwRpm zQE{dct7{cIYx@b}(?>ZKM$S|;Gb#-1R3eNjEGVYJhZax8`s=mAWmQ8_ai$WhYZcqo zPK8e#r3xcwDw-J;26ieDMimwmQ{l6Qr(*qeDqNONg@LMsPPK~dYNx`dj8cV>GZoFu zR2W#52%`!Mim9|c)!GcHsFa9;>7uDPlZni#i_MFlAs}% zRhmYHfmMkxs<5D1$;$yf`GioaFmk4%nNeY2RU(WkEGSg?gixw5a#S=kDh#Yjgi(bB zg$kb#N)<+qie^TIfmMkxs<6OONgs7j#oivw4HfUJ|43p3RY|uFTTrO*387SBrg z;i;q(bX9C7D$Z2+NP=sH2P{=`cq-Okr^03VR2ZmA=v1rNt~!lp%@N4gp1YdCH|91{dQ0(X-YyMm#I|&W*({R%IL^R^57>tuK zuY4`;{GJv=S4&gTVx(FT*IF#9y7LXMl=&3kX)$!QG!-pIsugjq#Ue+GPXwM8Lsv^v z(PE@p5!YHQaZXyi(IXAqw%%u zUC7+qs>@P$`AjP<%(Vh;v}||1z+KKpz)n@?Bw={KLQ?$d8RUESAw^Jya+hFXhOzYdp0_*&Ay!1jh(7URByQ>QqFY9-_N%|7S)gIn{enV|9$Hi~#?d8=I z+wm&Le~Ym`Q21pyNZHOzy7~Ija7OXlMzNs!HdGLKV~f{#pLzM-T6vIK43O>{6+Ceyy;$dRMEj;jNH-DQqCkNUB_C5|9kV z0iDJY%6VoJCh(oLEI(bjmM4VUkNs#7Qlr%_G2V4e2yxBPegU8PnfKqr0_ai1~#v6pr#g0SXccz)a0KG zoN;|)GX400O2_ACjjx;Iu{M0^N9|Spy5)H0y*Ae!-x6WzKQxzJkgUx(fYsRIx zXlTVCPA7cPw>C-lN_;dIEU6pe;_M%s-ktqbeF(rOEm|Z==sq~KdR5ru-QMP!$MT-; z-bFp8LB0qkIOSSJ8-`m@_1);zQ1X@aMdOAm7xrJ}H*IcJX<-}&&%nUMMHBj` zE?SVEX>|&HOP4RjwHmuG=w8%2d1`aPG<@<@dm;@#$6g%8`NboolWG=qeyif5Yv*56 zFPOAw%A!S6r-XZEHG@fu;#YXAHN{fm0S1B86?!Ws5e{SvRf(tg3< z!hRe=OXIPZ^)K&V96liR@#ar8fAu#!iKNjqeBlC}mL4QdT-k!5!Fu_E?ul~M)V!zr WoL<|v;r3wNcoU*_PxoXAy8a(s)a1ed literal 0 HcmV?d00001 diff --git a/wolf3d/wolfextractor/wolf/wl6_name.c b/wolf3d/wolfextractor/wolf/wl6_name.c new file mode 100644 index 0000000..3d4fdb9 --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wl6_name.c @@ -0,0 +1,760 @@ +/* + + Copyright (C) 2004-2005 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wl6_name.c: Convert chunk number to string name. + * + * Author: Michael Liebscher + * + * Acknowledgement: + * This code was derived from Wolfenstein 3-D, and was originally + * written by Id Software, Inc. + * + */ + +#include + +#include "wolf_def.h" +#include "../../../common/arch.h" +#include "../../../common/common_utils.h" + + + +/* +----------------------------------------------------------------------------- + Function: GetLumpFileName_WL1() -Returns lump name string. + + Parameters: chunk -[in] Chunk value to get string name for. + + Returns: NULL on error, otherwise string name. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *GetLumpFileName_WL1( W32 chunk ) +{ + switch( chunk ) + { + case WL1_H_BJPIC: return "H_BJPIC"; + case WL1_H_CASTLEPIC: return "H_CASTLEPIC"; + case WL1_H_KEYBOARDPIC: return "H_KEYBOARDPIC"; + case WL1_H_CONTROLPIC: return "H_CONTROLPIC"; + case WL1_H_HEALPIC: return "H_HEALPIC"; + case WL1_H_BGPIC: return "H_BGPIC"; + case WL1_H_GUNPIC: return "H_GUNPIC"; + case WL1_H_KEYPIC: return "H_KEYPIC"; + case WL1_H_BLAZEPIC: return "H_BLAZEPIC"; + case WL1_H_WEAPON1234PIC: return "H_WEAPON1234PIC"; + case WL1_H_WOLFLOGOPIC: return "H_WOLFLOGOPIC"; + case WL1_H_VISAPIC: return "H_VISAPIC"; + case WL1_H_MCPIC: return "H_MCPIC"; + case WL1_H_IDLOGOPIC: return "H_IDLOGOPIC"; + case WL1_H_TOPWINDOWPIC: return "H_TOPWINDOWPI"; + case WL1_H_LEFTWINDOWPIC: return "H_LEFTWINDOWPIC"; + case WL1_H_RIGHTWINDOWPIC: return "H_RIGHTWINDOWPIC"; + case WL1_H_BOTTOMINFOPIC: return "H_BOTTOMINFOPIC"; + case WL1_H_GAMEPIC: return "H_GAMEPIC"; + + case WL1_C_OPTIONSPIC: return "C_OPTIONSPIC"; + case WL1_C_CURSOR1PIC: return "C_CURSOR0PIC"; + case WL1_C_CURSOR2PIC: return "C_CURSOR1PIC"; + case WL1_C_NOTSELECTEDPIC: return "C_NOTSELECTEDPIC"; + case WL1_C_SELECTEDPIC: return "C_SELECTEDPIC"; + case WL1_C_FXTITLEPIC: return "C_FXTITLEPIC"; + case WL1_C_DIGITITLEPIC: return "C_DIGITITLEPIC"; + case WL1_C_MUSICTITLEPIC: return "C_MUSICTITLEPIC"; + case WL1_C_MOUSELBACKPIC: return "C_MOUSELBACKPIC"; + case WL1_C_BABYMODEPIC: return "C_SKILL1PIC"; + case WL1_C_EASYPIC: return "C_SKILL2PIC"; + case WL1_C_NORMALPIC: return "C_SKILL3PIC"; + case WL1_C_HARDPIC: return "C_SKILL4PIC"; + case WL1_C_LOADSAVEDISKPIC: return "C_LOADSAVEDISKPIC"; + case WL1_C_DISKLOADING1PIC: return "C_DISKLOADING0PIC"; + case WL1_C_DISKLOADING2PIC: return "C_DISKLOADING1PIC"; + case WL1_C_CONTROLPIC: return "C_CONTROLPIC"; + case WL1_C_CUSTOMIZEPIC: return "C_CUSTOMIZEPIC"; + case WL1_C_LOADGAMEPIC: return "C_LOADGAMEPIC"; + case WL1_C_SAVEGAMEPIC: return "C_SAVEGAMEPIC"; + case WL1_C_EPISODE1PIC: return "C_EPISODE1PIC"; + case WL1_C_EPISODE2PIC: return "C_EPISODE2PIC"; + case WL1_C_EPISODE3PIC: return "C_EPISODE3PIC"; + case WL1_C_EPISODE4PIC: return "C_EPISODE4PIC"; + case WL1_C_EPISODE5PIC: return "C_EPISODE5PIC"; + case WL1_C_EPISODE6PIC: return "C_EPISODE6PIC"; + case WL1_C_CODEPIC: return "C_CODEPIC"; + case WL1_C_TIMECODEPIC: return "C_TIMECODEPIC"; + case WL1_C_LEVELPIC: return "C_LEVELPIC"; + case WL1_C_NAMEPIC: return "C_NAMEPIC"; + case WL1_C_SCOREPIC: return "C_SCOREPIC"; + case WL1_C_JOY1PIC: return "C_JOY1PIC"; + case WL1_C_JOY2PIC: return "C_JOY2PIC"; + + case WL1_L_GUYPIC: return "L_GUY0PIC"; + case WL1_L_COLONPIC: + case WL1_L_NUM0PIC: + case WL1_L_NUM1PIC: + case WL1_L_NUM2PIC: + case WL1_L_NUM3PIC: + case WL1_L_NUM4PIC: + case WL1_L_NUM5PIC: + case WL1_L_NUM6PIC: + case WL1_L_NUM7PIC: + case WL1_L_NUM8PIC: + case WL1_L_NUM9PIC: + case WL1_L_PERCENTPIC: + case WL1_L_APIC: + case WL1_L_BPIC: + case WL1_L_CPIC: + case WL1_L_DPIC: + case WL1_L_EPIC: + case WL1_L_FPIC: + case WL1_L_GPIC: + case WL1_L_HPIC: + case WL1_L_IPIC: + case WL1_L_JPIC: + case WL1_L_KPIC: + case WL1_L_LPIC: + case WL1_L_MPIC: + case WL1_L_NPIC: + case WL1_L_OPIC: + case WL1_L_PPIC: + case WL1_L_QPIC: + case WL1_L_RPIC: + case WL1_L_SPIC: + case WL1_L_TPIC: + case WL1_L_UPIC: + case WL1_L_VPIC: + case WL1_L_WPIC: + case WL1_L_XPIC: + case WL1_L_YPIC: + case WL1_L_ZPIC: + case WL1_L_EXPOINTPIC: + case WL1_L_APOSTROPHEPIC: return "L_FONTPIC"; + case WL1_L_GUY2PIC: return "L_GUY1PIC"; + case WL1_L_BJWINSPIC: return "L_BJWINSPIC"; + case WL1_STATUSBARPIC: return "STATUSBARPIC"; + case WL1_TITLEPIC: return "TITLEPIC"; + case WL1_PG13PIC: return "PC13PIC"; + case WL1_CREDITSPIC: return "CREDITSPIC"; + case WL1_HIGHSCORESPIC: return "HIGHSCORESPIC"; + + case WL1_KNIFEPIC: return "KNIFEPIC"; + case WL1_GUNPIC: return "GUNPIC"; + case WL1_MACHINEGUNPIC: return "MACHINEGUNPIC"; + case WL1_GATLINGGUNPIC: return "GATLINGGUNPIC"; + case WL1_NOKEYPIC: return "NOKEYPIC"; + case WL1_GOLDKEYPIC: return "GOLDKEYPIC"; + case WL1_SILVERKEYPIC: return "SILVERKEYPIC"; + case WL1_N_BLANKPIC: return "N_BLANKPIC"; + case WL1_N_0PIC: + case WL1_N_1PIC: + case WL1_N_2PIC: + case WL1_N_3PIC: + case WL1_N_4PIC: + case WL1_N_5PIC: + case WL1_N_6PIC: + case WL1_N_7PIC: + case WL1_N_8PIC: + case WL1_N_9PIC: return "N_NUMPIC"; + case WL1_FACE1APIC: return "FACE1APIC"; + case WL1_FACE1BPIC: return "FACE1BPIC"; + case WL1_FACE1CPIC: return "FACE1CPIC"; + case WL1_FACE2APIC: return "FACE2APIC"; + case WL1_FACE2BPIC: return "FACE2BPIC"; + case WL1_FACE2CPIC: return "FACE2CPIC"; + case WL1_FACE3APIC: return "FACE3APIC"; + case WL1_FACE3BPIC: return "FACE3BPIC"; + case WL1_FACE3CPIC: return "FACE3CPIC"; + case WL1_FACE4APIC: return "FACE4APIC"; + case WL1_FACE4BPIC: return "FACE4BPIC"; + case WL1_FACE4CPIC: return "FACE4CPIC"; + case WL1_FACE5APIC: return "FACE5APIC"; + case WL1_FACE5BPIC: return "FACE5BPIC"; + case WL1_FACE5CPIC: return "FACE5CPIC"; + case WL1_FACE6APIC: return "FACE6APIC"; + case WL1_FACE6BPIC: return "FACE6BPIC"; + case WL1_FACE6CPIC: return "FACE6CPIC"; + case WL1_FACE7APIC: return "FACE7APIC"; + case WL1_FACE7BPIC: return "FACE7BPIC"; + case WL1_FACE7CPIC: return "FACE7CPIC"; + case WL1_FACE8APIC: return "FACE8APIC"; + case WL1_GOTGATLINGPIC: return "GOTGATLINGPIC"; + case WL1_MUTANTBJPIC: return "MUTANTBJPIC"; + case WL1_PAUSEDPIC: return "PAUSEDPIC"; + case WL1_GETPSYCHEDPIC: return "GETPSYCHEDPIC"; + + default: return NULL; + } // End switch chunk +} + +/* +----------------------------------------------------------------------------- + Function: GetLumpFileName_WL6() -Returns lump name string. + + Parameters: chunk -[in] Chunk value to get string name for. + + Returns: NULL on error, otherwise string name. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *GetLumpFileName_WL6( W32 chunk ) +{ + switch( chunk ) + { + case H_BJPIC: return "H_BJPIC"; + case H_CASTLEPIC: return "H_CASTLEPIC"; + case H_BLAZEPIC: return "H_BLAZEPIC"; + case H_TOPWINDOWPIC: return "H_TOPWINDOWPIC"; + case H_LEFTWINDOWPIC: return "H_LEFTWINDOWPIC"; + case H_RIGHTWINDOWPIC: return "H_RIGHTWINDOWPIC"; + case H_BOTTOMINFOPIC: return "H_BOTTOMINFOPIC"; + case C_OPTIONSPIC: return "C_OPTIONSPIC"; + case C_CURSOR1PIC: return "C_CURSOR0PIC"; + case C_CURSOR2PIC: return "C_CURSOR1PIC"; + case C_NOTSELECTEDPIC: return "C_NOTSELECTEDPIC"; + case C_SELECTEDPIC: return "C_SELECTEDPIC"; + case C_FXTITLEPIC: return "C_FXTITLEPIC"; + case C_DIGITITLEPIC: return "C_DIGITITLEPIC"; + case C_MUSICTITLEPIC: return "C_MUSICTITLEPIC"; + case C_MOUSELBACKPIC: return "C_MOUSELBACKPIC"; + case C_BABYMODEPIC: return "C_SKILL1PIC"; + case C_EASYPIC: return "C_SKILL2PIC"; + case C_NORMALPIC: return "C_SKILL3PIC"; + case C_HARDPIC: return "C_SKILL4PIC"; + case C_LOADSAVEDISKPIC: return "C_LOADSAVEDISKPIC"; + case C_DISKLOADING1PIC: return "C_DISKLOADING0PIC"; + case C_DISKLOADING2PIC: return "C_DISKLOADING1PIC"; + case C_CONTROLPIC: return "C_CONTROLPIC"; + case C_CUSTOMIZEPIC: return "C_CUSTOMIZEPIC"; + case C_LOADGAMEPIC: return "C_LOADGAMEPIC"; + case C_SAVEGAMEPIC: return "C_SAVEGAMEPIC"; + case C_EPISODE1PIC: return "C_EPISODE1PIC"; + case C_EPISODE2PIC: return "C_EPISODE2PIC"; + case C_EPISODE3PIC: return "C_EPISODE3PIC"; + case C_EPISODE4PIC: return "C_EPISODE4PIC"; + case C_EPISODE5PIC: return "C_EPISODE5PIC"; + case C_EPISODE6PIC: return "C_EPISODE6PIC"; + case C_CODEPIC: return "C_CODEPIC"; + case C_TIMECODEPIC: return "C_TIMECODEPIC"; + case C_LEVELPIC: return "C_LEVELPIC"; + case C_NAMEPIC: return "C_NAMEPIC"; + case C_SCOREPIC: return "C_SCOREPIC"; + case C_JOY1PIC: return "C_JOY1PIC"; + case C_JOY2PIC: return "C_JOY2PIC"; + + case L_GUYPIC: return "L_GUY0PIC"; + case L_COLONPIC: + case L_NUM0PIC: + case L_NUM1PIC: + case L_NUM2PIC: + case L_NUM3PIC: + case L_NUM4PIC: + case L_NUM5PIC: + case L_NUM6PIC: + case L_NUM7PIC: + case L_NUM8PIC: + case L_NUM9PIC: + case L_PERCENTPIC: + case L_APIC: + case L_BPIC: + case L_CPIC: + case L_DPIC: + case L_EPIC: + case L_FPIC: + case L_GPIC: + case L_HPIC: + case L_IPIC: + case L_JPIC: + case L_KPIC: + case L_LPIC: + case L_MPIC: + case L_NPIC: + case L_OPIC: + case L_PPIC: + case L_QPIC: + case L_RPIC: + case L_SPIC: + case L_TPIC: + case L_UPIC: + case L_VPIC: + case L_WPIC: + case L_XPIC: + case L_YPIC: + case L_ZPIC: + case L_EXPOINTPIC: + case L_APOSTROPHEPIC: return "L_FONTPIC"; + case L_GUY2PIC: return "L_GUY1PIC"; + case L_BJWINSPIC: return "L_BJWINSPIC"; + case STATUSBARPIC: return "STATUSBARPIC"; + case TITLEPIC: return "TITLEPIC"; + case PG13PIC: return "PC13PIC"; + case CREDITSPIC: return "CREDITSPIC"; + case HIGHSCORESPIC: return "HIGHSCORESPIC"; + case KNIFEPIC: return "KNIFEPIC"; + case GUNPIC: return "GUNPIC"; + case MACHINEGUNPIC: return "MACHINEGUNPIC"; + case GATLINGGUNPIC: return "GATLINGGUNPIC"; + case NOKEYPIC: return "NOKEYPIC"; + case GOLDKEYPIC: return "GOLDKEYPIC"; + case SILVERKEYPIC: return "SILVERKEYPIC"; + case N_BLANKPIC: return "N_BLANKPIC"; + case N_0PIC: + case N_1PIC: + case N_2PIC: + case N_3PIC: + case N_4PIC: + case N_5PIC: + case N_6PIC: + case N_7PIC: + case N_8PIC: + case N_9PIC: return "N_NUMPIC"; + case FACE1APIC: return "FACE1APIC"; + case FACE1BPIC: return "FACE1BPIC"; + case FACE1CPIC: return "FACE1CPIC"; + case FACE2APIC: return "FACE2APIC"; + case FACE2BPIC: return "FACE2BPIC"; + case FACE2CPIC: return "FACE2CPIC"; + case FACE3APIC: return "FACE3APIC"; + case FACE3BPIC: return "FACE3BPIC"; + case FACE3CPIC: return "FACE3CPIC"; + case FACE4APIC: return "FACE4APIC"; + case FACE4BPIC: return "FACE4BPIC"; + case FACE4CPIC: return "FACE4CPIC"; + case FACE5APIC: return "FACE5APIC"; + case FACE5BPIC: return "FACE5BPIC"; + case FACE5CPIC: return "FACE5CPIC"; + case FACE6APIC: return "FACE6APIC"; + case FACE6BPIC: return "FACE6BPIC"; + case FACE6CPIC: return "FACE6CPIC"; + case FACE7APIC: return "FACE7APIC"; + case FACE7BPIC: return "FACE7BPIC"; + case FACE7CPIC: return "FACE7CPIC"; + case FACE8APIC: return "FACE8APIC"; + case GOTGATLINGPIC: return "GOTGATLINGPIC"; + case MUTANTBJPIC: return "MUTANTBJPIC"; + case PAUSEDPIC: return "PAUSEDPIC"; + case GETPSYCHEDPIC: return "GETPSYCHEDPIC"; + + default: return NULL; + } // End switch chunk +} + + +/* +----------------------------------------------------------------------------- + Function: GetLumpFileName_SDM() -Returns lump name string. + + Parameters: chunk -[in] Chunk value to get string name for. + + Returns: NULL on error, otherwise string name. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *GetLumpFileName_SDM( W32 chunk ) +{ + switch( chunk ) + { + case SDM_C_BACKDROPPIC: return "C_BACKDROPPIC"; + case SDM_C_MOUSELBACKPIC: return "SC_MOUSELBACKPIC"; + case SDM_C_CURSOR1PIC: return "SC_CURSOR0PIC"; + case SDM_C_CURSOR2PIC: return "SC_CURSOR1PIC"; + case SDM_C_NOTSELECTEDPIC: return "SC_NOTSELECTEDPIC"; + case SDM_C_SELECTEDPIC: return "SC_SELECTEDPIC"; + + case SDM_C_CUSTOMIZEPIC: return "SC_CUSTOMIZEPIC"; + case SDM_C_JOY1PIC: return "C_JOY1PIC"; + case SDM_C_JOY2PIC: return "C_JOY2PIC"; + case SDM_C_MOUSEPIC: return "C_MOUSEPIC"; + case SDM_C_JOYSTICKPIC: return "C_JOYSTICKPIC"; + case SDM_C_KEYBOARDPIC: return "C_KEYBOARDPIC"; + case SDM_C_CONTROLPIC: return "SC_CONTROLPIC"; + + case SDM_C_OPTIONSPIC: return "SC_OPTIONSPIC"; + + case SDM_C_FXTITLEPIC: return "SC_FXTITLEPIC"; + case SDM_C_DIGITITLEPIC: return "SC_DIGITITLEPIC"; + case SDM_C_MUSICTITLEPIC: return "SC_MUSICTITLEPIC"; + + case SDM_C_HOWTOUGHPIC: return "C_HOWTOUGHPIC"; + case SDM_C_BABYMODEPIC: return "SC_SKILL1PIC"; + case SDM_C_EASYPIC: return "SC_SKILL2PIC"; + case SDM_C_NORMALPIC: return "SC_SKILL3PIC"; + case SDM_C_HARDPIC: return "SC_SKILL4PIC"; + + case SDM_C_DISKLOADING1PIC: return "C_DISKLOADING0PIC"; + case SDM_C_DISKLOADING2PIC: return "C_DISKLOADING1PIC"; + case SDM_C_LOADGAMEPIC: return "SC_LOADGAMEPIC"; + case SDM_C_SAVEGAMEPIC: return "SC_SAVEGAMEPIC"; + + case SDM_HIGHSCORESPIC: return "SHIGHSCORESPIC"; + case SDM_C_WONSPEARPIC: return "C_WONSPEARPIC"; + + case SDM_L_GUYPIC: return "L_GUY0PIC"; + case SDM_L_COLONPIC: + case SDM_L_NUM0PIC: + case SDM_L_NUM1PIC: + case SDM_L_NUM2PIC: + case SDM_L_NUM3PIC: + case SDM_L_NUM4PIC: + case SDM_L_NUM5PIC: + case SDM_L_NUM6PIC: + case SDM_L_NUM7PIC: + case SDM_L_NUM8PIC: + case SDM_L_NUM9PIC: + case SDM_L_PERCENTPIC: + case SDM_L_APIC: + case SDM_L_BPIC: + case SDM_L_CPIC: + case SDM_L_DPIC: + case SDM_L_EPIC: + case SDM_L_FPIC: + case SDM_L_GPIC: + case SDM_L_HPIC: + case SDM_L_IPIC: + case SDM_L_JPIC: + case SDM_L_KPIC: + case SDM_L_LPIC: + case SDM_L_MPIC: + case SDM_L_NPIC: + case SDM_L_OPIC: + case SDM_L_PPIC: + case SDM_L_QPIC: + case SDM_L_RPIC: + case SDM_L_SPIC: + case SDM_L_TPIC: + case SDM_L_UPIC: + case SDM_L_VPIC: + case SDM_L_WPIC: + case SDM_L_XPIC: + case SDM_L_YPIC: + case SDM_L_ZPIC: + case SDM_L_EXPOINTPIC: + case SDM_L_APOSTROPHEPIC: return "L_FONTPIC"; + case SDM_L_GUY2PIC: return "L_GUY1PIC"; + case SDM_L_BJWINSPIC: return "L_BJWINSPIC"; + + case SDM_TITLE1PIC: + case SDM_TITLE2PIC: return "STITLEPIC"; + case SDM_STATUSBARPIC: return "STATUSBARPIC"; + case SDM_PG13PIC: return "PC13PIC"; + case SDM_CREDITSPIC: return "SCREDITSPIC"; + + case SDM_KNIFEPIC: return "KNIFEPIC"; + case SDM_GUNPIC: return "GUNPIC"; + case SDM_MACHINEGUNPIC: return "MACHINEGUNPIC"; + case SDM_GATLINGGUNPIC: return "GATLINGGUNPIC"; + case SDM_NOKEYPIC: return "NOKEYPIC"; + case SDM_GOLDKEYPIC: return "GOLDKEYPIC"; + case SDM_SILVERKEYPIC: return "SILVERKEYPIC"; + case SDM_N_BLANKPIC: return "N_BLANKPIC"; + case SDM_N_0PIC: + case SDM_N_1PIC: + case SDM_N_2PIC: + case SDM_N_3PIC: + case SDM_N_4PIC: + case SDM_N_5PIC: + case SDM_N_6PIC: + case SDM_N_7PIC: + case SDM_N_8PIC: + case SDM_N_9PIC: return "N_NUMPIC"; + case SDM_FACE1APIC: return "FACE1APIC"; + case SDM_FACE1BPIC: return "FACE1BPIC"; + case SDM_FACE1CPIC: return "FACE1CPIC"; + case SDM_FACE2APIC: return "FACE2APIC"; + case SDM_FACE2BPIC: return "FACE2BPIC"; + case SDM_FACE2CPIC: return "FACE2CPIC"; + case SDM_FACE3APIC: return "FACE3APIC"; + case SDM_FACE3BPIC: return "FACE3BPIC"; + case SDM_FACE3CPIC: return "FACE3CPIC"; + case SDM_FACE4APIC: return "FACE4APIC"; + case SDM_FACE4BPIC: return "FACE4BPIC"; + case SDM_FACE4CPIC: return "FACE4CPIC"; + case SDM_FACE5APIC: return "FACE5APIC"; + case SDM_FACE5BPIC: return "FACE5BPIC"; + case SDM_FACE5CPIC: return "FACE5CPIC"; + case SDM_FACE6APIC: return "FACE6APIC"; + case SDM_FACE6BPIC: return "FACE6BPIC"; + case SDM_FACE6CPIC: return "FACE6CPIC"; + case SDM_FACE7APIC: return "FACE7APIC"; + case SDM_FACE7BPIC: return "FACE7BPIC"; + case SDM_FACE7CPIC: return "FACE7CPIC"; + case SDM_FACE8APIC: return "FACE8APIC"; + case SDM_GOTGATLINGPIC: return "GOTGATLINGPIC"; + case SDM_GODMODEFACE1PIC: return "GODMODEFACE0PIC"; + case SDM_GODMODEFACE2PIC: return "GODMODEFACE1PIC"; + case SDM_GODMODEFACE3PIC: return "GODMODEFACE2PIC"; + case SDM_BJWAITING1PIC: return "BJWAITING0PIC"; + case SDM_BJWAITING2PIC: return "BJWAITING1PIC"; + case SDM_BJOUCHPIC: return "BJOUCHPIC"; + case SDM_PAUSEDPIC: return "PAUSEDPIC"; + case SDM_GETPSYCHEDPIC: return "GETPSYCHEDPIC"; + + default: return NULL; + + } // End switch chunk +} + +/* +----------------------------------------------------------------------------- + Function: GetLumpFileName_SOD() -Returns lump name string. + + Parameters: chunk -[in] Chunk value to get string name for. + + Returns: NULL on error, otherwise string name. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC char *GetLumpFileName_SOD( W32 chunk ) +{ + switch( chunk ) + { + case SOD_C_BACKDROPPIC: return "C_BACKDROPPIC"; + case SOD_C_MOUSELBACKPIC: return "SC_MOUSELBACKPIC"; + case SOD_C_CURSOR1PIC: return "SC_CURSOR0PIC"; + case SOD_C_CURSOR2PIC: return "SC_CURSOR1PIC"; + case SOD_C_NOTSELECTEDPIC: return "SC_NOTSELECTEDPIC"; + case SOD_C_SELECTEDPIC: return "SC_SELECTEDPIC"; + case SOD_C_CUSTOMIZEPIC: return "SC_CUSTOMIZEPIC"; + case SOD_C_JOY1PIC: return "C_JOY1PIC"; + case SOD_C_JOY2PIC: return "C_JOY2PIC"; + case SOD_C_MOUSEPIC: return "C_MOUSEPIC"; + case SOD_C_JOYSTICKPIC: return "C_JOYSTICKPIC"; + case SOD_C_KEYBOARDPIC: return "C_KEYBOARDPIC"; + case SOD_C_CONTROLPIC: return "SC_CONTROLPIC"; + case SOD_C_OPTIONSPIC: return "SC_OPTIONSPIC"; + case SOD_C_FXTITLEPIC: return "SC_FXTITLEPIC"; + case SOD_C_DIGITITLEPIC: return "SC_DIGITITLEPIC"; + case SOD_C_MUSICTITLEPIC: return "SC_MUSICTITLEPIC"; + case SOD_C_HOWTOUGHPIC: return "C_HOWTOUGHPIC"; + case SOD_C_BABYMODEPIC: return "SC_SKILL1PIC"; + case SOD_C_EASYPIC: return "SC_SKILL2PIC"; + case SOD_C_NORMALPIC: return "SC_SKILL3PIC"; + case SOD_C_HARDPIC: return "SC_SKILL4PIC"; + case SOD_C_DISKLOADING1PIC: return "C_DISKLOADING0PIC"; + case SOD_C_DISKLOADING2PIC: return "C_DISKLOADING1PIC"; + case SOD_C_LOADGAMEPIC: return "SC_LOADGAMEPIC"; + case SOD_C_SAVEGAMEPIC: return "SC_SAVEGAMEPIC"; + case SOD_HIGHSCORESPIC: return "SHIGHSCORESPIC"; + case SOD_C_WONSPEARPIC: return "C_WONSPEARPIC"; + case SOD_BJCOLLAPSE1PIC: return "BJCOLLAPSE1PIC"; + case SOD_BJCOLLAPSE2PIC: return "BJCOLLAPSE2PIC"; + case SOD_BJCOLLAPSE3PIC: return "BJCOLLAPSE3PIC"; + case SOD_BJCOLLAPSE4PIC: return "BJCOLLAPSE4PIC"; + case SOD_ENDPICPIC: return "ENDPICPIC"; + case SOD_L_GUYPIC: return "L_GUY0PIC"; + case SOD_L_COLONPIC: + case SOD_L_NUM0PIC: + case SOD_L_NUM1PIC: + case SOD_L_NUM2PIC: + case SOD_L_NUM3PIC: + case SOD_L_NUM4PIC: + case SOD_L_NUM5PIC: + case SOD_L_NUM6PIC: + case SOD_L_NUM7PIC: + case SOD_L_NUM8PIC: + case SOD_L_NUM9PIC: + case SOD_L_PERCENTPIC: + case SOD_L_APIC: + case SOD_L_BPIC: + case SOD_L_CPIC: + case SOD_L_DPIC: + case SOD_L_EPIC: + case SOD_L_FPIC: + case SOD_L_GPIC: + case SOD_L_HPIC: + case SOD_L_IPIC: + case SOD_L_JPIC: + case SOD_L_KPIC: + case SOD_L_LPIC: + case SOD_L_MPIC: + case SOD_L_NPIC: + case SOD_L_OPIC: + case SOD_L_PPIC: + case SOD_L_QPIC: + case SOD_L_RPIC: + case SOD_L_SPIC: + case SOD_L_TPIC: + case SOD_L_UPIC: + case SOD_L_VPIC: + case SOD_L_WPIC: + case SOD_L_XPIC: + case SOD_L_YPIC: + case SOD_L_ZPIC: + case SOD_L_EXPOINTPIC: + case SOD_L_APOSTROPHEPIC: return "L_FONTPIC"; + case SOD_L_GUY2PIC: return "L_GUY1PIC"; + case SOD_L_BJWINSPIC: return "L_BJWINSPIC"; + case SOD_TITLE1PIC: + case SOD_TITLE2PIC: return "STITLEPIC"; + case SOD_ENDSCREEN11PIC: return "ENDSCREEN11PIC"; + case SOD_ENDSCREEN12PIC: return "ENDSCREEN12PIC"; + case SOD_ENDSCREEN3PIC: return "ENDSCREEN3PIC"; + case SOD_ENDSCREEN4PIC: return "ENDSCREEN4PIC"; + case SOD_ENDSCREEN5PIC: return "ENDSCREEN5PIC"; + case SOD_ENDSCREEN6PIC: return "ENDSCREEN6PIC"; + case SOD_ENDSCREEN7PIC: return "ENDSCREEN7PIC"; + case SOD_ENDSCREEN8PIC: return "ENDSCREEN8PIC"; + case SOD_ENDSCREEN9PIC: return "ENDSCREEN9PIC"; + case SOD_STATUSBARPIC: return "STATUSBARPIC"; + case SOD_PG13PIC: return "PC13PIC"; + case SOD_CREDITSPIC: return "SCREDITSPIC"; + case SOD_IDGUYS1PIC: + case SOD_IDGUYS2PIC: return "IDGUYSPIC"; + case SOD_COPYPROTTOPPIC: return "COPYPROTTOPPIC"; + case SOD_COPYPROTBOXPIC: return "COPYPROTBOXPIC"; + case SOD_BOSSPIC1PIC: return "BOSSPIC1PIC"; + case SOD_BOSSPIC2PIC: return "BOSSPIC2PIC"; + case SOD_BOSSPIC3PIC: return "BOSSPIC3PIC"; + case SOD_BOSSPIC4PIC: return "BOSSPIC4PIC"; + case SOD_KNIFEPIC: return "KNIFEPIC"; + case SOD_GUNPIC: return "GUNPIC"; + case SOD_MACHINEGUNPIC: return "MACHINEGUNPIC"; + case SOD_GATLINGGUNPIC: return "GATLINGGUNPIC"; + case SOD_NOKEYPIC: return "NOKEYPIC"; + case SOD_GOLDKEYPIC: return "GOLDKEYPIC"; + case SOD_SILVERKEYPIC: return "SILVERKEYPIC"; + case SOD_N_BLANKPIC: return "N_BLANKPIC"; + case SOD_N_0PIC: + case SOD_N_1PIC: + case SOD_N_2PIC: + case SOD_N_3PIC: + case SOD_N_4PIC: + case SOD_N_5PIC: + case SOD_N_6PIC: + case SOD_N_7PIC: + case SOD_N_8PIC: + case SOD_N_9PIC: return "N_NUMPIC"; + case SOD_FACE1APIC: return "FACE1APIC"; + case SOD_FACE1BPIC: return "FACE1BPIC"; + case SOD_FACE1CPIC: return "FACE1CPIC"; + case SOD_FACE2APIC: return "FACE2APIC"; + case SOD_FACE2BPIC: return "FACE2BPIC"; + case SOD_FACE2CPIC: return "FACE2CPIC"; + case SOD_FACE3APIC: return "FACE3APIC"; + case SOD_FACE3BPIC: return "FACE3BPIC"; + case SOD_FACE3CPIC: return "FACE3CPIC"; + case SOD_FACE4APIC: return "FACE4APIC"; + case SOD_FACE4BPIC: return "FACE4BPIC"; + case SOD_FACE4CPIC: return "FACE4CPIC"; + case SOD_FACE5APIC: return "FACE5APIC"; + case SOD_FACE5BPIC: return "FACE5BPIC"; + case SOD_FACE5CPIC: return "FACE5CPIC"; + case SOD_FACE6APIC: return "FACE6APIC"; + case SOD_FACE6BPIC: return "FACE6BPIC"; + case SOD_FACE6CPIC: return "FACE6CPIC"; + case SOD_FACE7APIC: return "FACE7APIC"; + case SOD_FACE7BPIC: return "FACE7BPIC"; + case SOD_FACE7CPIC: return "FACE7CPIC"; + case SOD_FACE8APIC: return "FACE8APIC"; + case SOD_GOTGATLINGPIC: return "GOTGATLINGPIC"; + case SOD_GODMODEFACE1PIC: return "GODMODEFACE0PIC"; + case SOD_GODMODEFACE2PIC: return "GODMODEFACE1PIC"; + case SOD_GODMODEFACE3PIC: return "GODMODEFACE2PIC"; + case SOD_BJWAITING1PIC: return "BJWAITING0PIC"; + case SOD_BJWAITING2PIC: return "BJWAITING1PIC"; + case SOD_BJOUCHPIC: return "BJOUCHPIC"; + case SOD_PAUSEDPIC: return "PAUSEDPIC"; + case SOD_GETPSYCHEDPIC: return "GETPSYCHEDPIC"; + + default: return NULL; + + } // End switch chunk + +} + + + + + +PUBLIC char *GetMusicFileName_WL6( W32 chunk ) +{ + switch( chunk ) + { + case CORNER_MUS: return "CORNER"; + case DUNGEON_MUS: return "DUNGEON"; + case WARMARCH_MUS: return "WARMARCH"; + case GETTHEM_MUS: return "GETTHEM"; + case HEADACHE_MUS: return "HEADACHE"; + case HITLWLTZ_MUS: return "HITLWLTZ"; + case INTROCW3_MUS: return "INTROCW3"; + case NAZI_NOR_MUS: return "NAZI_NOR"; + case NAZI_OMI_MUS: return "NAZI_OMI"; + case POW_MUS: return "POW"; + case SALUTE_MUS: return "SALUTE"; + case SEARCHN_MUS: return "SEARCHN"; + case SUSPENSE_MUS: return "SUSPENSE"; + case VICTORS_MUS: return "VICTORS"; + case WONDERIN_MUS: return "WONDERIN"; + case FUNKYOU_MUS: return "FUNKYOU"; + case ENDLEVEL_MUS: return "ENDLEVEL"; + case GOINGAFT_MUS: return "GOINGAFT"; + case PREGNANT_MUS: return "PREGNANT"; + case ULTIMATE_MUS: return "ULTIMATE"; + case NAZI_RAP_MUS: return "NAZI_RAP"; + case ZEROHOUR_MUS: return "ZEROHOUR"; + case TWELFTH_MUS: return "TWELFTH"; + case ROSTER_MUS: return "ROSTER"; + case URAHERO_MUS: return "URAHERO"; + case VICMARCH_MUS: return "VICMARCH"; + case PACMAN_MUS: return "PACMAN"; + + default: return NULL; + + } // End switch chunk + +} + +PUBLIC char *GetMusicFileName_SOD( W32 chunk ) +{ + switch( chunk ) + { + case SOD_XFUNKIE_MUS: return "XFUNKIE"; + case SOD_DUNGEON_MUS: return "DUNGEON"; + case SOD_XDEATH_MUS: return "XDEATH"; + case SOD_GETTHEM_MUS: return "GETTHEM"; + case SOD_XTIPTOE_MUS: return "XTIPTOE"; + case SOD_GOINGAFT_MUS: return "GOINGAFT"; + case SOD_URAHERO_MUS: return "URAHERO"; + case SOD_XTHEEND_MUS: return "XTHEEND"; + case SOD_NAZI_OMI_MUS: return "NAZI_OMI"; + case SOD_POW_MUS: return "POW"; + case SOD_TWELFTH_MUS: return "TWELFTH"; + case SOD_SEARCHN_MUS: return "SEARCHN"; + case SOD_SUSPENSE_MUS: return "SUSPENSE"; + case SOD_ZEROHOUR_MUS: return "ZEROHOUR"; + case SOD_WONDERIN_MUS: return "WONDERIN"; + case SOD_ULTIMATE_MUS: return "ULTIMATE"; + case SOD_ENDLEVEL_MUS: return "ENDLEVEL"; + case SOD_XEVIL_MUS: return "XEVIL"; + case SOD_XJAZNAZI_MUS: return "XJAZNAZI"; + case SOD_COPYPRO_MUS: return "COPYPRO"; + case SOD_XAWARD_MUS: return "XAWARD"; + case SOD_XPUTIT_MUS: return "XPUTIT"; + case SOD_XGETYOU_MUS: return "XGETYOU"; + case SOD_XTOWER2_MUS: return "XTOWER2"; + + default: return NULL; + + } // End switch chunk + +} \ No newline at end of file diff --git a/wolf3d/wolfextractor/wolf/wolf_aud.c b/wolf3d/wolfextractor/wolf/wolf_aud.c new file mode 100644 index 0000000..98534f0 --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wolf_aud.c @@ -0,0 +1,507 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wolf_aud.c: Decode Wolfenstein 3-D Adlib audio data. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Wolfenstein 3-D, and was originally + * written by Id Software, Inc. + * + */ + +#include +#include + +#include "wolf_def.h" + +#include "../string/com_string.h" +#include "../adlib/adlib.h" +#include "../adlib/fmopl.h" +#include "../loaders/wav.h" +#include "../filesys/file.h" +#include "../../../common/common_utils.h" +#include "../../../common/arch.h" +#include "../memory/memory.h" + +#define AHEADFNAME "AUDIOHED" +#define AUDIOFNAME "AUDIOT" + + +#define MAX_CHUNK_SIZE 500 + + +#define WL6_STARTMUSIC 262 +#define SOD_STARTMUSIC 243 + + + +PRIVATE FILE *audiohandle; + +PRIVATE W32 *audiostarts; + + +/* +----------------------------------------------------------------------------- + Function: CAL_SetupAudioFile() -Setup for decoding audio data. + + Parameters: fextension -[in] Pointer to string with file extension. + + Returns: Non-zero on success, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE W8 CAL_SetupAudioFile( const char *fextension ) +{ + FILE *handle; + SW32 length; + W32 count; + char fname[ 13 ]; + + if( ! fextension || ! *fextension ) + { + printf( "NULL extension passed into CAL_SetupAudioFile!\n" ); + + return 0; + } + +// +// load audiohed.XXX (offsets and lengths for audio file) +// + cs_strlcpy( fname, AHEADFNAME, sizeof( fname ) ); + cs_strlcat( fname, fextension, sizeof( fname ) ); + + handle = fopen( cs_strupr( fname ), "rb" ); + if( handle == NULL ) + { + handle = fopen( cs_strlwr( fname ), "rb" ); + + if( handle == NULL ) + { + printf( "Can not open file (%s) for read!\n", fname ); + return 0; + } + } + + length = FS_FileLength( handle ); + if( length < 4 ) + { + fclose( handle ); + printf( "Incorrect audio header size on file: %s\n", fname ); + return 0; + } + + audiostarts = (PW32) MM_MALLOC( length ); + if( audiostarts == NULL ) + { + return 0; + } + + count = fread( audiostarts, sizeof( W32 ), length >> 2, handle ); + if( count != (W32)(length >> 2) ) + { + fclose( handle ); + printf( "[Error]: Read error on file: (%s)", fname ); + return 0; + } + + + fclose( handle ); + +// +// open the Audio data file +// + cs_strlcpy( fname, AUDIOFNAME, sizeof( fname ) ); + cs_strlcat( fname, fextension, sizeof( fname ) ); + + audiohandle = fopen( cs_strupr( fname ), "rb" ); + if( audiohandle == NULL ) + { + audiohandle = fopen( cs_strlwr( fname ), "rb" ); + if( audiohandle == NULL ) + { + printf( "Could not open file (%s) for read!\n", fname ); + return 0; + } + } + + return 1; +} + +/* +----------------------------------------------------------------------------- + Function: CA_CacheAudioChunk() -Cache audio data. + + Parameters: chunk -[in] Chunk number to cache. + BuffChunk -[in] Allocated memory block to hold data. + + Returns: Non-zero on success, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE W8 CA_CacheAudioChunk( W32 chunk, W8 *BuffChunk ) +{ + W32 pos, length, count; + + +// +// load the chunk into a buffer +// + pos = audiostarts[ chunk ]; + length = audiostarts[ chunk+1 ] - pos; + if( length < 1 || length > MAX_CHUNK_SIZE ) + { + printf( "[CA_CacheAudioChunk]: Chunk length not valid\n" ); + return 0; + } + + + if( fseek( audiohandle, pos, SEEK_SET ) != 0 ) + { + printf( "[CA_CacheAudioChunk]: Could not seek!\n" ); + return 0; + } + + + count = fread( BuffChunk, 1, length, audiohandle ); + if( count != length ) + { + printf( "[CA_CacheAudioChunk]: Read error!\n" ); + return 0; + } + + return 1; +} + +/* +----------------------------------------------------------------------------- + Function: CA_SaveAudioChunk() -Decode and save audio data. + + Parameters: chunk -[in] Chunk number to cache. + filename -[in] Save as filename. + BuffChunk -[in] Sound data to decode. + BuffWav -[in] Allocated memory block to hold decoded data. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void CA_SaveAudioChunk( W32 chunk, const char *filename, + W8 *BuffChunk, W8 *BuffWav ) +{ + W32 length; + + if( ! filename || ! *filename ) + { + return; + } + + if( ! CA_CacheAudioChunk( chunk, BuffChunk ) ) + { + return; + } + + if( ADLIB_DecodeSound( (AdLibSound *)BuffChunk, BuffWav, &length ) == 0 ) + { + return; + } + + write_wav( filename, BuffWav, length, 1, 22050, 2 ); +} + + +extern W32 ADLIB_UpdateMusic( W32 size, void *buffer ); +extern W32 ADLIB_getLength( void *musbuffer ); +extern void ADLIB_LoadMusic( void *musbuffer ); + +extern int vorbis_encode( const char *filename, void *data, W32 size, W32 in_channels, W32 in_samplesize, + W32 rate, W32 quality, W32 max_bitrate, W32 min_bitrate ); + + +#define NCH 1 // channels +#define BPS 16 // bit per second + +PRIVATE void CA_SaveMusicChunk( W32 chunk, const char *filename ) +{ + W8 *data, *BuffWav; + W32 pos, length, uncompr_length; + W32 len; + + + pos = audiostarts[ chunk ]; + length = audiostarts[ chunk+1 ] - pos; + + data = MM_MALLOC( length ); + if( data == NULL ) + { + return; + } + + if( fseek( audiohandle, pos, SEEK_SET ) != 0 ) + { + printf( "[CA_SaveMusicChunk]: Could not seek!\n" ); + + MM_FREE( data ); + + return; + } + + if( fread( data, 1, length, audiohandle ) != length ) + { + printf( "[CA_SaveMusicChunk]: Read error!\n" ); + + MM_FREE( data ); + + return; + } + + + uncompr_length = ADLIB_getLength( data ); + if( uncompr_length == 1 ) + { + MM_FREE( data ); + + return; + } + + + ADLIB_LoadMusic( data ); + + BuffWav = MM_MALLOC( uncompr_length * 64 * 2 ); + if( BuffWav == NULL ) + { + MM_FREE( data ); + + return; + } + + len = ADLIB_UpdateMusic( uncompr_length, BuffWav ); + + +#if 1 + + vorbis_encode( filename, BuffWav, len, 1, 16, 44100, 0, 0, 0 ); + +#else + + write_wav( filename, BuffWav, len, 1, 44100, 2 ); + +#endif + + MM_FREE( BuffWav ); + MM_FREE( data ); +} + +/* +----------------------------------------------------------------------------- + Function: CAL_ShutdownAudioFile() -Decode and save audio data. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void CAL_ShutdownAudioFile() +{ + if( audiohandle ) + { + fclose( audiohandle ); + audiohandle = NULL; + } + + if( audiostarts ) + { + MM_FREE( audiostarts ); + } + +} + +/* +----------------------------------------------------------------------------- + Function: AudioRipper() -Interface to audio decoder. + + Parameters: fextension -[in] file extension string. + start -[in] Chunk number for start of audio data. + end -[in] Chunk number for end of audio data. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean AudioRipper( const char *fextension, + W32 start, W32 end, W16 version ) +{ + W32 i, j; + char filename[ 64 ]; + W8 *buffChunk; + W8 *buffWav; + W32 startofmusic = WL6_STARTMUSIC - 1; + W32 endofmusic = LASTMUSIC; + +// +// Setup +// + + if( version == SOD_PAK || version == SDM_PAK ) + { + if( 0 == FS_Mkdir( SODLSFXDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "wolf_aud.c", SODLSFXDIR ); + + return false; + } + + startofmusic = SOD_STARTMUSIC; + endofmusic = SOD_LASTMUSIC; + } + else + { + if( 0 == FS_Mkdir( LSFXDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "wolf_aud.c", LSFXDIR ); + + return false; + } + } + + + if( 0 == FS_Mkdir( MUSICDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "wolf_aud.c", LSFXDIR ); + + return false; + } + + + + + + if( ! CAL_SetupAudioFile( fextension ) ) + { + CAL_ShutdownAudioFile(); + + return false; + } + + if( ! ADLIB_Init( 22050 ) ) + { + CAL_ShutdownAudioFile(); + + return false; + } + +// +// Allocate buffers +// + + buffChunk = MM_MALLOC( MAX_CHUNK_SIZE ); + if( buffChunk == NULL ) + { + ADLIB_Shutdown(); + CAL_ShutdownAudioFile(); + + return false; + } + + buffWav = MM_MALLOC( MAX_WAV_SIZE ); + if( buffWav == NULL ) + { + ADLIB_Shutdown(); + CAL_ShutdownAudioFile(); + MM_FREE( buffChunk ); + + return false; + } + +// +// Decode Audio data +// + + printf( "Decoding Audio Data...\n" ); + + for( i = start, j = 0; i < end; ++i, ++j ) + { + if( version == SOD_PAK || version == SDM_PAK ) + { + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", SODLSFXDIR, j ); + } + else + { + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", LSFXDIR, j ); + } + + CA_SaveAudioChunk( i, filename, buffChunk, buffWav ); + } + + ADLIB_Shutdown(); + + MM_FREE( buffWav ); + MM_FREE( buffChunk ); + + +// +// Decode Music data +// + + if( ! ADLIB_Init( 44100 ) ) + { + CAL_ShutdownAudioFile(); + + return false; + } + + printf( "Decoding Music Data...\n" ); + + for( i = 0 ; i < endofmusic ; ++i ) + { + if( version == SOD_PAK || version == SDM_PAK ) + { + cs_snprintf( filename, sizeof( filename ), "%s/%s.ogg", MUSICDIR, GetMusicFileName_SOD( i ) ); + } + else + { + cs_snprintf( filename, sizeof( filename ), "%s/%s.ogg", MUSICDIR, GetMusicFileName_WL6( i ) ); + } + + CA_SaveMusicChunk( startofmusic + i, filename ); + } + + ADLIB_Shutdown(); + +// +// Shutdown +// + + + CAL_ShutdownAudioFile(); + + + + return true; +} diff --git a/wolf3d/wolfextractor/wolf/wolf_def.h b/wolf3d/wolfextractor/wolf/wolf_def.h new file mode 100644 index 0000000..032fa1b --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wolf_def.h @@ -0,0 +1,919 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wolf_def.h: Valid chunk numbers for Wolfenstein 3-D and Spear of Destiny. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Wolfenstein 3-D, and was originally + * written by Id Software, Inc. + * + */ + +/* + Notes: + This module is implemented by wolf_aud.c, wolf_gfx.c, wolf_map.c, + wolf_pal.c, wolf_pm.c and wl6_name.c. + +*/ + +#ifndef __WOLF_DEF_H__ +#define __WOLF_DEF_H__ + +#include "../../../common/arch.h" + + +#define WL1_PAK (1<<0) +#define WL6_PAK (1<<1) +#define SDM_PAK (1<<2) +#define SOD_PAK (1<<3) +#define MAC_PAK (1<<4) +#define THREEDO_PAK (1<<5) + + +#define WL1_FEXT "*.WL1" +#define WL6_FEXT "*.WL6" +#define SDM_FEXT "*.SDM" +#define SOD_FEXT "*.SOD" +#define MAC_FEXT "*.MAC" + + + +#define GFXWALLDIR "walls" +#define GFXSPRITEDIR "sprites" +#define SFXDIR "sfx" + +#define SODGFXSPRITEDIR "sodsprites" +#define SODSFXDIR "sodsfx" + +#define MAPDIR "maps" + +#define LGFXDIR "pics" + +#define LSFXDIR "lsfx" +#define SODLSFXDIR "sodlsfx" + +#define MUSICDIR "music" + + + + + +typedef enum +{ + // Lump Start + WL1_H_BJPIC = 3, + WL1_H_CASTLEPIC, // 4 + WL1_H_KEYBOARDPIC, // 5 + WL1_H_CONTROLPIC, // 6 + WL1_H_HEALPIC, // 7 + WL1_H_BGPIC, // 8 + WL1_H_GUNPIC, // 9 + WL1_H_KEYPIC, // 10 + WL1_H_BLAZEPIC, // 11 + WL1_H_WEAPON1234PIC, // 12 + WL1_H_WOLFLOGOPIC, // 13 + WL1_H_VISAPIC, // 14 + WL1_H_MCPIC, // 15 + WL1_H_IDLOGOPIC, // 16 + WL1_H_TOPWINDOWPIC, // 17 + WL1_H_LEFTWINDOWPIC, // 18 + WL1_H_RIGHTWINDOWPIC, // 19 + WL1_H_BOTTOMINFOPIC, // 20 + WL1_H_GAMEPIC, // 21 + // Lump Start + WL1_C_OPTIONSPIC, // 22 + WL1_C_CURSOR1PIC, // 23 + WL1_C_CURSOR2PIC, // 24 + WL1_C_NOTSELECTEDPIC, // 25 + WL1_C_SELECTEDPIC, // 26 + WL1_C_FXTITLEPIC, // 27 + WL1_C_DIGITITLEPIC, // 28 + WL1_C_MUSICTITLEPIC, // 29 + WL1_C_MOUSELBACKPIC, // 30 + WL1_C_BABYMODEPIC, // 31 + WL1_C_EASYPIC, // 32 + WL1_C_NORMALPIC, // 33 + WL1_C_HARDPIC, // 34 + WL1_C_LOADSAVEDISKPIC, // 35 + WL1_C_DISKLOADING1PIC, // 36 + WL1_C_DISKLOADING2PIC, // 37 + WL1_C_CONTROLPIC, // 38 + WL1_C_CUSTOMIZEPIC, // 39 + WL1_C_LOADGAMEPIC, // 40 + WL1_C_SAVEGAMEPIC, // 41 + WL1_C_EPISODE1PIC, // 42 + WL1_C_EPISODE2PIC, // 43 + WL1_C_EPISODE3PIC, // 44 + WL1_C_EPISODE4PIC, // 45 + WL1_C_EPISODE5PIC, // 46 + WL1_C_EPISODE6PIC, // 47 + WL1_C_CODEPIC, // 48 + WL1_C_TIMECODEPIC, // 49 + WL1_C_LEVELPIC, // 50 + WL1_C_NAMEPIC, // 51 + WL1_C_SCOREPIC, // 52 + WL1_C_JOY1PIC, // 53 + WL1_C_JOY2PIC, // 54 + // Lump Start + WL1_L_GUYPIC, // 55 + WL1_L_COLONPIC, // 56 + WL1_L_NUM0PIC, // 57 + WL1_L_NUM1PIC, // 58 + WL1_L_NUM2PIC, // 59 + WL1_L_NUM3PIC, // 60 + WL1_L_NUM4PIC, // 61 + WL1_L_NUM5PIC, // 62 + WL1_L_NUM6PIC, // 63 + WL1_L_NUM7PIC, // 64 + WL1_L_NUM8PIC, // 65 + WL1_L_NUM9PIC, // 66 + WL1_L_PERCENTPIC, // 67 + WL1_L_APIC, // 68 + WL1_L_BPIC, // 69 + WL1_L_CPIC, // 70 + WL1_L_DPIC, // 71 + WL1_L_EPIC, // 72 + WL1_L_FPIC, // 73 + WL1_L_GPIC, // 74 + WL1_L_HPIC, // 75 + WL1_L_IPIC, // 76 + WL1_L_JPIC, // 77 + WL1_L_KPIC, // 78 + WL1_L_LPIC, // 79 + WL1_L_MPIC, // 80 + WL1_L_NPIC, // 81 + WL1_L_OPIC, // 82 + WL1_L_PPIC, // 83 + WL1_L_QPIC, // 84 + WL1_L_RPIC, // 85 + WL1_L_SPIC, // 86 + WL1_L_TPIC, // 87 + WL1_L_UPIC, // 88 + WL1_L_VPIC, // 89 + WL1_L_WPIC, // 90 + WL1_L_XPIC, // 91 + WL1_L_YPIC, // 92 + WL1_L_ZPIC, // 93 + WL1_L_EXPOINTPIC, // 94 + WL1_L_APOSTROPHEPIC, // 95 + WL1_L_GUY2PIC, // 96 + WL1_L_BJWINSPIC, // 97 + WL1_STATUSBARPIC, // 98 + WL1_TITLEPIC, // 99 + WL1_PG13PIC, // 100 + WL1_CREDITSPIC, // 101 + WL1_HIGHSCORESPIC, // 102 + // Lump Start + WL1_KNIFEPIC, // 103 + WL1_GUNPIC, // 104 + WL1_MACHINEGUNPIC, // 105 + WL1_GATLINGGUNPIC, // 106 + WL1_NOKEYPIC, // 107 + WL1_GOLDKEYPIC, // 108 + WL1_SILVERKEYPIC, // 109 + WL1_N_BLANKPIC, // 110 + WL1_N_0PIC, // 111 + WL1_N_1PIC, // 112 + WL1_N_2PIC, // 113 + WL1_N_3PIC, // 114 + WL1_N_4PIC, // 115 + WL1_N_5PIC, // 116 + WL1_N_6PIC, // 117 + WL1_N_7PIC, // 118 + WL1_N_8PIC, // 119 + WL1_N_9PIC, // 120 + WL1_FACE1APIC, // 121 + WL1_FACE1BPIC, // 122 + WL1_FACE1CPIC, // 123 + WL1_FACE2APIC, // 124 + WL1_FACE2BPIC, // 125 + WL1_FACE2CPIC, // 126 + WL1_FACE3APIC, // 127 + WL1_FACE3BPIC, // 128 + WL1_FACE3CPIC, // 129 + WL1_FACE4APIC, // 130 + WL1_FACE4BPIC, // 131 + WL1_FACE4CPIC, // 132 + WL1_FACE5APIC, // 133 + WL1_FACE5BPIC, // 134 + WL1_FACE5CPIC, // 135 + WL1_FACE6APIC, // 136 + WL1_FACE6BPIC, // 137 + WL1_FACE6CPIC, // 138 + WL1_FACE7APIC, // 139 + WL1_FACE7BPIC, // 140 + WL1_FACE7CPIC, // 141 + WL1_FACE8APIC, // 142 + WL1_GOTGATLINGPIC, // 143 + WL1_MUTANTBJPIC, // 144 + WL1_PAUSEDPIC, // 145 + WL1_GETPSYCHEDPIC, // 146 + + WL1_ENUMEND + +} wl1_graphicnums; + +typedef enum +{ + // Lump Start + H_BJPIC = 3, + H_CASTLEPIC, // 4 + H_BLAZEPIC, // 5 + H_TOPWINDOWPIC, // 6 + H_LEFTWINDOWPIC, // 7 + H_RIGHTWINDOWPIC, // 8 + H_BOTTOMINFOPIC, // 9 + // Lump Start + C_OPTIONSPIC, // 10 + C_CURSOR1PIC, // 11 + C_CURSOR2PIC, // 12 + C_NOTSELECTEDPIC, // 13 + C_SELECTEDPIC, // 14 + C_FXTITLEPIC, // 15 + C_DIGITITLEPIC, // 16 + C_MUSICTITLEPIC, // 17 + C_MOUSELBACKPIC, // 18 + C_BABYMODEPIC, // 19 + C_EASYPIC, // 20 + C_NORMALPIC, // 21 + C_HARDPIC, // 22 + C_LOADSAVEDISKPIC, // 23 + C_DISKLOADING1PIC, // 24 + C_DISKLOADING2PIC, // 25 + C_CONTROLPIC, // 26 + C_CUSTOMIZEPIC, // 27 + C_LOADGAMEPIC, // 28 + C_SAVEGAMEPIC, // 29 + C_EPISODE1PIC, // 30 + C_EPISODE2PIC, // 31 + C_EPISODE3PIC, // 32 + C_EPISODE4PIC, // 33 + C_EPISODE5PIC, // 34 + C_EPISODE6PIC, // 35 + C_CODEPIC, // 36 + C_TIMECODEPIC, // 37 + C_LEVELPIC, // 38 + C_NAMEPIC, // 39 + C_SCOREPIC, // 40 + C_JOY1PIC, // 41 + C_JOY2PIC, // 42 + // Lump Start + L_GUYPIC, // 43 + L_COLONPIC, // 44 + L_NUM0PIC, // 45 + L_NUM1PIC, // 46 + L_NUM2PIC, // 47 + L_NUM3PIC, // 48 + L_NUM4PIC, // 49 + L_NUM5PIC, // 50 + L_NUM6PIC, // 51 + L_NUM7PIC, // 52 + L_NUM8PIC, // 53 + L_NUM9PIC, // 54 + L_PERCENTPIC, // 55 + L_APIC, // 56 + L_BPIC, // 57 + L_CPIC, // 58 + L_DPIC, // 59 + L_EPIC, // 60 + L_FPIC, // 61 + L_GPIC, // 62 + L_HPIC, // 63 + L_IPIC, // 64 + L_JPIC, // 65 + L_KPIC, // 66 + L_LPIC, // 67 + L_MPIC, // 68 + L_NPIC, // 69 + L_OPIC, // 70 + L_PPIC, // 71 + L_QPIC, // 72 + L_RPIC, // 73 + L_SPIC, // 74 + L_TPIC, // 75 + L_UPIC, // 76 + L_VPIC, // 77 + L_WPIC, // 78 + L_XPIC, // 79 + L_YPIC, // 80 + L_ZPIC, // 81 + L_EXPOINTPIC, // 82 + L_APOSTROPHEPIC, // 83 + L_GUY2PIC, // 84 + L_BJWINSPIC, // 85 + STATUSBARPIC, // 86 + TITLEPIC, // 87 + PG13PIC, // 88 + CREDITSPIC, // 89 + HIGHSCORESPIC, // 90 + // Lump Start + KNIFEPIC, // 91 + GUNPIC, // 92 + MACHINEGUNPIC, // 93 + GATLINGGUNPIC, // 94 + NOKEYPIC, // 95 + GOLDKEYPIC, // 96 + SILVERKEYPIC, // 97 + N_BLANKPIC, // 98 + N_0PIC, // 99 + N_1PIC, // 100 + N_2PIC, // 101 + N_3PIC, // 102 + N_4PIC, // 103 + N_5PIC, // 104 + N_6PIC, // 105 + N_7PIC, // 106 + N_8PIC, // 107 + N_9PIC, // 108 + FACE1APIC, // 109 + FACE1BPIC, // 110 + FACE1CPIC, // 111 + FACE2APIC, // 112 + FACE2BPIC, // 113 + FACE2CPIC, // 114 + FACE3APIC, // 115 + FACE3BPIC, // 116 + FACE3CPIC, // 117 + FACE4APIC, // 118 + FACE4BPIC, // 119 + FACE4CPIC, // 120 + FACE5APIC, // 121 + FACE5BPIC, // 122 + FACE5CPIC, // 123 + FACE6APIC, // 124 + FACE6BPIC, // 125 + FACE6CPIC, // 126 + FACE7APIC, // 127 + FACE7BPIC, // 128 + FACE7CPIC, // 129 + FACE8APIC, // 130 + GOTGATLINGPIC, // 131 + MUTANTBJPIC, // 132 + PAUSEDPIC, // 133 + GETPSYCHEDPIC, // 134 + + ORDERSCREEN=136, + ERRORSCREEN, // 137 + T_HELPART, // 138 + T_DEMO0, // 139 + T_DEMO1, // 140 + T_DEMO2, // 141 + T_DEMO3, // 142 + T_ENDART1, // 143 + T_ENDART2, // 144 + T_ENDART3, // 145 + T_ENDART4, // 146 + T_ENDART5, // 147 + T_ENDART6, // 148 + ENUMEND + +} graphicnums; + + +typedef enum +{ + // Lump Start + SDM_C_BACKDROPPIC = 3, + SDM_C_MOUSELBACKPIC, // 4 + SDM_C_CURSOR1PIC, // 5 + SDM_C_CURSOR2PIC, // 6 + SDM_C_NOTSELECTEDPIC, // 7 + SDM_C_SELECTEDPIC, // 8 + // Lump Start + SDM_C_CUSTOMIZEPIC, // 9 + SDM_C_JOY1PIC, // 10 + SDM_C_JOY2PIC, // 11 + SDM_C_MOUSEPIC, // 12 + SDM_C_JOYSTICKPIC, // 13 + SDM_C_KEYBOARDPIC, // 14 + SDM_C_CONTROLPIC, // 15 + // Lump Start + SDM_C_OPTIONSPIC, // 16 + // Lump Start + SDM_C_FXTITLEPIC, // 17 + SDM_C_DIGITITLEPIC, // 18 + SDM_C_MUSICTITLEPIC, // 19 + // Lump Start + SDM_C_HOWTOUGHPIC, // 20 + SDM_C_BABYMODEPIC, // 21 + SDM_C_EASYPIC, // 22 + SDM_C_NORMALPIC, // 23 + SDM_C_HARDPIC, // 24 + // Lump Start + SDM_C_DISKLOADING1PIC, // 25 + SDM_C_DISKLOADING2PIC, // 26 + SDM_C_LOADGAMEPIC, // 27 + SDM_C_SAVEGAMEPIC, // 28 + // Lump Start + SDM_HIGHSCORESPIC, // 29 + SDM_C_WONSPEARPIC, // 30 + // Lump Start + SDM_L_GUYPIC, // 31 + SDM_L_COLONPIC, // 32 + SDM_L_NUM0PIC, // 33 + SDM_L_NUM1PIC, // 34 + SDM_L_NUM2PIC, // 35 + SDM_L_NUM3PIC, // 36 + SDM_L_NUM4PIC, // 37 + SDM_L_NUM5PIC, // 38 + SDM_L_NUM6PIC, // 39 + SDM_L_NUM7PIC, // 40 + SDM_L_NUM8PIC, // 41 + SDM_L_NUM9PIC, // 42 + SDM_L_PERCENTPIC, // 43 + SDM_L_APIC, // 44 + SDM_L_BPIC, // 45 + SDM_L_CPIC, // 46 + SDM_L_DPIC, // 47 + SDM_L_EPIC, // 48 + SDM_L_FPIC, // 49 + SDM_L_GPIC, // 50 + SDM_L_HPIC, // 51 + SDM_L_IPIC, // 52 + SDM_L_JPIC, // 53 + SDM_L_KPIC, // 54 + SDM_L_LPIC, // 55 + SDM_L_MPIC, // 56 + SDM_L_NPIC, // 57 + SDM_L_OPIC, // 58 + SDM_L_PPIC, // 59 + SDM_L_QPIC, // 60 + SDM_L_RPIC, // 61 + SDM_L_SPIC, // 62 + SDM_L_TPIC, // 63 + SDM_L_UPIC, // 64 + SDM_L_VPIC, // 65 + SDM_L_WPIC, // 66 + SDM_L_XPIC, // 67 + SDM_L_YPIC, // 68 + SDM_L_ZPIC, // 69 + SDM_L_EXPOINTPIC, // 70 + SDM_L_APOSTROPHEPIC, // 71 + SDM_L_GUY2PIC, // 72 + SDM_L_BJWINSPIC, // 73 + // Lump Start + SDM_TITLE1PIC, // 74 + SDM_TITLE2PIC, // 75 + SDM_STATUSBARPIC, // 76 + SDM_PG13PIC, // 77 + SDM_CREDITSPIC, // 78 + // Lump Start + SDM_KNIFEPIC, // 79 + SDM_GUNPIC, // 80 + SDM_MACHINEGUNPIC, // 81 + SDM_GATLINGGUNPIC, // 82 + SDM_NOKEYPIC, // 83 + SDM_GOLDKEYPIC, // 84 + SDM_SILVERKEYPIC, // 85 + SDM_N_BLANKPIC, // 86 + SDM_N_0PIC, // 87 + SDM_N_1PIC, // 88 + SDM_N_2PIC, // 89 + SDM_N_3PIC, // 90 + SDM_N_4PIC, // 91 + SDM_N_5PIC, // 92 + SDM_N_6PIC, // 93 + SDM_N_7PIC, // 94 + SDM_N_8PIC, // 95 + SDM_N_9PIC, // 96 + SDM_FACE1APIC, // 97 + SDM_FACE1BPIC, // 98 + SDM_FACE1CPIC, // 99 + SDM_FACE2APIC, // 100 + SDM_FACE2BPIC, // 101 + SDM_FACE2CPIC, // 102 + SDM_FACE3APIC, // 103 + SDM_FACE3BPIC, // 104 + SDM_FACE3CPIC, // 105 + SDM_FACE4APIC, // 106 + SDM_FACE4BPIC, // 107 + SDM_FACE4CPIC, // 108 + SDM_FACE5APIC, // 109 + SDM_FACE5BPIC, // 110 + SDM_FACE5CPIC, // 111 + SDM_FACE6APIC, // 112 + SDM_FACE6BPIC, // 113 + SDM_FACE6CPIC, // 114 + SDM_FACE7APIC, // 115 + SDM_FACE7BPIC, // 116 + SDM_FACE7CPIC, // 117 + SDM_FACE8APIC, // 118 + SDM_GOTGATLINGPIC, // 119 + SDM_GODMODEFACE1PIC, // 120 + SDM_GODMODEFACE2PIC, // 121 + SDM_GODMODEFACE3PIC, // 122 + SDM_BJWAITING1PIC, // 123 + SDM_BJWAITING2PIC, // 124 + SDM_BJOUCHPIC, // 125 + SDM_PAUSEDPIC, // 126 + SDM_GETPSYCHEDPIC, // 127 + + + + SDM_ORDERSCREEN = 129, + SDM_ERRORSCREEN, // 130 + SDM_TITLEPALETTE, // 131 + SDM_T_DEMO0, // 132 + + SDM_ENUMEND + +} sdm_graphicnums; + +typedef enum +{ + // Lump Start + SOD_C_BACKDROPPIC = 3, + SOD_C_MOUSELBACKPIC, // 4 + SOD_C_CURSOR1PIC, // 5 + SOD_C_CURSOR2PIC, // 6 + SOD_C_NOTSELECTEDPIC, // 7 + SOD_C_SELECTEDPIC, // 8 + // Lump Start + SOD_C_CUSTOMIZEPIC, // 9 + SOD_C_JOY1PIC, // 10 + SOD_C_JOY2PIC, // 11 + SOD_C_MOUSEPIC, // 12 + SOD_C_JOYSTICKPIC, // 13 + SOD_C_KEYBOARDPIC, // 14 + SOD_C_CONTROLPIC, // 15 + // Lump Start + SOD_C_OPTIONSPIC, // 16 + // Lump Start + SOD_C_FXTITLEPIC, // 17 + SOD_C_DIGITITLEPIC, // 18 + SOD_C_MUSICTITLEPIC, // 19 + // Lump Start + SOD_C_HOWTOUGHPIC, // 20 + SOD_C_BABYMODEPIC, // 21 + SOD_C_EASYPIC, // 22 + SOD_C_NORMALPIC, // 23 + SOD_C_HARDPIC, // 24 + // Lump Start + SOD_C_DISKLOADING1PIC, // 25 + SOD_C_DISKLOADING2PIC, // 26 + SOD_C_LOADGAMEPIC, // 27 + SOD_C_SAVEGAMEPIC, // 28 + // Lump Start + SOD_HIGHSCORESPIC, // 29 + SOD_C_WONSPEARPIC, // 30 + // Lump Start + SOD_BJCOLLAPSE1PIC, // 31 + SOD_BJCOLLAPSE2PIC, // 32 + SOD_BJCOLLAPSE3PIC, // 33 + SOD_BJCOLLAPSE4PIC, // 34 + SOD_ENDPICPIC, // 35 + // Lump Start + SOD_L_GUYPIC, // 36 + SOD_L_COLONPIC, // 37 + SOD_L_NUM0PIC, // 38 + SOD_L_NUM1PIC, // 39 + SOD_L_NUM2PIC, // 40 + SOD_L_NUM3PIC, // 41 + SOD_L_NUM4PIC, // 42 + SOD_L_NUM5PIC, // 43 + SOD_L_NUM6PIC, // 44 + SOD_L_NUM7PIC, // 45 + SOD_L_NUM8PIC, // 46 + SOD_L_NUM9PIC, // 47 + SOD_L_PERCENTPIC, // 48 + SOD_L_APIC, // 49 + SOD_L_BPIC, // 50 + SOD_L_CPIC, // 51 + SOD_L_DPIC, // 52 + SOD_L_EPIC, // 53 + SOD_L_FPIC, // 54 + SOD_L_GPIC, // 55 + SOD_L_HPIC, // 56 + SOD_L_IPIC, // 57 + SOD_L_JPIC, // 58 + SOD_L_KPIC, // 59 + SOD_L_LPIC, // 60 + SOD_L_MPIC, // 61 + SOD_L_NPIC, // 62 + SOD_L_OPIC, // 63 + SOD_L_PPIC, // 64 + SOD_L_QPIC, // 65 + SOD_L_RPIC, // 66 + SOD_L_SPIC, // 67 + SOD_L_TPIC, // 68 + SOD_L_UPIC, // 69 + SOD_L_VPIC, // 70 + SOD_L_WPIC, // 71 + SOD_L_XPIC, // 72 + SOD_L_YPIC, // 73 + SOD_L_ZPIC, // 74 + SOD_L_EXPOINTPIC, // 75 + SOD_L_APOSTROPHEPIC, // 76 + SOD_L_GUY2PIC, // 77 + SOD_L_BJWINSPIC, // 78 + // Lump Start + SOD_TITLE1PIC, // 79 + SOD_TITLE2PIC, // 80 + // Lump Start + SOD_ENDSCREEN11PIC, // 81 + // Lump Start + SOD_ENDSCREEN12PIC, // 82 + SOD_ENDSCREEN3PIC, // 83 + SOD_ENDSCREEN4PIC, // 84 + SOD_ENDSCREEN5PIC, // 85 + SOD_ENDSCREEN6PIC, // 86 + SOD_ENDSCREEN7PIC, // 87 + SOD_ENDSCREEN8PIC, // 88 + SOD_ENDSCREEN9PIC, // 89 + SOD_STATUSBARPIC, // 90 + SOD_PG13PIC, // 91 + SOD_CREDITSPIC, // 92 + // Lump Start + SOD_IDGUYS1PIC, // 93 + SOD_IDGUYS2PIC, // 94 + // Lump Start + SOD_COPYPROTTOPPIC, // 95 + SOD_COPYPROTBOXPIC, // 96 + SOD_BOSSPIC1PIC, // 97 + SOD_BOSSPIC2PIC, // 98 + SOD_BOSSPIC3PIC, // 99 + SOD_BOSSPIC4PIC, // 100 + // Lump Start + SOD_KNIFEPIC, // 101 + SOD_GUNPIC, // 102 + SOD_MACHINEGUNPIC, // 103 + SOD_GATLINGGUNPIC, // 104 + SOD_NOKEYPIC, // 105 + SOD_GOLDKEYPIC, // 106 + SOD_SILVERKEYPIC, // 107 + SOD_N_BLANKPIC, // 108 + SOD_N_0PIC, // 109 + SOD_N_1PIC, // 110 + SOD_N_2PIC, // 111 + SOD_N_3PIC, // 112 + SOD_N_4PIC, // 113 + SOD_N_5PIC, // 114 + SOD_N_6PIC, // 115 + SOD_N_7PIC, // 116 + SOD_N_8PIC, // 117 + SOD_N_9PIC, // 118 + SOD_FACE1APIC, // 119 + SOD_FACE1BPIC, // 120 + SOD_FACE1CPIC, // 121 + SOD_FACE2APIC, // 122 + SOD_FACE2BPIC, // 123 + SOD_FACE2CPIC, // 124 + SOD_FACE3APIC, // 125 + SOD_FACE3BPIC, // 126 + SOD_FACE3CPIC, // 127 + SOD_FACE4APIC, // 128 + SOD_FACE4BPIC, // 129 + SOD_FACE4CPIC, // 130 + SOD_FACE5APIC, // 131 + SOD_FACE5BPIC, // 132 + SOD_FACE5CPIC, // 133 + SOD_FACE6APIC, // 134 + SOD_FACE6BPIC, // 135 + SOD_FACE6CPIC, // 136 + SOD_FACE7APIC, // 137 + SOD_FACE7BPIC, // 138 + SOD_FACE7CPIC, // 139 + SOD_FACE8APIC, // 140 + SOD_GOTGATLINGPIC, // 141 + SOD_GODMODEFACE1PIC, // 142 + SOD_GODMODEFACE2PIC, // 143 + SOD_GODMODEFACE3PIC, // 144 + SOD_BJWAITING1PIC, // 145 + SOD_BJWAITING2PIC, // 146 + SOD_BJOUCHPIC, // 147 + SOD_PAUSEDPIC, // 148 + SOD_GETPSYCHEDPIC, // 149 + + SOD_ORDERSCREEN = 151, + SOD_ERRORSCREEN, // 152 + SOD_TITLEPALETTE, // 153 + SOD_END1PALETTE, // 154 + SOD_END2PALETTE, // 155 + SOD_END3PALETTE, // 156 + SOD_END4PALETTE, // 157 + SOD_END5PALETTE, // 158 + SOD_END6PALETTE, // 159 + SOD_END7PALETTE, // 160 + SOD_END8PALETTE, // 161 + SOD_END9PALETTE, // 162 + SOD_IDGUYSPALETTE, // 163 + SOD_T_DEMO0, // 164 + SOD_T_DEMO1, // 165 + SOD_T_DEMO2, // 166 + SOD_T_DEMO3, // 167 + SOD_T_ENDART1, // 168 + SOD_ENUMEND + +} sod_graphicnums; + + +typedef enum +{ + CORNER_MUS, // 0 + DUNGEON_MUS, // 1 + WARMARCH_MUS, // 2 + GETTHEM_MUS, // 3 + HEADACHE_MUS, // 4 + HITLWLTZ_MUS, // 5 + INTROCW3_MUS, // 6 + NAZI_NOR_MUS, // 7 + NAZI_OMI_MUS, // 8 + POW_MUS, // 9 + SALUTE_MUS, // 10 + SEARCHN_MUS, // 11 + SUSPENSE_MUS, // 12 + VICTORS_MUS, // 13 + WONDERIN_MUS, // 14 + FUNKYOU_MUS, // 15 + ENDLEVEL_MUS, // 16 + GOINGAFT_MUS, // 17 + PREGNANT_MUS, // 18 + ULTIMATE_MUS, // 19 + NAZI_RAP_MUS, // 20 + ZEROHOUR_MUS, // 21 + TWELFTH_MUS, // 22 + ROSTER_MUS, // 23 + URAHERO_MUS, // 24 + VICMARCH_MUS, // 25 + PACMAN_MUS, // 26 + LASTMUSIC + +} wl6_musicnames; + +typedef enum +{ + SOD_XFUNKIE_MUS, // 0 + SOD_DUNGEON_MUS, // 1 + SOD_XDEATH_MUS, // 2 + SOD_GETTHEM_MUS, // 3 + SOD_XTIPTOE_MUS, // 4 + SOD_GOINGAFT_MUS, // 5 + SOD_URAHERO_MUS, // 6 + SOD_XTHEEND_MUS, // 7 + SOD_NAZI_OMI_MUS, // 8 + SOD_POW_MUS, // 9 + SOD_TWELFTH_MUS, // 10 + SOD_SEARCHN_MUS, // 11 + SOD_SUSPENSE_MUS, // 12 + SOD_ZEROHOUR_MUS, // 13 + SOD_WONDERIN_MUS, // 14 + SOD_ULTIMATE_MUS, // 15 + SOD_ENDLEVEL_MUS, // 16 + SOD_XEVIL_MUS, // 17 + SOD_XJAZNAZI_MUS, // 18 + SOD_COPYPRO_MUS, // 19 + SOD_XAWARD_MUS, // 20 + SOD_XPUTIT_MUS, // 21 + SOD_XGETYOU_MUS, // 22 + SOD_XTOWER2_MUS, // 23 + SOD_LASTMUSIC + +} sod_musicnames; + + +///////////////////////////////////////////////////////////////////// +// +// WL1 +// +///////////////////////////////////////////////////////////////////// + +// +// Data LUMPs +// +#define WL1_README_LUMP_START 3 +#define WL1_README_LUMP_END 25 + +#define WL1_CONTROLS_LUMP_START 26 +#define WL1_CONTROLS_LUMP_END 52 + +#define WL1_LEVELEND_LUMP_START 53 +#define WL1_LEVELEND_LUMP_END 93 + +#define WL1_LATCHPICS_LUMP_START 99 +#define WL1_LATCHPICS_LUMP_END 141 + + + +///////////////////////////////////////////////////////////////////// +// +// WL6 +// +///////////////////////////////////////////////////////////////////// + +// +// Data LUMPs +// +#define WL6_README_LUMP_START 3 +#define WL6_README_LUMP_END 9 + +#define WL6_CONTROLS_LUMP_START 10 +#define WL6_CONTROLS_LUMP_END 42 + +#define WL6_LEVELEND_LUMP_START 43 +#define WL6_LEVELEND_LUMP_END 85 + +#define WL6_LATCHPICS_LUMP_START 91 +#define WL6_LATCHPICS_LUMP_END 134 + + +// +// Amount of each data item +// +#define NUMFONT 2 +#define NUMFONTM 0 +#define NUMPICM 0 +#define NUMSPRITES 0 +#define NUMTILE8 72 +#define NUMTILE8M 0 +#define NUMTILE16 0 +#define NUMTILE16M 0 +#define NUMTILE32 0 +#define NUMTILE32M 0 +#define NUMEXTERNS 13 +// +// File offsets for data items +// +#define STRUCTPIC 0 + +#define STARTFONT 1 +#define STARTFONTM 3 +#define STARTPICS 3 +#define STARTPICM 135 +#define STARTSPRITES 135 +#define STARTTILE8 135 +#define STARTTILE8M 136 +#define STARTTILE16 136 +#define STARTTILE16M 136 +#define STARTTILE32 136 +#define STARTTILE32M 136 +#define STARTEXTERNS 136 + + + +///////////////////////////////////////////////////////////////////// +// +// Spear of Destiny +// +///////////////////////////////////////////////////////////////////// + + +// +// Amount of each data item +// +#define NUMCHUNKS 169 +#define NUMPICS 147 +#define SOD_NUMEXTERNS 18 +// +// File offsets for data items +// + +#define SOD_STARTDIFF 15 + +//// End SOD + + + + + + +extern _boolean LumpExtractor( const char *fextension, W32 limit, W16 version ); +extern _boolean PExtractor( const char *extension, W16 version ); +extern _boolean AudioRipper( const char *fextension, W32 start, W32 end, W16 version ); + +extern _boolean MapRipper( const char *fextension, W16 version ); + + + +extern char *GetMusicFileName_WL6( W32 chunk ); +extern char *GetMusicFileName_SOD( W32 chunk ); + + +extern char *GetLumpFileName_WL1( W32 chunk ); +extern char *GetLumpFileName_WL6( W32 chunk ); +extern char *GetLumpFileName_SDM( W32 chunk ); +extern char *GetLumpFileName_SOD( W32 chunk ); + + +#endif /* __WOLF_DEF_H__ */ + diff --git a/wolf3d/wolfextractor/wolf/wolf_gfx.c b/wolf3d/wolfextractor/wolf/wolf_gfx.c new file mode 100644 index 0000000..d9a0dba --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wolf_gfx.c @@ -0,0 +1,1707 @@ +/* + + Copyright (C) 2004 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wolf_gfx.c: Decode Wolfenstein3-D GFX data. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Wolfenstein3-D, and was originally + * written by Id Software, Inc. + * + */ + +#include +#include +#include + +#include "wolf_def.h" + +#include "../loaders/tga.h" +#include "../hq2x.h" +#include "../string/com_string.h" +#include "../filesys/file.h" +#include "../../../common/common_utils.h" +#include "../../../common/arch.h" +#include "../memory/memory.h" + + +extern char gamepal[]; + +#define FILEPOSSIZE 3 + + + + +#define GFXHEADFNAME "VGAHEAD" +#define GFXFNAME "VGAGRAPH" +#define GFXDICTFNAME "VGADICT" + + + +#define FONTWIDTH 256 +#define FONTHEIGHT 128 + + + + +typedef struct +{ + short height; + short location[ 256 ]; + char width[ 256 ]; + +} fontstruct; + + +typedef struct +{ + // 0-255 is a character, > is a pointer to a node + W16 bit0, bit1; + +} huffnode; + +typedef struct +{ + W16 width, height; + +} pictabletype; + +pictabletype *pictable; +huffnode grhuffman[ 255 ]; + + +FILE *grhandle; +SW32 *grstarts; // array of offsets in vgagraph, -1 for sparse + +void *grsegs[ NUMCHUNKS ]; + + + + +/* +----------------------------------------------------------------------------- + Function: GRFILEPOS() -Calculate graphic file position. + + Parameters: chunk -[in] Chunk number to calculate file offset. + + Returns: File offset value or -1 for sparse tile. + + Notes: See 'wl6_name.h' for valid chunk numbers for SOD and WL6. + grstarts must be allocated and initialized before call. + Uses global variable grstarts. + +----------------------------------------------------------------------------- +*/ +PRIVATE SW32 GRFILEPOS( W32 c ) +{ + SW32 value; + W32 offset; + + offset = c * 3; + + value = *(PW32)( ( (PW8)grstarts ) + offset ); + + value &= 0x00ffffffl; + + if( value == 0xffffffl ) + { + value = -1; + } + + return value; +}; + + +/* +----------------------------------------------------------------------------- + Function: CAL_GetGrChunkLength() -Calculate length of compressed graphic + chunk. + + Parameters: chunk -[in] Chunk number to calculate file offset. + + Returns: The length of the compressed graphic chunk. + + Notes: Gets the length of an explicit length chunk (not tiles). + The file pointer is positioned so the compressed data + can be read in next. + +----------------------------------------------------------------------------- +*/ +PRIVATE SW32 CAL_GetGrChunkLength( W32 chunk ) +{ + fseek( grhandle, GRFILEPOS( chunk ) + sizeof( W32 ), SEEK_SET ); + + return ( GRFILEPOS( chunk + 1 ) - GRFILEPOS( chunk ) - 4 ); +} + +/* +----------------------------------------------------------------------------- + Function: CAL_HuffExpand() -Expand compressed data. + + Parameters: source -[in] Pointer to compressed data. + destination -[out] Pointer to hold decompressed data. + length -[in] Length of expanded data. + hufftable -[in] Huffman dictionary data. + + Returns: Nothing. + + Notes: Uses classic Huffman node tree (not optimized). +----------------------------------------------------------------------------- +*/ +PRIVATE void CAL_HuffExpand( const W8 *source, + W8 *destination, + W32 length, + huffnode *hufftable ) +{ + W32 bx; // node pointer + W32 dx; + + W32 ch; // high order of CX + W32 cl; // low order of CX + + const W8 *si; // Source Index + W8 *di; // Destination Index + + bx = 254; // head node is always node 254 + si = source; + di = destination; + + + ch = *si; // load first byte + si++; + cl = 1; + + do + { + if( (ch & cl) & 0xff ) // bit set? + dx = hufftable[ bx ].bit1; // take bit1 path from node + else + dx = hufftable[ bx ].bit0; // take bit0 path from node + + + cl <<= 1; // advance to next bit position + + if( cl & 0x100 ) + { + ch = *si; // load next byte + si++; + cl = 1; // back to first bit + } + + if( (cl & 0x100) == 0 ) + { + if( dx < 256 ) + { + *di = (W8)(dx & 0xff); // write a decompressed byte out + di++; + bx = 254; // back to the head node for next bit + + length--; + } + else + { + bx = dx - 256; // next node = (huffnode *)code + } + } + + } while( length ); + +} + +/* +----------------------------------------------------------------------------- + Function: CAL_SetupGrFile() -Initialize graphic files and arrays. + + Parameters: extension -[in] Pointer to a null-terminated string that + specifies the file extension. + (must be in '.XXX' format). + + Returns: 1 on success, 0 otherwise. + + Notes: + Uses global variables grhandle and pictable. + 1. Open vgadict.XXX, read huffman dictionary data. + 2. Open vgahead.XXX, read data offsets. + 3. Open vgagraph.XXX, read pic and sprite header, expand data. +----------------------------------------------------------------------------- +*/ +PRIVATE W8 CAL_SetupGrFile( const char *extension ) +{ + void *compseg; + FILE *handle; + char filename[ 16 ]; + SW32 chunkcomplen; // chunk compressed length + +// +// load vgadict.ext (huffman dictionary for graphics files) +// + cs_strlcpy( filename, GFXDICTFNAME, sizeof( filename ) ); + cs_strlcat( filename, extension, sizeof( filename ) ); + + if( ( handle = fopen( cs_strupr( filename ), "rb" ) ) == NULL ) + { + if( ( handle = fopen( cs_strlwr( filename ), "rb" ) ) == NULL ) + { + printf( "Could not open file (%s) for read!\n", filename ); + return 0; + } + } + + fread( grhuffman, sizeof( grhuffman ), 1, handle ); + fclose( handle ); + +// +// Open then load the data offsets from vgahead.ext +// + + cs_strlcpy( filename, GFXHEADFNAME, sizeof( filename ) ); + cs_strlcat( filename, extension, sizeof( filename ) ); + + if( (handle = fopen( cs_strupr( filename ), "rb" )) == NULL ) + { + if( (handle = fopen( cs_strlwr( filename ), "rb" )) == NULL ) + { + printf( "Could not open file (%s) for read!\n", filename ); + return 0; + } + } + + grstarts = MM_MALLOC( (NUMCHUNKS+1) * FILEPOSSIZE ); + if( grstarts == NULL ) + { + return 0; + } + + fread( grstarts, sizeof( long ), (NUMCHUNKS+1) * FILEPOSSIZE, handle ); + + fclose( handle ); + +// +// Open the graphics file 'vgagraph.XXX'. +// + + cs_strlcpy( filename, GFXFNAME, sizeof( filename ) ); + cs_strlcat( filename, extension, sizeof( filename ) ); + + if( ( grhandle = fopen( cs_strupr( filename ), "rb" ) ) == NULL ) + { + if( ( grhandle = fopen( cs_strlwr( filename ), "rb" ) ) == NULL ) + { + printf( "Could not open file (%s) for read!\n", filename ); + return 0; + } + } + +// +// load the pic and sprite headers into the arrays. +// + pictable = MM_MALLOC( NUMPICS * sizeof( pictabletype ) ); + if( pictable == NULL ) + { + return 0; + } + + + chunkcomplen = CAL_GetGrChunkLength( STRUCTPIC ); // position file pointer + + compseg = MM_MALLOC( chunkcomplen ); + if( compseg == NULL ) + { + return 0; + } + + fread( compseg, chunkcomplen, 1, grhandle ); + + CAL_HuffExpand( compseg, (PW8)pictable, + NUMPICS * sizeof( pictabletype ), + grhuffman ); + + MM_FREE( compseg ); + + return 1; +} + +/* +----------------------------------------------------------------------------- + Function: CAL_Shutdown() -Shutdown module. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: Frees grstarts, pictable and grsegs data. Closes grhandle file handle. +----------------------------------------------------------------------------- +*/ +PUBLIC void CAL_Shutdown( void ) +{ + W32 i; + + if( grstarts ) + { + MM_FREE( grstarts ); + } + + if( pictable ) + { + MM_FREE( pictable ); + } + + if( grhandle ) + { + fclose( grhandle ); + } + + for( i = 0; i < NUMCHUNKS; ++i ) + { + if( grsegs[ i ] ) + { + MM_FREE( grsegs[ i ] ); + } + } + +} + +/* +----------------------------------------------------------------------------- + Function: CAL_ExpandGrChunk() -Expand compressed graphic chunk. + + Parameters: chunk -[in] Chunk number to expand. + source -[in] Pointer to compressed data. + version -[in] extension version. + 1 -WL6 + 2 -SOD + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void CAL_ExpandGrChunk( W32 chunk, const W8 *source, W16 version ) +{ + W32 expanded; + W16 offset = 0; + + if( version & SOD_PAK ) + offset = SOD_STARTDIFF; + + if( chunk >= ( STARTTILE8 + offset ) && + chunk < ( STARTEXTERNS + offset ) ) + { + // + // expanded sizes of tile8/16/32 are implicit + // + +#define BLOCK 64 +#define MASKBLOCK 128 + + if( chunk < (STARTTILE8M + offset) ) // tile 8s are all in one chunk! + expanded = BLOCK * NUMTILE8; + else if( chunk < (STARTTILE16 + offset) ) + expanded = MASKBLOCK * NUMTILE8M; + else if( chunk < (STARTTILE16M + offset) ) // all other tiles are one/chunk + expanded = BLOCK << 2; + else if( chunk < (STARTTILE32 + offset) ) + expanded = MASKBLOCK << 2; + else if( chunk < (STARTTILE32M + offset) ) + expanded = BLOCK << 4; + else + expanded = MASKBLOCK << 4; + } + else + { + // + // everything else has an explicit size longword + // + expanded = *(PW32)source; + source += 4; // skip over length + } + +// +// allocate final space and decompress it. +// Sprites need to have shifts made and various other junk. +// + grsegs[ chunk ] = MM_MALLOC( expanded ); + if( grsegs[ chunk ] == NULL ) + { + return; + } + + CAL_HuffExpand( source, grsegs[ chunk ], expanded, grhuffman ); +} + +/* +----------------------------------------------------------------------------- + Function: CA_CacheGrChunk() -Cache graphic chunk. + + Parameters: chunk -[in] Chunk number to cache. + version -[in] extension version. + 1 -WL6 + 2 -SOD + + Returns: Nothing. + + Notes: Makes sure a given chunk is in memory, loading it if needed. +----------------------------------------------------------------------------- +*/ +PRIVATE void CA_CacheGrChunk( W32 chunk, W16 version ) +{ + SW32 pos; + W32 compressed; + void *buffer; + W32 next; + + if( grsegs[ chunk ] ) + { + return; // already in memory + } + + +// +// load the chunk into a buffer +// + pos = GRFILEPOS( chunk ); + if( pos < 0 ) // $FFFFFFFF start is a sparse tile + { + return; + } + + next = chunk + 1; + while( GRFILEPOS( next ) == -1 ) // skip past any sparse tiles + { + next++; + } + + compressed = GRFILEPOS( next ) - pos; + + fseek( grhandle, pos, SEEK_SET ); + + + buffer = MM_MALLOC( compressed ); + if( buffer == NULL ) + { + return; + } + + + fread( buffer, 1, compressed, grhandle ); + + CAL_ExpandGrChunk( chunk, buffer, version ); + + + MM_FREE( buffer ); +} + + + +/* +----------------------------------------------------------------------------- + Function: RGB32toRGB24() -Convert image from 32bits to 24bits. + + Parameters: src -[in] Buffer to convert from. + dest -[in/out] Buffer to convert to. + size -[in] Size of src buffer. + + Returns: Nothing. + + Notes: src and dest can point to the same memory block. +----------------------------------------------------------------------------- +*/ +PUBLIC void RGB32toRGB24( const W8 *src, W8 *dest, size_t size ) +{ + size_t i; + size_t npixels = size >> 2; + + for( i = 0 ; i < npixels ; ++i ) + { + dest[ i * 3 + 0 ] = src[ i * 4 + 0 ]; + dest[ i * 3 + 1 ] = src[ i * 4 + 1 ]; + dest[ i * 3 + 2 ] = src[ i * 4 + 2 ]; + } +} + + + +/* +----------------------------------------------------------------------------- + Function: MergePics() -Merge image inside another image. + + Parameters: src -[in] Source image to copy from. + dest -[in] Destination image to copy to. + width -[in] Width of source image. + height -[in] Height of source image. + bpp -[in] Bytes per pixel of images. + totalwidth -[in] -Total width (in pixels) of destination image. + x_offset -[in] X offset (in pixels) in destination image. + y_offset -[in] Y offset (in pixels) in destination image. + + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void MergePics( const W8 *src, W8 *dest, W16 width, W16 height, W16 bpp, W16 totalwidth, + W32 x_offset, + W32 y_offset ) +{ + W16 x, y; + W8 *dptr; + + + dptr = dest + (y_offset * totalwidth * bpp) + (x_offset * bpp); + for( y = 0 ; y < height ; ++y ) + { + for( x = 0 ; x < width ; ++x ) + { + dptr[ 0 ] = src[ 0 ]; + dptr[ 1 ] = src[ 1 ]; + + src += bpp; + dptr += bpp; + } + + dptr += (totalwidth * bpp) - width * bpp; + } +} + +PRIVATE void MergeImages( W8 *src, W16 src_bpp, W16 src_totalwidth, W16 src_region_width, W16 src_region_height, W32 src_x_offset, W32 src_y_offset, + W8 *dest, W16 dest_bpp, W16 dest_totalwidth, W16 dest_region_width, W16 dest_region_height, W32 dest_x_offset, W32 dest_y_offset ) +{ + W16 x, y; + W8 *dptr; + W8 *sptr; + + + dptr = dest + (dest_y_offset * dest_totalwidth * dest_bpp) + (dest_x_offset * dest_bpp); + sptr = src + (src_y_offset * src_totalwidth * src_bpp) + (src_x_offset * src_bpp); + for( y = 0 ; y < src_region_height ; ++y ) + { + for( x = 0 ; x < src_region_width ; ++x ) + { + dptr[ 0 ] = sptr[ 0 ]; + dptr[ 1 ] = sptr[ 1 ]; + + sptr += src_bpp; + dptr += dest_bpp; + } + + dptr += (dest_totalwidth * dest_bpp) - dest_region_width * dest_bpp; + sptr += (src_totalwidth * src_bpp) - src_region_width * src_bpp; + } +} + +/* +----------------------------------------------------------------------------- + Function: SavePic() -Save graphic lump in targa image format. + + Parameters: chunk -[in] Chunk number to save. + version -[in] extension version. + 1 -WL6 + 2 -SOD + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void SavePic( W32 chunknum, W16 version, W8 *buffer, W8 *buffer2 ) +{ + W16 i; + W16 temp; + char filename[32]; + char *fname; + W8 *ptr; + W8 *pic; + W32 picnum; + W16 width, height; + W16 linewidth, plane, sx, sy; + W8 r,g,b; + W16 rgb; + W8 *tpalette = gamepal; + static W16 offset = 0; + + + if( ( (chunknum == WL1_N_BLANKPIC || + chunknum == WL1_NOKEYPIC ) && (version & WL1_PAK) ) ) + { + return; + } + + if( ( (chunknum == N_BLANKPIC || + chunknum == NOKEYPIC ) && (version & WL6_PAK) ) ) + { + return; + } + + if( ( (chunknum == SDM_N_BLANKPIC || + chunknum == SDM_NOKEYPIC ) && (version & SDM_PAK) ) ) + { + return; + } + + if( ( (chunknum == SOD_N_BLANKPIC || + chunknum == SOD_NOKEYPIC ) && (version & SOD_PAK) ) ) + { + return; + } + + // Spear used multiple palettes, so + // pull out the one we need. + if( version & SDM_PAK ) + { + switch( chunknum ) + { + case SDM_TITLE1PIC: + case SDM_TITLE2PIC: + CA_CacheGrChunk( SDM_TITLEPALETTE, version ); + tpalette = grsegs[ SDM_TITLEPALETTE ]; + break; + + default: + tpalette = gamepal; + break; + } + } + + if( version & SOD_PAK ) + { + switch( chunknum ) + { + case SOD_IDGUYS1PIC: + case SOD_IDGUYS2PIC: + CA_CacheGrChunk( SOD_IDGUYSPALETTE, version ); + tpalette = grsegs[ SOD_IDGUYSPALETTE ]; + break; + + case SOD_TITLE1PIC: + case SOD_TITLE2PIC: + CA_CacheGrChunk( SOD_TITLEPALETTE, version ); + tpalette = grsegs[ SOD_TITLEPALETTE ]; + break; + + case SOD_ENDSCREEN11PIC: + CA_CacheGrChunk( SOD_END1PALETTE, version ); + tpalette = grsegs[ SOD_END1PALETTE ]; + break; + + case SOD_ENDSCREEN12PIC: + CA_CacheGrChunk( SOD_END2PALETTE, version ); + tpalette = grsegs[ SOD_END2PALETTE ]; + break; + + case SOD_ENDSCREEN3PIC: + CA_CacheGrChunk( SOD_END3PALETTE, version ); + tpalette = grsegs[ SOD_END3PALETTE ]; + break; + + case SOD_ENDSCREEN4PIC: + CA_CacheGrChunk( SOD_END4PALETTE, version ); + tpalette = grsegs[ SOD_END4PALETTE ]; + break; + + case SOD_ENDSCREEN5PIC: + CA_CacheGrChunk( SOD_END5PALETTE, version ); + tpalette = grsegs[ SOD_END5PALETTE ]; + break; + + case SOD_ENDSCREEN6PIC: + CA_CacheGrChunk( SOD_END6PALETTE, version ); + tpalette = grsegs[ SOD_END6PALETTE ]; + break; + + case SOD_ENDSCREEN7PIC: + CA_CacheGrChunk( SOD_END7PALETTE, version ); + tpalette = grsegs[ SOD_END7PALETTE ]; + break; + + case SOD_ENDSCREEN8PIC: + CA_CacheGrChunk( SOD_END8PALETTE, version ); + tpalette = grsegs[ SOD_END8PALETTE ]; + break; + + case SOD_ENDSCREEN9PIC: + CA_CacheGrChunk( SOD_END9PALETTE, version ); + tpalette = grsegs[ SOD_END9PALETTE ]; + break; + + default: + tpalette = gamepal; + break; + + } // End switch chunknum + + } // End if version & SOD_PAK + +STATUSBARHACK: + + picnum = chunknum - STARTPICS; + + pic = grsegs[ chunknum ]; + width = pictable[ picnum ].width; + height= pictable[ picnum ].height; + + + + linewidth = width / 4; + for( i = 0; i < ( width * height ); ++i, pic++ ) + { + plane = i / ( (width * height) / 4 ); + sx = ( ( i % ( linewidth ) ) * 4 ) + plane; + sy = ( ( i / linewidth ) % height ); + + ptr = buffer + ( (sx*2) + (sy * width)*2); + + + temp = (*pic) * 3; + r = tpalette[ temp ] >> 1; + g = tpalette[ temp+1 ]; + b = tpalette[ temp+2 ] >> 1; + + rgb = (b << 11) | (g << 5) | r; + ptr[ 0 ] = rgb & 0xff; + ptr[ 1 ] = rgb >> 8; + } + + +// +// Hacks to reassemble images +// + if( version & WL1_PAK ) + { + if( chunknum == WL1_STATUSBARPIC ) + { + memcpy( buffer2, buffer, width * height * 2 ); // Save Status bar pic + CA_CacheGrChunk( WL1_NOKEYPIC, version ); // cache NOKEYPIC + chunknum = WL1_NOKEYPIC; + + goto STATUSBARHACK; + } + else if( chunknum == WL1_H_BOTTOMINFOPIC ) + { + MergeImages( buffer, 2, 304, 91, 16, 24, 4, + buffer2, 2, 91, 91, 16, 0, 0 ); + MergeImages( buffer, 2, 304, 91, 16, 192, 4, + buffer2, 2, 91, 91, 16, 0, 16 ); + + + hq2x_32( buffer2, buffer, 91, 16, (91*2)*4 ); + RGB32toRGB24( buffer, buffer, 182*32*4 ); + + cs_snprintf( filename, sizeof( filename ), "%s/%s.tga", LGFXDIR, "PLAQUE_PAGE" ); + + WriteTGA( filename, 24, 182, 32, buffer, 0, 0 ); + + hq2x_32( buffer2 + (16 * 91 * 2), buffer, 91, 16, (91*2)*4 ); + RGB32toRGB24( buffer, buffer, 182*32*4 ); + + cs_snprintf( filename, sizeof( filename ), "%s/%s.tga", LGFXDIR, "PLAQUE_BLANK" ); + + WriteTGA( filename, 24, 182, 32, buffer, 0, 1 ); + + return; + } + else if( chunknum == WL1_NOKEYPIC ) + { + chunknum = WL1_STATUSBARPIC; + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4 ); + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4+height ); + + memcpy( buffer, buffer2, 320 * 40 * 2 ); + width = 320; + height = 40; + } + else if( chunknum == WL1_L_COLONPIC ) + { + memset( buffer2, 0, 256*64*2 ); + + MergePics( buffer, buffer2, width, height, 2, 256, 160, 16 ); + + return; + } + else if( chunknum == WL1_L_EXPOINTPIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, 16, 0 ); + + return; + } + else if( chunknum == WL1_L_APOSTROPHEPIC ) + { + W16 i; + + MergePics( buffer, buffer2, width, height, 2, 256, 112, 0 ); + + memcpy( buffer, buffer2, 256 * 64 * 2 ); + + + for( i = 0 ; i < 256 * 64 * 2 ; i += 2 ) + { + if( buffer[ i ] == 0 && buffer[ i + 1 ] == 0 ) + { + buffer[ i + 1 ] = 66; + } + } + + offset = 0; + width = 256; + height = 64; + } + else if( chunknum == WL1_L_PERCENTPIC ) + { + offset = 16; // this is for L_APIC... + + MergePics( buffer, buffer2, width, height, 2, 256, 80, 0 ); + + return; + } + else if( chunknum >= WL1_L_NUM0PIC && chunknum <= WL1_L_NUM9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, offset, 16 ); + + offset += width; + + return; + } + else if( chunknum >= WL1_N_0PIC && chunknum < WL1_N_9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + offset += width + 1; + + return; + } + else if( chunknum == WL1_N_9PIC ) + { + W32 i; + + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + memcpy( buffer, buffer2, 90 * height * 2 ); + + for( i = 0 ; i < 90 * 16 * 2 ; i += 2 ) + { + if( ! (i % 9) && i != 0 ) + { + buffer[ i - 2 ] = 0; + buffer[ i - 1 ] = 160; + } + } + + width = 90; + offset = 0; + } + else if( chunknum >= WL1_L_APIC && chunknum <= WL1_L_ZPIC ) + { + static W32 yoffset = 32; + + MergePics( buffer, buffer2, width, height, 2, 256, offset, yoffset ); + + offset += width; + + if( offset >= 256 ) + { + offset = 0; + yoffset += 16; + } + + return; + } + else if( chunknum == WL1_FACE5CPIC ) + { + // hmmm... Why is this one messed up? + + MergeImages( buffer, 2, 24, 18, height-2, 8, 2, + buffer2, 2, 24, 18, height-2, 0, 0 ); + MergeImages( buffer, 2, 24, 8, height-3, 0, 3, + buffer2, 2, 24, 8, height-2, 16, 0 ); + + MergeImages( buffer, 2, 24, 18, 2, 9, 0, + buffer2, 2, 24, 18, 2, 0, height-2 ); + MergeImages( buffer, 2, 24, 7, 3, 1, 0, + buffer2, 2, 24, 7, 3, 16, height-3 ); + + memcpy( buffer, buffer2, 24 * 32 * 2 ); + + + buffer[ (30 * 24 * 2) + (3 * 2) ] = 73; + buffer[ (30 * 24 * 2) + (3 * 2) + 1 ] = 74; + + buffer[ (31 * 24 * 2) + (3 * 2) ] = 73; + buffer[ (31 * 24 * 2) + (3 * 2) + 1 ] = 74; + + + + buffer[ (29 * 24 * 2) + (23 * 2) ] = 73; + buffer[ (29 * 24 * 2) + (23 * 2) + 1 ] = 74; + + buffer[ (30 * 24 * 2) + (23 * 2) ] = 73; + buffer[ (30 * 24 * 2) + (23 * 2) + 1 ] = 74; + + buffer[ (31 * 24 * 2) + (23 * 2) ] = 73; + buffer[ (31 * 24 * 2) + (23 * 2) + 1 ] = 74; + + + + buffer[ (29 * 24 * 2) + (19 * 2) ] = 255; + buffer[ (29 * 24 * 2) + (19 * 2) + 1 ] = 100; + + buffer[ (30 * 24 * 2) + (19 * 2) ] = 63; + buffer[ (30 * 24 * 2) + (19 * 2) + 1 ] = 117; + + buffer[ (31 * 24 * 2) + (19 * 2) ] = 52; + buffer[ (31 * 24 * 2) + (19 * 2) + 1 ] = 59; + + + + buffer[ (30 * 24 * 2) + (7 * 2) ] = 19; + buffer[ (30 * 24 * 2) + (7 * 2) + 1 ] = 59; + + buffer[ (31 * 24 * 2) + (7 * 2) ] = 19; + buffer[ (31 * 24 * 2) + (7 * 2) + 1 ] = 59; + + + + buffer[ (30 * 24 * 2) + (11 * 2) ] = 91; + buffer[ (30 * 24 * 2) + (11 * 2) + 1 ] = 84; + + buffer[ (31 * 24 * 2) + (11 * 2) ] = 190; + buffer[ (31 * 24 * 2) + (11 * 2) + 1 ] = 92; + + + buffer[ (30 * 24 * 2) + (15 * 2) ] = 249; + buffer[ (30 * 24 * 2) + (15 * 2) + 1 ] = 75; + + buffer[ (31 * 24 * 2) + (15 * 2) ] = 190; + buffer[ (31 * 24 * 2) + (15 * 2) + 1 ] = 92; + } + } + else if( version & WL6_PAK ) + { + if( chunknum == STATUSBARPIC ) + { + memcpy( buffer2, buffer, width * height * 2 ); // Save Status bar pic + CA_CacheGrChunk( NOKEYPIC, version ); // cache NOKEYPIC + chunknum = NOKEYPIC; + + goto STATUSBARHACK; + } + else if( chunknum == H_BOTTOMINFOPIC ) + { + MergeImages( buffer, 2, 304, 91, 16, 24, 4, + buffer2, 2, 91, 91, 16, 0, 0 ); + MergeImages( buffer, 2, 304, 91, 16, 192, 4, + buffer2, 2, 91, 91, 16, 0, 16 ); + + + hq2x_32( buffer2, buffer, 91, 16, (91*2)*4 ); + RGB32toRGB24( buffer, buffer, 182*32*4 ); + + cs_snprintf( filename, sizeof( filename ), "%s/%s.tga", LGFXDIR, "PLAQUE_PAGE" ); + + WriteTGA( filename, 24, 182, 32, buffer, 0, 0 ); + + hq2x_32( buffer2 + (16 * 91 * 2), buffer, 91, 16, (91*2)*4 ); + RGB32toRGB24( buffer, buffer, 182*32*4 ); + + cs_snprintf( filename, sizeof( filename ), "%s/%s.tga", LGFXDIR, "PLAQUE_BLANK" ); + + WriteTGA( filename, 24, 182, 32, buffer, 0, 1 ); + + return; + } + else if( chunknum == NOKEYPIC ) + { + chunknum = STATUSBARPIC; + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4 ); + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4+height ); + + memcpy( buffer, buffer2, 320 * 40 * 2 ); + width = 320; + height = 40; + } + else if( chunknum == L_COLONPIC ) + { + memset( buffer2, 0, 256*64*2 ); + + MergePics( buffer, buffer2, width, height, 2, 256, 160, 16 ); + + return; + } + else if( chunknum == L_EXPOINTPIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, 16, 0 ); + + return; + } + else if( chunknum == L_APOSTROPHEPIC ) + { + W16 i; + + MergePics( buffer, buffer2, width, height, 2, 256, 112, 0 ); + + memcpy( buffer, buffer2, 256 * 64 * 2 ); + + + for( i = 0 ; i < 256 * 64 * 2 ; i += 2 ) + { + if( buffer[ i ] == 0 && buffer[ i + 1 ] == 0 ) + { + buffer[ i + 1 ] = 66; + } + } + + offset = 0; + width = 256; + height = 64; + } + else if( chunknum == L_PERCENTPIC ) + { + offset = 16; // this is for L_APIC... + + MergePics( buffer, buffer2, width, height, 2, 256, 80, 0 ); + + return; + } + else if( chunknum >= L_NUM0PIC && chunknum <= L_NUM9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, offset, 16 ); + + offset += width; + + return; + } + else if( chunknum >= N_0PIC && chunknum < N_9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + offset += width + 1; + + return; + } + else if( chunknum == N_9PIC ) + { + W32 i; + + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + memcpy( buffer, buffer2, 90 * height * 2 ); + + for( i = 0 ; i < 90 * 16 * 2 ; i += 2 ) + { + if( ! (i % 9) && i != 0 ) + { + buffer[ i - 2 ] = 0; + buffer[ i - 1 ] = 160; + } + } + + width = 90; + offset = 0; + } + else if( chunknum >= L_APIC && chunknum <= L_ZPIC ) + { + static W32 yoffset = 32; + + MergePics( buffer, buffer2, width, height, 2, 256, offset, yoffset ); + + offset += width; + + if( offset >= 256 ) + { + offset = 0; + yoffset += 16; + } + + + return; + } + } + else if( version & SDM_PAK ) + { + if( chunknum == SDM_STATUSBARPIC ) + { + memcpy( buffer2, buffer, width * height * 2 ); // Save Status bar pic + CA_CacheGrChunk( SDM_NOKEYPIC, version ); // cache SOD_NOKEYPIC + chunknum = SDM_NOKEYPIC; + + goto STATUSBARHACK; + } + else if( chunknum == SDM_NOKEYPIC ) + { + chunknum = SDM_STATUSBARPIC; + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4 ); + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4+height ); + + memcpy( buffer, buffer2, 320 * 40 * 2 ); + width = 320; + height = 40; + } + else if( chunknum == SDM_L_COLONPIC ) + { + memset( buffer2, 0, 256*64*2 ); + + MergePics( buffer, buffer2, width, height, 2, 256, 160, 16 ); + + return; + } + else if( chunknum == SDM_L_EXPOINTPIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, 16, 0 ); + + return; + } + else if( chunknum == SDM_L_APOSTROPHEPIC ) + { + W16 i; + + MergePics( buffer, buffer2, width, height, 2, 256, 112, 0 ); + + memcpy( buffer, buffer2, 256 * 64 * 2 ); + + + for( i = 0 ; i < 256 * 64 * 2 ; i += 2 ) + { + if( buffer[ i ] == 0 && buffer[ i + 1 ] == 0 ) + { + buffer[ i + 1 ] = 66; + } + } + + offset = 0; + width = 256; + height = 64; + } + else if( chunknum == SDM_L_PERCENTPIC ) + { + offset = 16; // this is for L_APIC... + + MergePics( buffer, buffer2, width, height, 2, 256, 80, 0 ); + + return; + } + else if( chunknum >= SDM_L_NUM0PIC && chunknum <= SDM_L_NUM9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, offset, 16 ); + + offset += width; + + return; + } + else if( chunknum >= SDM_N_0PIC && chunknum < SDM_N_9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + offset += width + 1; + + return; + } + else if( chunknum == SDM_N_9PIC ) + { + W32 i; + + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + memcpy( buffer, buffer2, 90 * height * 2 ); + + for( i = 0 ; i < 90 * 16 * 2 ; i += 2 ) + { + if( ! (i % 9) && i != 0 ) + { + buffer[ i - 2 ] = 0; + buffer[ i - 1 ] = 160; + } + } + + width = 90; + offset = 0; + } + else if( chunknum >= SDM_L_APIC && chunknum <= SDM_L_ZPIC ) + { + static W32 yoffset = 32; + + MergePics( buffer, buffer2, width, height, 2, 256, offset, yoffset ); + + offset += width; + + if( offset >= 256 ) + { + offset = 0; + yoffset += 16; + } + + return; + } + else if( chunknum == SDM_TITLE1PIC ) + { + memcpy( buffer2+offset, buffer, (width*height*2) ); + offset += width*height*2; + + return; + } + else if( chunknum == SDM_TITLE2PIC ) + { + memcpy( buffer2+offset, buffer, (width*height*2) ); + memcpy( buffer, buffer2, 320*200*2 ); + height = 200; + offset = 0; + } + } + else if( version & SOD_PAK ) + { + if( chunknum == SOD_STATUSBARPIC ) + { + memcpy( buffer2, buffer, width * height * 2 ); // Save Status bar pic + CA_CacheGrChunk( SOD_NOKEYPIC, version ); // cache SOD_NOKEYPIC + chunknum = SOD_NOKEYPIC; + + goto STATUSBARHACK; + } + else if( chunknum == SOD_NOKEYPIC ) + { + chunknum = SOD_STATUSBARPIC; + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4 ); + MergePics( buffer, buffer2, width, height, 2, 320, 240, 4+height ); + + memcpy( buffer, buffer2, 320 * 40 * 2 ); + width = 320; + height = 40; + } + else if( chunknum == SOD_L_COLONPIC ) + { + memset( buffer2, 0, 256*64*2 ); + + MergePics( buffer, buffer2, width, height, 2, 256, 160, 16 ); + + return; + } + else if( chunknum == SOD_L_EXPOINTPIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, 16, 0 ); + + return; + } + else if( chunknum == SOD_L_APOSTROPHEPIC ) + { + W16 i; + + MergePics( buffer, buffer2, width, height, 2, 256, 112, 0 ); + + memcpy( buffer, buffer2, 256 * 64 * 2 ); + + + for( i = 0 ; i < 256 * 64 * 2 ; i += 2 ) + { + if( buffer[ i ] == 0 && buffer[ i + 1 ] == 0 ) + { + buffer[ i + 1 ] = 66; + } + } + + offset = 0; + width = 256; + height = 64; + } + else if( chunknum == SOD_L_PERCENTPIC ) + { + offset = 16; // this is for L_APIC... + + MergePics( buffer, buffer2, width, height, 2, 256, 80, 0 ); + + return; + } + else if( chunknum >= SOD_L_NUM0PIC && chunknum <= SOD_L_NUM9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 256, offset, 16 ); + + offset += width; + + return; + } + else if( chunknum >= SOD_N_0PIC && chunknum < SOD_N_9PIC ) + { + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + offset += width + 1; + + return; + } + else if( chunknum == SOD_N_9PIC ) + { + W32 i; + + MergePics( buffer, buffer2, width, height, 2, 90, offset, 0 ); + + memcpy( buffer, buffer2, 90 * height * 2 ); + + for( i = 0 ; i < 90 * 16 * 2 ; i += 2 ) + { + if( ! (i % 9) && i != 0 ) + { + buffer[ i - 2 ] = 0; + buffer[ i - 1 ] = 160; + } + } + + width = 90; + offset = 0; + } + else if( chunknum >= SOD_L_APIC && chunknum <= SOD_L_ZPIC ) + { + static W32 yoffset = 32; + + MergePics( buffer, buffer2, width, height, 2, 256, offset, yoffset ); + + offset += width; + + if( offset >= 256 ) + { + offset = 0; + yoffset += 16; + } + + return; + } + else if( chunknum == SOD_IDGUYS1PIC ) + { + memcpy( buffer2+offset, buffer, (width*height*2) ); + offset += width*height*2; + + return; + } + else if( chunknum == SOD_IDGUYS2PIC ) + { + memcpy( buffer2+offset, buffer, (width*height*2) ); + memcpy( buffer, buffer2, 320*200*2 ); + height = 200; + offset = 0; + } + else if( chunknum == SOD_TITLE1PIC ) + { + memcpy( buffer2+offset, buffer, (width*height*2) ); + offset += width*height*2; + + return; + } + else if( chunknum == SOD_TITLE2PIC ) + { + memcpy( buffer2+offset, buffer, (width*height*2) ); + memcpy( buffer, buffer2, 320*200*2 ); + height = 200; + offset = 0; + } + } +// +// End of images hacks +// + + + if( version & WL1_PAK ) + { + fname = GetLumpFileName_WL1( chunknum ); + } + else if( version & WL6_PAK ) + { + fname = GetLumpFileName_WL6( chunknum ); + } + else if( version & SDM_PAK ) + { + fname = GetLumpFileName_SDM( chunknum ); + } + else if( version & SOD_PAK ) + { + fname = GetLumpFileName_SOD( chunknum ); + } + else + { + printf( "Unknown file extension!\n" ); + + return; + } + + if( fname == NULL ) + { + printf( "File name not found for item: (%d)\n", chunknum ); + + return; + } + + cs_snprintf( filename, sizeof( filename ), "%s/%s.tga", LGFXDIR, fname ); + + + hq2x_32( buffer, buffer2, width, height, (width*2)*4 ); + + + // Get rid of alpha channel + RGB32toRGB24( buffer2, buffer2, (width*2)*(height*2)*4 ); + + + WriteTGA( filename, 24, (width*2), (height*2), buffer2, 0, 1 ); + + return; +} + + + + +/* +----------------------------------------------------------------------------- + Function: Fontline() -Extract and save font. + + Parameters: fontnumber -[in] font to save. + version -[in] extension version. + 1 -WL6 + 2 -SOD + + Returns: Nothing. + + Notes: Font must be cached in grsegs[] before calling. +----------------------------------------------------------------------------- +*/ +PRIVATE void Fontline( W32 fontnumber, W16 version ) +{ + fontstruct *font; + W16 i; + W16 x, y; + W16 px, py; + W8 *buffer; + W8 *source; + W8 *ptr; + char filename[ 256 ]; + + + font = (fontstruct *)grsegs[ fontnumber ]; + + + buffer = MM_MALLOC( FONTWIDTH * FONTHEIGHT * 4 ); + if( buffer == NULL ) + return; + + ptr = buffer; + for( x = 0; x < FONTWIDTH; ++x ) + { + for( y = 0; y < FONTHEIGHT; ++y, ptr += 4 ) + { + ptr[ 0 ] = ptr[ 1 ] = ptr[ 2 ] = 0xFF; + ptr[ 3 ] = 0x00; + } + } + + px = py = 0; + for( i = 0; i < 256; ++i ) + { + if( ! font->width[ i ] ) + continue; + + if( px + font->width[ i ] > FONTWIDTH-1 ) + { + py += font->height; + px = 0; + } + + source = ((PW8) font) + font->location[ i ]; + + ptr = buffer + (py * FONTWIDTH + px) * 4; + for( y = 0; y < font->height; ++y, ptr += FONTWIDTH * 4 ) + { + for( x = 0; x < font->width[ i ]; ++x ) + { + if( *source++ ) + { + ptr[ x * 4 + 3 ] = 0xFF; + } + } + } + + px += 16; + + } // end for i = 0; i < 256; ++i + + + cs_snprintf( filename, sizeof( filename ), "%s/font%d.tga", LGFXDIR, fontnumber ); + + WriteTGA( filename, 32, FONTWIDTH, FONTHEIGHT, buffer, 0, 1 ); + + MM_FREE( buffer ); + +} + + +PRIVATE void DecodeText( W16 version ) +{ + char *text; + int artnum; + int endextern; + int i; + int length; + FILE *fhandle; + int limit; + + + limit = 6; + if( version & SOD_PAK ) + { + endextern = 168; + fhandle = fopen( "sod.txt", "wb" ); + if( ! fhandle ) + { + return; + } + + limit = 1; + } + else if( version & WL6_PAK ) + { + endextern = 143; + fhandle = fopen( "wl6.txt", "wb" ); + if( ! fhandle ) + { + return; + } + } + else + { + return; + } + + for( i = 0 ; i < limit ; ++i ) + { + artnum = endextern + i; + CA_CacheGrChunk( artnum, version ); + text = (char *)grsegs[ artnum ]; + + length = strlen( text ); + + fwrite( text, sizeof( W8 ), length, fhandle ); + fprintf( fhandle, "\n\n" ); + + MM_FREE( grsegs[ artnum ] ); + } + + fclose( fhandle ); +} + +/* +----------------------------------------------------------------------------- + Function: LumpExtractor() -Extract Lump gfx from Wolf3D and SOD data files. + + Parameters: fextension -[in] String holding file extension + (must be in '.XXX' format). + limit -[in] max + version -[in] extension version. + 1 -WL6 + 2 -SOD + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean LumpExtractor( const char *fextension, W32 limit, W16 version ) +{ + W32 i; + W8 *buffer, *buffer2; + + + if( ! fextension || ! *fextension ) + { + printf( "Invalid file extension passed into LumpExtractor!\n" ); + + return false; + } + +// +// Setup +// + + if( 0 == FS_Mkdir( LGFXDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "wolf_gfx.c", LGFXDIR ); + + return false; + } + + + if( ! CAL_SetupGrFile( fextension ) ) + { + CAL_Shutdown(); + + return false; + } + +// +// Allocate buffers +// + + buffer = MM_MALLOC( 320 * 416 * 2 ); + if( buffer == NULL ) + { + CAL_Shutdown(); + + return false; + } + + buffer2 = MM_MALLOC( 640 * 400 * 4 ); + if( buffer2 == NULL ) + { + MM_FREE( buffer ); + CAL_Shutdown(); + + return false; + } + +// +// Decode GFX data +// + + printf( "Decoding GFX Data...\n" ); + +// (void)DecodeText( version ); + + + for( i = STARTFONT; i < STARTPICS; ++i ) + { + CA_CacheGrChunk( i, version ); + Fontline( i, version ); + } + + + for( i = STARTPICS; i < limit+1; ++i ) + { + CA_CacheGrChunk( i, version ); + SavePic( i, version, buffer, buffer2 ); + } + + + +// +// Shutdown +// + + MM_FREE( buffer2 ); + MM_FREE( buffer ); + + CAL_Shutdown(); + + return true; +} + diff --git a/wolf3d/wolfextractor/wolf/wolf_map.c b/wolf3d/wolfextractor/wolf/wolf_map.c new file mode 100644 index 0000000..ca99c80 --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wolf_map.c @@ -0,0 +1,692 @@ +/* + + Copyright (C) 2004-2005 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wolf_map.c: Decode Wolfenstein 3-D Map data. + * + * Author: Michael Liebscher + * Date: 2004 + * + * Acknowledgement: + * This code was derived from Wolfenstein 3-D, and was originally + * written by Id Software, Inc. + * + */ + +#include +#include +#include + +#include "wolf_def.h" + +#include "../string/com_string.h" +#include "../loaders/tga.h" +#include "../filesys/file.h" +#include "../../../common/arch.h" +#include "../memory/memory.h" +#include "../../../common/common_utils.h" + + +#define MAPHEADNAME "MAPHEAD" +#define MAPNAME "GAMEMAPS" + + + +PRIVATE FILE *maphandle; + + +PRIVATE W32 headeroffsets[ 100 ]; +PRIVATE W32 TotalMaps; +PRIVATE W16 RLEWtag; + +PRIVATE W16 gameversion; + + +PRIVATE const W32 vgaCeilingWL6[] = +{ + 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xbfbf, + 0x4e4e,0x4e4e,0x4e4e,0x1d1d,0x8d8d,0x4e4e,0x1d1d,0x2d2d,0x1d1d,0x8d8d, + 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x2d2d,0xdddd,0x1d1d,0x1d1d,0x9898, + + 0x1d1d,0x9d9d,0x2d2d,0xdddd,0xdddd,0x9d9d,0x2d2d,0x4d4d,0x1d1d,0xdddd, + 0x7d7d,0x1d1d,0x2d2d,0x2d2d,0xdddd,0xd7d7,0x1d1d,0x1d1d,0x1d1d,0x2d2d, + 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xdddd,0xdddd,0x7d7d,0xdddd,0xdddd,0xdddd +}; + +PRIVATE const W32 vgaCeilingSOD[] = +{ + 0x6f6f,0x4f4f,0x1d1d,0xdede,0xdfdf,0x2e2e,0x7f7f,0x9e9e,0xaeae,0x7f7f, + 0x1d1d,0xdede,0xdfdf,0xdede,0xdfdf,0xdede,0xe1e1,0xdcdc,0x2e2e,0x1d1d,0xdcdc +}; + +PRIVATE W32 WL6_songs[] = +{ +// +// Episode One +// + GETTHEM_MUS, + SEARCHN_MUS, + POW_MUS, + SUSPENSE_MUS, + GETTHEM_MUS, + SEARCHN_MUS, + POW_MUS, + SUSPENSE_MUS, + + WARMARCH_MUS, // Boss level + CORNER_MUS, // Secret level + +// +// Episode Two +// + NAZI_OMI_MUS, + PREGNANT_MUS, + GOINGAFT_MUS, + HEADACHE_MUS, + NAZI_OMI_MUS, + PREGNANT_MUS, + HEADACHE_MUS, + GOINGAFT_MUS, + + WARMARCH_MUS, // Boss level + DUNGEON_MUS, // Secret level + +// +// Episode Three +// + INTROCW3_MUS, + NAZI_RAP_MUS, + TWELFTH_MUS, + ZEROHOUR_MUS, + INTROCW3_MUS, + NAZI_RAP_MUS, + TWELFTH_MUS, + ZEROHOUR_MUS, + + ULTIMATE_MUS, // Boss level + PACMAN_MUS, // Secret level + +// +// Episode Four +// + GETTHEM_MUS, + SEARCHN_MUS, + POW_MUS, + SUSPENSE_MUS, + GETTHEM_MUS, + SEARCHN_MUS, + POW_MUS, + SUSPENSE_MUS, + + WARMARCH_MUS, // Boss level + CORNER_MUS, // Secret level + +// +// Episode Five +// + NAZI_OMI_MUS, + PREGNANT_MUS, + GOINGAFT_MUS, + HEADACHE_MUS, + NAZI_OMI_MUS, + PREGNANT_MUS, + HEADACHE_MUS, + GOINGAFT_MUS, + + WARMARCH_MUS, // Boss level + DUNGEON_MUS, // Secret level + +// +// Episode Six +// + INTROCW3_MUS, + NAZI_RAP_MUS, + TWELFTH_MUS, + ZEROHOUR_MUS, + INTROCW3_MUS, + NAZI_RAP_MUS, + TWELFTH_MUS, + ZEROHOUR_MUS, + + ULTIMATE_MUS, // Boss level + FUNKYOU_MUS // Secret level +}; + + +PRIVATE W32 SOD_songs[] = +{ + SOD_XTIPTOE_MUS, + SOD_XFUNKIE_MUS, + SOD_XDEATH_MUS, + SOD_XGETYOU_MUS, // DON'T KNOW + SOD_ULTIMATE_MUS, // Trans Grosse + + SOD_DUNGEON_MUS, + SOD_GOINGAFT_MUS, + SOD_POW_MUS, + SOD_TWELFTH_MUS, + SOD_ULTIMATE_MUS, // Barnacle Wilhelm BOSS + + SOD_NAZI_OMI_MUS, + SOD_GETTHEM_MUS, + SOD_SUSPENSE_MUS, + SOD_SEARCHN_MUS, + SOD_ZEROHOUR_MUS, + SOD_ULTIMATE_MUS, // Super Mutant BOSS + + SOD_XPUTIT_MUS, + SOD_ULTIMATE_MUS, // Death Knight BOSS + + SOD_XJAZNAZI_MUS, // Secret level + SOD_XFUNKIE_MUS, // Secret level (DON'T KNOW) + + SOD_XEVIL_MUS // Angel of Death BOSS + +}; + + + +typedef struct +{ + float time; + char timestr[ 6 ]; + +} times; + + +PRIVATE times parTimesWL6[] = +{ + // + // Episode One Par Times + // + { 1.5, "01:30" }, + { 2, "02:00" }, + { 2, "02:00" }, + { 3.5, "03:30" }, + { 3, "03:00" }, + { 3, "03:00" }, + { 2.5, "02:30" }, + { 2.5, "02:30" }, + { 0, "??:??" }, // Boss level + { 0, "??:??" }, // Secret level + + // + // Episode Two Par Times + // + { 1.5, "01:30" }, + { 3.5, "03:30" }, + { 3, "03:00" }, + { 2, "02:00" }, + { 4, "04:00" }, + { 6, "06:00" }, + { 1, "01:00" }, + { 3, "03:00" }, + { 0, "??:??" }, + { 0, "??:??" }, + + // + // Episode Three Par Times + // + { 1.5, "01:30" }, + { 1.5, "01:30" }, + { 2.5, "02:30" }, + { 2.5, "02:30" }, + { 3.5, "03:30" }, + { 2.5, "02:30" }, + { 2, "02:00" }, + { 6, "06:00" }, + { 0, "??:??" }, + { 0, "??:??" }, + + // + // Episode Four Par Times + // + { 2, "02:00" }, + { 2, "02:00" }, + { 1.5, "01:30" }, + { 1, "01:00" }, + { 4.5, "04:30" }, + { 3.5, "03:30" }, + { 2, "02:00" }, + { 4.5, "04:30" }, + { 0, "??:??" }, + { 0, "??:??" }, + + // + // Episode Five Par Times + // + { 2.5, "02:30" }, + { 1.5, "01:30" }, + { 2.5, "02:30" }, + { 2.5, "02:30" }, + { 4, "04:00" }, + { 3, "03:00" }, + { 4.5, "04:30" }, + { 3.5, "03:30" }, + { 0, "??:??" }, + { 0, "??:??" }, + + // + // Episode Six Par Times + // + { 6.5, "06:30" }, + { 4, "04:00" }, + { 4.5, "04:30" }, + { 6, "06:00" }, + { 5, "05:00" }, + { 5.5, "05:30" }, + { 5.5, "05:30" }, + { 8.5, "08:30" }, + { 0, "??:??" }, + { 0, "??:??" } +}; + +PRIVATE times parTimesSOD[] = +{ + // + // SPEAR OF DESTINY TIMES + // + { 1.5, "01:30" }, + { 3.5, "03:30" }, + { 2.75,"02:45" }, + { 3.5, "03:30" }, + { 0, "??:??" }, // Boss 1 + { 4.5, "04:30" }, + { 3.25,"03:15" }, + { 2.75,"02:45" }, + { 4.75,"04:45" }, + { 0, "??:??" }, // Boss 2 + { 6.5, "06:30" }, + { 4.5, "04:30" }, + { 2.75,"02:45" }, + { 4.5, "04:30" }, + { 6, "06:00" }, + { 0, "??:??" }, // Boss 3 + { 6, "06:00" }, + { 0, "??:??" }, // Boss 4 + { 0, "??:??" }, // Secret level 1 + { 0, "??:??" }, // Secret level 2 + +}; + + +/* +----------------------------------------------------------------------------- + Function: CAL_SetupMapFile -Setup map files for decoding. + + Parameters: extension -[in] file extension for map data files. + + Returns: Non-zero on success, zero otherwise. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE W8 CAL_SetupMapFile( const char *extension ) +{ + FILE *handle; + SW32 length; + char fname[ 13 ]; + + +// +// load maphead.xxx (offsets and tileinfo for map file) +// + cs_strlcpy( fname, MAPHEADNAME, sizeof( fname ) ); + cs_strlcat( fname, extension, sizeof( fname ) ); + + handle = fopen( cs_strupr( fname ), "rb" ); + if( handle == NULL ) + { + handle = fopen( cs_strlwr( fname ), "rb" ); + if( handle == NULL ) + { + printf( "Could not open file (%s) for read!\n", fname ); + return 0; + } + } + + length = FS_FileLength( handle ); + + + fread( &RLEWtag, 2, 1, handle ); + + for( TotalMaps = 0 ; TotalMaps < length ; ++TotalMaps ) + { + fread( &headeroffsets[ TotalMaps ], 4, 1, handle ); + if( ! headeroffsets[ TotalMaps ] ) + { + break; + } + } + + + fclose( handle ); + + + + cs_strlcpy( fname, MAPNAME, sizeof( fname ) ); + cs_strlcat( fname, extension, sizeof( fname ) ); + + maphandle = fopen( cs_strupr( fname ), "rb"); + if( NULL == maphandle ) + { + maphandle = fopen( cs_strlwr( fname ), "rb"); + if( NULL == maphandle ) + { + return 0; + } + } + + + return 1; +} + +/* +----------------------------------------------------------------------------- + Function: CAL_ShutdownMapFile -Shutdown map file. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE void CAL_ShutdownMapFile( void ) +{ + if( maphandle ) + { + fclose( maphandle ); + } +} + + + +/* +----------------------------------------------------------------------------- + Function: CA_CacheMap -Cache and save map data. + + Parameters: + ChunkOffset -[in] Chunk offset. + Chunklength -[in] Length of chunk. + filename -[in] File name to save map as. + index -[in] File name index number. + + Returns: Non-zero on success, otherwise zero. + + Notes: +----------------------------------------------------------------------------- +*/ +PRIVATE W8 CA_CacheMap( W32 ChunkOffset, W32 Chunklength, const char *filename, W32 index ) +{ + W32 offset[ 3 ]; + W32 offsetin[ 3 ]; + W32 temp; + W16 length[ 3 ]; + W8 sig[ 5 ]; + W16 w, h; + W8 *data; + W32 ceiling; + W32 floor; + FILE *fout; + float ftime; + char *stime; + char name[ 32 ]; + char musicName[ 64 ]; + extern char gamepal[]; + SW32 jmp; + + if( gameversion == SOD_PAK ) + { + temp = (vgaCeilingSOD[ index ] & 0xff) * 3; + ceiling = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2); + + temp = 0x19 * 3; + floor = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2); + + ftime = parTimesSOD[ index ].time; + stime = parTimesSOD[ index ].timestr; + + cs_snprintf( musicName, sizeof( musicName ), "music/%s.ogg", GetMusicFileName_SOD( SOD_songs[ index ] ) ); + } + else + { + temp = (vgaCeilingWL6[ index ] & 0xff) * 3; + ceiling = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2); + + temp = 0x19 * 3; + floor = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2); + + ftime = parTimesWL6[ index ].time; + stime = parTimesWL6[ index ].timestr; + + cs_snprintf( musicName, sizeof( musicName ), "music/%s.ogg", GetMusicFileName_WL6( WL6_songs[ index ] ) ); + } + + fout = fopen( filename, "wb"); + if( NULL == fout ) + { + return 0; + } + + + + fseek( maphandle, ChunkOffset, SEEK_SET ); + + + fread( &offsetin, sizeof( W32 ), 3, maphandle ); + fread( &length, sizeof( W16 ), 3, maphandle ); + + fread( &w, sizeof( W16 ), 1, maphandle ); + fread( &h, sizeof( W16 ), 1, maphandle ); + + + + fread( name, sizeof( W8 ), 16, maphandle ); + fread( sig, sizeof( W8 ), 4, maphandle ); + +// +// Output header +// + + // Map file header signature + fwrite( sig, sizeof( W8 ), 4, fout ); + + // RLE Word tag + fwrite( &RLEWtag, sizeof( W16 ), 1, fout ); + + // Max Width + fwrite( &w, sizeof( W16 ), 1, fout ); + + // Max Height + fwrite( &h, sizeof( W16 ), 1, fout ); + + // Ceiling Colour + fwrite( &ceiling, sizeof( W32 ), 1, fout ); + + // Floor Colour + fwrite( &floor, sizeof( W32 ), 1, fout ); + + // Length of layers + temp = length[ 0 ]; + fwrite( &temp, sizeof( W16 ), 1, fout ); // Length One + temp = length[ 1 ]; + fwrite( &temp, sizeof( W16 ), 1, fout ); // Length Two + temp = length[ 2 ]; + fwrite( &temp, sizeof( W16 ), 1, fout ); // Length Three + + jmp = ftell( fout ); + + temp = 0; + fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset One + fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Two + fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Three + + + // Map name length + temp = strlen( name ); + fwrite( &temp, sizeof( W16 ), 1, fout ); + + // Music name length + temp = strlen( musicName ); + fwrite( &temp, sizeof( W16 ), 1, fout ); + + // Par time Float + fwrite( &ftime, sizeof( float ), 1, fout ); + + // Par time string + fwrite( stime, sizeof( W8 ), 5 , fout ); + + // Map name + fwrite( name, sizeof( W8 ), strlen( name ), fout ); + + // Music file name + fwrite( musicName, sizeof( W8 ), strlen( musicName ), fout ); + + + + + + data = MM_MALLOC( length[ 0 ] ); + if( data == NULL ) + { + return 0; + } + + offset[ 0 ] = ftell( fout ); + + fseek( maphandle, offsetin[ 0 ], SEEK_SET ); + fread( data, 1, length[ 0 ], maphandle ); + + fwrite( data, 1, length[ 0 ], fout ); + + + data = MM_REALLOC( data, length[ 1 ] ); + if( data == NULL ) + { + return 0; + } + + offset[ 1 ] = ftell( fout ); + + fseek( maphandle, offsetin[ 1 ], SEEK_SET ); + fread( data, 1, length[ 1 ], maphandle ); + + fwrite( data, 1, length[ 1 ], fout ); + + + + + data = MM_REALLOC( data, length[ 2 ] ); + if( data == NULL ) + { + return 0; + } + + offset[ 2 ] = ftell( fout ); + + fseek( maphandle, offsetin[ 2 ], SEEK_SET ); + fread( data, 1, length[ 2 ], maphandle ); + + fwrite( data, 1, length[ 2 ], fout ); + + MM_FREE( data ); + + + fseek( fout, jmp, SEEK_SET ); + + temp = offset[ 0 ]; + fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset One + + temp = offset[ 1 ]; + fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Two + + temp = offset[ 2 ]; + fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Three + + + fclose( fout ); + + + return 1; +} + + +/* +----------------------------------------------------------------------------- + Function: MapRipper -Re-encode map data. + + Parameters: extension -[in] file extension for map data files. + + Returns: Nothing. + + Notes: +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean MapRipper( const char *fextension, W16 version ) +{ + W32 i; + char fname[ 32 ]; + + gameversion = version; + +// +// Setup +// + + if( 0 == FS_Mkdir( MAPDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "wolf_map.c", MAPDIR ); + + return false; + } + + + if( ! CAL_SetupMapFile( fextension ) ) + { + CAL_ShutdownMapFile(); + + return false; + } + +// +// Decode Map data +// + + printf( "Decoding Map Data...\n" ); + + for( i = 0 ; i < TotalMaps ; ++i ) + { + cs_snprintf( fname, sizeof( fname ), "%s/%c%.2d.map", MAPDIR, TOLOWER( fextension[ 1 ] ), i ); + + CA_CacheMap( headeroffsets[ i ], + headeroffsets[ i + 1 ] - headeroffsets[ i ], + fname, i ); + + } + +// +// Shutdown +// + + CAL_ShutdownMapFile(); + + return true; +} diff --git a/wolf3d/wolfextractor/wolf/wolf_pal.c b/wolf3d/wolfextractor/wolf/wolf_pal.c new file mode 100644 index 0000000..d13361e --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wolf_pal.c @@ -0,0 +1,263 @@ + +char gamepal[ 768 ] = { + 0, 0, 0, + 0, 0, 42, + 0, 42, 0, + 0, 42, 42, + 42, 0, 0, + 42, 0, 42, + 42, 21, 0, + 42, 42, 42, + 21, 21, 21, + 21, 21, 63, + 21, 63, 21, + 21, 63, 63, + 63, 21, 21, + 63, 21, 63, + 63, 63, 21, + 63, 63, 63, + 59, 59, 59, + 55, 55, 55, + 52, 52, 52, + 48, 48, 48, + 45, 45, 45, + 42, 42, 42, + 38, 38, 38, + 35, 35, 35, + 31, 31, 31, + 28, 28, 28, + 25, 25, 25, + 21, 21, 21, + 18, 18, 18, + 14, 14, 14, + 11, 11, 11, + 8, 8, 8, + 63, 0, 0, + 59, 0, 0, + 56, 0, 0, + 53, 0, 0, + 50, 0, 0, + 47, 0, 0, + 44, 0, 0, + 41, 0, 0, + 38, 0, 0, + 34, 0, 0, + 31, 0, 0, + 28, 0, 0, + 25, 0, 0, + 22, 0, 0, + 19, 0, 0, + 16, 0, 0, + 63, 54, 54, + 63, 46, 46, + 63, 39, 39, + 63, 31, 31, + 63, 23, 23, + 63, 16, 16, + 63, 8, 8, + 63, 0, 0, + 63, 42, 23, + 63, 38, 16, + 63, 34, 8, + 63, 30, 0, + 57, 27, 0, + 51, 24, 0, + 45, 21, 0, + 39, 19, 0, + 63, 63, 54, + 63, 63, 46, + 63, 63, 39, + 63, 63, 31, + 63, 62, 23, + 63, 61, 16, + 63, 61, 8, + 63, 61, 0, + 57, 54, 0, + 51, 49, 0, + 45, 43, 0, + 39, 39, 0, + 33, 33, 0, + 28, 27, 0, + 22, 21, 0, + 16, 16, 0, + 52, 63, 23, + 49, 63, 16, + 45, 63, 8, + 40, 63, 0, + 36, 57, 0, + 32, 51, 0, + 29, 45, 0, + 24, 39, 0, + 54, 63, 54, + 47, 63, 46, + 39, 63, 39, + 32, 63, 31, + 24, 63, 23, + 16, 63, 16, + 8, 63, 8, + 0, 63, 0, + 0, 63, 0, + 0, 59, 0, + 0, 56, 0, + 0, 53, 0, + 1, 50, 0, + 1, 47, 0, + 1, 44, 0, + 1, 41, 0, + 1, 38, 0, + 1, 34, 0, + 1, 31, 0, + 1, 28, 0, + 1, 25, 0, + 1, 22, 0, + 1, 19, 0, + 1, 16, 0, + 54, 63, 63, + 46, 63, 63, + 39, 63, 63, + 31, 63, 62, + 23, 63, 63, + 16, 63, 63, + 8, 63, 63, + 0, 63, 63, + 0, 57, 57, + 0, 51, 51, + 0, 45, 45, + 0, 39, 39, + 0, 33, 33, + 0, 28, 28, + 0, 22, 22, + 0, 16, 16, + 23, 47, 63, + 16, 44, 63, + 8, 42, 63, + 0, 39, 63, + 0, 35, 57, + 0, 31, 51, + 0, 27, 45, + 0, 23, 39, + 54, 54, 63, + 46, 47, 63, + 39, 39, 63, + 31, 32, 63, + 23, 24, 63, + 16, 16, 63, + 8, 9, 63, + 0, 1, 63, + 0, 0, 63, + 0, 0, 59, + 0, 0, 56, + 0, 0, 53, + 0, 0, 50, + 0, 0, 47, + 0, 0, 44, + 0, 0, 41, + 0, 0, 38, + 0, 0, 34, + 0, 0, 31, + 0, 0, 28, + 0, 0, 25, + 0, 0, 22, + 0, 0, 19, + 0, 0, 16, + 10, 10, 10, + 63, 56, 13, + 63, 53, 9, + 63, 51, 6, + 63, 48, 2, + 63, 45, 0, + +// 45, 8, 63, //hmmmm +// 42, 0, 63, //hmmmm + 0, 14, 0, + 0, 10, 0, + + 38, 0, 57, + 32, 0, 51, + 29, 0, 45, + 24, 0, 39, + 20, 0, 33, + 17, 0, 28, + 13, 0, 22, + 10, 0, 16, + 63, 54, 63, + 63, 46, 63, + 63, 39, 63, + 63, 31, 63, + 63, 23, 63, + 63, 16, 63, + 63, 8, 63, + 63, 0, 63, + 56, 0, 57, + 50, 0, 51, + 45, 0, 45, + 39, 0, 39, + 33, 0, 33, + 27, 0, 28, + 22, 0, 22, + 16, 0, 16, + 63, 58, 55, + 63, 56, 52, + 63, 54, 49, + 63, 53, 47, + 63, 51, 44, + 63, 49, 41, + 63, 47, 39, + 63, 46, 36, + 63, 44, 32, + 63, 41, 28, + 63, 39, 24, + 60, 37, 23, + 58, 35, 22, + 55, 34, 21, + 52, 32, 20, + 50, 31, 19, + 47, 30, 18, + 45, 28, 17, + 42, 26, 16, + 40, 25, 15, + 39, 24, 14, + 36, 23, 13, + 34, 22, 12, + 32, 20, 11, + 29, 19, 10, + 27, 18, 9, + 23, 16, 8, + 21, 15, 7, + 18, 14, 6, + 16, 12, 6, + 14, 11, 5, + 10, 8, 3, + 24, 0, 25, + 0, 25, 25, + 0, 24, 24, + 0, 0, 7, + 0, 0, 11, + 12, 9, 4, + 18, 0, 18, + 20, 0, 20, + 0, 0, 13, + 7, 7, 7, + 19, 19, 19, + 23, 23, 23, + 16, 16, 16, + 12, 12, 12, + 13, 13, 13, + 54, 61, 61, + 46, 58, 58, + 39, 55, 55, + 29, 50, 50, + 18, 48, 48, + 8, 45, 45, + 8, 44, 44, + 0, 41, 41, + 0, 38, 38, + 0, 35, 35, + 0, 33, 33, + 0, 31, 31, + 0, 30, 30, + 0, 29, 29, + 0, 28, 28, + 0, 27, 27, + 38, 0, 34 +}; diff --git a/wolf3d/wolfextractor/wolf/wolf_pm.c b/wolf3d/wolfextractor/wolf/wolf_pm.c new file mode 100644 index 0000000..5a8d356 --- /dev/null +++ b/wolf3d/wolfextractor/wolf/wolf_pm.c @@ -0,0 +1,943 @@ +/* + + Copyright (C) 2004-2005 Michael Liebscher + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +/* + * wolf_pm.c: Decode Wolfenstein3-D Page data. + * + * Author: Michael Liebscher + * + * Acknowledgement: + * This code was derived from Wolfenstein 3-D, and was originally + * written by Id Software, Inc. + * + */ + +#include +#include +#include + +#include "wolf_def.h" + +#include "../../../common/arch.h" +#include "../../../common/common_utils.h" +#include "../loaders/tga.h" +#include "../hq2x.h" +#include "../loaders/wav.h" +#include "../filesys/file.h" +#include "../string/com_string.h" +#include "../memory/memory.h" + + +extern char gamepal[]; + +#define PAGEFNAME "VSWAP" + + + + + +#define SAMPLERATE 7000 // In Hz + + +typedef struct +{ + W32 offset; // Offset of chunk into file + W16 length; // Length of the chunk + +} PageList_t; + +typedef struct +{ + W16 leftpix, rightpix; + W16 dataofs[ 64 ]; + // table data after dataofs[ rightpix - leftpix + 1 ] + +} t_compshape; + + +PRIVATE PageList_t *PMPages; + +PRIVATE FILE *PageFile = NULL; + +PRIVATE W16 PMNumBlocks; +PRIVATE W16 PMSpriteStart, PMSoundStart; + + + +/* +----------------------------------------------------------------------------- + Function: CAL_GetGrChunkLength() -Opens the page file and sets up + the page info. + + Parameters: extension -[in] Pointer to a null-terminated string that + specifies the file extension. + (must be in '.XXX' format) + + Returns: 1 on success, otherwise 0. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE W8 PML_OpenPageFile( const char *extension ) +{ + W32 i; + W32 size; + void *buf; + char filename[ 16 ]; + W32 *offsetptr; + W16 *lengthptr; + PageList_t *page; + + if( ! extension || ! *extension ) + { + printf( "Invalid file extension passed to PML_OpenPageFile()\n" ); + return 0; + } + + cs_strlcpy( filename, PAGEFNAME, sizeof( filename ) ); + cs_strlcat( filename, extension, sizeof( filename ) ); + + PageFile = fopen( cs_strupr( filename ), "rb" ); + if( PageFile == NULL ) + { + PageFile = fopen( cs_strlwr( filename ), "rb" ); + if( PageFile == NULL ) + { + printf( "Could not open file (%s) for read!\n", filename ); + return 0; + } + } + + // Read in header variables + fread( &PMNumBlocks, sizeof( PMNumBlocks ), 1, PageFile ); + fread( &PMSpriteStart, sizeof( PMSpriteStart ), 1, PageFile ); + fread( &PMSoundStart, sizeof( PMSoundStart ), 1, PageFile ); + + + // Allocate and clear the page list + PMPages = (PageList_t *) MM_MALLOC( sizeof( PageList_t ) * PMNumBlocks ); + if( PMPages == NULL ) + { + return 0; + } + + memset( PMPages, 0, sizeof( PageList_t ) * PMNumBlocks ); + + // Read in the chunk offsets + size = sizeof( W32 ) * PMNumBlocks; + + buf = MM_MALLOC( size ); + if( buf == NULL ) + { + return 0; + } + + if( fread( buf, 1, size, PageFile ) == 0 ) + { + printf( "PML_OpenPageFile: Length read failed\n" ); + } + offsetptr = (PW32) buf; + for( i = 0, page = PMPages; i < PMNumBlocks; i++, page++ ) + { + page->offset = *offsetptr++; + } + MM_FREE( buf ); + + // Read in the chunk lengths + size = sizeof( W16 ) * PMNumBlocks; + + buf = MM_MALLOC( size ); + if( buf == NULL ) + { + return 0; + } + + if( fread( buf, 1, size, PageFile ) == 0 ) + { + printf( "PML_OpenPageFile: Length read failed\n" ); + } + + lengthptr = (PW16)buf; + for( i = 0, page = PMPages; i < PMNumBlocks; ++i, page++ ) + { + page->length = *lengthptr++; + } + + MM_FREE( buf ); + + return 1; +} + +/* +----------------------------------------------------------------------------- + Function: PML_ReadFromFile() -Reads in data from Page file. + + Parameters: buf -[out] Storage location for data. + offset -[in] Number of bytes from beginning of file. + length -[in] Maximum number of items to be read. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE void PML_ReadFromFile( W8 *buf, SW32 offset, W16 length ) +{ + if( ! buf ) + { + printf( "[PML_ReadFromFile]: NULL pointer\n" ); + return; + } + + if( ! offset ) + { + printf( "[PML_ReadFromFile]: Zero offset\n" ); + return; + } + + if( fseek( PageFile, offset, SEEK_SET ) ) + { + printf( "[PML_ReadFromFile]: Seek failed\n" ); + return; + } + + if( ! fread( buf, 1, length, PageFile ) ) + { + printf( "[PML_ReadFromFile]: Read failed\n" ); + return; + } +} + +/* +----------------------------------------------------------------------------- + Function: PML_LoadPage() -Reads in data from Page file. + + Parameters: buf -[out] Storage location for data. + offset -[in] Number of bytes from beginning of file. + clength -[in] Maximum number of items to be read. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE void *PML_LoadPage( W32 pagenum, W16 *clength ) +{ + W8 *addr; + PageList_t *page; + + page = &PMPages[ pagenum ]; + if( page->length == 0 ) + { + return NULL; + } + + *clength = page->length; + + addr = MM_MALLOC( page->length ); + if( addr == NULL ) + { + return NULL; + } + + PML_ReadFromFile( addr, page->offset, page->length ); + + return addr; +} + +void OutlineImage( W8 *rgba, int width, int height ) { + W8 *data_p; + W8 *copy_p; + W8 *copy = (W8 *)_alloca( width * height * 4 ); + int x, y; + + memcpy( copy, rgba, width * height * 4 ); + data_p = rgba; + copy_p = copy; + + for ( y = 0 ; y < height ; y++ ) { + for ( x = 0 ; x < width ; x++, data_p+=4, copy_p+=4 ) { + if ( data_p[3] != 0 ) { + continue; + } + if ( x < width-1 && copy_p[7] != 0 ) { + *(int *)data_p = ((int *)copy_p)[1]; + } else if ( x > 0 && copy_p[-1] != 0 ) { + *(int *)data_p = ((int *)copy_p)[-1]; + } else if ( y < height-1 && copy_p[width*4+3] != 0 ) { + *(int *)data_p = ((int *)copy_p)[width]; + } else if ( y > 0 && copy_p[-width*4+3] != 0 ) { + *(int *)data_p = ((int *)copy_p)[-width]; + } + data_p[3] = 1; + } + } +} + +typedef struct { + int hasAlpha; + int srcWidth; + int srcHeight; + int uploadWidth; + int uploadHeight; + + // track the outlines of up to two boxes of non-transparent pixels. + // The reason for two boxes is that the common lights have something + // at the top and something at the bottom, with nothing inbetween. + // These are inclusive bounds of the rows / columns with non-0 alpha + int numBounds; + int bounds[2][2][2]; +} picHeader_t; + +int RowClear( W8 *rgba, int w, int h, int y ) { + int x; + for ( x = 0 ; x < w ; x++ ) { + if ( rgba[(y*w+x)*4+3] != 0 ) { + return 0; + } + } + return 1; +} + +void Write5551( const char *tgaName, int w, int h, W8 *rgba, int hasAlpha ) { + unsigned short *s = _alloca( w*h*4 ); + FILE *f; + picHeader_t *header = (picHeader_t *)s; + unsigned short *s_p; + int i; + int shorts; + W8 *tempMip; + W8 *rgba_p; + int b, x, y, c; + char newName[1024]; + char *ext; + + memset( header, 0, sizeof( *header ) ); + header->hasAlpha = hasAlpha; + header->srcWidth = w; + header->srcHeight = h; + header->uploadWidth = w; + header->uploadHeight = h; + + if ( !hasAlpha ) { + // convert from 24 bit to 32 bit + W8 *newPic = _alloca( w * h * 4 ); + for ( i = 0 ; i < w*h ; i++ ) { + newPic[i*4+0] = rgba[i*3+0]; + newPic[i*4+1] = rgba[i*3+1]; + newPic[i*4+2] = rgba[i*3+2]; + newPic[i*4+3] = 255; + } + rgba = newPic; + } + + // find the bounding boxes for more efficient drawing + header->numBounds = 1; + for ( y = 0 ; y < h ; y++ ) { + if ( !RowClear( rgba, w, h, y ) ) { + // this row is needed + header->bounds[0][0][1] = y; + break; + } + } + for ( y = h-1 ; y >= 0 ; y-- ) { + if ( !RowClear( rgba, w, h, y ) ) { + // this row is needed + header->bounds[0][1][1] = y; + break; + } + } + + // if the middle row is clear, make two boxes + // We could make a better test, but this catches the ones we care about... + if ( header->bounds[0][0][1] < h/2 && header->bounds[0][1][1] > h / 2 && RowClear( rgba, w, h, h/2 ) ) { + header->numBounds = 2; + header->bounds[1][1][1] = header->bounds[0][1][1]; + + for ( y = h/2-1 ; y >= 0 ; y-- ) { + if ( !RowClear( rgba, w, h, y ) ) { + header->bounds[0][1][1] = y; + break; + } + } + for ( y = h/2+1 ; y < h ; y++ ) { + if ( !RowClear( rgba, w, h, y ) ) { + header->bounds[1][0][1] = y; + break; + } + } + } + + for ( b = 0 ; b < header->numBounds ; b++ ) { + for ( x = 0 ; x < w ; x++ ) { + for ( y = header->bounds[b][0][1] ; y <= header->bounds[b][1][1] ; y++ ) { + if ( rgba[(y*w+x)*4+3] != 0 ) { + // this column is needed + header->bounds[b][0][0] = x; + break; + } + } + if ( y <= header->bounds[b][1][1] ) { + break; + } + } + for ( x = w-1 ; x >= 0 ; x-- ) { + for ( y = header->bounds[b][0][1] ; y <= header->bounds[b][1][1] ; y++ ) { + if ( rgba[(y*w+x)*4+3] != 0 ) { + // this column is needed + header->bounds[b][1][0] = x; + break; + } + } + if ( y <= header->bounds[b][1][1] ) { + break; + } + } + } + + s_p = (unsigned short *)(header+1); + + while ( 1 ) { + rgba_p = rgba; + + // convert to 5551 + for ( i = 0 ; i < w*h ; i++, rgba_p+=4 ) { + int r = rgba_p[0]; + int g = rgba_p[1]; + int b = rgba_p[2]; + int a = rgba_p[3]; + + *s_p++ = ((r>>3)<<11) | ((g>>3)<<6) | ((b>>3)<<1) | (a>>7); + } + + if ( w == 1 && h == 1 ) { + break; + } + // mip map + w >>= 1; + if ( w == 0 ) { + w = 1; + } + h >>= 1; + if ( h == 0 ) { + h = 1; + } + tempMip = _alloca( w * h * 4 ); + for ( y = 0 ; y < h ; y++ ) { + for ( x = 0 ; x < w ; x++ ) { + for ( c = 0 ; c < 4 ; c++ ) { + tempMip[(y*w+x)*4+c] = ( + rgba[((y*2+0)*w*2+(x*2+0))*4+c] + + rgba[((y*2+0)*w*2+(x*2+1))*4+c] + + rgba[((y*2+1)*w*2+(x*2+0))*4+c] + + rgba[((y*2+1)*w*2+(x*2+1))*4+c] ) >> 2; + } + } + } + rgba = tempMip; + } + shorts = s_p - s; + + // byte swap +#if 0 + for ( i = 0 ; i < shorts ; i++ ) { + int temp = ((W8 *)s)[i*2+0]; + ((W8 *)s)[i*2+0] = ((W8 *)s)[i*2+1]; + ((W8 *)s)[i*2+1] = temp; + } +#endif + + // write + strcpy( newName, tgaName ); + ext = strstr( newName, ".tga" ); + strcpy( ext, ".5551" ); + f = fopen( newName, "wb" ); + if( f == NULL ) { + printf( "Could not open file (%s) for write!\n", newName ); + return; + } + fwrite( s, 2, shorts, f ); + fclose( f ); +} + +#include +void UpdateSingleSprite( const char *srcTGA, const char *destTGA ) { + W8 *rgba; + int width, height; + int i; + + // HACK HACK HACK just to convert the single health pack sprite without the + // trademarked "red cross" + + LoadTGA( srcTGA, &rgba, &width, &height ); + assert( rgba ); + assert( width == 64 && height == 64 ); + + // JDC: outline the image to avoid dark halos with filtering + for ( i = 0 ; i < 8 ; i++ ) { + OutlineImage( rgba, 64, 64 ); + } + for ( i = 0 ; i < 64*64 ; i++ ) { + if ( rgba[i*4+3] == 1 ) { + rgba[i*4+3] = 0; + } + } + WriteTGA( destTGA, 32, 64, 64, rgba, 0, 1 ); + Write5551( destTGA, 64, 64, rgba, 1 ); +} + +/* +----------------------------------------------------------------------------- + Function: PML_LoadPage() -Save image data from page file. + + Parameters: nPage -[in] Page number to save. + filename -[in] Pointer to string with filename. + buffer -[in] Allocated memory buffer to hold image data. + buffer2 -[in] Allocated memory buffer to hold hq2x data. + + Returns: Non-zero on success, otherwise zero. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE W8 PML_SaveGFXPage( W32 nPage, const char *filename, + W8 *buffer, W8 *buffer2, _boolean iswall, W32 GunFlash ) +{ + W16 x, y; + W8 *data; + W8 *ptr; + W16 temp; + W8 r,g,b; + W16 clength; // Chunk length + + data = (PW8)PML_LoadPage( nPage, &clength ); + if( data == NULL ) + { + return 0; + } + + if( nPage < PMSpriteStart ) + { + // simple 64x64 image + W8 *rgb = (W8 *)_alloca( 64*64*3 ); + for( x = 0; x < 64; ++x ) + { + for( y = 0; y < 64; ++y ) + { + temp = ( data[ (x<<6)+y ] ) * 3; + + // gamepal is in 6 bit color + r = gamepal[ temp ]; + g = gamepal[ temp+1 ]; + b = gamepal[ temp+2 ]; + + ptr = rgb + ( ( (y << 6) + x ) * 3 ); + ptr[ 0 ] = ( r << 2 ) | ( r >> 4 ); + ptr[ 1 ] = ( g << 2 ) | ( g >> 4 ); + ptr[ 2 ] = ( b << 2 ) | ( b >> 4 ); + } + } + WriteTGA( filename, 24, 64, 64, rgb, 0, 1 ); + Write5551( filename, 64, 64, rgb, 0 ); + } + else if( nPage >= PMSpriteStart && nPage < PMSoundStart ) + { + W16 *cmdptr; + short *linecmds; + t_compshape *shape; + int x, y; + W8 *rgba = (W8 *)_alloca( 64*64*4 ); + int i; + + // all transparent at the beginning + memset( rgba, 0, 64*64*4 ); + + // draw the spans into the buffer + shape = (t_compshape *)data; + cmdptr = shape->dataofs; + for( x = shape->leftpix; x <= shape->rightpix; ++x ) + { + linecmds = (short *)( data + *cmdptr++ ); + for( ; *linecmds; linecmds += 3 ) + { + i = linecmds[ 2 ] / 2 + linecmds[ 1 ]; + for( y = linecmds[ 2 ] / 2; y < linecmds[ 0 ] / 2; ++y, ++i ) + { + temp = ( data[ i ] ) * 3; + + r = gamepal[ temp ]; + g = gamepal[ temp+1 ]; + b = gamepal[ temp+2 ]; + + ptr = rgba + ( (y * 64 + x) * 4 ); + ptr[ 0 ] = ( r << 2 ) | ( r >> 4 ); + ptr[ 1 ] = ( g << 2 ) | ( g >> 4 ); + ptr[ 2 ] = ( b << 2 ) | ( b >> 4 ); + ptr[ 3 ] = 255; + } + } + } + + // JDC: outline the image to avoid dark halos with filtering + for ( i = 0 ; i < 8 ; i++ ) { + OutlineImage( rgba, 64, 64 ); + } + for ( i = 0 ; i < 64*64 ; i++ ) { + if ( rgba[i*4+3] == 1 ) { + rgba[i*4+3] = 0; + } + } + WriteTGA( filename, 32, 64, 64, rgba, 0, 1 ); + Write5551( filename, 64, 64, rgba, 1 ); + } + else + { + MM_FREE( data ); + printf( "Out of bounds page number passed into PML_SavePage()!\n" ); + return 0; + } + + + MM_FREE( data ); + + return 1; +} + +/* +----------------------------------------------------------------------------- + Function: PML_SaveSoundPage() -Save sound data from Page file. + + Parameters: nPage -[in] Page number to save. + filename -[in] Pointer to string with filename. + buffer -[in] Allocated memory buffer to hold sound data. + size -[in] Size of allocated memory buffer. + + Returns: Non-zero on success, otherwise zero. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE W8 PML_SaveSoundPage( W32 nPage, char *filename, + W8 *buffer, + W32 size ) +{ + static W16 totallength = 0; + W8 *data; + W16 clength; // Chunk length + + if( nPage < PMSoundStart || nPage > PMNumBlocks ) + { + printf( "Out of bounds page number passed into PML_SaveSound()!\n" ); + return 1; + } + + data = (PW8) PML_LoadPage( nPage, &clength ); + if( data == NULL ) + { + return 1; + } + + if( totallength > size ) + { + printf( "[wolf_pmc] Buffer not large enough!\n" ); + return 2; + } + + memcpy( buffer + totallength, data, clength ); + + totallength += clength; + if( clength < 4096 ) + { + write_wav( filename, buffer, totallength, 1, SAMPLERATE, 1 ); + totallength = 0; + } + + MM_FREE( data ); + + return 0; +} + +/* +----------------------------------------------------------------------------- + Function: PML_Shutdown() -Shutdown page cache. + + Parameters: Nothing. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PRIVATE void PML_Shutdown() +{ + if( PageFile ) + { + fclose( PageFile ); + PageFile = NULL; + } + + if( PMPages ) + { + MM_FREE( PMPages ); + } +} + + +/* +----------------------------------------------------------------------------- + Function: PExtractor() -Interface to page manager. + + Parameters: extension -[in] Ponter to string with file extenion of data + files. + + Returns: Nothing. + + Notes: + +----------------------------------------------------------------------------- +*/ +PUBLIC _boolean PExtractor( const char *extension, W16 version ) +{ + W32 i, j; + char filename[ 256 ]; + W8 *buffer, *buffer2; + W32 Flash; + + +// +// Setup +// + + if( 0 == FS_Mkdir( GFXWALLDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "PExtractor", GFXWALLDIR ); + + return false; + } + + if( version == SOD_PAK || version == SDM_PAK ) + { + if( 0 == FS_Mkdir( SODGFXSPRITEDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "PExtractor", GFXSPRITEDIR ); + + return false; + } + + if( 0 == FS_Mkdir( SODSFXDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "PExtractor", SODSFXDIR ); + + return false; + } + } + else + { + if( 0 == FS_Mkdir( GFXSPRITEDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "PExtractor", GFXSPRITEDIR ); + + return false; + } + + if( 0 == FS_Mkdir( SFXDIR ) ) + { + printf( "[%s] Could not create directory (%s)!\n", "PExtractor", SFXDIR ); + + return false; + } + } + + + if( ! PML_OpenPageFile( extension ) ) + { + PML_Shutdown(); + + return false; + } + +// +// Allocate buffers +// + + buffer = MM_MALLOC( 64 * 64 * 2 ); + if( buffer == NULL ) + { + PML_Shutdown(); + + return false; + } + + buffer2 = MM_MALLOC( 128 * 128 * 4 ); + if( buffer2 == NULL ) + { + MM_FREE( buffer ); + PML_Shutdown(); + + return false; + } + +// +// Decode Page data +// + + printf( "Decoding Page Data...\n" ); + + for( i = 0, j = 0; i < PMSpriteStart; ++i, ++j ) + { + // Hacks + if( version == WL6_PAK || version == WL1_PAK ) + { + if( 98 == j ) + { + j = 126; + } + } + + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.tga", GFXWALLDIR, j ); + + PML_SaveGFXPage( i, filename, buffer, buffer2, 1, 0 ); + } + + for( i = PMSpriteStart, j = 0; i < PMSoundStart; ++i, ++j ) + { + // Hacks + if( version == WL1_PAK ) + { + if( j == 50 ) + { + j = 54; + } + + if( j == 191 ) + { + j = 300; + i += 109; + } + + if( j == 311 ) + { + j = 431; + i += 101; + } + + if( j == 439 ) + { + j = 514; + } + } + + if( version == WL6_PAK ) + { + if( j == 50 ) + { + j = 54; + } + + if( j == 389 ) + { + j = 408; + } + + if( j == 439 ) + { + j = 514; + } + } + + if( version == SDM_PAK ) + { + if( j == 401 ) + { + j = 514; + } + } + + if( version == SOD_PAK ) + { + if( j == 292 ) + { + j = 374; + } + + if( j == 408 ) + { + j = 439; + } + } + + if( version == SOD_PAK || version == SDM_PAK ) + { + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.tga", SODGFXSPRITEDIR, j ); + } + else + { + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.tga", GFXSPRITEDIR, j ); + } + + + if( j == 531 || + j == 532 || + j == 526 || + j == 521 ) + { + Flash = j; + } + else + { + Flash = 0; + } + + + PML_SaveGFXPage( i, filename, buffer, buffer2, 0, Flash ); + } + + for( i = PMSoundStart, j = 0; i < PMNumBlocks-1; ++i, ++j ) + { + if( version == SOD_PAK || version == SDM_PAK ) + { + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", SODSFXDIR, j ); + } + else + { + cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", SFXDIR, j ); + } + + PML_SaveSoundPage( i, filename, buffer2, 128 * 128 * 4 ); + } + +// +// Shutdown +// + + MM_FREE( buffer ); + MM_FREE( buffer2 ); + + PML_Shutdown(); + + return true; +} + diff --git a/wolf3d/wolfextractor/wolfextractor.dsp b/wolf3d/wolfextractor/wolfextractor.dsp new file mode 100644 index 0000000..bef75d3 --- /dev/null +++ b/wolf3d/wolfextractor/wolfextractor.dsp @@ -0,0 +1,257 @@ +# Microsoft Developer Studio Project File - Name="wolfextractor" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=wolfextractor - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "wolfextractor.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "wolfextractor.mak" CFG="wolfextractor - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "wolfextractor - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "wolfextractor - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "wolfextractor - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D vsnprintf=_vsnprintf /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib vorbisenc_static.lib vorbis_static.lib ogg_static.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"libcmt.lib" + +!ELSEIF "$(CFG)" == "wolfextractor - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D vsnprintf=_vsnprintf /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib vorbisenc_static.lib vorbis_static.lib ogg_static.lib /nologo /subsystem:console /profile /debug /machine:I386 /nodefaultlib:"libcmt.lib" + +!ENDIF + +# Begin Target + +# Name "wolfextractor - Win32 Release" +# Name "wolfextractor - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\zlib\adler32.c +# End Source File +# Begin Source File + +SOURCE=.\adlib\adlib.c +# End Source File +# Begin Source File + +SOURCE=..\..\common\arch.c +# End Source File +# Begin Source File + +SOURCE=.\string\com_string.c +# End Source File +# Begin Source File + +SOURCE=..\..\zlib\compress.c +# End Source File +# Begin Source File + +SOURCE=..\..\zlib\crc32.c +# End Source File +# Begin Source File + +SOURCE=..\..\zlib\deflate.c +# End Source File +# Begin Source File + +SOURCE=.\filesys\file.c +# End Source File +# Begin Source File + +SOURCE=.\adlib\fmopl.c +# End Source File +# Begin Source File + +SOURCE=.\hq2x.c +# End Source File +# Begin Source File + +SOURCE=.\mac\mac.c +# End Source File +# Begin Source File + +SOURCE=.\main.c +# End Source File +# Begin Source File + +SOURCE=.\memory\memory.c +# End Source File +# Begin Source File + +SOURCE=.\pak.c +# End Source File +# Begin Source File + +SOURCE=.\loaders\tga.c +# End Source File +# Begin Source File + +SOURCE=..\..\zlib\trees.c +# End Source File +# Begin Source File + +SOURCE=.\vorbisenc_inter.c +# End Source File +# Begin Source File + +SOURCE=.\loaders\wav.c +# End Source File +# Begin Source File + +SOURCE=.\filesys\win32\win_file.c +# End Source File +# Begin Source File + +SOURCE=.\wolf\wl6_name.c +# End Source File +# Begin Source File + +SOURCE=.\wolf\wolf_aud.c +# End Source File +# Begin Source File + +SOURCE=.\wolf\wolf_gfx.c +# End Source File +# Begin Source File + +SOURCE=.\wolf\wolf_map.c +# End Source File +# Begin Source File + +SOURCE=.\wolf\wolf_pal.c +# End Source File +# Begin Source File + +SOURCE=.\wolf\wolf_pm.c +# End Source File +# Begin Source File + +SOURCE=.\zip\zipfile.c +# End Source File +# Begin Source File + +SOURCE=..\..\zlib\zutil.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\adlib\adlib.h +# End Source File +# Begin Source File + +SOURCE=..\..\common\arch.h +# End Source File +# Begin Source File + +SOURCE=.\string\com_string.h +# End Source File +# Begin Source File + +SOURCE=..\..\common\common_utils.h +# End Source File +# Begin Source File + +SOURCE=.\filesys\file.h +# End Source File +# Begin Source File + +SOURCE=.\adlib\fmopl.h +# End Source File +# Begin Source File + +SOURCE=.\hq2x.h +# End Source File +# Begin Source File + +SOURCE=.\mac\mac.h +# End Source File +# Begin Source File + +SOURCE=.\memory\memory.h +# End Source File +# Begin Source File + +SOURCE=.\loaders\tga.h +# End Source File +# Begin Source File + +SOURCE=.\loaders\wav.h +# End Source File +# Begin Source File + +SOURCE=.\wolf\wolf_def.h +# End Source File +# Begin Source File + +SOURCE=.\zip\zip.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/wolf3d/wolfextractor/wolfextractor.dsw b/wolf3d/wolfextractor/wolfextractor.dsw new file mode 100644 index 0000000..71f4c57 --- /dev/null +++ b/wolf3d/wolfextractor/wolfextractor.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "wolfextractor"=.\wolfextractor.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/wolf3d/wolfextractor/wolfextractor.ncb b/wolf3d/wolfextractor/wolfextractor.ncb new file mode 100644 index 0000000000000000000000000000000000000000..1d935113ad6401f050d594c59715abc4891fa335 GIT binary patch literal 12774400 zcmeF)2bdJa+A!>4mz;CXIY%WUIVm}dAS}xQ3oN_rE;%R3K|nx6KtV(#iHZRf1VJz$ zq9R}*D}o{*l7;^sID!Au_ng-we&M=a*4t;Mrn{=Tx~gZU(=?3?kByFt?h&82Zkf6z zO5|KBev<#Ud&vLP{=eS>H*bx*bt^dekz2=qx>Yl9^WXOF{|)``U)JHj zzij_A<$u@$|8f)ie|r7@-&B5@|FD7o(%Jsy==on?Ob{3z2m}-J1ahVgY`qoysUgL7*ZZPMS5gV(&cCPS&!ht}Ueqm7&aYA^vGVx)tJtN{H z`}K&v^E@iL`+&X?|LgPc=%}c$e%<><_WS#Mk&*r4;=4!m_**t%0|o~(jS7polTG)? z*og4>=-45H!s5ew-JNxr@T#2#MfdGdp?jzB=7efJE%SDFECNO!su{&i*V zUaH@Wq<>dVT)bxQY5Ne><<7%(zV_;0e(-PC?7v&`sIc%({O2?N;noV)==NusF26e*|6PUq zMtdiZjq4QOGwiqB@88WF6&Bg=k1y)&mi@!a`Tu_h`c1$1cU6rE>+{EJIy5q-6Mwv6 z?rzn8S=HMc@A%k=i2u$;{?2rNxa9^$$99X1i|7~L#V4AG*gxJ3e_xtGVFUm8%zxif z4vOqop?oL*@A9X&nK8ERJ)&cy;=1?w$LDPscaI+QJD+U+gAGQ+;P9CE->&pOkkfxv z!$0|k`Cnw)@6T2C?_XKMDq zWcT0Qn*PZy5EIucCM>+qefPY=G0`!>jPHHEcPd=|ugbXcJ`<_f26t9upD!=k~e% z-iATGanXOlr$_mQ#}4^xzDoVsqYwX8JA{YD-urFYpx`&Fd%x`s4vp@A$-pp>@BIcs zcZiG*kH7bCY{C8;75-POHyOt`Sa{Dj?J==&z3%;o-RQm%R|2s#){^X~!;L%tg{O|cXvr8|mZ)DGV-+6-@^MUvNLs?Y#;CtQ% zkx{?%?d0DbhzP#kX;9yaU4m!L{PErCcV?GIm#_id|M={8@5=wp9-RMP)q`dC?C~EQ z8~bO~oh*gbN}r~(C;6*xVznMAJ7?k`zZV0s(9x- ztACsy70e>I>LZE;72`|9VnZ@JuRa7u`9qQ>t9) z@}==0lN|8M3Do}2YM?#d%K(evX>ue76%MMP|-_PJ{ zls6COi2rI8Z^Q z#OY?5BTjR|T}|<2>7~VWnF4{1VjKAu6la;gzZm@I5}ZKA&_E!wxHo$s5Gf`yeFrg% za=VK+@&y7T#gg)WTpVJ$UgATE0)af@!=`^&TyDA%;+z73z&Np-lP(*I$&@Q8uq=Hb z&{7PTFSn3Tp^u1h8p5IlvS89ctV-n!rmI&lZF8YOV5V3UO&+LheU=n|G-C;|OwK?cO6*uT z5ST4a^1Po|NIvz%ecEBX*e)aDI{rAVk{Oh(8cn05pSqZ@N%ta?Ko9jpfd~-^P2xYv7Y64K%C}zMKQVQCW{@EUrc<} za_NeJXFM-1KCOLJG0<3g4)F{B>nn~H`-nfuf3R3hXL(RuoHq~{DlQ5Q1g!eNm)g6o zI9SYz&UKg^w-KUa^w`9^*EP|#AjFjIru_jhQV1nhYBObFHjm0YJS4F&Jx>@2G z<7I$YRQ*g6IA>f0^Qs{|PW-F>&6ROI9dvbxyGm%0H890`sn$??HMRVu@&t~pNpX8S zv{(8OE9|U=-)6zD=(Ii7>jPztD{a%x!l&#K2<+EC%6dM-bjz)vjk5n%TW=8Ky|!Fu zD`;8I$?q!$YorDGVsM&^mc5nf$`?mxyHB1CtnZbkPb$wnULTz|5O}tja;)FV>D9;d zhpf0-rkQJ+ot}@DS3m7MPd$^0rwdtcUcYJn^y;ujzFj@;$)~G%z7b^~=(IaQ;7FQ~!1Defx1XQ55E7Un?^T0sAIk&+TQlpA+G4M?MRl}+ zGEOVMnUx(P-_6QewJi`j`o0-LpE{(cDpD>uqd9hSx<2rMp^ zAka-GJw3~E7?d~U+e5wb7NpIcI?S`ohb-q>^=M@oihJBwp54_orF_b&|61h>x3`b` zqzBj0LW60j^wip_rTkjanl`kh9qsAB!>rQY!EO6$*07d!tmh>*@G`IPDjRu?*Lj0C z*+lStN3pl-lSovZ+v6`d<}6CUBHrE}YL46Q109v!U40|yK~H)SNpJelmnixXO$_~s zC60IoFpxnEW(Y$W#&AY3l2MFi3}YF`cqZ@|6Pd(hrZAOhOlJl&nZ@JGW)5?Cf_cnm z0Z+1!r&z?(EM^Hyd4^|M#&Vux1<$jR7g)uMtY!^s3BDh#=Os4qGOzF|8+nb_d4o6E z#Ae>&ZMLwLci6^u-em_nd5>M}=6yckLq1{;AG4QF*vF@Q#^>zk3l4CQLww0se9bo; z<_JeQ#&J$?l5hErQ+&^9&hP_2a+aSs$9XRBGZ*=VOI+p(SGmS@ZtyENxkd1eCIKOY zl91r%x5OkNDalAq3R04a)TALT=}1ooGLnhRWFafr$W9J&l8fBrAusvJPXP*2h{6=1 zD8(pF2})9m(v+brC9jzvv{1@%waB1Fpv2x z;7Jzp6pMJ8#Vlbd&+shESk7~-;CWW^0;_nD)vRGH>sZfAY~W>H;Z-*B8n5#PZ?cKa zyv5sWVJq*jjqSY44tDY$yV%Y9e87i%#2!9oFQ2fFPx*|`+0Pdo;2?+ilCSuhZ#c{m zj&h9SoZuwi@*Su6p3|J+2Y%!%KXH!pT;OLe@(Y)^%oVP3jqBXtS8j5P;1{<9gb+&b zJ5?eQlZ2!sBRMHZNh(s4hP0$3JsHSICNh(StYjlQImk&aa+8O=9AJDpQ53RHHgIcz~MJqBeD?OFin-fQB@pF%R+(O=wCp zn$v=ow4ya_XiGcV(}9QS$Rl(j`2F!wy3my{x)DxyBIrR+dJ#!)`p}ms`VmbG{fQ-x zcm^<#K@4UHLm9?!Mlh05jAjgD8OL}g@E8-B#AK#0m1#_81~Zw(E{Z z-ewD1d53Lm=UsNNllR!gZrKt?i=nJi=_8`;T0PI8f(Jme)G`6)m_3Q?FM6r~u& zDM3j}QJON8r5xp{zg4JWNL(p%a~Xl;D1lu7uHzaJmyg4|>vzNP5$UzC_WFXkzG3EOEp$ zfPoBRFhdy1ForXNk&I$AV;IXg#xsG(n8+k1Gli*4V>&aK$t)gcHglNE6U<{i3wV-+ zJjEiOW-&`x$}>F6GM4ikD|nujyud16WHoD8%R1Kc5*v7#S9q0;yvFOi!JBMiGjH)W zTiD7wY-2m`vV)zx$1ZmBJ|FNQAF+pz*~=&F<5NE4bN2HE2RO(fzT_*u<{J)kgrgke zI43yCw|vJbzUMS&_<Gwg zl%@=2DMxuKa3A+mkxEpi3RS5_b!zYcHK|2y>QI+@)F-$vry-4K%!52c6PnVD=GYAt zXh|zt(}uRRqdgsXn2tO`Cpz;eUFb>}-3X^U!TrxY=t(ak=}jN{5=B3viJ?ES#1YQ` z1~Q1j3}Gn47|sYrGK$fRVJzbq&jcQ0B9oZR6s9tb>C9jzvv{1@%waB1Fpv2x;7Jzp z6pMJ8#Vlbd&+shESk7~-;CWW^0;_nD)vRGH>sZfAY~W>H;Z-*B8n5#PZ?cKayv5sW zVJq*jjqSY44tDY$yV%Y9e87i%#2!9oFQ2fFPx*|`+0Pdo;2?+ilCSuhZ#c{mj&h9S zoZuwi@*Su6p3|J+2Y%!%KXH!pT;OLe@(Y)^%oVP3jqBXtS8j5P;EwGCgb+$X5|NlB zWVgRC2RX?_Zt_seKB`CPL}wnQ3tb7L8{u>(f*$mw7m@U)4}FQEAJN3npIG9EX8;2k z#9)Rnlwk~K1S1*6XvQ#>ag1jIk1>%+OlAsGnMQCw{|sg_i^rMG9Om)_^O(;9o@60U zv52Qx%o3LJ49~KR2Lz8De8e6;W-p(xk5BoG&)Lrx9N-{__>!;qnr}GF5sq?< zD zP6s7?(YpeD7bO&#h|kNPwqc>Jgljd_rVXhKt( z(VP~vq!q1cLtEO>o(?=rM;@UQoq3clbR~>#gwve}deDT3 z0SsgigBik5hB2HG1dnBnVl-nI%Q(g}fybE0BqlS3sZ3)!GnmON9%nXln9CE)V?GOb zl7&3QBA#Y3OIXS?Jj*hc^BgO9o|U{n<|6tNS;@0trU*qT zMsZ3|l2VkW3}q={Sd=Ds%&`Ftarox;vCoIZCOC|9`*>k<(IK4M$Jc|$w_4MNwzT76 zI`Rme2p+$F6o=CSU2&-B_ObJDu{#m;peMbEq&I!&OFyECp+B(%k0r)4fPoBRFhg)i z==L$>;o=BJGK$fRVJzbq&jcQ0B9oZR6s9tb>C9jz4maICCt-V?8giftPuOSJ}vGyv`fE$tE`Q7H_kK zt-QlFw(~AK*vWhBVmI&e0Uz=ad-#~We8N6HZzT#`X;V?%y$}x^} zf|Gp9cbwvTPIHDI_>r^x#5vA$fuFg^FI?g>SGdYGu5*K5xyda83H(P0p(G>`iAh3I zl98Mgq$Cx=V}WT%OFGh%fsAA#Gg-(=HnNk0oa7=mdB{sX@>77|apOW1rU=1f<_>KJ zic^A;l%h0cC`&oYQ-S-qpNdqXGF7NbHL6pC2dGIcYEy^0)T2HPXhru_RjEdGYVZIxsYPw-P?vhtrvVLVL}MQ0 zA)3&XW;CY-EeW1$)S5Q5r5)|*z{7Op5jxSCN9jUW!stdg-HD(FJ?TXxz3D?=qUc97 zF*sc%5KA2K3}7HmF9{502tygha7HkaQH*8`V;RSICh!;&nZ#tKFqLUcX9hEw#pBFo z4s&^edCX@4PqL7wSj5vTW(iAqhG$vEa-L%a&$E&jSjCI1W({ju$9i63126LmudqE#77eTX~0VZ0B8eu#@-L#ctl`13u&<_V6)#`GkFZ%4dAee!k!U2RX!- ze8ty%!(onalw%y{1Sk2H?>NQxoaPKa@FQpWiF2Ii0zY$+U%13&u5guWT;~SAa+6yG zLXCey2qhtjNK6uvl8oe}ASJ0tO&ZdYj`U<8Bbmrd7P69!?BpOPxyVf(@{*7I6rdo5 z2%ZO3grXFqI3*}aDN0j@vXrAd6}XT437%71iON)=D%Ge?4IZE-wWv)U>QayTG@v1k zXv~8=L=&3QjOMhUC9P;p8`{#2_H^K3I`Rme=***Zp(|l@Bb@F;(1V`zB9h+pp)XPN zBbpfc6H6TN3}7IG7|alY=Wh*TI3pOzC`L1ev5aFp6L^e?Oky%qn94M!GlQAT;&Em( zhq*k#Jm#~2Ct1i-EaGVvvxKEQ!?P@7InS|z=UK@Mtl~vhvxc>-V?8giftPuOSJ}vG zyv`fE$tE`Q7H_kKt-QlFw(~AK*vWhBVmI&e0Uz=ad-#~We8N6HZ zzT#`X;V?%y$}x^}f|Gp9cbwvTPIHDI_>r^x#5vA$fuFg^FI?g>SGdYGu5*K5xyda8 z35|Oal8D44At}j7P6|?ziqxbbE$K*41~QU~%w!=e*~m@~a*~VODP6s7?(YpeD7bO&#h|kNPyAA&qFvgFHkN zn$nEsw4f!eXiXd1(vJ3Y;9)xQ2%YH6qjaGwVRR#$?nKaop7bJ;-t?g_QS>9482S@S z9PtcbAcGjp5QZ|0;f!D;qZrK?#xjoaOyDslGKtAdVJg#@&J1QUi^rMG9Om)_^O(;9 zo@60Uv52Qx%o3LJ49~KR2Ykp!?BQef@(KI+l+XB_{d~az4swVu`HHXkhQl1; zD91R?2~P4Y-*JlXIn5b<;788#6X!V31%Botzi^4mT;VF$xXulJ~-sYydx(vhAFWF!-r$wF4Lk)0gmBp12KLtgTcp8^!55QQm1QHoKV z5|pGAr71&M%2A#Q+{gV?q!N{>LRG3!of zK}%ZEnl`kh9qsAB!*t{kI?H=|f+l=tnd$^e2`$;u*j| z1~Hf+3}qO@8Nov@R{yv!@S%0^z}b>84jHnEwvc$+P3 zhm-!^iC96ZY{bpYb{S`GNx+nlt>skDTQv&T*a#{LDpu;S!g*!d0$uog4hhO>PlLZ2S{KC<#eKVv>-Q z;B{lkNkK|dk(xB5B^~L>Kt?i=nJi=_8`;T0PI8f(Jme)G`6)m_3Q?FM6r~u&DM3j} zQJON8r5xp{zsT?wNb;dCd09`vLak@ThyeTkwU(ZtZ7SmKCh00SAs zV1_W1VGL&kBN@eL#xRy~jAsImF_B43W(rf8#&l*dlUY2@Z00bRCz!{47Vsnsd5T3m z&0?0YlxKLBWi018R`5J4d4W~D$ZFQGmUXP>B{uLfukb1xd5zb3gE!g4X5Qj$wy>3V z*v59=Wd}QXk6rBMeLmnrK4K3avzJfU$ESS8=j`VT4seh|e92dQ%{Lt82uC@_aZYfO zZ~2Z>e9vjl@B=?`mY+Dsc`ooX7x{%tT;>W_xyE&F@GCdDMIedsPY9tTBoT>8LQ;~E zoD>AF4@yO9(vX&Pq$dLz$wX$dkdAFz`7Gc` z7V;E}c$&p5VJXk>EX!EVbFAQbR`LR?c#+ktVJ+)e&r59JWnSS`Hu4&;^9FCSiOsyl z+iYPg@34*Syvq)D@*ca`&HH@7hkV2yK4veUu#ZpqjL+H67aZUqhxn4O_?mAx%n^=q zjN_c(B;WEKr}&=JoZ$z4~-sYydx(vhAFWF!-r$wF4Lk)0gmBp12KLtgTcp8^!55QQm1QHoKV5|pGA zr71&M%2A#Q+{gV?q!Phvw5w2+YE-8N4^Wd@)TRz~sYiVp(2zzn=0P5!2~BB6b6U`n zRC9jzvv{1@%waB1Fpv2x;7Jzp z6pMJ8#Vlbd&+shESk7~-;CWW^0;_nD)vRGH>sZfAY~W>H;Z-*B8n5#PZ?cKayv5sW zVJq*jjqSY44tDY$yV%Y9e87i%#2!9oFQ2fFPx*|`+0Pdo;2?+ilCSuhZ#c{mj&h9S zoZuwi@*Su6p3|J+2Y%!%KXH!pT;OLe@(Y)^%oVP3jqBXtS8j5P;DxgZ2qBb&BqA|M zNJ=u2lY*3_A~k79OFGh%fsAA#Gg-(=HnNk0oa7=mdB{sX@>76<6rwOiC`vJkQ-YF| zqBLbFOF4q~jHtkU+)qU+QJE@Kr5e?#!2{H!7PYBEUFuPv1~jA*jd_rVXhKt((VP~v zq!q1cLtEO>o(?=rM;@UQoq3clbR~>#gwve}deD_iqVW=EaMo@1Ri4|lbFmDrZSD`%wQ(7c%0eHVJ=TFkNGU%Nfz=H zi+GyFEMY0n@GQ$%&U38bc~)ha1ZgPv@Me_*=A(Vt9A~8uw zN-~m@f|R5pHEBpoI?|JYjASA+S;$H@vXg_HQ3Jl%*Wysla{QPem$GnJQGJ8r7-61JtAzwW&j0>QSEtG^7!Yd60)_LQ|U2oEEgC z6|HGQTY~p&X-@|prX!EgiOxJq7rGKgH^S*o1U=|UFCytpANmqSKcb1DKe5CS&j1E8 zh`|hDD8m@e2u3oB(Trg%;~38b9%CYtn9LNWGL7lXU?#J8oY~A_E>AFz`7Gc`7V;E} zc$&p5VJXk>EX!EVbFAQbR`LR?c#+ktVJ+)e&r59JWnSS`Hu4&;^9FCSiOsyl+iYPg z@34*Syvq)D@*ca`&HH@7hkV2yK4veUu#ZpqjL+H67aZUqhxn4O_?mAx%n^=qjN_c( zB;WEKr}&=JoZ$z4XD)JILF1B&RH8Cfs7f`eQ-cSnNp0#-mwH60 z>Sg&{;VRd-&JBL$CbtOQs3-ybJ&q-g5YIzNNFoxGgrp=RIVngTwNFfSSgrWrRWmKFJl%y1;DMMMxQJxCi$Nf~K5|yb! zRjN^)8azNvYEhdy)TJKvX+T37(U=E$h$b|p8O>=yOIp#IHngQ3?Frtu=3zSW2%YH6 zqjaGwVRR#$?nKaop7bJ;-t?g_QS>94c-V?8giftPuOSJ}vG zyv`fE$tE`Q7H_kKt-QlFw(~AKsAzaqqB2#e%1-GM)ngKqnZi`2F`XIAWEPJzn>ozo z3Fa}Mw|JW^Y~>xcv7L9>!A{;|7rVJ%`DG}}d+PC#v^{)G@ZNc!u#ZnEZ<-3+$1cR^3l4CQL%fj7df-#jd={LJ{d~az4swVu`HHXkhQl1; zD91R?2~P4Y-*JlXIn5b<;788#6X!V31%Botzi^4mT;VF$xXulJlYxw6A~RXYN;a~SgPi0dH+jfQKJrt5f)t`KMJP%!ic^A; zl%h1jd+U{@9ObFNecVq)Dp8p#RHYi#slfx(q!zWQLtW}op9VCf5si6}hiF1mn$esV zw4@cSX+vAu(Vh-GOh+D}6PtmFk&@gl2P!&=s{o|o9b%e=y?Y~(dw=MCOu6PtO9x7os0 z-eDWtd6ymR#E5BZ2ae9T@xVIQCJ8K1MCFF3$K4)G;l@ipIYm?IqJ7{@um zNxtPfPVqgbIl~Y9$XR~k9Ot>f&s^jeE^(PFT;&?qxxug886P!f`e#3Ugp z$w*ELQj&_)q#-ToNKXbbl8MY@AuHL)P7ZRCi`?WPFZsw%0SZ!x!W5w>#VAe*N>Yl_ zl%Xu;C{G3M<9;eqiON(Vct6%^RHp_HP?K8JrVe$fM|~R5kVZ7-K^~$BO=(7RTF{bK zw5APhX-9iH@Gu>DgidtkQM%BTFuD;=cOvLPPkIqaZ~D-eDEbji4E>2Ej(7$zkU%766Y+^HS@itr7$~$ahJMXfCoxH~` zcJn?T@F5?uhmYCIC+y=>KI3!t^92Vu$RWPuE57C%4s(Q~9OF1AILWts$0@$&G-vpM zA34iUoZ~zf_?e6R!X++qg{xfSIyd;0o7^IJGv5S+5K2N4k(eYTB^k*{K}u4Qnlz*( z9qGwHMlz9^EMz4c*~vjpa*>-nDgidtkQM%BTFuD;=cOvLPPkIqaZ~D-eDEbji4E>2Ej(7$zkUqE#77eTX~0VZ0B8eu#@-L z#ctl`13u&<_V6)#`GkFZ%4dAee!k!U2RX!-e8ty%!(onalw%y{1Sk2H?>NQxoaPKa z@FQpWiF2Ii0zY$+U%13&u5guWT;~SAa+6yGZv>uz5JE{vA`+8?q$DFbDM(2wQj>9AJDpQ53RHHgIcz~MJB6xr2I@F~e^=Uvu8qt^sd59)7r5Vj>K}%ZEnl`kh9qsAB z!*t{kI?H=|f+l=tnd$^e2`$;u*j|1~Hf+3}qO@8Nov@R{yv!@S%0^z}b>84jHnEwvc$+P3hm-!^iC96ZY{bpYb{S`GNx+nlt>s zkDTQv&T*a#{LDpu;S!g*!d0$uog4hhO>Pm$YuuBNL?k8&Nl8X>Qjn5Vq$Uk%Nk@7z zkdaJeCJR}~Ms{+LlU(E`4|&N)ehN^KLKLP5MJYycN>Gwgl%@=2DMxuKa3A+mkxEpi z3RS5_b!zYcHK|2y>QI+@)TaRrX+&clBnx?pMLf-7mavp(c$Q@>=Q&pJJS%yD zRlLY**07d!tmh>*@G`IPDjRu?*Lj0C*~Dhv;%&CDm3P?2cHU(NJ9&>??B;zw;6pxQ z4AFz`7Gc`7V;E}c$&p5VJXk>EX!EVbFAQbR`LR?c#+kt zVJ+)e&r59JWnSS`Hu4&;^9FCSiOsyl+iYPg@34*Syvq)D@*ca`&HH@7hkV2yK4veU zu#ZpqjL+H67aZUqhxn4O_?mAx%n^=qjN_c(B;WEKr}&=JoZ$z4hNk}3RlZ2!sBRMHZNh(s4hP0$3JsHSICNh(StYjlQ zImk&aa+8O=9AJDpQ53RHHgIcz~MJ zqBeD?OFin-fQB@pF%R+(O=wCpn$v=ow4ya_XiGcV(}9QS$Rl*3Gmp}Ru7uHzaJmyg z4|>vzNP5$UzC_WFXkzG3EOEp$fPoBRFhdy1ForXNk&I$AV;IXg#xsG(n8+k1Gli*4 zV>&aK$t)gcHglNE6U<{i3wV-+JjEiOW-&`x$}>F6GM4ikD|nujyud16WHoD8%R1Kc z5*v7#S9q0;yvFOi!JBMiGjH)WTiD7wY-2m`vV)zx$1ZmBJ|FNQAF+pz*~=&F<5NE4 zbN2HE2RO(fzT_*u<{J)kgrgkeI43yCw|vJbzUMS&_<DP6s7?(YpeD7bO&#h| zkNPyAA&qFvgFHkNn$nEsw4f!eXiXd1(vJ3Y;9)xQ2%YH6qjaGwVRR#$?nKaop7bJ; z-t?g_QS>9482S@S9PtcbAcGjp5QZ|0;f!D;qZrK?#xjoaOyDslGKtAdVJg#@&J1QU zi^rMG9Om)_^O(;9o@60Uv52Qx%o3LJ49~KR2Ykp!?BQef@(KI+l+XB_{d~az z4swVu`HHXkhQl1;D91R?2~P4Y-*JlXIn5b<;788#6X!V31%Botzi^4mT;VF$xXulJ zTw z$d}o*4`1^QhdIJgj&Yn5oTQqnSEmLKP?K8JrVe$fM}1c0Qm+*1MOLzronPd0iRZn( zl9Hw^MSD6>U!4k3m?9LV7{w_;NlH7mqK0-*%q=r zV2p#`!DJ!8_Qir4o$rzF;G_ES7ZO}ba5=%11XmNJ2+16hJ)~^N(vW2#D=hi@ zAs>W%81hlbxsacgekEjd=$O#4p}qcAQhiI--|7l3!Ggf~CU?qjAJQS@eA7FR7lrH( z>2Dc=%X30oo&VdMokKf^9J|unp}GQyV8SwHiIkDQb_M}S9+q`=_!+@ls^5g z^x(M2;L5dB(q9aw=e=ES(qMWPSF>f1{@LHAPoX}+>Sb|-TN>$!Y?y-e45oW3J#Eso z9#pz3J=yK_bV-8~^u8-S*q5`oIxfBR#eYi=F0aj%^bEJl-F8>HZY@1y(u}4*eph;` z+v%B-W|E$`#y{IFxK6XU+Ag#7@^_^N*K-zE;AN5C`L6Wfy3gXOysXkE-IX5f4_REP zmreSLyV8SwB#W!}vP<7{S9-ADWN}4b4(UJMl^*O%SzP6pQ+i4p^1rX&VE@YE%D-IF zOWc)yr_be1np^sVcclmWVHQ^i=8@j3iYIw*_n#!ezL_Nunlw~;x4Y7V{q^tZ)&H5E zG?<><6^_B_qyLtF9_=6O+awKcNXOlkp5u0Uf}{zg&$}x<=k4^6q#@Gt{xkn1xo)T5 zND{oBGVNXIx$jCp8|?pg>Yp^2p3~Ks!Rc51E&oF56C77LU7Z=cK6A%i>3MIbUr!Re zX7lh}MH3gyKv_3GDY+c5Z`Zu4fXn>VTN;lQ|lF|m>T;(OHS@{fnXDcaSoT((Qw77bg~ zu2;WC*}-KimMt4hZd#{q>p+=?QGqh`8^!sR>sD>*mJ5_=+D0)AVoG(x%@0rCu5*_Tl`95*=QphL=M65=?N@_6vXCZR zPMO+u+t*Xr-M{Vqdp|24DAl-b)lMy9qkG1NMdfYa$Gzh^HH{39jgE`{|JZvEXsL>) z(Rar=XXebwIp;`*L(Wk|Kr({ljDSc65s)OJASfV$3X%~MA}T?UpqRjbh>8j-iUAcB z69W2v)q4*N2fg?EzIE4I@4oe)z51LzHG6lcuCA`CuC5+5Hml3fG2{9U&+0gK+<>7Y zvugF|(ll^%_J8}mzGH`v7}WoN{Cd0Lea8+OIeJ9LX4n1C@{kwD2OTu7RcI_Nhpd`i z-?iiAHdk!hyi<=BAY zruZuNApZ48Vr37)4|o9I`txmoHjulq+{rIvf}R;jr0lUo(eBH0^809hL!&f8c*GJOB%R|G#oCc?3Tf$n!t{uf$6* zj)L$12~PpK2!8HA_y09~{{IpBVPl0+{?Qnv7nRb6 z5&BrJ@m#mMb-vrJ@lxtLsEdP<*2IXvqnkr1$MyFpU*!6>lsjFU!?_3xwTHE}oJBC# zSYkd)xuUfkHSRL+G4C^F_o7hG9PO#W&fP;=rJ=5tM!gb@T%(cE%xGl{HbxkCP|JnX zbFEQpgQKy3Vccv^HkXcIeq7%>!71T=eL8Q8 zPW6d#!l-6$cHeDA%nXqsmZ`at18wT>(_I2)+d1{$>XH54#XaE ztPcH{L1hko$MBdr_c%|4=|AZ=8a-&K=r8XWUvQPfGEvv;WDYW={?dY_W{=U1*58W0 zYpY$a_0wLbf5MFE##>TKQuQ=F{Srm}vcbVdWBsU}&Xa|b z3se`QsJ*e?P4BMXsQ1zb=)<6sN%}N>uD(QHdx?Ty)xUryzoY%X=)WpF)i&x=^Bav` zMsK5^(ch@=;=4p|r+>n|&_;88mHq@hmxx*_?fO8Q(8ST%TSL*4v^zOdV}o{H({)on zrYArVJB%1J#av2%iDp+HDrlxKI25`Q97dp8#~Rg*+0eQ0`DoA~I-}@0Yf1N2T6r!1 zc$@P6{#y#w6$uH@sYIMo<}vd^S)&iCCO4eSEa4xz$$5}GnrIKkcJ&o;72 z;;U$8<;bc`Hu9iTi)^`76^&rqS#7KZ^)L-KL>Ov9Bb#g2akxrH4pr%baj!3e++b}8 zT|bPiq9Zv1Wenopt=etc?XZB=H1!E>k9L4#I^NYj)lPC`hN*k#%mh6N7E-L2(<|sz z_3C<4DOv@wt-t`N&V79#_g+Sl36eqpTeQ@R1tbj1M>v)bKUR+j5EZGFNDfzgjw8-B z(=%1v)jE)z6*8*1JOJ%Vb~4axj4y&NQNwe{I1%*a@wXg?m#U-*7+$83Zq>3N=xmr< zwltOR{uf&QO|@mH!?aK-HnOH zoyG&kGsbg};S0uR#wp`l;|C+ej4@-)OtY!k!fa)>HpiIbWejTR*bH`~oUY|tGGuMI zXn^zrXz)P4AyiPtN+0 zvzx<%w^8tZ?PX4Cd5cq6j&o|t8BRkvr~S=H3emlKBqKYK(Vwg5LkgAj`g%jq(1Ka5 zH5{)!=;*HZ*8A#%^`W3;q<)J&nt9)xYURa~A2U*YPJM`W9%la$& ztNKCs@4N7j58%R|D)jxPU(_|jz?2Zi$V@TPKxdAT2WP7YTALWHjka*NPN27kG1|Dz zm@COU+4U?~tOj`Rq;Q!MQt3<@K=2mMea2K_5 z%P#|D^32jiuYe-uQ$g9sH+JUs3V20z&e2bU%EGItvyZ~y)>l4XRqd}#nNk*BP3^fn zzP>EHRPDojZ)sV0bv5Lwzf%@oL+w2sepNm-)qd0$oae>9s5{)}J9TEssvx+GSys`s zkNA5RaKq8NbfzXg?a>5TLzCwnJEbl>QdS=t^LPB^d^{pw$VvsKIqjw(xNu*Qj6^n) zI6OBWVZDwti_{o$Uc&!1?)|OIm>0%7@M*hP%j5eUr04nlMH1#8O*p!=r7?9IPv5>z z+jYKA);GN2+||>wHaN3=SEP+QIXS05FVu?|$dz4qF9!N%PN`|njNVc2q&EUCBk^s< zzy$pfzDbUKwaxBbAFVetyRaiuxAo+~&hI{bnfrS;?KSuAMy;6oO8tr%DV>-D@1yTU zN|?gwPwO~g>7cgy0q6b3+GB1`zi2nQt;o>d0C)2KIT(;!N8G0)^iGuF

O6PZx48 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%0AKSFHO1Vs2ml3%5?P8 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