Compare commits

...
370 Commits
Author SHA1 Message Date
Alexander Batalov dcd450a9b7 Bump version to 1.2.0 2023-01-20 10:02:02 +03:00
Alexander Batalov bfbf692cc0 Add iOS release workflow 2023-01-20 09:57:52 +03:00
Alexander Batalov 2714dc1ea1 Fix memory alignment
See #135, #122
2023-01-19 20:27:22 +03:00
Alexander Batalov 8604d9c401 Fix check 2023-01-16 17:33:19 +03:00
Alexander Batalov b9261c3da2 Fix directory name reading 2023-01-16 17:01:52 +03:00
Alexander Batalov ed7176b796 Fix combatai_notify_onlookers 2023-01-16 16:55:31 +03:00
Alexander Batalov 6cac53d20b Rename critter maneuver flags 2023-01-16 16:49:50 +03:00
Alexander Batalov ad3860790c Fix NPCs not joining combat 2023-01-16 16:42:50 +03:00
Alexander Batalov bffe81d0b3 Improve cycle.cc readability 2023-01-05 11:29:00 +03:00
Alexander Batalov 6ab08bd22b Remove some unused db functions 2023-01-05 10:39:46 +03:00
Alexander Batalov 060c79fc20 Remove electronic registration 2023-01-05 10:27:16 +03:00
Alexander Batalov ac64fde502 Fix object rendering
Previous solution did not work well on high resolutions due to
incorrect tile calculations - was not updating edges and sometimes
hanged in endless loop trying to find upper-left or bottom-right
tiles.

New solution follows Sfall's HRP implementation.
2023-01-05 05:59:45 +03:00
Alexander Batalov 7496afa4f8 Clarify textObjectAdd param 2023-01-05 04:06:18 +03:00
Alexander Batalov 66955f893a Review light.cc 2023-01-03 23:56:52 +03:00
Alexander Batalov 9ee4cb4a26 Refactor min/max usage 2023-01-03 23:00:38 +03:00
Alexander Batalov a5cefd6c8b Clear dirty rect during map updates
Previous solution to replace squares was destructive in nature and
could possibly lead to unexpected things (especially with mods where
tile 0x293 might not be opaque black).

New solution follows mapper refresh routines where entire dirty rect
is reset to black as a preparation step.
2023-01-03 21:10:20 +03:00
Alexander Batalov d040ea814a Fix objects being animated while playing movies 2023-01-02 21:15:43 +03:00
Alexander Batalov 03145e4fcd Fix endgame slideshow issues
See #3
Closes #215
2023-01-02 14:34:42 +03:00
Alexander Batalov 812079004c Make credits fullscreen
See #3, #215
2023-01-02 13:09:03 +03:00
Alexander Batalov 6224af6178 Fix help screen issues
Closes #179
2023-01-02 11:13:32 +03:00
Alexander Batalov a8d3cdd148 Improve worldmap.cc readability 2022-12-31 14:12:04 +03:00
Alexander Batalov 95cc863fde Fix special encounter icon blinking 2022-12-30 16:45:49 +03:00
Alexander Batalov cc1562b056 Add fading effects when moving to/from worldmap
Follow-up to #193
2022-12-30 00:41:29 +03:00
Alexander Batalov 07f3c82444 Fix map loading background
Integrated interface bar area remained visible during map loading.
2022-12-29 23:33:09 +03:00
Alexander Batalov 9976728e04 Fix worldmap background
Closes #193
2022-12-29 21:54:40 +03:00
Alexander Batalov 5922d15b1c Fix various dialog box issues
- Better vertical positioning (account for word wrapping)
- Better horizontal positioning (consider both right and left gaps for
calculating available width).
- Prevent vertical text overflow.
2022-12-29 13:02:59 +03:00
Alexander Batalov 248d6dfb92 Add shadow to city labels 2022-12-29 10:43:02 +03:00
Alexander Batalov 73cc93a3e4 Cleanup some interface bar functions 2022-12-29 10:21:15 +03:00
Alexander Batalov 34259269a4 Improve "Whomever is attacking me" targeting
Fixes #197
2022-12-29 09:37:51 +03:00
Alexander Batalov 11217974c6 Improve aiFindAttackers 2022-12-28 19:45:17 +03:00
Alexander Batalov 0e13989f9c Fix critter lists sorting functions 2022-12-28 17:54:09 +03:00
Alexander Batalov 57dcf42b5c Fix custom disposition button 2022-12-28 17:33:01 +03:00
Alexander Batalov c2c26db5d9 Fix max throw range calculation 2022-12-28 12:33:10 +03:00
Alexander Batalov b6ee5fcbe9 Fix configGetIntList 2022-12-28 09:14:30 +03:00
Alexander Batalov 0e11569397 Add ai_check_drugs fixes and improvements (#29) 2022-12-28 02:19:43 +03:00
Alexander Batalov 4b137dac5f Improve graphlib accuracy 2022-12-27 18:59:24 +03:00
Alexander Batalov 1f6d5ebbc9 Improve some color functions readability 2022-12-27 16:27:14 +03:00
Alexander Batalov 462baa0a04 Improve color tables accuracy 2022-12-27 15:51:43 +03:00
Alexander Batalov b74f3c368b Fix warning 2022-12-26 12:03:14 +03:00
Alexander Batalov a05ab09e1b Cleanup audio IO 2022-12-26 11:48:47 +03:00
Alexander Batalov 1b0cd6d757 Improve SoundDecoder readability 2022-12-25 22:30:31 +03:00
Alexander Batalov b8dea116ee Improve Sound readability 2022-12-25 21:56:23 +03:00
Alexander Batalov e11f1af9ae Improve combat_ai.cc readability 2022-12-24 14:30:03 +03:00
Alexander Batalov 9c34b26fec Improve animation.cc readability 2022-12-23 15:49:56 +03:00
Alexander Batalov 9a6d45541f Rename animationRegisterPing 2022-12-23 15:22:53 +03:00
Alexander Batalov f4775775b8 Review dude move/run functions 2022-12-23 15:13:05 +03:00
Alexander Batalov a48d744cde Improve actions.cc readability 2022-12-23 12:44:52 +03:00
Alexander Batalov 16dbe1122e Normalize gradlew.bat 2022-12-23 10:55:15 +03:00
Alexander Batalov b0cb70ffa6 Fix file existence check 2022-12-23 10:34:20 +03:00
Alexander Batalov 512530c653 Fix building file list on non-Windows platforms 2022-12-23 10:33:16 +03:00
Alexander Batalov 982d4cc0f9 Truncate long names in file picker dialog 2022-12-23 10:30:31 +03:00
Alexander Batalov 3b951b8578 Add opSetWeaponAmmoPid 2022-12-22 20:36:31 +03:00
Alexander Batalov 17a4ee8a68 Add Sfall version opcodes (#200) 2022-12-22 20:18:07 +03:00
Alexander Batalov c85cda4b48 Fix rare crash when using grenades
Closes #208
2022-12-22 19:54:04 +03:00
Alexander Batalov c7ca358295 Rename OBJECT_NO_SAVE flag 2022-12-22 16:49:17 +03:00
Alexander Batalov 96296417c6 Rename OBJECT_NO_REMOVE flag 2022-12-22 16:47:11 +03:00
Alexander Batalov 737076a126 Fix getting elevation of freed object 2022-12-22 14:20:37 +03:00
Alexander Batalov c0908cf14f Fix visual artifacts caused by null tiles 2022-12-21 09:18:29 +03:00
Alexander Batalov 343911f736 Fix floor lighting 2022-12-20 18:44:21 +03:00
Alexander Batalov 281c1aa82a Review tileRenderFloorsInRect 2022-12-20 16:22:56 +03:00
Alexander Batalov 18afce71b0 Review tile_fill_roof 2022-12-20 15:10:42 +03:00
Alexander Batalov 9599d63f45 Review roof_fill_off 2022-12-20 15:09:01 +03:00
Alexander Batalov ce351988b5 Review roof_fill_on 2022-12-20 15:01:57 +03:00
Alexander Batalov feb3821565 Fix multiple knockout effects 2022-12-13 23:59:45 +03:00
Alexander Batalov 54eaff26ea Fix partyMemberIncLevels 2022-12-13 23:35:15 +03:00
Alexander Batalov 5a7ffde45e Fix max party member level 2022-12-13 23:29:34 +03:00
Alexander Batalov 1c0385ad11 Remove _obj_fix_combat_cid_for_dude
The same cid-to-object conversion performed by `combatLoad`.
2022-12-13 23:06:52 +03:00
Alexander Batalov 0fe6d88a3a Review combatLoad 2022-12-13 23:03:42 +03:00
Alexander Batalov 7596d4d721 Fix combat_is_shot_blocked 2022-12-13 22:18:12 +03:00
Alexander Batalov 8333e553e2 Add SubtileFill 2022-12-13 22:11:37 +03:00
Alexander Batalov 6f62cfd466 Fix critters dying on exit grids 2022-12-13 16:33:19 +03:00
Alexander Batalov 280b55ab05 Add isExitGridPid 2022-12-13 14:34:49 +03:00
Alexander Batalov e02dcdf69d Fix car disappearing when using town interface 2022-12-13 13:20:55 +03:00
Alexander Batalov b5701fb9b9 Fix worldmap scroll down button 2022-12-13 12:45:39 +03:00
Alexander Batalov c569b879f6 Fix opPrint 2022-12-13 11:35:07 +03:00
Alexander Batalov b36ac50425 Review windowShow 2022-12-13 10:37:52 +03:00
Alexander Batalov 029a84a113 Review gWindowIndexes 2022-12-13 10:18:02 +03:00
Alexander Batalov e6fddd6905 Rename window flags 2022-12-13 10:04:05 +03:00
Alexander Batalov b0b69bd780 Fix wmMapIdxToName 2022-12-09 00:52:03 +03:00
Alexander Batalov 6de4ac87df Use snprintf 2022-12-08 23:05:50 +03:00
Alexander Batalov 502c920656 Add reportOverloaded 2022-12-08 22:05:54 +03:00
Alexander Batalov c383fc6b95 Add mobile keyboard support (#206) 2022-12-08 20:41:59 +03:00
Alexander Batalov 4b03c714b4 Bump libsdl to 2.26.1 2022-12-08 19:48:53 +03:00
Alexander Batalov 0d93279a10 Fix missing include 2022-12-08 19:38:55 +03:00
Alexander Batalov 510d7bfe95 Reorganize includes 2022-12-08 19:18:39 +03:00
Alexander Batalov 19d0d2919f Remove unnecessary includes 2022-12-08 17:29:30 +03:00
Alexander Batalov 42f01c8d45 Remove unused 16bpp code 2022-12-08 17:26:28 +03:00
Alexander Batalov 0474199b5c Remove unnecessary include 2022-12-08 17:13:06 +03:00
Alexander Batalov 8a4ce6c658 Improve splash screen handling (#3)
* Fixes splash screens in Olympus
2022-12-08 16:41:55 +03:00
Alexander Batalov 884034f0bf Refactor stretching blitters
* Fixes skipped pixels
* Improves readability
2022-12-08 16:34:38 +03:00
Alexander Batalov 602ef7c1e1 Increase maps ambient sfx capacity 2022-12-08 14:10:31 +03:00
Alexander Batalov 897ff2bbd2 Add dialog options numbering 2022-12-08 10:58:54 +03:00
Alexander Batalov 9ade107e95 Rename Button fields 2022-12-07 16:42:37 +03:00
Alexander Batalov 1698cfa04b Rename Window fields 2022-12-07 16:39:30 +03:00
Alexander Batalov 59639c60a3 Cleanup 2022-12-07 10:17:48 +03:00
Alexander Batalov f056f0e131 Add opGetGameMode (#200) 2022-12-06 17:46:52 +03:00
Alexander Batalov dc90beb696 Add game mode tracking 2022-12-06 17:22:30 +03:00
Alexander Batalov 90da2164f2 Fix assignment 2022-12-06 17:13:48 +03:00
Alexander Batalov 9d9e09e80f Use MESSAGE_LIST_ITEM_FIELD_MAX_SIZE 2022-12-06 12:37:59 +03:00
sonilyan cd51e0cdd7 Fix crash for msg limit (#203) 2022-12-06 12:32:21 +03:00
drjfaust d49869f45c Fix several combat bugs (#204) 2022-12-06 12:17:11 +03:00
Alexander Batalov 3a541d4b67 Fix endurance label
Closes #201
2022-11-10 23:48:09 +03:00
Alexander Batalov 7471f9cdbe Fix palette fading 2022-11-10 23:43:18 +03:00
Alexander Batalov fe9ba9171e Add custom message lists support
Closes #130
See #200
2022-11-10 18:07:23 +03:00
Alexander Batalov 6c03e4e293 Fix storing pointers in map global variables 2022-11-09 14:35:07 +03:00
Alexander Batalov 3f25c9265b Fix arguments order 2022-11-09 13:54:32 +03:00
Alexander Batalov fa475c754e Add opReadByte
See #200
2022-11-09 13:09:56 +03:00
Alexander Batalov 5e9cf96106 Rename state structs
Fixes UB leading to crash when exiting the game
2022-11-09 11:41:53 +03:00
Alexander Batalov a70912d311 Fix ini section parsing 2022-11-09 11:11:19 +03:00
Alexander Batalov 67351b8b09 Fix player model customization 2022-11-09 10:21:12 +03:00
Alexander Batalov e0e0a1ee7d Add Sfall list functions
See #200
2022-11-08 22:55:25 +03:00
Alexander Batalov fa11122f87 Make spatial script finders public 2022-11-08 22:45:30 +03:00
Alexander Batalov ef54463fcc Add pc bonus stats opcodes
See #200
2022-11-08 18:59:14 +03:00
Alexander Batalov 2255481d50 Add missing header 2022-11-08 18:07:11 +03:00
Alexander Batalov 03a7e2e1b1 Add some Sfall global vars functions
See #200
2022-11-08 18:01:00 +03:00
Alexander Batalov 19bcfebe0d Add ammo/charges opcodes
See #200
2022-11-07 20:41:33 +03:00
Alexander Batalov 393d89f8c4 Add some Sfall opcodes
See #200
2022-11-07 20:03:04 +03:00
Alexander Batalov 9c6286f94a Increase number of opcodes 2022-11-07 19:06:37 +03:00
Alexander Batalov fa058f24b4 Add interface bar side panels
See #3
2022-11-07 16:05:34 +03:00
Alexander Batalov b2420bdc80 Refactor artLock with FrmImage 2022-11-07 13:55:05 +03:00
sonilyan 23bee9fd62 Add IFACE_BAR_WIDTH support (#188) 2022-11-07 13:35:22 +03:00
Alexander Batalov 3ec827d5c1 Fix worldmap position calculation
Closes #192
2022-11-07 10:59:16 +03:00
Alexander Batalov c692fc91af Fix error check
Closes #196
2022-11-03 18:16:50 +03:00
Alexander Batalov a38151bf2c Reorganize control flow in gdCustomSelect
Fixes #198
2022-11-03 18:08:49 +03:00
Alexander Batalov b689b3a757 Fix combat control fields not being cleared
Closes #194
2022-11-03 17:48:34 +03:00
Alexander Batalov e7d68c4f72 Get rid of PreferenceDescription packing
Fixes pointer alignment warnings.
2022-10-30 13:00:43 +03:00
Alexander Batalov bc43bdc99c Rename some variables in objectSetLocation 2022-10-30 09:39:43 +03:00
Alexander Batalov e5aa4a3518 Fix square tiles initial lookup 2022-10-30 09:31:09 +03:00
Alexander Batalov 4e98093d6c Fix crash when removing all scripts 2022-10-30 09:03:24 +03:00
Alexander Batalov 1342fd3ecf Fix warning 2022-10-30 08:45:04 +03:00
Alexander Batalov 3015f39368 Review interfaceFontGetStringWidthImpl 2022-10-30 08:41:00 +03:00
Alexander Batalov 37f7ecc1c3 Review SlotMap2Game 2022-10-29 21:27:08 +03:00
Alexander Batalov bdf2c219ab Fix error check 2022-10-29 21:09:53 +03:00
Alexander Batalov 3488833c2e Use SDL for logging 2022-10-29 20:57:11 +03:00
Alexander Batalov 4821cab724 Review tileSetCenter flags 2022-10-29 18:52:22 +03:00
Alexander Batalov 0851354c8a Rename _square_y 2022-10-29 18:25:28 +03:00
Alexander Batalov 2f42818a33 Review square coords math 2022-10-29 18:23:53 +03:00
Alexander Batalov 12367acb33 Fix byte swapping warnings 2022-10-29 18:17:57 +03:00
Alexander Batalov caa8b06d4f Fix UB when parsing encounter table 2022-10-29 18:14:49 +03:00
Alexander Batalov 2b63360b95 Fix memory alignment 2022-10-29 17:26:46 +03:00
Alexander Batalov 8dd8d1c312 Replace random generator 2022-10-29 17:21:54 +03:00
Alexander Batalov 8ee0f478ad Fix setting managed button procs 2022-10-28 11:02:53 +03:00
Alexander Batalov 9c6daa4abe Fix selecting managed window 2022-10-28 10:59:38 +03:00
Alexander Batalov 01f264e0c2 Fix color setters 2022-10-28 10:35:22 +03:00
Alexander Batalov 1bbd586cbb Fix trimming line ending in .lst files 2022-10-26 10:17:39 +03:00
Alexander Batalov 223930c464 Get rid of goto 2022-10-25 17:37:45 +03:00
Alexander Batalov 40510539ee Fix interface font loading 2022-10-25 15:57:31 +03:00
Alexander Batalov c47113ca29 Force screen redraw after playing movies
Fixes #180
2022-10-25 13:05:09 +03:00
Alexander Batalov ad9b8586e9 Fix testing pointers for nulls in Nevada
Closes #178
2022-10-25 09:57:13 +03:00
sonilyan 5b151634a5 Fix memory alignment (#187) 2022-10-25 09:12:54 +03:00
Martin Janiczek 7627092478 Make sfall key naming consistent (#172) 2022-10-25 09:05:09 +03:00
Martin Janiczek b60fe43b06 Refactor: use enum instead of magic numbers (#176) 2022-10-25 09:04:42 +03:00
Alexander Batalov 21aec548af Add iOS support (#167) 2022-10-14 11:40:11 +03:00
Alexander Batalov beb010cd0f Normalize fade duration
See #165
2022-10-11 17:58:02 +03:00
Alexander Batalov b23d05f850 Fix called shot window freeze
See #165
2022-10-10 11:42:10 +03:00
Alexander Batalov e16659d96d Fix key processing
Fixes buffer-underwrite crash on macOS when scancode is remapped to -1.
2022-10-08 12:32:50 +03:00
Alexander Batalov 4c1020af5f Fix path handling in _gsound_get_music_path 2022-10-08 10:56:46 +03:00
Alexander Batalov a4105d5826 Decouple drawing and rendering (#165) 2022-10-08 00:54:27 +03:00
Alexander Batalov ddae4df4ab Fix red dialog buttons 2022-10-07 23:31:17 +03:00
Alexander Batalov 74a9a9e530 Add audio engine initialization check
Fixes various bugs when movie system attemps to create audio buffer with
sound system being disabled via fallout2.cfg.
2022-10-07 15:17:07 +03:00
Alexander Batalov 223d214f57 Review lsgSaveGame
* Add scrolling
* Rename variables
2022-10-07 12:04:30 +03:00
Alexander Batalov a52fd4e70a Review lsgLoadGame
* Add missing cleanup
* Fixes double click handling
* Rename variables
2022-10-07 11:28:42 +03:00
Alexander Batalov 266c727870 Extract renderPresent 2022-10-06 19:10:01 +03:00
Alexander Batalov 54d230432b Refactor game config with Settings (#164) 2022-10-06 16:32:46 +03:00
Alexander Batalov 9663532e44 Add missing elevator ids 2022-10-05 18:29:21 +03:00
Alexander Batalov a4e9123bcc Fix crash in obj_use_item_on 2022-10-05 17:55:54 +03:00
Alexander Batalov 08691ce319 Fix incorrect death animation in opKillCritterType 2022-10-05 16:58:57 +03:00
Alexander Batalov d03fd5e43f Review opGetMessageString 2022-10-05 16:07:55 +03:00
Alexander Batalov 7ddd8f2894 Fix itemGetQuantity 2022-10-05 15:44:00 +03:00
Alexander Batalov 93a341bbaa Fix arguments order 2022-10-05 14:59:00 +03:00
Alexander Batalov d2c4538656 Fix obj_can_see_obj elevation check 2022-10-05 14:56:29 +03:00
Alexander Batalov 8a5c3bc97b Fix obj_can_hear_obj implementation 2022-10-05 14:38:19 +03:00
Alexander Batalov db57fe6a5e Review isWithinPerception 2022-10-05 14:25:36 +03:00
Alexander Batalov 56d798dd12 Display encounter description in one line 2022-10-05 14:20:32 +03:00
Alexander Batalov 90942c46b2 Uninline obj_set_seen 2022-10-05 13:49:18 +03:00
Alexander Batalov 1cda2beef7 Fix looting corpses with NoSteal flag 2022-10-05 13:26:13 +03:00
Alexander Batalov 8754a5d6c9 Rename critter flags 2022-10-05 13:06:49 +03:00
Alexander Batalov 65f43804b3 Rename core 2022-10-05 10:35:05 +03:00
Alexander Batalov 9b150257fb Rename some input functions 2022-10-05 10:11:47 +03:00
Alexander Batalov 32c7883f82 Cleanup input.h 2022-10-05 09:54:46 +03:00
Alexander Batalov 1c73fb7240 Extract input 2022-10-05 09:23:27 +03:00
Alexander Batalov cce1bb223e Handle window size change (#163) 2022-10-04 13:15:54 +03:00
Alexander Batalov 624076ae9b Fix Doctor skill usage 2022-10-04 09:23:17 +03:00
Alexander Batalov 8d61a19dbe Remove declarations 2022-10-03 18:11:55 +03:00
Alexander Batalov 0264c00ab8 Extract keyboard 2022-10-03 16:42:34 +03:00
Alexander Batalov e1f22b8218 Review game state functions 2022-10-03 15:54:18 +03:00
Alexander Batalov fe4c125474 Fix crash when dialog speaker destroys itself
See #162
2022-10-03 15:04:30 +03:00
Alexander Batalov 56d27400ac Add missing include 2022-10-03 14:52:47 +03:00
Alexander Batalov b5681984cd Extract mouse 2022-10-03 12:41:33 +03:00
Alexander Batalov a541d0f24a Fix type warnings 2022-10-03 10:19:22 +03:00
Alexander Batalov 20a41088c6 Remove trap.cc 2022-10-03 10:01:42 +03:00
Alexander Batalov 16ab9cb958 Fix lock check 2022-10-03 09:38:43 +03:00
Alexander Batalov 5f9ceb7f5d Extract vcr 2022-10-03 09:37:05 +03:00
Alexander Batalov a1c1e03da0 Refactor artLockFrameData with FrmImage 2022-09-26 16:09:22 +03:00
Alexander Batalov ac0a044a32 Refactor artLockFrameData with FrmImage 2022-09-26 15:17:22 +03:00
Alexander Batalov 4aae167bd8 Refactor artLockFrameData with FrmImage 2022-09-26 11:55:06 +03:00
Alexander Batalov 2e5be31ed4 Refactor artLockFrameData with FrmImage 2022-09-26 11:14:11 +03:00
Alexander Batalov 45278f66a5 Refactor artLockFrameData with FrmImage 2022-09-26 10:36:54 +03:00
Alexander Batalov 2205077d36 Refactor artLockFrameData with FrmImage 2022-09-26 10:28:44 +03:00
Alexander Batalov 67f966f7a9 Refactor artLockFrameData with FrmImage 2022-09-24 22:53:25 +03:00
Alexander Batalov 463968d798 Refactor artLockFrameData with FrmImage 2022-09-24 21:29:50 +03:00
Alexander Batalov 109dc6680c Refactor artLockFrameData with FrmImage 2022-09-24 21:22:40 +03:00
Alexander Batalov 23c5f070fa Refactor artLockFrameData with FrmImage 2022-09-24 21:04:32 +03:00
Alexander Batalov fd9843f8dc Fix type warning 2022-09-24 19:43:27 +03:00
Alexander Batalov 443070226f Refactor artLockFrameData with FrmImage 2022-09-24 19:41:25 +03:00
Alexander Batalov db63d8a085 Refactor artLockFrameData with FrmImage 2022-09-24 18:15:52 +03:00
Alexander Batalov f203cfcc83 Refactor artLockFrameData with FrmImage 2022-09-24 17:31:13 +03:00
Alexander Batalov 9ceb490f72 Refactor artLockFrameData with FrmImage 2022-09-24 17:03:50 +03:00
Alexander Batalov 5b7a676b35 Refactor artLockFrameData with FrmImage 2022-09-24 16:51:16 +03:00
Alexander Batalov e50e26cf87 Refactor artLockFrameData with FrmImage 2022-09-24 16:39:15 +03:00
Alexander Batalov f59c072d68 Add FrmImage 2022-09-24 16:14:54 +03:00
Alexander Batalov 79c396c1a0 Uninline characterSelectorWindowFatalError 2022-09-24 10:28:30 +03:00
Alexander Batalov 9bb053b3ba Add namespace (#155) 2022-09-23 15:43:44 +03:00
Alexander Batalov 3168c2ec09 Improve some combat functions readability 2022-09-23 14:01:39 +03:00
Alexander Batalov cb9c72d1db Bump version to 1.1.0 2022-09-23 09:42:47 +03:00
Edgar Miró 7a455dcad5 Update readme (#143) 2022-09-23 09:33:03 +03:00
Alexander Batalov cacbecb324 Update license 2022-09-22 13:23:09 +03:00
Alexander Batalov c521dcaf57 Fix storing pointers in map local variables
Closes #152
2022-09-22 12:45:58 +03:00
Alexander Batalov b89c06008b Add Windows icon 2022-09-22 10:13:28 +03:00
Alexander Batalov c20e40652d Add Android icon 2022-09-15 22:06:36 +03:00
Alexander Batalov 2fe74627bd Add macOS icon 2022-09-15 20:59:02 +03:00
Alexander Batalov 9864a2551d Uninline mapSetEnteringLocation 2022-09-15 19:59:16 +03:00
Alexander Batalov dea8c98399 Decompile square_init 2022-09-15 18:25:48 +03:00
Alexander Batalov 108a20ef27 Decompile mapLocalVariablesLoad 2022-09-15 18:22:27 +03:00
Alexander Batalov 0adc65054c Decompile mapLocalVariablesInit 2022-09-15 18:19:50 +03:00
Alexander Batalov d72a74f6c3 Decompile mapGlobalVariablesLoad 2022-09-15 18:17:16 +03:00
Alexander Batalov 1d05bac7a1 Decompile mapGlobalVariablesInit 2022-09-15 18:16:46 +03:00
Alexander Batalov 980b40dcdd Review mapNewMap 2022-09-15 17:49:40 +03:00
Alexander Batalov b1a8707fb2 Review isoExit 2022-09-15 17:45:35 +03:00
Alexander Batalov 382de999cc Review isoReset 2022-09-15 17:43:33 +03:00
Alexander Batalov 06618d9e21 Uninline wmAreaSetVisibleState 2022-09-15 14:25:21 +03:00
Alexander Batalov 1b6e29acc0 Reorder includes 2022-09-15 12:38:23 +03:00
Alexander Batalov e5992779f3 Reconcile worldmap.cc 2022-09-15 11:42:02 +03:00
Alexander Batalov d7bc8e4176 Rename worldmap.cc 2022-09-15 09:00:11 +03:00
Alexander Batalov 629978d7a6 Reconcile with reference edition 2022-09-01 18:41:37 +03:00
Alexander Batalov 039ad65557 Add getFileSize 2022-09-01 07:37:00 +03:00
Alexander Batalov 26e5104a96 Add compat_strdup 2022-09-01 06:48:26 +03:00
Alexander Batalov d39276fe3a Update fpattern config 2022-09-01 06:24:01 +03:00
Alexander Batalov 2a17a07784 Fix AI behaviour for Snipe distance preference 2022-08-31 22:02:08 +03:00
Alexander Batalov 56d35bef0d Add more checks for AI to pick secondary hit mode 2022-08-31 20:25:40 +03:00
Alexander Batalov 676098dc5f Fix weapon safety check 2022-08-31 19:56:09 +03:00
Alexander Batalov 857d3902bb Fix AI weapon switching 2022-08-31 19:53:12 +03:00
Alexander Batalov 7803378d82 Fix some warnings 2022-08-31 18:52:01 +03:00
Alexander Batalov 893a116fb4 Fix getting random target 2022-08-31 18:31:23 +03:00
Alexander Batalov 916bf40602 Add CombatBadShot enum 2022-08-31 18:29:46 +03:00
Alexander Batalov 40d6348b09 Fix incorrect AP cost when AI reloads a weapon 2022-08-31 17:41:50 +03:00
Alexander Batalov 1e5047cd48 Improve aiHaveAmmo 2022-08-31 12:05:56 +03:00
Alexander Batalov 7750006127 Fix warnings 2022-08-31 10:11:01 +03:00
Alexander Batalov 1b69c97ce4 Improve aiAttemptWeaponReload 2022-08-31 10:05:00 +03:00
Alexander Batalov b3431fadf7 Fix some warnings 2022-08-29 23:58:03 +03:00
Alexander Batalov 2a0d0633f1 Fix images for scroll buttons 2022-08-29 23:42:36 +03:00
Alexander Batalov 4ed86be78e Add missing worldmap button sounds 2022-08-29 23:35:58 +03:00
Alexander Batalov db13317613 Fix default worldmap font 2022-08-29 23:33:03 +03:00
Alexander Batalov 8deb855b12 Fix Pathfinder perk 2022-08-29 17:37:58 +03:00
Alexander Batalov 24277424d2 Fix typo 2022-08-29 16:08:23 +03:00
Alexander Batalov c593eceaaf Add pip-boy automaps patch 2022-08-29 16:07:34 +03:00
Alexander Batalov e3a811c83d Add a flashing icon to the Horrigan encounter 2022-08-29 15:14:16 +03:00
Alexander Batalov 89fd83012a Fix quick destinations positioning 2022-08-24 13:11:46 +03:00
Alexander Batalov e71447a3d3 Use pop-up message box about death from radiation 2022-08-19 20:25:14 +03:00
Alexander Batalov b89d6dfd72 Fix crash when opening bag on the bartering table 2022-08-19 19:54:39 +03:00
Alexander Batalov 3878be0d09 Fix items disappearing when using bag 2022-08-19 19:42:21 +03:00
Alexander Batalov 21d550ad1e Fix attackDetermineToHit 2022-08-19 18:58:18 +03:00
Alexander Batalov 134ab451e3 Fix item name separator position 2022-08-19 18:07:12 +03:00
Alexander Batalov 25fc67fec1 Add mouse support on Android
Closes #116
2022-08-19 13:36:14 +03:00
Alexander Batalov a41780caa2 Rename some item functions 2022-08-18 08:41:15 +03:00
Edgar MiróandAlexander Batalov 4eb5e39946 Add loading dialog (#125)
Co-authored-by: Alexander Batalov <alex.batalov@gmail.com>
2022-08-17 09:32:08 +03:00
Alexander Batalov 354b0812c9 Fix missing Android signing configs in forks/PRs 2022-08-17 00:01:20 +03:00
Alexander Batalov bee34bfdf4 Add items weight summary 2022-08-16 23:06:40 +03:00
Alexander Batalov d31e367870 Tweak inventory scroller positions 2022-08-16 22:19:23 +03:00
Alexander Batalov 16f0be1a45 Add more inventory UI constants 2022-08-16 21:08:04 +03:00
Alexander Batalov ebba548206 Use inventory slot size constants 2022-08-16 16:26:21 +03:00
Alexander Batalov c9fa9a4765 Fix inventory defines misuse 2022-08-16 16:09:13 +03:00
Alexander Batalov cfca07f7f2 Add idle func 2022-08-16 14:24:57 +03:00
Alexander Batalov 0f60556b73 Decompile some input functions 2022-08-16 14:14:53 +03:00
Nikola Đurinec a1521049b5 Fix interface button positions (#131) 2022-08-16 11:52:37 +03:00
Alexander Batalov 1128813bf0 Fix testing pointers for nulls in Sonora 2022-08-16 11:35:21 +03:00
Alexander Batalov 1f6339b3b3 Uncollapse _db_select 2022-08-16 11:25:56 +03:00
Alexander Batalov 79f5e00f6e Fix town map hotkeys 2022-08-15 00:16:36 +03:00
Alexander Batalov 957c5af66b Fix pcx extension check 2022-08-14 23:22:37 +03:00
Alexander Batalov c5c5ecd499 Fix for Jet antidote not being removed 2022-08-14 23:06:11 +03:00
Alexander Batalov df4382f2e0 Fix Silent Death bonus for critical hits 2022-08-14 22:46:28 +03:00
Alexander Batalov 8700d0c601 Remove unreferenced label 2022-08-14 22:16:48 +03:00
Alexander Batalov 27c5beea01 Fix max items quantity added via scripting 2022-08-14 22:15:13 +03:00
Alexander Batalov 52af5cfc1f Fix object search when loading game in combat mode 2022-08-14 22:07:22 +03:00
Alexander Batalov 5a47f74023 Fix base EMP damage resistance 2022-08-14 21:45:58 +03:00
Alexander Batalov c35ea77c59 Fix ammo details when examining in barter screen 2022-08-14 20:45:26 +03:00
Alexander Batalov b10c580d6f Fix displaying xp gained with Swift Learner bonus 2022-08-14 18:46:02 +03:00
Alexander Batalov 7096116296 Fix best weapon calculations 2022-08-14 17:48:59 +03:00
Alexander Batalov 330edde003 Fix radiation bugs 2022-08-14 17:30:45 +03:00
Alexander Batalov cac96bfc13 Add gender-specific text improvements (#130) 2022-08-14 13:06:51 +03:00
Alexander Batalov 31edb19379 Use English as fallback language 2022-08-14 12:52:13 +03:00
Alexander Batalov d482f0e610 Add healing items improvements (#29) 2022-08-14 12:42:18 +03:00
Alexander Batalov c3bffa6777 Increase script message lists capacity 2022-08-12 15:49:43 +03:00
Alexander Batalov 140234f40e Add game dialog fix 2022-08-12 15:03:06 +03:00
Alexander Batalov 13b76287f8 Add science/repair on critters patch 2022-08-12 14:55:36 +03:00
Alexander Batalov a55feb9301 Add custom mouse mode frms 2022-08-12 14:19:16 +03:00
Alexander Batalov d86a887cf9 Add damage mod (#29) 2022-08-12 13:54:18 +03:00
Alexander Batalov 5b2a1d13a1 Fix displaying secondary weapon mode stats 2022-08-11 14:30:06 +03:00
Alexander Batalov 1ca08cb97a Fix unarmed attack mode reset when using inventory 2022-08-11 14:12:29 +03:00
Alexander Batalov ca78b94a7d Fix sprintf warning 2022-08-11 13:41:06 +03:00
Alexander Batalov dcb53393c1 FIx opFloatMessage string arg handling
Closes #129
2022-08-11 13:34:37 +03:00
Alexander Batalov 4ece7d1188 Workaround for wrong animate_rotation usage
Closes #128
2022-08-11 13:25:43 +03:00
Alexander Batalov 87289a34c0 Add unarmed hits improvements (#29) 2022-08-10 20:46:09 +03:00
Alexander Batalov 2859410d4b Fix character selector not being reset 2022-08-08 12:04:03 +03:00
Alexander Batalov 9d53496521 Fix premade characters data freed too early 2022-08-08 11:34:36 +03:00
Alexander Batalov 4a8d5b13a8 Fix queue clearing 2022-08-08 11:01:52 +03:00
Alexander Batalov 8ba4fa309d Add shortcuts to close game windows 2022-08-07 21:49:53 +03:00
Alexander Batalov 0cab26227a Fix holodisk highlighting 2022-08-07 21:05:42 +03:00
Alexander Batalov 1694c68ebc Fix rest clickability exploit 2022-08-07 19:54:04 +03:00
Alexander Batalov 6c74c461c2 Review pipboyOpen 2022-08-07 19:03:43 +03:00
Alexander Batalov 0ec5306de5 Fix Barter button 2022-08-07 15:52:28 +03:00
Alexander Batalov ba2ae3c303 Uninline gameDialogHighlightsExit 2022-08-07 15:38:47 +03:00
Alexander Batalov 019dbbb56e Add mouse wheel support 2022-08-07 14:52:44 +03:00
Alexander Batalov a47918a83c Fix Pipboy screensaver on non-Windows platforms
Closes #115
2022-08-06 22:46:13 +03:00
Alexander Batalov 25e07fb597 Fix flags on non-door objects 2022-08-06 20:33:53 +03:00
Alexander Batalov 43ad927817 Fix dead critters reload weapons when combat ends 2022-08-06 20:12:23 +03:00
Alexander Batalov d7966cdab2 Fix updating armor class 2022-08-06 20:05:33 +03:00
Alexander Batalov 33bda1612c Fix withdrawal perk crash 2022-08-06 18:45:44 +03:00
Alexander Batalov f3eef3fe6c Fix negative Skilldex values 2022-08-06 18:21:47 +03:00
Alexander Batalov d8ae5fbd32 Fix car charging bugs 2022-08-06 17:49:24 +03:00
Alexander Batalov 02e83a1989 Fix Sharshooter bonus 2022-08-06 17:07:07 +03:00
Alexander Batalov 5c8f7c4b00 Fix negate operator 2022-08-06 16:57:43 +03:00
Alexander Batalov 3592a7232c Add town reputation improvements (#29) 2022-08-06 15:50:33 +03:00
Alexander Batalov ef067cd954 Reconcile with reference edition 2022-08-06 13:48:16 +03:00
Alexander Batalov 17382d7c7e Fix poping uninitialized pointer
Closes #113
2022-08-06 12:46:05 +03:00
Alexander Batalov 5170948588 Add explosions improvements (#29) 2022-08-05 17:43:00 +03:00
Alexander Batalov 3ccb087d20 Add burst mod (#29) 2022-08-03 17:23:24 +03:00
Alexander Batalov 3f9145b745 Remove varargs.h 2022-08-03 16:13:18 +03:00
Alexander Batalov 5b79d8ca79 Add premade characters improvements (#29) 2022-08-03 16:06:44 +03:00
Alexander Batalov 25c1eeee5c Add display monitor improvements (#29) 2022-08-03 13:54:26 +03:00
Alexander Batalov f5060c301b Add elevators improvements (#29) 2022-08-03 12:34:13 +03:00
Alexander Batalov 8a2ca4b733 Add books improvements (#29) 2022-08-02 21:52:32 +03:00
Alexander Batalov 9610de0a66 Add criticals config defaults 2022-08-02 21:04:58 +03:00
Alexander Batalov 64627ddde9 Fix sprintf_s 2022-08-02 19:46:44 +03:00
Alexander Batalov 63bcb2d009 Add critical hits improvements (#29) 2022-08-02 19:37:31 +03:00
Alexander Batalov df5bceaf2a Reconcile with reference edition 2022-08-02 13:31:26 +03:00
Alexander Batalov 66d46bd8a5 Fix skills usage slots
Closes #110
2022-08-02 12:09:33 +03:00
Alexander Batalov 28a433ea76 Fix parentesis warnings 2022-08-01 19:47:09 +03:00
Alexander Batalov 2c69834a12 Fix unequipped armor flags
Closes #108
2022-08-01 07:17:01 +03:00
Alexander Batalov 00ee53efca Fix CI branch 2022-07-31 23:06:27 +03:00
Alexander Batalov 4989cf6d5a Update CI workflow trigger events 2022-07-31 23:05:30 +03:00
Alexander Batalov 0d5aa705f0 Add activity to import game assets on Android
Fixes #105
2022-07-31 22:52:26 +03:00
Alexander Batalov 307b032118 Fix movie decoding on x64
Closes #107
2022-07-31 22:32:50 +03:00
Alexander Batalov ab8279078e Fix party member level up message
Closes #104
2022-07-31 12:09:39 +03:00
Alexander Batalov b7ac80e684 Fix floating point division
Closes #103
2022-07-31 12:03:43 +03:00
Alexander Batalov 6064a4bc79 Add Android controls (#101) 2022-07-29 20:04:37 +03:00
Alexander Batalov e41a4b8e16 Reconcile with reference edition (#100) 2022-07-29 16:04:05 +03:00
Alexander Batalov 39057fd1fb Fix missing result on stack
Closes #95
Closes #96
2022-07-27 23:22:06 +03:00
Alexander Batalov cbdb0eeba4 Make configGetInt compatible with atoi
Fixes #94
2022-07-27 10:24:45 +03:00
Alexander Batalov 73b6a16551 Fix loading save game crash on Windows 2022-07-27 10:11:33 +03:00
Alexander Batalov 42376b7172 Format workflows 2022-07-26 16:49:10 +03:00
Alexander Batalov 6a6d691b8d Fix release workflow 2022-07-26 16:34:07 +03:00
Alexander Batalov e457fc1383 Remove Android builds 2022-07-26 16:23:36 +03:00
Alexander Batalov cf844e6224 Provide release workflow for Android 2022-07-26 10:49:47 +03:00
Alexander Batalov 684d943062 Add Android support (#92) 2022-07-26 04:30:17 +03:00
Alexander Batalov 23d37621d5 Backport to OS X 10.11 (#91) 2022-07-26 00:58:02 +03:00
Alexander Batalov 8bd75e9737 Fix splitpath/makepath issues
See #68
2022-07-25 20:48:35 +03:00
Alexander Batalov 8ef9b66950 Get rid of std::filesystem
See #68
2022-07-25 20:38:11 +03:00
Alexander Batalov 8a006d2818 Rewrite fileCopy
See #68
2022-07-25 18:37:22 +03:00
Alexander Batalov a60382e044 Fix type 2022-07-25 00:02:54 +03:00
Alexander Batalov a20e2a8b50 Fix unsigned checks 2022-07-24 22:58:01 +03:00
Alexander Batalov 032969ce5b Add Apple Silicon support (#86) 2022-07-24 15:52:29 +03:00
Alexander Batalov 365805afe8 Fix opRemoveObjectFromInventory arguments order
Closes #83
2022-07-24 11:11:56 +03:00
Alexander Batalov da75a76ed9 Update macOS installation instructions 2022-07-24 09:26:45 +03:00
Alexander Batalov 757330bff4 Add pointer vs int equality check 2022-07-23 07:42:33 +03:00
Alexander Batalov f3869e0acf Fix pointer comparison
See #82
2022-07-23 07:25:39 +03:00
Alexander Batalov cee3af7cc4 Fix opAdd concatenating string and pointer
Closes #78
2022-07-22 16:43:40 +03:00
Alexander Batalov 8ab7f8493a Fix kills folder
Closes #76
2022-07-15 16:58:58 +03:00
Alexander Batalov 1e5cda5dde Update contributing notes 2022-07-13 09:20:46 +03:00
Alexander Batalov f1006d981c Update installation instructions 2022-07-12 22:10:20 +03:00
313 changed files with 42406 additions and 21996 deletions
+10 -1
View File
@@ -2,14 +2,23 @@
*.c text eol=lf
*.cc text eol=lf
*.cmake text eol=lf
*.gradle text eol=lf
*.h text eol=lf
*.md text eol=lf
*.java text eol=lf
*.json text eol=lf
*.md text eol=lf
*.plist text eol=lf
*.pro text eol=lf
*.properties text eol=lf
*.xml text eol=lf
*.yml text eol=lf
.clang-format text eol=lf
.editorconfig text eol=lf
.gitattributes text eol=lf
.gitignore text eol=lf
gradlew text eol=lf
CMakeLists.txt text eol=lf
LICENSE text eol=lf
# Force CRLF
*.bat text eol=crlf
@@ -2,19 +2,12 @@ name: Build
on:
push:
paths:
- '.github/workflows/Build.yml'
- 'src/**.cc'
- 'src/**.h'
- '**/CMakeLists.txt'
- '**/*.cmake'
branches:
- main
pull_request:
paths:
- '.github/workflows/Build.yml'
- 'src/**.cc'
- 'src/**.h'
- '**/CMakeLists.txt'
- '**/*.cmake'
types:
- opened
- synchronize
defaults:
run:
@@ -38,6 +31,95 @@ jobs:
- name: cppcheck
run: cppcheck --std=c++17 src/
android:
name: Android
runs-on: ubuntu-latest
steps:
- name: Clone
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: temurin
java-version: 11
cache: gradle
- name: Cache cmake build
uses: actions/cache@v3
with:
path: os/android/app/.cxx
key: android-cmake-v1
- name: Setup signing config
if: env.KEYSTORE_FILE_BASE64 != '' && env.KEYSTORE_PROPERTIES_FILE_BASE64 != ''
run: |
cd os/android
echo "$KEYSTORE_FILE_BASE64" | base64 --decode > debug.keystore
echo "$KEYSTORE_PROPERTIES_FILE_BASE64" | base64 --decode > debug-keystore.properties
env:
KEYSTORE_FILE_BASE64: ${{ secrets.ANDROID_DEBUG_KEYSTORE_FILE_BASE64 }}
KEYSTORE_PROPERTIES_FILE_BASE64: ${{ secrets.ANDROID_DEBUG_KEYSTORE_PROPERTIES_FILE_BASE64 }}
- name: Build
run: |
cd os/android
./gradlew assembleDebug
- name: Upload
uses: actions/upload-artifact@v3
with:
name: fallout2-ce-debug.apk
path: os/android/app/build/outputs/apk/debug/app-debug.apk
retention-days: 7
ios:
name: iOS
runs-on: macos-11
steps:
- name: Clone
uses: actions/checkout@v3
- name: Cache cmake build
uses: actions/cache@v3
with:
path: build
key: ios-cmake-v1
- name: Configure
run: |
cmake \
-B build \
-D CMAKE_BUILD_TYPE=RelWithDebInfo \
-D CMAKE_TOOLCHAIN_FILE=cmake/toolchain/ios.toolchain.cmake \
-D ENABLE_BITCODE=0 \
-D PLATFORM=OS64 \
# EOL
- name: Build
run: |
cmake \
--build build \
-j $(sysctl -n hw.physicalcpu) \
--target package \
# EOL
# TODO: Should be a part of packaging.
- name: Prepare for uploading
run: |
cp build/fallout2-ce.zip build/fallout2-ce.ipa
- name: Upload
uses: actions/upload-artifact@v3
with:
name: fallout2-ce.ipa
path: build/fallout2-ce.ipa
retention-days: 7
linux:
name: Linux (${{ matrix.arch }})
@@ -93,7 +175,10 @@ jobs:
- name: Build
run: |
cmake --build build -j $(nproc)
cmake \
--build build \
-j $(nproc) \
# EOL
- name: Upload
uses: actions/upload-artifact@v3
@@ -111,29 +196,32 @@ jobs:
- name: Clone
uses: actions/checkout@v3
- name: Dependencies
run: |
brew install sdl2
- name: Cache cmake build
uses: actions/cache@v3
with:
path: build
key: macos-cmake-v1
key: macos-cmake-v3
- name: Configure
run: |
cmake -B build -D CMAKE_BUILD_TYPE=RelWithDebInfo
cmake \
-B build \
-D CMAKE_BUILD_TYPE=RelWithDebInfo \
# EOL
- name: Build
run: |
cmake --build build -j $(sysctl -n hw.physicalcpu) --target package
cmake \
--build build \
-j $(sysctl -n hw.physicalcpu) \
--target package \
# EOL
- name: Upload
uses: actions/upload-artifact@v3
with:
name: fallout2-ce-macos.dmg
path: build/_CPack_Packages/Darwin/DragNDrop/fallout2-ce/fallout2-ce.dmg
path: build/fallout2-ce.dmg
retention-days: 7
windows:
+93 -6
View File
@@ -10,6 +10,94 @@ defaults:
shell: bash
jobs:
android:
name: Android
runs-on: ubuntu-latest
steps:
- name: Clone
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: temurin
java-version: 11
cache: gradle
- name: Cache cmake build
uses: actions/cache@v3
with:
path: os/android/app/.cxx
key: android-cmake-v1
- name: Setup signing config
if: env.KEYSTORE_FILE_BASE64 != '' && env.KEYSTORE_PROPERTIES_FILE_BASE64 != ''
run: |
cd os/android
echo "$KEYSTORE_FILE_BASE64" | base64 --decode > release.keystore
echo "$KEYSTORE_PROPERTIES_FILE_BASE64" | base64 --decode > release-keystore.properties
env:
KEYSTORE_FILE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_FILE_BASE64 }}
KEYSTORE_PROPERTIES_FILE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_PROPERTIES_FILE_BASE64 }}
- name: Build
run: |
cd os/android
./gradlew assembleRelease
- name: Upload
run: |
cd os/android/app/build/outputs/apk/release
cp app-release.apk fallout2-ce-android.apk
gh release upload ${{ github.ref_name }} fallout2-ce-android.apk
rm fallout2-ce-android.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ios:
name: iOS
runs-on: macos-11
steps:
- name: Clone
uses: actions/checkout@v3
- name: Cache cmake build
uses: actions/cache@v3
with:
path: build
key: ios-cmake-v1
- name: Configure
run: |
cmake \
-B build \
-D CMAKE_BUILD_TYPE=RelWithDebInfo \
-D CMAKE_TOOLCHAIN_FILE=cmake/toolchain/ios.toolchain.cmake \
-D ENABLE_BITCODE=0 \
-D PLATFORM=OS64 \
# EOL
- name: Build
run: |
cmake \
--build build \
-j $(sysctl -n hw.physicalcpu) \
--target package \
# EOL
- name: Upload
run: |
cd build
cp fallout2-ce.zip fallout2-ce-ios.ipa
gh release upload ${{ github.ref_name }} fallout2-ce-ios.ipa
rm fallout2-ce-ios.ipa
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
linux:
name: Linux (${{ matrix.arch }})
@@ -65,7 +153,10 @@ jobs:
- name: Build
run: |
cmake --build build -j $(nproc)
cmake \
--build build \
-j $(nproc) \
# EOL
- name: Upload
run: |
@@ -85,10 +176,6 @@ jobs:
- name: Clone
uses: actions/checkout@v3
- name: Dependencies
run: |
brew install sdl2
- name: Import code signing certificates
uses: apple-actions/import-codesign-certs@v1
with:
@@ -99,7 +186,7 @@ jobs:
uses: actions/cache@v3
with:
path: build
key: macos-cmake-v1
key: macos-cmake-v3
- name: Configure
run: |
+89 -28
View File
@@ -4,13 +4,29 @@ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(EXECUTABLE_NAME fallout2-ce)
if (APPLE)
if(IOS)
set(CMAKE_OSX_DEPLOYMENT_TARGET "11" CACHE STRING "")
set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "")
else()
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "")
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "")
endif()
endif()
project(${EXECUTABLE_NAME})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_CXX_EXTENSIONS NO)
add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
if (ANDROID)
add_library(${EXECUTABLE_NAME} SHARED)
else()
add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE)
endif()
target_sources(${EXECUTABLE_NAME} PUBLIC
"src/actions.cc"
"src/actions.h"
"src/animation.cc"
@@ -41,8 +57,6 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/combat.h"
"src/config.cc"
"src/config.h"
"src/core.cc"
"src/core.h"
"src/credits.cc"
"src/credits.h"
"src/critter.cc"
@@ -69,8 +83,6 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/display_monitor.h"
"src/draw.cc"
"src/draw.h"
"src/electronic_registration.cc"
"src/electronic_registration.h"
"src/elevator.cc"
"src/elevator.h"
"src/endgame.cc"
@@ -93,8 +105,6 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/game_mouse.h"
"src/game_movie.cc"
"src/game_movie.h"
"src/game_palette.cc"
"src/game_palette.h"
"src/game_sound.cc"
"src/game_sound.h"
"src/game_vars.h"
@@ -104,10 +114,10 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/geometry.h"
"src/graph_lib.cc"
"src/graph_lib.h"
"src/grayscale.cc"
"src/grayscale.h"
"src/heap.cc"
"src/heap.h"
"src/input.cc"
"src/input.h"
"src/interface.cc"
"src/interface.h"
"src/interpreter_extra.cc"
@@ -120,6 +130,8 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/inventory.h"
"src/item.cc"
"src/item.h"
"src/kb.cc"
"src/kb.h"
"src/light.cc"
"src/light.h"
"src/lips.cc"
@@ -142,6 +154,8 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/mmx.h"
"src/mouse_manager.cc"
"src/mouse_manager.h"
"src/mouse.cc"
"src/mouse.h"
"src/movie_effect.cc"
"src/movie_effect.h"
"src/movie_lib.cc"
@@ -159,6 +173,8 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/palette.h"
"src/party_member.cc"
"src/party_member.h"
"src/pcx.cc"
"src/pcx.h"
"src/perk_defs.h"
"src/perk.cc"
"src/perk.h"
@@ -201,6 +217,8 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/stat.h"
"src/string_parsers.cc"
"src/string_parsers.h"
"src/svga.cc"
"src/svga.h"
"src/text_font.cc"
"src/text_font.h"
"src/text_object.cc"
@@ -210,8 +228,8 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/trait_defs.h"
"src/trait.cc"
"src/trait.h"
"src/trap.cc"
"src/trap.h"
"src/vcr.cc"
"src/vcr.h"
"src/version.cc"
"src/version.h"
"src/widget.cc"
@@ -226,8 +244,8 @@ add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE
"src/window.h"
"src/word_wrap.cc"
"src/word_wrap.h"
"src/world_map.cc"
"src/world_map.h"
"src/worldmap.cc"
"src/worldmap.h"
"src/xfile.cc"
"src/xfile.h"
)
@@ -241,10 +259,25 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
"src/platform_compat.h"
"src/pointer_registry.cc"
"src/pointer_registry.h"
"src/settings.cc"
"src/settings.h"
"src/sfall_config.cc"
"src/sfall_config.h"
"src/sfall_global_vars.cc"
"src/sfall_global_vars.h"
"src/sfall_lists.cc"
"src/sfall_lists.h"
"src/sfall_opcodes.cc"
"src/sfall_opcodes.h"
)
if(IOS)
target_sources(${EXECUTABLE_NAME} PUBLIC
"src/platform/ios/paths.h"
"src/platform/ios/paths.mm"
)
endif()
if(WIN32)
target_compile_definitions(${EXECUTABLE_NAME} PUBLIC
_CRT_SECURE_NO_WARNINGS
@@ -263,19 +296,39 @@ if(WIN32)
)
endif()
if (WIN32)
target_sources(${EXECUTABLE_NAME} PUBLIC
"os/windows/fallout2-ce.ico"
"os/windows/fallout2-ce.rc"
)
endif()
if(APPLE)
set_target_properties(${EXECUTABLE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/os/macos/Info.plist")
target_sources(${EXECUTABLE_NAME} PUBLIC "os/macos/fallout2-ce.icns")
set_source_files_properties("os/macos/fallout2-ce.icns" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
if(IOS)
target_sources(${EXECUTABLE_NAME} PUBLIC "os/ios/LaunchScreen.storyboard")
set_source_files_properties("os/ios/LaunchScreen.storyboard" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
set_target_properties(${EXECUTABLE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/os/ios/Info.plist")
set_target_properties(${EXECUTABLE_NAME} PROPERTIES XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2")
else()
set_target_properties(${EXECUTABLE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/os/macos/Info.plist")
endif()
set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.alexbatalov.fallout2-ce")
set(MACOSX_BUNDLE_BUNDLE_NAME "${EXECUTABLE_NAME}")
set(MACOSX_BUNDLE_ICON_FILE "fallout2-ce.icns")
set(MACOSX_BUNDLE_DISPLAY_NAME "Fallout 2")
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.2.0")
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.2.0")
endif()
add_subdirectory("third_party/fpattern")
target_link_libraries(${EXECUTABLE_NAME} ${FPATTERN_LIBRARY})
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${FPATTERN_INCLUDE_DIR})
if(NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_subdirectory("third_party/zlib")
add_subdirectory("third_party/sdl2")
else()
@@ -290,23 +343,31 @@ target_link_libraries(${EXECUTABLE_NAME} ${SDL2_LIBRARIES})
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
if(APPLE)
install(TARGETS ${EXECUTABLE_NAME} DESTINATION .)
install(CODE "
include(BundleUtilities)
fixup_bundle(${CMAKE_BINARY_DIR}/${MACOSX_BUNDLE_BUNDLE_NAME}.app \"\" \"\")
"
COMPONENT Runtime)
if(IOS)
install(TARGETS ${EXECUTABLE_NAME} DESTINATION "Payload")
if (CPACK_BUNDLE_APPLE_CERT_APP)
set(CPACK_GENERATOR "ZIP")
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
set(CPACK_PACKAGE_FILE_NAME "fallout2-ce")
else()
install(TARGETS ${EXECUTABLE_NAME} DESTINATION .)
install(CODE "
execute_process(COMMAND codesign --deep --force --options runtime --sign \"${CPACK_BUNDLE_APPLE_CERT_APP}\" ${CMAKE_BINARY_DIR}/${MACOSX_BUNDLE_BUNDLE_NAME}.app)
include(BundleUtilities)
fixup_bundle(${CMAKE_BINARY_DIR}/${MACOSX_BUNDLE_BUNDLE_NAME}.app \"\" \"\")
"
COMPONENT Runtime)
endif()
set(CPACK_GENERATOR "DragNDrop")
set(CPACK_DMG_DISABLE_APPLICATIONS_SYMLINK ON)
set(CPACK_PACKAGE_FILE_NAME "fallout2-ce")
if (CPACK_BUNDLE_APPLE_CERT_APP)
install(CODE "
execute_process(COMMAND codesign --deep --force --options runtime --sign \"${CPACK_BUNDLE_APPLE_CERT_APP}\" ${CMAKE_BINARY_DIR}/${MACOSX_BUNDLE_BUNDLE_NAME}.app)
"
COMPONENT Runtime)
endif()
set(CPACK_GENERATOR "DragNDrop")
set(CPACK_DMG_DISABLE_APPLICATIONS_SYMLINK ON)
set(CPACK_PACKAGE_FILE_NAME "fallout2-ce")
endif()
include(CPack)
endif()
+51
View File
@@ -0,0 +1,51 @@
# Sustainable Use License
Version 1.0
## Acceptance
By using the software, you agree to all of the terms and conditions below.
## Copyright License
The licensor grants you a non-exclusive, royalty-free, worldwide, non-sublicensable, non-transferable license to use, copy, distribute, make available, and prepare derivative works of the software, in each case subject to the limitations below.
## Limitations
You may use or modify the software only for your own internal business purposes or for non-commercial or personal use. You may distribute the software or provide it to others only if you do so free of charge for non-commercial purposes. You may not alter, remove, or obscure any licensing, copyright, or other notices of the licensor in the software. Any use of the licensors trademarks is subject to applicable law.
## Patents
The licensor grants you a license, under any patent claims the licensor can license, or becomes able to license, to make, have made, use, sell, offer for sale, import and have imported the software, in each case subject to the limitations and conditions in this license. This license does not cover any patent claims that you cause to be infringed by modifications or additions to the software. If you or your company make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
## Notices
You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms. If you modify the software, you must include in any modified copies of the software a prominent notice stating that you have modified the software.
## No Other Rights
These terms do not imply any licenses other than those expressly granted in these terms.
## Termination
If you use the software in violation of these terms, such use is not licensed, and your license will automatically terminate. If the licensor provides you with a notice of your violation, and you cease all violation of this license no later than 30 days after you receive that notice, your license will be reinstated retroactively. However, if you violate these terms after such reinstatement, any additional violation of these terms will cause your license to terminate automatically and permanently.
## No Liability
As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.
## Definitions
The "licensor" is the entity offering these terms.
The "software" is the software the licensor makes available under these terms, including any portion of it.
"You" refers to the individual or entity agreeing to these terms.
"Your company" is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. Control means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
"Your license" is the license granted to you for the software under these terms.
"Use" means anything you do with the software requiring your license.
"Trademark" means trademarks, service marks, and similar rights.
+25 -24
View File
@@ -2,7 +2,7 @@
## Installation
You must own the game to play. Purchase your copy on [GOG](https://www.gog.com/game/fallout_2) or [Steam](https://store.steampowered.com/app/38410). Download latest build or build from source.
You must own the game to play. Purchase your copy on [GOG](https://www.gog.com/game/fallout_2) or [Steam](https://store.steampowered.com/app/38410). Download latest release or build from source.
### Windows
@@ -14,12 +14,6 @@ Download and copy `fallout2-ce.exe` to your `Fallout2` folder. It serves as a dr
- Download and copy `fallout2-ce` to this folder.
- Fix permissions (GitHub artifacts issue):
```console
$ chmod a+x /home/john/Desktop/Fallout2/fallout2-ce
```
- Install [SDL2](https://libsdl.org/download-2.0.php):
```console
@@ -30,37 +24,44 @@ $ sudo apt install libsdl2-2.0-0
### macOS
> **NOTE**: macOS 11 or higher is required. The app is not universal. It should run on Apple Silicon under Rosetta 2, but I haven't tried it. The app is neither signed, nor notarized.
> **NOTE**: macOS 10.11 (El Capitan) or higher is required. Runs natively on Intel-based Macs and Apple Silicon.
- Use Windows installation as a base - it contains data assets needed to play. Copy `Fallout2` folder somewhere, for example `/Applications/Fallout2`.
- Alternatively you can use Fallout 2 from Macplay/The Omni Group as a base - you need to extract game assets from the original bundle. Mount CD/DMG, right click `Fallout 2` -> `Show Package Contents`, navigate to `Contents/Resources`. Copy `GameData` folder somewhere, for example `/Applications/Fallout2`.
- Download and copy `fallout2-ce.app` to this folder.
- Run `fallout2-ce.app`.
- When running for the first time, macOS will complain that the app is not signed and you'll be present two options - `Move to bin`, and `Cancel`. Click `Cancel`, open `System Preferences`, go to `Security & Privacy`. The pane at the bottom will say `fallout2-ce was blocked from use because it is not from an identified developer`. Click `Open Anyway`. Confirm once again. Alternatively you can remove quarantine attribute from terminal:
### Android
```console
$ xattr -d com.apple.quarantine /Applications/Fallout2/fallout2-ce.app
```
> **NOTE**: Fallout 2 was designed with mouse in mind. There are many controls that require precise cursor positioning, which is not possible with fingers. When playing on Android you'll use fingers to move mouse cursor, not a character, or a map. Double tap to "click" left mouse button in the current cursor position, triple tap to "click" right mouse button. It might feel awkward at first, but it's super handy - you can play with just a thumb. This is not set in stone and might change in the future.
- Use Windows installation as a base - it contains data assets needed to play. Copy `Fallout2` folder to your device, for example to `Downloads`. You need `master.dat`, `critter.dat`, `patch000.dat`, and `data` folder.
- Download `fallout2-ce.apk` and copy it to your device. Open it with file explorer, follow instructions (install from unknown source).
- When you run the game for the first time it will immediately present file picker. Select the folder from the first step. Wait until this data is copied. A loading dialog will appear, just wait for about 30 seconds. The game will start automatically.
### iOS
> **NOTE**: See Android note on controls.
- Download `fallout2-ce.ipa`. Use sideloading applications ([AltStore](https://altstore.io/) or [Sideloadly](https://sideloadly.io/)) to install it to your device. Alternatively you can always build from source with your own signing certificate.
- Run the game once. You'll see error message saying "Couldn't find/load text fonts". This step is needed for iOS to expose the game via File Sharing feature.
- Use Finder (macOS Catalina and later) or iTunes (Windows and macOS Mojave or earlier) to copy `master.dat`, `critter.dat`, `patch000.dat`, and `data` folder to "Fallout 2" app ([how-to](https://support.apple.com/HT210598)).
## Contributing
For now there are three major areas.
Integrating Sfall goodies is the top priority. Quality of life updates are OK too. Please no large scale refactorings at this time as we need to reconcile changes from Reference Edition, which will make this process slow and error-prone. In any case open up an issue with your suggestion or to notify other people that something is being worked on.
### Intergrating Sfall
There are literally hundreds if not thousands of fixes and features in sfall. I guess not all of them are needed in Community Edition, but for the sake of compatibility with big mods out there, let's integrate them all.
### SDL
## License
Migrate DirectX stuff to SDL. This is the shortest path to native Linux version.
### Prepare to 64-bit
Modern macOS requires apps to be 64-bit, so even if we have SDL, the scripting part of the game will not work, because of builtin SSL interpreter. It stores pointers (both functions and variables) as 32-bit integers, so 64-bit pointers will not fit into stack. Since the stack is shared for both instructions and data, it needs some attention.
## Legal & License
See [Fallout 2 Reference Edition](https://github.com/alexbatalov/fallout2-re). Same conditions apply until the source code in this repository is changed significantly.
The source code is this repository is available under the [Sustainable Use License](LICENSE.md).
File diff suppressed because it is too large Load Diff
+13
View File
@@ -0,0 +1,13 @@
*.iml
.gradle
/.idea/assetWizardSettings.xml
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/navEditor.xml
/.idea/workspace.xml
/local.properties
/debug-keystore.properties
/debug.keystore
/release-keystore.properties
/release.keystore
+5
View File
@@ -0,0 +1,5 @@
/.cxx
/build
# TODO: Cleanup root .gitignore
!/src/debug
+100
View File
@@ -0,0 +1,100 @@
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId 'com.alexbatalov.fallout2ce'
minSdk 21
targetSdk 32
versionCode 3
versionName '1.2.0'
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_static'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
// TODO: Remove once format issues are resolved.
cppFlags '-Wno-format-security'
// Specify target library explicitly as there is a shared zlib,
// that we don't need to be linked in.
targets 'fallout2-ce'
}
}
}
signingConfigs {
// Override default debug signing config to make sure every CI runner
// uses the same key for painless updates.
def debugKeystorePropertiesFile = rootProject.file('debug-keystore.properties')
if (debugKeystorePropertiesFile.exists()) {
def debugKeystoreProperties = new Properties()
debugKeystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile))
debug {
storeFile rootProject.file(debugKeystoreProperties.getProperty('storeFile'))
storePassword debugKeystoreProperties.getProperty('storePassword')
keyAlias debugKeystoreProperties.getProperty('keyAlias')
keyPassword debugKeystoreProperties.getProperty('keyPassword')
}
}
def releaseKeystoreProperties = new Properties()
def releaseKeystorePropertiesFile = rootProject.file('release-keystore.properties')
if (releaseKeystorePropertiesFile.exists()) {
releaseKeystoreProperties.load(new FileInputStream(releaseKeystorePropertiesFile))
release {
storeFile rootProject.file(releaseKeystoreProperties.getProperty('storeFile'))
storePassword releaseKeystoreProperties.getProperty('storePassword')
keyAlias releaseKeystoreProperties.getProperty('keyAlias')
keyPassword releaseKeystoreProperties.getProperty('keyPassword')
}
}
}
buildTypes {
debug {
// Prevents signing keys clashes between debug and release versions
// for painless development.
applicationIdSuffix '.debug'
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// Release signing config is optional and might not be present in CI
// builds, hence `findByName`.
signingConfig signingConfigs.findByName('release')
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
applicationVariants.all { variant ->
tasks["merge${variant.name.capitalize()}Assets"]
.dependsOn("externalNativeBuild${variant.name.capitalize()}")
}
if (!project.hasProperty('EXCLUDE_NATIVE_LIBS')) {
sourceSets.main {
jniLibs.srcDir 'libs'
}
externalNativeBuild {
cmake {
path '../../../CMakeLists.txt'
}
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.documentfile:documentfile:1.0.1'
}
+21
View File
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
@@ -0,0 +1,3 @@
<resources>
<string name="app_name">Fallout 2 (Debug)</string>
</resources>
+102
View File
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alexbatalov.fallout2ce"
android:versionCode="1"
android:versionName="1.0.0"
android:installLocation="auto">
<!-- OpenGL ES 2.0 -->
<uses-feature android:glEsVersion="0x00020000" />
<!-- Touchscreen support -->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<!-- Game controller support -->
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-feature
android:name="android.hardware.gamepad"
android:required="false" />
<uses-feature
android:name="android.hardware.usb.host"
android:required="false" />
<!-- External mouse input events -->
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />
<!-- Audio recording support -->
<!-- if you want to capture audio, uncomment this. -->
<!-- <uses-feature
android:name="android.hardware.microphone"
android:required="false" /> -->
<!-- Allow downloading to the external storage on Android 5.1 and older -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="22" />
<!-- Allow access to Bluetooth devices -->
<!-- Currently this is just for Steam Controller support and requires setting SDL_HINT_JOYSTICK_HIDAPI_STEAM -->
<!-- <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> -->
<!-- <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> -->
<!-- Allow access to the vibrator -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- if you want to capture audio, uncomment this. -->
<!-- <uses-permission android:name="android.permission.RECORD_AUDIO" /> -->
<!-- Create a Java class extending SDLActivity and place it in a
directory under app/src/main/java matching the package, e.g. app/src/main/java/com/gamemaker/game/MyGame.java
then replace "SDLActivity" with the name of your class (e.g. "MyGame")
in the XML below.
An example Java class can be found in README-android.md
-->
<application android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:hardwareAccelerated="true" >
<!-- Example of setting SDL hints from AndroidManifest.xml:
<meta-data android:name="SDL_ENV.SDL_ACCELEROMETER_AS_JOYSTICK" android:value="0"/>
-->
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:alwaysRetainTaskState="true"
android:launchMode="singleInstance"
android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:preferMinimalPostProcessing="true"
android:exported="true"
android:screenOrientation="landscape"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Let Android know that we can handle some USB devices and should receive this event -->
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<!-- Drop file event -->
<!--
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
-->
</activity>
<activity android:name=".ImportActivity"
android:theme="@style/AppTheme">
</activity>
</application>
</manifest>
@@ -0,0 +1,56 @@
package com.alexbatalov.fallout2ce;
import android.content.ContentResolver;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileUtils {
static boolean copyRecursively(ContentResolver contentResolver, DocumentFile src, File dest) {
final DocumentFile[] documentFiles = src.listFiles();
for (final DocumentFile documentFile : documentFiles) {
if (documentFile.isFile()) {
if (!copyFile(contentResolver, documentFile, new File(dest, documentFile.getName()))) {
return false;
}
} else if (documentFile.isDirectory()) {
final File subdirectory = new File(dest, documentFile.getName());
if (!subdirectory.exists()) {
subdirectory.mkdir();
}
if (!copyRecursively(contentResolver, documentFile, subdirectory)) {
return false;
}
}
}
return true;
}
private static boolean copyFile(ContentResolver contentResolver, DocumentFile src, File dest) {
try {
final InputStream inputStream = contentResolver.openInputStream(src.getUri());
final OutputStream outputStream = new FileOutputStream(dest);
final byte[] buffer = new byte[16384];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
}
@@ -0,0 +1,74 @@
package com.alexbatalov.fallout2ce;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
public class ImportActivity extends Activity {
private static final int IMPORT_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, IMPORT_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == IMPORT_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
final Uri treeUri = resultData.getData();
if (treeUri != null) {
final DocumentFile treeDocument = DocumentFile.fromTreeUri(this, treeUri);
if (treeDocument != null) {
copyFiles(treeDocument);
return;
}
}
}
finish();
} else {
super.onActivityResult(requestCode, resultCode, resultData);
}
}
private void copyFiles(DocumentFile treeDocument) {
ProgressDialog dialog = createProgressDialog();
dialog.show();
new Thread(() -> {
ContentResolver contentResolver = getContentResolver();
File externalFilesDir = getExternalFilesDir(null);
FileUtils.copyRecursively(contentResolver, treeDocument, externalFilesDir);
startMainActivity();
dialog.dismiss();
finish();
}).start();
}
private void startMainActivity() {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
private ProgressDialog createProgressDialog() {
ProgressDialog progressDialog = new ProgressDialog(this,
android.R.style.Theme_Material_Light_Dialog);
progressDialog.setTitle(R.string.loading_dialog_title);
progressDialog.setMessage(getString(R.string.loading_dialog_message));
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setCancelable(false);
return progressDialog;
}
}
@@ -0,0 +1,50 @@
package com.alexbatalov.fallout2ce;
import android.content.Intent;
import android.os.Bundle;
import org.libsdl.app.SDLActivity;
import java.io.File;
public class MainActivity extends SDLActivity {
private boolean noExit = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final File externalFilesDir = getExternalFilesDir(null);
final File configFile = new File(externalFilesDir, "fallout2.cfg");
if (!configFile.exists()) {
final File masterDatFile = new File(externalFilesDir, "master.dat");
final File critterDatFile = new File(externalFilesDir, "critter.dat");
if (!masterDatFile.exists() || !critterDatFile.exists()) {
final Intent intent = new Intent(this, ImportActivity.class);
startActivity(intent);
noExit = true;
finish();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (!noExit) {
// Needed to make sure libc calls exit handlers, which releases
// in-game resources.
System.exit(0);
}
}
@Override
protected String[] getLibraries() {
return new String[]{
"fallout2-ce",
};
}
}
@@ -0,0 +1,22 @@
package org.libsdl.app;
import android.hardware.usb.UsbDevice;
interface HIDDevice
{
public int getId();
public int getVendorId();
public int getProductId();
public String getSerialNumber();
public int getVersion();
public String getManufacturerName();
public String getProductName();
public UsbDevice getDevice();
public boolean open();
public int sendFeatureReport(byte[] report);
public int sendOutputReport(byte[] report);
public boolean getFeatureReport(byte[] report);
public void setFrozen(boolean frozen);
public void close();
public void shutdown();
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,309 @@
package org.libsdl.app;
import android.hardware.usb.*;
import android.os.Build;
import android.util.Log;
import java.util.Arrays;
class HIDDeviceUSB implements HIDDevice {
private static final String TAG = "hidapi";
protected HIDDeviceManager mManager;
protected UsbDevice mDevice;
protected int mInterfaceIndex;
protected int mInterface;
protected int mDeviceId;
protected UsbDeviceConnection mConnection;
protected UsbEndpoint mInputEndpoint;
protected UsbEndpoint mOutputEndpoint;
protected InputThread mInputThread;
protected boolean mRunning;
protected boolean mFrozen;
public HIDDeviceUSB(HIDDeviceManager manager, UsbDevice usbDevice, int interface_index) {
mManager = manager;
mDevice = usbDevice;
mInterfaceIndex = interface_index;
mInterface = mDevice.getInterface(mInterfaceIndex).getId();
mDeviceId = manager.getDeviceIDForIdentifier(getIdentifier());
mRunning = false;
}
public String getIdentifier() {
return String.format("%s/%x/%x/%d", mDevice.getDeviceName(), mDevice.getVendorId(), mDevice.getProductId(), mInterfaceIndex);
}
@Override
public int getId() {
return mDeviceId;
}
@Override
public int getVendorId() {
return mDevice.getVendorId();
}
@Override
public int getProductId() {
return mDevice.getProductId();
}
@Override
public String getSerialNumber() {
String result = null;
if (Build.VERSION.SDK_INT >= 21) {
try {
result = mDevice.getSerialNumber();
}
catch (SecurityException exception) {
//Log.w(TAG, "App permissions mean we cannot get serial number for device " + getDeviceName() + " message: " + exception.getMessage());
}
}
if (result == null) {
result = "";
}
return result;
}
@Override
public int getVersion() {
return 0;
}
@Override
public String getManufacturerName() {
String result = null;
if (Build.VERSION.SDK_INT >= 21) {
result = mDevice.getManufacturerName();
}
if (result == null) {
result = String.format("%x", getVendorId());
}
return result;
}
@Override
public String getProductName() {
String result = null;
if (Build.VERSION.SDK_INT >= 21) {
result = mDevice.getProductName();
}
if (result == null) {
result = String.format("%x", getProductId());
}
return result;
}
@Override
public UsbDevice getDevice() {
return mDevice;
}
public String getDeviceName() {
return getManufacturerName() + " " + getProductName() + "(0x" + String.format("%x", getVendorId()) + "/0x" + String.format("%x", getProductId()) + ")";
}
@Override
public boolean open() {
mConnection = mManager.getUSBManager().openDevice(mDevice);
if (mConnection == null) {
Log.w(TAG, "Unable to open USB device " + getDeviceName());
return false;
}
// Force claim our interface
UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
if (!mConnection.claimInterface(iface, true)) {
Log.w(TAG, "Failed to claim interfaces on USB device " + getDeviceName());
close();
return false;
}
// Find the endpoints
for (int j = 0; j < iface.getEndpointCount(); j++) {
UsbEndpoint endpt = iface.getEndpoint(j);
switch (endpt.getDirection()) {
case UsbConstants.USB_DIR_IN:
if (mInputEndpoint == null) {
mInputEndpoint = endpt;
}
break;
case UsbConstants.USB_DIR_OUT:
if (mOutputEndpoint == null) {
mOutputEndpoint = endpt;
}
break;
}
}
// Make sure the required endpoints were present
if (mInputEndpoint == null || mOutputEndpoint == null) {
Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName());
close();
return false;
}
// Start listening for input
mRunning = true;
mInputThread = new InputThread();
mInputThread.start();
return true;
}
@Override
public int sendFeatureReport(byte[] report) {
int res = -1;
int offset = 0;
int length = report.length;
boolean skipped_report_id = false;
byte report_number = report[0];
if (report_number == 0x0) {
++offset;
--length;
skipped_report_id = true;
}
res = mConnection.controlTransfer(
UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_OUT,
0x09/*HID set_report*/,
(3/*HID feature*/ << 8) | report_number,
mInterface,
report, offset, length,
1000/*timeout millis*/);
if (res < 0) {
Log.w(TAG, "sendFeatureReport() returned " + res + " on device " + getDeviceName());
return -1;
}
if (skipped_report_id) {
++length;
}
return length;
}
@Override
public int sendOutputReport(byte[] report) {
int r = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000);
if (r != report.length) {
Log.w(TAG, "sendOutputReport() returned " + r + " on device " + getDeviceName());
}
return r;
}
@Override
public boolean getFeatureReport(byte[] report) {
int res = -1;
int offset = 0;
int length = report.length;
boolean skipped_report_id = false;
byte report_number = report[0];
if (report_number == 0x0) {
/* Offset the return buffer by 1, so that the report ID
will remain in byte 0. */
++offset;
--length;
skipped_report_id = true;
}
res = mConnection.controlTransfer(
UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_IN,
0x01/*HID get_report*/,
(3/*HID feature*/ << 8) | report_number,
mInterface,
report, offset, length,
1000/*timeout millis*/);
if (res < 0) {
Log.w(TAG, "getFeatureReport() returned " + res + " on device " + getDeviceName());
return false;
}
if (skipped_report_id) {
++res;
++length;
}
byte[] data;
if (res == length) {
data = report;
} else {
data = Arrays.copyOfRange(report, 0, res);
}
mManager.HIDDeviceFeatureReport(mDeviceId, data);
return true;
}
@Override
public void close() {
mRunning = false;
if (mInputThread != null) {
while (mInputThread.isAlive()) {
mInputThread.interrupt();
try {
mInputThread.join();
} catch (InterruptedException e) {
// Keep trying until we're done
}
}
mInputThread = null;
}
if (mConnection != null) {
UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
mConnection.releaseInterface(iface);
mConnection.close();
mConnection = null;
}
}
@Override
public void shutdown() {
close();
mManager = null;
}
@Override
public void setFrozen(boolean frozen) {
mFrozen = frozen;
}
protected class InputThread extends Thread {
@Override
public void run() {
int packetSize = mInputEndpoint.getMaxPacketSize();
byte[] packet = new byte[packetSize];
while (mRunning) {
int r;
try
{
r = mConnection.bulkTransfer(mInputEndpoint, packet, packetSize, 1000);
}
catch (Exception e)
{
Log.v(TAG, "Exception in UsbDeviceConnection bulktransfer: " + e);
break;
}
if (r < 0) {
// Could be a timeout or an I/O error
}
if (r > 0) {
byte[] data;
if (r == packetSize) {
data = packet;
} else {
data = Arrays.copyOfRange(packet, 0, r);
}
if (!mFrozen) {
mManager.HIDDeviceInputReport(mDeviceId, data);
}
}
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More