Compare commits

..

1 Commits

Author SHA1 Message Date
Axle1975 71332d38db Add 4.4 engine files
2 years ago

21
.gitattributes vendored

@ -3,27 +3,18 @@ TA_Features_2013.ccx filter=lfs diff=lfs merge=lfs -text
ProTA.gp3 filter=lfs diff=lfs merge=lfs -text ProTA.gp3 filter=lfs diff=lfs merge=lfs -text
TotalA.exe filter=lfs diff=lfs merge=lfs -text TotalA.exe filter=lfs diff=lfs merge=lfs -text
TADEMO.UFO filter=lfs diff=lfs merge=lfs -text TADEMO.UFO filter=lfs diff=lfs merge=lfs -text
Shaders/shader-package.zip filter=lfs diff=lfs merge=lfs -text TADemo/3DTA.exe filter=lfs diff=lfs merge=lfs -text
TADemo/3DTAConfig.exe filter=lfs diff=lfs merge=lfs -text TADemo/3DTAConfig.exe filter=lfs diff=lfs merge=lfs -text
TADemo/HPIUtil.dll filter=lfs diff=lfs merge=lfs -text
TADemo/bagge.fnt filter=lfs diff=lfs merge=lfs -text TADemo/bagge.fnt filter=lfs diff=lfs merge=lfs -text
TADemo/bitmaps/gran.bmp filter=lfs diff=lfs merge=lfs -text TADemo/bitmaps/gran.bmp filter=lfs diff=lfs merge=lfs -text
TADemo/bitmaps/gran2.bmp filter=lfs diff=lfs merge=lfs -text TADemo/bitmaps/gran2.bmp filter=lfs diff=lfs merge=lfs -text
TADemo/3DTA.exe filter=lfs diff=lfs merge=lfs -text TADemo/HPIUtil.dll filter=lfs diff=lfs merge=lfs -text
TADemo/SERVER.EXE filter=lfs diff=lfs merge=lfs -text
TADemo/bitmaps/detailtex.jpg filter=lfs diff=lfs merge=lfs -text TADemo/bitmaps/detailtex.jpg filter=lfs diff=lfs merge=lfs -text
TADemo/bitmaps/ocean.jpg filter=lfs diff=lfs merge=lfs -text TADemo/bitmaps/ocean.jpg filter=lfs diff=lfs merge=lfs -text
TADemo/SERVER.EXE filter=lfs diff=lfs merge=lfs -text Viewer.exe filter=lfs diff=lfs merge=lfs -text
bass.dll filter=lfs diff=lfs merge=lfs -text
basscd.dll filter=lfs diff=lfs merge=lfs -text
basswasapi.dll filter=lfs diff=lfs merge=lfs -text
ddraw.dll filter=lfs diff=lfs merge=lfs -text
tmusi.dll filter=lfs diff=lfs merge=lfs -text
win32.dll filter=lfs diff=lfs merge=lfs -text
audiere.dll filter=lfs diff=lfs merge=lfs -text audiere.dll filter=lfs diff=lfs merge=lfs -text
bassflac.dll filter=lfs diff=lfs merge=lfs -text pdraw.dll filter=lfs diff=lfs merge=lfs -text
bassmix.dll filter=lfs diff=lfs merge=lfs -text
dplayx.dll filter=lfs diff=lfs merge=lfs -text
tdraw.dll filter=lfs diff=lfs merge=lfs -text tdraw.dll filter=lfs diff=lfs merge=lfs -text
tmusi.dll filter=lfs diff=lfs merge=lfs -text
tplayx.dll filter=lfs diff=lfs merge=lfs -text tplayx.dll filter=lfs diff=lfs merge=lfs -text
wgmus.dll filter=lfs diff=lfs merge=lfs -text
cnc-ddraw[[:space:]]config.exe filter=lfs diff=lfs merge=lfs -text

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -2,12 +2,12 @@
[Option] ; General Settings [Option] ; General Settings
FillColor=34; ; The color that will be replaced by the player color FillColor=245; ; The color that will be replaced by the player color
TransparentColor=9; ; The color that will be replaced by transparency TransparentColor=9; ; The color that will be replaced by transparency
SelectedColor=255; ; The color that will be shown only when the unit is selected SelectedColor=255; ; The color that will be shown only when the unit is selected
HoverColor=84; ; The color that will show when the icon is hovered on HoverColor=84; ; The color that will show when the icon is hovered on
UseCircleHover=TRUE; ; Enable or disable a drawn ring when hovered on, disabled by default UseCircleHover=TRUE; ; Enable or disable a drawn ring when hovered on, disabled by default
UseDefaultIcon=FALSE; ; Enable to use default icons, disable to use custom icons UseDefaultIcon=TRUE; ; Enable to use default icons, disable to use custom icons
[ICON] ; Custom Icons [ICON] ; Custom Icons
@ -20,35 +20,4 @@ NukeIcon=NUKEICON.pcx;
; A disabled example of the syntax is provided below ; A disabled example of the syntax is provided below
; In the example, any unit with KBOT as a category will use KBOT.pcx as the icon (not provided) ; In the example, any unit with KBOT as a category will use KBOT.pcx as the icon (not provided)
;KBOT=KBOT.pcx ;KBOT=KBOT.pcx
AIR=AIR.PCX
AIRCONS=AIRCONS.PCX
AIRFAC=AIRFAC.PCX
BUILDING=BUILDING.PCX
EXP=EXP.PCX
EXPFAC=EXPFAC.PCX
HOVER=HOVER.PCX
HOVCONS=HOVCONS.PCX
HOVFAC=HOVFAC.PCX
KBOT=KBOT.PCX
KBOTCONS=KBOTCONS.PCX
KBOTFAC=KBOTFAC.PCX
MINE=MINE.PCX
SHIP=SHIP.PCX
SHIPCONS=SHIPCONS.PCX
SHIPFAC=SHIPFAC.PCX
SUB=SUB.PCX
SUBCONS=SUBCONS.PCX
VEHICLE=VEHICLE.PCX
VEHCONS=VEHCONS.PCX
VEHFAC=VEHFAC.PCX

Binary file not shown.

Binary file not shown.

@ -1,79 +0,0 @@
# TA Demo Recorder and Community Patch
## LICENSE
### TA Community Patch (original filename: tdraw.dll; source directory: src/DDRaw)
The MIT License (MIT)
Copyright (c) 2023 Axle1975, FunkyFr3sh
Copyright (c) 2019 Xpoy
Copyright (c) 2003 SJ, Yeha
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
### TA Demo Recorder (original filename: tplayx.dll; source directory: src/Recorder)
The MIT License (MIT)
Copyright (c) 2015 Rime
Copyright (c) 2003 SJ, Yeha
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
### TA Demo Replayer (original filename: SERVER.EXE, source directory: src/Server)
The MIT License (MIT)
Copyright (c) 2015 Chaos
Copyright (c) 2003 Fnordia
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -235,7 +235,7 @@ Arm Maverick:
Arm Shooter: Arm Shooter:
Reduced health (1250->960) Reduced health (1250->960)
Reduced turn rate (1216->608) Reduced turn rate (1216->608)
Reduced torso aiming rate (210->105) Reduced torse aiming rate (210->105)
Core Sumo: Core Sumo:
Increased build time (14268->15365) Increased build time (14268->15365)

@ -1,361 +0,0 @@
ProTA 4.5 changelog (test version)
------------------------------------
GUI notes:
- Edited title screen
- Edited build menu side panel
- Fixed campaign build menu glitches
- Re-enabled unit limit slider in battleroom
Gameplay notes:
- Fixed campaign AI not building
- Fixed Core Mission 1, now has 1080p support
- Added missing special damages for seaplanes to Phoenix/Hurricane's laser
- Added missing special damages for seaplanes to Krogoth's rocket
- Fixed Core Adv Kbot Lab yardmap to allow units to leave from the sides better
- Improved Arm Hammer delay before firing
- Added .exe hacks:
- Fix "Necro: Resurrection failed" misspelling
- Prevent reclaiming feature sound from looping until finished (only plays it once)
- Correct the reclaim sound when VTOL starts reclaiming a unit
- Always show all player data at final scoreboard, even if they left
- Allow AI to build and fire nukes/anti nukes
- Prevent AI from infinitely queueing stockpile weapons
- Allow AI to turn off any energy-hungry appliances when energy is low
- Increase number of build units (labs + construction + Commander himself) before AI Commanders go into repair patrol mode, from 5 to 10
Other notes:
- CnC-DDraw 5.1.0.0 by FunkyFr3sh included in install
- WGMUS 0.0.17 by MnHebi included in install
- Moved CTRL+F2 menu to Settings.ini and ChatMacro.ini
Commanders
------------------------------------
Arm Commander:
Increased death explosion AOE (550->580)
Core Commander:
Increased death explosion AOE (550->580)
Buildings
------------------------------------
Arm Metal Storage:
Reduced metal cost (320->256)
Core Metal Storage:
Reduced metal cost (305->244)
Arm Hovercraft Platform:
Reduced energy cost (3166->2111)
Reduced metal cost (1364->1254)
Core Hovercraft Platform:
Reduced energy cost (3252->2168)
Reduced metal cost (1327->1210)
Arm Underwater Metal Extractor:
Reduced energy cost (1037->881)
Reduced metal cost (100->91)
Reduced health (330->280)
Core Underwater Metal Extractor:
Reduced build time (4587->4357)
Reduced energy cost (1059->900)
Reduced metal cost (95->87)
Reduced health (355->275)
Arm Underwater Metal Storage:
Reduced metal cost (360->288)
Core Underwater Metal Storage:
Reduced metal cost (350->280)
Arm Sentinel:
Increased health (1200->1250)
Reduced range (550->500)
Core Gaat Gun:
Increased health (1230->1280)
Reduced range (550->500)
Kbots
------------------------------------
Arm Construction Kbot:
Increased build time (3358->3638)
Core Construction Kbot:
Increased build time (3490->3782)
Arm Rocko:
Removed guidance
Core Storm:
Removed guidance
Vehicles
------------------------------------
Arm Jeffy:
Increased aim speed (90->180)
Core Weasel:
Increased aim speed (90->180)
Aircraft
------------------------------------
Arm Thunder:
Reduced speed (9->8.6)
Increased attack run length (120->160)
Hovercraft
------------------------------------
Arm Construction Hovercraft:
Reduced energy cost (3059->2841)
Reduced metal cost (277->267)
Reduced build time (6977->6296)
Core Construction Hovercraft:
Reduced energy cost (3118->2896)
Reduced metal cost (273->263)
Reduced build time (7333->6617)
Arm Skimmer:
Increased aim speed (150->240)
Core Scrubber:
Increased aim speed (150->240)
Arm Anaconda:
Reduced build time (4463->4058)
Increased aiming speed (170->255)
Core Snapper:
Reduced build time (4710->4282)
Increased aiming speed (150->235)
Arm Swatter:
Reduced build time (3747->3372)
Core Slinger:
Reduced build time (3747->3372)
Arm Wombat:
Reduced build time (5972->5380)
Core Nixer:
Reduced build time (6368->5737)
Seaplanes
------------------------------------
Arm Albatross:
Changed death explosion (BIG_UNITEX -> SMALL_UNITEX) (50 damage, 110 AOE -> 30 damage, 30 AOE)
Core Typhoon:
Changed death explosion (BIG_UNITEX -> SMALL_UNITEX) (50 damage, 110 AOE -> 30 damage, 30 AOE)
Advanced Buildings
------------------------------------
Arm Adv. Aircraft Plant
Increased metal cost (2210->2341)
Core Adv. Aircraft Plant
Increased metal cost (2191->2410)
Arm Moho Mine:
Increased energy cost (2897->4350)
Increased metal cost (502->754)
Increased build time (11905->17875)
Core Moho Mine:
Increased energy cost (3010->4561)
Increased metal cost (483->725)
Increased build time (10823->16250)
Arm Cloakable Fusion Reactor:
Increased energy cost (42058->52573)
Increased metal cost (5420->6775)
Increased build time (105487->131859)
Increased energy production (1000->1250)
Core Cloakable Fusion Reactor:
Increased energy cost (46225->57781)
Increased metal cost (5321->6651)
Increased build time (111874->139843)
Increased energy production (1050->1300)
Arm Big Bertha:
Increased reload time (7.5->8)
Core Intimidator:
Increased accuracy (750->625)
Increased reload time (8->8.5)
Arm Annihilator:
Reduced energy per shot (2000->1500)
Increased health (2820->2960)
Arm Stunner:
Increased area of effect (512->640)
Core Neutron:
Increased area of effect (512->640)
Arm Retaliator:
Increased area of effect (512->640)
Core Silencer:
Increased area of effect (512->640)
Advanced Kbots
------------------------------------
Core Pyro:
Reduced health (1400->1350)
Core Gimp:
Changed AA missile to AA only
Reduced missile reload time (4->2)
Increased missile damage to air (80->90)
Increased weapon velocity (900->1000)
Increased weapon acceleration (300->350)
Reduced turn rate (700->600)
Arm Fido:
Reduced build time (8661->8120)
Increased health (1250->1300)
Converted to triple shot burst weapon
Reduced damage per shot (140->65)
Increased DPS (53.85->75)
Reduced bullet velocity (400->350)
Core Morty:
Reduced damage per shot (80->65)
Reduced reload time (1.6->1.45)
Reduced DPS (50->44.82)
Core Can:
Increased speed (0.8->0.85)
Core Dominator:
Increased build time (10382->11420)
Reduced speed (1.1->1)
Reduced turn rate (700->600)
Reduced health (1550->1500)
Arm Shooter:
Increased energy cost (8976->10309)
Reduced damage per shot (1500->1250)
Reduced reload time (10->9)
Reduced DPS (150->138.88)
Core Sumo:
Increased energy cost (5987->11974)
Increased build time (15365->19206)
Reduced health (5500->5000)
Reduced damage per shot (420->400)
Increased reload time (1.75->2)
Reduced DPS (240->200)
Advanced Vehicles
------------------------------------
Arm Panther:
Reduced range (200->190)
Arm Triton:
Reduced health (2400->2276)
Core Crock:
Reduced health (2288->2174)
Core Diplomat:
Increased rocket weapon velocity (575->600)
Increased rocket weapon acceleration (76->80)
Arm Penetrator:
Increased energy cost (6991->11360)
Core Goliath:
Increased build time (12947->13410)
Increased energy cost (3906->7812)
Increased turn rate (206->270)
Increased aim speed (80->115)
Arm Phalanx:
Increased health (1273->1397)
Core Copperhead:
Increased health (1404->1541)
Advanced Aircraft
------------------------------------
Arm Phoenix:
Increased energy cost (7624->8768)
Increased build time (16064->17670)
Core Hurricane:
Increased energy cost (8050->8855)
Increased build time (16269->17896)
Arm Lancet:
Increased turn rate (420->462)
Increased weapon velocity (150->175)
Reduced reload time (8.5->4.25)
Core Titan:
Increased turn rate (409->450)
Increased weapon velocity (150->175)
Reduced reload time (9->4.5)
Advanced Ships
------------------------------------
Arm Ranger:
Increased radar distance (0->1250)
Increased missile weapon velocity (450->650)
Increased missile start velocity (430->450)
Reduced rocket reload time (12->10)
Increased brake rate (0.032->0.064)
Core Hydra:
Increased missile weapon velocity (450->650)
Increased missile start velocity (400->450)
Reduced rocket reload time (11->9)
Increased brake rate (0.03->0.06)
Arm Archer:
Increased missile weapon velocity (450->650)
Increased missile start velocity (430->450)
Core Shredder:
Increased missile weapon velocity (450->650)
Increased missile start velocity (430->450)
Arm Piranha:
Reduced build time (17767->15102)
Core Shark:
Reduced build time (17529->14900)

@ -1,632 +0,0 @@
ProTA 4.6 changelog
------------------------------------
Gameplay notes:
- Added new units: Arm/Core Underwater Moho Mine
- Added new units: Arm/Core Underwater Moho Metal Maker
- Added auto unload scripts for sea/hover transports
- Added rotated versions of Arm Big Bertha/Core Intimidator to improve balance when turning to aim the first shot
- Added rotated versions of Arm Vulcan/Core Buzzsaw to improve balance when turning to aim the first shot
- Fixed incorrect footprint for Arm/Core Advanced Construction Sub which stopped them moving close to each other
- Added Commander build menus to Decoy Commanders
- Added .exe hacks:
- Allow weapons to acquire targets while reclaiming a unit
- Allow weapons to acquire targets while capturing a unit
- Allow weapons to acquire targets while repairing a unit
- Allow weapons to acquire targets while assist-nanolating a new unit
- Allow weapons to acquire targets while building a new unit
- Patches main rendering function to draw player 11 features regardless of LOS (see engine notes)
- Enable mex snap and set its default (3) and maximum (3) radius (see engine notes)
- Enable wreck snap and set its default (1) and maximum (1) radius (see engine notes)
- Removed units from CTRL+S/CTRL+W hotkeys (see engine notes):
- Arm Bear
- Arm Eraser
- Arm Escort
- Arm Fibber
- Arm Hulk
- Arm Infiltrator
- Arm Invader
- Arm Jammer
- Arm Marky
- Arm Scarab
- Arm Seer
- Core Deleter
- Core Envoy
- Core Hedgehog
- Core Informer
- Core Parasite
- Core Phantom
- Core Roach
- Core Spectre
- Core Turtle
- Core Voyeur
- Removed units from CTRL+F hotkey (see engine notes):
- Arm Protector
- Arm Retaliator
- Arm Stunner
- Core Fortitude
- Core Neutron
- Core Silencer
GUI notes:
- Added arrows to Arm Big Bertha/Core Intimidator build pictures to build rotated versions
- Added arrows to Arm Vulcan/Core Buzzsaw build pictures to build rotated versions
- Fixed cursor animation speed
- Added +noshake and .ready buttons to sharing menu (see engine notes)
- Added .autopause button to battleroom screen (see engine notes)
- Added clock and weather report (wind and tidal strength) on top resource panel (see engine notes)
Engine notes:
- Updated to new TA engine v2024.3.25 (see tdraw.txt for new features in detail)
NEW FEATURES IN BRIEF:
- Set start positions based on battleroom teams (or alliances)
- Repair battleroom team icons so they can be used to create teams before launching game
- Add +autoteam battleroom and in-game commands to automatically assign teams
- Add +randomteam battleroom command to automatically assign random teams
- Add .exereport battleroom command to report CRC32 of each player's totala.exe
- Add .tdreport battleroom command to report CRC32 of each player's tdraw.dll
- Add .tpreport battleroom command to report CRC32 of each player's tplayx.dll
- Add .gp3report battleroom command to report CRC32 of each player's rev31.gp3
- Add .crcreport battleroom command to report fingerprints of each player's totala.exe, tdraw.dll, tplayx.dll and rev31.gp3 file all at once
- ClickSnap to snap to nearest mex, geo or reclaimable feature
- Add ability to drag queued orders around the map
- Con units patrol behaviour - hold position: reclaim only
- Fix the "ghost com" bug (remote commanders appear in top left of map during first 50sec of game)
- Fix the "units exploding in factories" bug by holding back recycling of deceased units' IDs for 5 seconds
- Option to render DTs and fortwalls that belong to the map (not built by a player)
- Supress "qqqqqq" whiteboard marker lables when "q" is used as the whiteboard key
- Show clock and weather report (wind and tidal strength) on top resource panel
- Sync wind speed across all players
- Set default resolution on new installs to 1024x768 (.ini setting "DisplayModeMinHeight768 = TRUE/FALSE")
- Disable relay of F11 chatmacro text to other players
- Enable start button in multiplayer lobby if only one player + AI are present
- Add +noshake and .ready buttons to sharing menu
- Add .autopause button to battleroom screen
- Change whiteboard, mappos and resource indicator colours in response to +logo commands
- Prevent +logo commands from affecting other players
- Ctrl-B doesn't select aircraft carriers
- Ctrl-F centres view on selected factory
- Ctrl-S works correctly with mobile-units-can-build-mobile-units hack
- Set +lostype as a cheatcode (not available unless cheats enabled)
- Look for ddraw.dll in current working directory as backend, or failing that use system ddraw.dll
- Use the same .ini file as TotalA.exe
- Use the same registry path as TotalA.exe
- Add FPS counter to megamap, increase megamap FPS
- Fix blue background on scoreboard
- Grey background on mega map to distinguish from unmapped area
- Prevent Ctrl-F2 dialog and allies resource bar from moving off screen
- Improve responsiveness of whiteboard marker movements sent to remote players
- Render cursor while in megamap
- Fix crash when removing markers
- Fix crash on simultaneous whiteboard marker move and delete
- Fix rare crash on TA Hook line drawing
- Radar and sonar jammers no longer jam your own radar and sonar in >3 player multiplayer
- Use CTRL_F and CTRL_B unit category tags for CTRL+F and CTRL+B hotkeys in preference to heuristics
- Change CTRL+S to use CTRL_W and NOTAIR/NAIR categories so as not to select jammers etc
Other notes:
- CnC-DDraw 6.3 by FunkyFr3sh included in install (updated from 5.1.0.0)
- WGMUS 0.0.23 by MnHebi included in install (updated from 0.0.17)
Buildings
------------------------------------
Arm Wind Generator:
- Fixed build angle shading glitch
Arm Sentinel:
- Increased weapon velocity (800->900)
Core Gaat Gun:
- Increased weapon velocity (800->900)
Core Viper:
- Increased weapon velocity (800->900)
Arm Guardian:
- Reduced metal cost (1946->1751)
- Reduced health (2477->2230)
Core Punisher:
- Reduced metal cost (1887->1698)
- Reduced health (2540->2285)
Arm Underwater Metal Extractor:
- Reduced self destruct countdown (5->0)
- Added sound on self destruct
Core Underwater Metal Extractor:
- Reduced self destruct countdown (5->0)
- Added sound on self destruct
Arm Sonar Station:
- Increased sonar distance (1180->1250)
Core Sonar Station:
- Increased sonar distance (1180->1250)
Arm Defender - NS:
- Increased health (252->335)
Core Stinger:
- Reduced build time (2357->2239)
- Increased health (290->340)
Arm Stingray:
- Reduced range (550->500)
- Increased weapon velocity (800->900)
Core Thunderbolt:
- Reduced range (550->500)
- Increased weapon velocity (800->900)
Arm Seaplane Platform:
- Added Arm Peeper to build menu
- Reduced energy cost (3777->3597)
- Reduced metal cost (1556->1482)
- Reduced build time (13473->12832)
Core Seaplane Platform:
- Added Core Fink to build menu
- Reduced energy cost (3757->3578)
- Reduced metal cost (1613->1537)
- Reduced build time (14071->13401)
Mines
------------------------------------
Arm Tiny:
- Reduced build time (1322->661)
- Reduced energy cost (1017->509)
- Reduced cloak cost (7->3)
- Reduced edge effectiveness (1->0.1)
Arm Area Mine:
- Reduced build time (2481->1241)
- Reduced energy cost (1909->955)
- Reduced cloak cost (14->6)
- Reduced edge effectiveness (1->0.05)
Arm Focused Mine:
- Reduced build time (3494->1747)
- Reduced energy cost (2688->1344)
- Reduced cloak cost (19->9)
- Reduced edge effectiveness (1->0.1)
Arm HE Area Mine:
- Reduced build time (5582->2791)
- Reduced energy cost (4294->2147)
- Reduced cloak cost (31->15)
- Reduced edge effectiveness (1->0.05)
Arm Precision Mine:
- Reduced build time (5375->2688)
- Reduced energy cost (4135->2068)
- Reduced health (200->100)
- Reduced cloak cost (30->15)
- Reduced edge effectiveness (1->0.1)
Arm Nuclear Mine:
- Reduced build time (28953->14477)
- Reduced energy cost (22272->11136)
- Reduced cloak cost (79->40)
- Reduced edge effectiveness (1->0.15)
Core M-104:
- Reduced build time (665->333)
- Reduced energy cost (532->266)
- Reduced health (200->100)
- Reduced cloak cost (5->2)
- Reduced edge effectiveness (1->0.1)
Core M-209:
- Reduced build time (1445->723)
- Reduced energy cost (1156->578)
- Reduced health (200->100)
- Reduced cloak cost (11->5)
- Reduced edge effectiveness (1->0.05)
Core M-303:
- Reduced build time (2130->1065)
- Reduced energy cost (1704->852)
- Reduced health (200->100)
- Reduced cloak cost (15->8)
- Reduced edge effectiveness (1->0.1)
Core M-420:
- Reduced build time (2927->1464)
- Reduced energy cost (2342->1171)
- Reduced health (200->100)
- Reduced cloak cost (21->11)
- Reduced edge effectiveness (1->0.05)
Core M-515:
- Reduced build time (9508->4754)
- Reduced energy cost (7607->3804)
- Reduced health (200->100)
- Reduced cloak cost (70->35)
- Reduced edge effectiveness (1->0.1)
Core M-610:
- Reduced build time (32715->16358)
- Reduced energy cost (26172->13086)
- Reduced health (200->100)
- Reduced cloak cost (123->50)
- Reduced edge effectiveness (1->0.15)
Kbots
------------------------------------
Arm Construction Kbot:
- Fixed opening/closing animation glitch
Core Storm:
- Increased acceleration (0.091552734->0.1)
Arm Jethro:
- Reduced energy cost (1036->975)
- Reduced metal cost (109->102)
- Reduced build time (2104->1973)
Core Crasher:
- Reduced energy cost (1040->979)
- Reduced metal cost (110->103)
- Reduced build time (2108->1977)
Vehicles
------------------------------------
Arm Jeffy:
- Increased weapon velocity (700->900)
Core Weasel:
- Increased weapon velocity (700->900)
Arm Podger:
- Increased build time (1519->3038)
- Increased energy cost (1031->2062)
- Increased speed (1.2->1.5)
- Reduced worker time (120->90)
Core Spoiler:
- Increased build time (1740->3480)
- Increased energy cost (1117->2234)
- Increased speed (1.1->1.4)
- Reduced worker time (120->90)
Ships
------------------------------------
Arm Skeeter:
- Increased weapon velocity (laser) (700->900)
Core Searcher:
- Fixed incorrect wake
- Increased weapon velocity (laser) (700->900)
Arm Hulk:
- Added auto unload script
Core Envoy:
- Added auto unload script
Hovercraft
------------------------------------
Arm Skimmer:
- Increased weapon velocity (450->900)
Core Scrubber:
- Increased weapon velocity (400->900)
Arm Swatter:
- Reduced opening animation time
- Changed primary weapon bad target category (VTOL->NOTAIR)
- Removed NoChaseCategory tag
- Reduced metal cost (256->240)
- Increased health (775->844)
- Increased speed (1.9->2)
- Increased aim speed (250->350)
Core Slinger:
- Reduced opening animation time
- Changed primary weapon bad target category (VTOL->NOTAIR)
- Removed NoChaseCategory tag
- Reduced metal cost (250->230)
- Increased health (795->888)
- Increased speed (1.9->2)
- Increased range (600->650)
- Increased aim speed (250->350)
Arm Wombat:
- Reduced weapon timer (3->2)
- Reduced flight time (10->4)
- Increased start velocity (100->250)
Core Nixer:
- Reduced weapon timer (3->2)
- Reduced flight time (10->4)
- Increased start velocity (100->250)
Arm Bear:
- Added auto unload script
Core Turtle:
- Added auto unload script
Advanced Buildings
------------------------------------
Core Moho Metal Maker:
- Fixed bug where unit wouldn't turn off when hit
- Reduced opening/closing animation speed
Arm Flakker:
- Added improved fire and hit sounds
- Changed from ballistic weapon to line of sight
- Increased tolerance (1000->4000)
- Added selfprop tag (1)
- Added unitsonly tag (1)
- Added pitchtolerance tag (6000)
- Added guidance tag (1)
- Added turnrate tag (3000)
Core Cobra:
- Added improved fire and hit sounds
- Changed from ballistic weapon to line of sight
- Increased tolerance (1000->4000)
- Added selfprop tag (1)
- Added unitsonly tag (1)
- Added pitchtolerance tag (6000)
- Added guidance tag (1)
- Added turnrate tag (3000)
Arm Big Bertha:
- Added rotated versions
- Reduced accuracy (500->562) (lower is better)
Core Intimidator:
- Added rotated versions
- Reduced range (5120->4608)
Arm Vulcan:
- Added rotated versions
- Fixed build angle shading glitch and added more team colour
Core Buzzsaw:
- Added rotated versions
Arm Stunner:
- Added special damages for new units
- Reduced area of effect (640->512)
- Increased reload time (130->150)
Core Neutron:
- Added special damages for new units
- Reduced area of effect (640->512)
- Increased reload time (130->150)
Arm Protector:
- Reduced energy cost (88000->79200)
- Reduced build time (95678->86110)
- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE)
Core Fortitude:
- Reduced energy cost (92321->83089)
- Reduced build time (96450->86805)
- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE)
Arm Retaliator:
- Increased build time (143517->160608)
Core Silencer:
- Increased build time (144675->163119)
Arm Adv. Aircraft Plant:
- Increased metal cost (2431->2542)
Core Adv. Aircraft Plant:
- Increased metal cost (2410->2520)
Arm Adv. Shipyard:
- Reduced metal cost (2524->2272)
Core Adv. Shipyard:
- Reduced metal cost (2460->2214)
Arm Advanced Sonar Station:
- Increased sonar distance (2360->2500)
Arm Advanced Sonar Station:
- Increased sonar distance (2360->2500)
Advanced Kbots
------------------------------------
Arm Warrior:
- Reduced health (1550->1395)
Core Pyro:
- Reduced health (1350->1215)
Core Gimp:
- Increased weapon velocity (laser) (700->900)
Arm Zeus:
- Reduced health (2450->2330)
Core Can:
- Reduced health (2800->2660)
- Increased weapon velocity (700->900)
Arm Fido:
- Edited model to lower barrel
- Converted to single shot weapon
- Increased weapon velocity (350->400)
- Increased damage per shot (65->150)
- Reduced DPS (75->57.69)
- Reduced health (1300->1250)
- Reduced turn rate (900->800)
- Reduced speed (1.4->1.25)
Core Morty:
- Reduced health (1150->1100)
- Reduced speed (1.13->1.1)
- Increased brake rate (0.183105469->0.19)
- Reduced range (770->720)
Core Dominator:
- Reduced range (500->450)
Arm Marky:
- Increased speed (0.94->1)
Core Sumo:
- Increased weapon velocity (800->900)
- Reduced energy storage (100->0)
Arm FARK:
- Fixed opening/closing animation glitch
- Increased build time (7931->8922)
- Increased energy cost (3219->4024)
- Increased energy storage (0->50)
- Increased metal storage (0->50)
Core Necro:
- Increased build time (8562->9133)
- Increased energy production (0.4->19)
- Increased metal production (0->0.5)
Arm Infiltrator:
- Increased metal cost (128->154)
- Increased speed (1.9->2.1)
- Reduced minimum cloak distance (80->60)
Core Parasite:
- Reduced energy cost (13452->9416)
- Reduced build time (12711->12005)
- Reduced minimum cloak distance (80->60)
Arm Decoy Commander:
- Reduced death explosion AOE (950->580)
- Added Commander build menu
Core Decoy Commander:
- Reduced death explosion AOE (950->580)
- Added Commander build menu
Advanced Vehicles
------------------------------------
Arm Adv. Construction Vehicle:
- Reduced build time (10397->9357)
Core Adv. Construction Vehicle:
- Reduced build time (10806->9725)
Arm Bulldog:
- Added barrels from TA Mayhem model and retextured to add more team colour
Arm Spider:
- Scaled model down by 15% and added team colour
- Changed footprint from 3x3 to 2x2
- Increased speed (1.6->1.7)
- Increased range (220->240)
- Increased weapon velocity (700->900)
Arm Merl:
- Reduced reload time (12->10)
- Increased DPS (50->60)
- Reduced weapon timer (3->2)
- Reduced flight time (5->4)
- Increased start velocity (100->250)
Core Diplomat:
- Reduced reload time (13->11)
- Increased DPS (46.15->54.55)
- Reduced weapon timer (3->2)
- Reduced flight time (5->4)
- Increased start velocity (100->250)
Arm Scarab:
- Reduced energy cost (88000->79200)
- Reduced build time (95678->86110)
- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE)
Core Hedgehog:
- Reduced energy cost (92321->83089)
- Reduced build time (96450->86805)
- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE)
Advanced Aircraft
------------------------------------
Arm Phoenix:
- Reduced health (520->470)
Core Hurricane:
- Reduced health (530->480)
Advanced Ships
------------------------------------
Arm Advanced Construction Sub:
- Changed footprint from 6x6 to 4x4
- Increased speed (2.15->2.35)
Core Advanced Construction Sub:
- Changed footprint from 6x6 to 4x4
- Increased speed (2.05->2.25)
Arm Ranger:
- Fixed radar not activating
- Added radar dish to unit model
- Added script from TA Mayhem
- Reduced weapon timer (3->2)
- Reduced flight time (5->4)
- Increased start velocity (100->250)
Core Hydra:
- Added script from TA Mayhem
- Reduced weapon timer (3->2)
- Reduced flight time (5->4)
- Increased start velocity (100->250)
Arm Pirahna:
- Increased damage per shot (300->350)
- Increased DPS (130.43->152.17)
- Increased special damage (double) to Arm Lurker and Core Snake (580->700)
- Increased special damage (double) to Core Leviathan (580->700)
- Increased special damage (double) to Arm Triton and Core Crock (600->700)
Core Shark:
- Increased damage per shot (310->370)
- Increased DPS (135.96->162.28)
- Increased special damage (double) to Arm Lurker and Core Snake (600->740)
- Increased special damage (double) to Core Leviathan (600->740)
- Increased special damage (double) to Arm Triton and Core Crock (600->740)
Arm Fibber:
- Increased sight distance (150->200)
- Increased sonar jamming distance (150->200)
Core Warlord:
- Increased weapon velocity (laser) (800->900)
- Reduced range (laser) (810->770)

@ -1,300 +0,0 @@
ProTA 4.7 changelog
------------------------------------
Gameplay notes:
- Fixed bug where Core Intimidator would hit surrounding Fort Wall
- Fixed various wreckage values of aircraft
- Fixed Core Mission 6 (Core Contingency) max wind speed (9->900)
- Made Arm/Core Seaplane Platform wreckages non blocking
Engine notes:
- Updated to new TA engine v2024.12.05
NEW FEATURES IN BRIEF:
*v2024.12.05
- Fix crash on print-screen
*v2024.12.03
- Fix crash on +logo
- Fix rare intermittent crash on adding / moving / deleting whiteboard markers
*v2024.10.27
- Ability to create multiplayer/skirmish maps with neutral units and/or additional per-player spawn units
- Add a control to hide/minimise the allies resource bar
- Make the ally resource bar actually readable with ctrl-f2 setting "background=None"
- Fix incorrect player logo colour for "new marker added" messages
- Play the "Mission Complete" sound upon winning a multiplayer/skirmish game
- Fix bug causing "unit limit reached" in between single player missions
- Remove shared metal/energy from player totals
- Get TAHook to use the click-snapped start position
- Increase size capacity of whiteboard marker messages
- Adjust format of whiteboard ping messages
- Fix whiteboard eraser removing more than intended
- Fix for 10 player (and other) VerCheck false positives
- Support for watching all 10 players in 10 player replays (pending a corresponding TAF update to activate it)
Buildings
------------------------------------
Core Shipyard:
- Edited build pad height to allow air cons to assist subs
- Reduced waterline (22->1)
Arm Guardian:
- Reduced energy cost (7687->6534)
- Reduced metal cost (1751->1654)
- Reduced build time (13377->11370)
- Reduced health (2230->2105)
Core Punisher:
- Reduced energy cost (7585->6447)
- Reduced metal cost (1698->1604)
- Reduced build time (13268->11278)
- Reduced health (2285->2159)
- Increased range (1200->1250)
- Reduced AOE (85->64)
Core Stinger:
- Added primary weapon bad target category (NOTAIR)
Kbots
------------------------------------
Arm Flea:
- Reduced metal cost (40->35)
- Reduced energy cost (641->570)
Arm Rocko:
- Increased health (610->640)
Core Storm:
- Increased health (620->650)
Vehicles
------------------------------------
Arm Jeffy:
- Increased health (79->85)
Core Weasel:
- Increased health (84->90)
- Increased speed (2.8->2.9)
Advanced Buildings
------------------------------------
Arm Moho Mine:
- Increased energy cost (4350->4568)
- Increased metal cost (754->792)
- Increased build time (17875->19663)
Core Moho Mine:
- Increased energy cost (4561->4789)
- Increased metal cost (725->761)
- Increased build time (16250->17875)
Arm Underwater Moho Mine:
- Increased energy cost (5438->5482)
- Increased metal cost (943->950)
- Increased build time (22344->23596)
Core Underwater Moho Mine:
- Increased energy cost (5701->5747)
- Increased metal cost (906->913)
- Increased build time (20313->21450)
Arm Ambusher:
- Increased metal cost (2102->2202)
Core Toaster:
- Increased energy cost (12687->16493)
- Increased metal cost (2200->2253)
- Increased build time (18377->19296)
Core Doomsday Machine:
- Increased metal cost (2247->2354)
- Increased build time (29457->31421)
Core Cobra:
- Reduced range (750->700)
Arm Big Bertha:
- Reduced accuracy (562->625)
Core Intimidator:
- Fixed bug where shell would hit surrounding Fort Wall
- Reduced range (4608->4096)
Core Adv. Shipyard:
- Edited build pad height to allow air cons to assist subs
- Reduced waterline (22->1)
Advanced Kbots
------------------------------------
Arm Warrior:
- Increased build time (4521->4747)
- Reduced health (1395->1325)
Core Pyro:
- Increased build time (4630->4862)
- Reduced health (1215->1185)
- Reduced burst (22->19)
- Increased damage (9->10)
- Increased burst rate (0.04->0.06)
- Reduced DPS (232.94->223.53)
Arm Zeus:
- Increased build time (7806->7943)
Core The Can:
- Increased build time (7875->8025)
Arm Fido:
- Reduced energy cost (3556->3378)
- Reduced build time (8120->7850)
- Increased health (1250->1275)
- Increased AOE (48->64)
Arm Marky:
- Increased turn speed (505->960)
Core Voyeur:
- Increased turn speed (530->980)
Arm Zipper:
- Reduced build time (4400->4180)
- Increased damage per shot (47->50)
- Increased DPS (58.75->62.5)
Core Freaker:
- Reduced build time (4484->4260)
Arm Maverick:
- Increased build time (12425->13046)
Core Dominator:
- Increased build time (11420->11991)
Arm Shooter:
- Increased build time (14068->15475)
Core Sumo:
- Increased build time (19206->21127)
Arm Infiltrator:
- Added amphibious movement
- Added RadarDistance tag (600)
- Added SonarDistance tag (600)
Core Parasite:
- Added amphibious movement
- Added RadarDistance tag (625)
- Added SonarDistance tag (625)
Advanced Vehicles
------------------------------------
Arm Panther:
- Increased build time (4838->5080)
- Reduced acceleration (0.07->0.06)
Core Leveler:
- Increased acceleration (0.02->0.04)
- Increased sight distance (220->245)
Core Reaper:
- Added new firing sound
Arm Spider:
- Reduced build time (5075->4860)
- Increased health (450->495)
Arm Seer:
- Increased energy cost (941->1223)
- Increased metal cost (85->111)
- Increased build time (3186->4142)
- Increased speed (1.1->1.4)
- Increased radar distance (1120->1375)
Core Informer:
- Increased energy cost (1209->1330)
- Increased metal cost (86->112)
- Increased sight distance (210->320)
- Increased radar distance (1120->1320)
- Increased turn rate (210->525)
Arm Jammer:
- Increased speed (1->1.4)
- Increased radar jamming distance (400->550)
Core Deleter:
- Increased speed (1.05->1.4)
- Increased radar jamming distance (420->540)
Core Copperhead:
- Reduced range (750->700)
- Increased speed (1.01->1.11)
Arm Penetrator:
- Changed death explosion (CRAWL_BLASTSML -> PENETRATOR) (1200 damage, 275 AOE -> 600 damage, 150 AOE)
- Increased build time (17853->19638)
Core Goliath:
- Increased build time (13410->14751)
Advanced Aircraft
------------------------------------
Arm Brawler:
- Increased metal cost (268->314)
- Increased energy cost (5343->8124)
- Increased build time (11651->18701)
Core Rapier:
- Increased metal cost (279->309)
- Increased energy cost (5489->8089)
- Increased build time (11965->18612)
- Reduced speed (7.6->6.4)
Arm Phoenix:
- Increased build time (17670->19277)
- Reduced speed (9.5->9)
Core Hurricane:
- Increased build time (17896->19523)
- Reduced speed (9.1->8.8)
Advanced Ships
------------------------------------
Arm Millennium:
- Increased metal cost (2860->3303)
- Increased energy cost (13462->17621)
- Increased build time (27749->32048)
Core Warlord:
- Increased metal cost (3231->3554)
- Increased energy cost (12819->16780)
- Increased build time (29031->34544)
- Reduced range (770->700) (laser)
- Increased reload time (1.1->1.25) (laser)
- Reduced DPS (163.64->144) (laser)
- Reduced reload time (2.46->2) (cannon)
- Increased DPS (109.76->135) (cannon)
Arm Fibber:
- Increased sight distance (200->250)
- Increased sonar jamming distance (200->250)

@ -1,521 +0,0 @@
ProTA 4.8 changelog
------------------------------------
Gameplay notes:
- Added new units:
- Arm Spark (Lightning Hovertank)
- Core Blaze (Flamethrower Hovertank)
- Arm Apex (Experimental Vehicle)
- Arm Apex Foundry (Builds Apex)
- Fixed special damages on Neutron/Stunner for Vulcan/Buzzsaw
- Fixed various bad target categories
- Fixed various blocking sea wreckages
- Fixed Croc/Triton tilt script
- Added updated Aramon/Creon rock feature files for more suitable metal values
- Set all factories to hold position default
- Added .exe hacks:
- Adjust AI resource generation/feature reclamation income factors dependant upon difficulty
Original: Hard = 1.0x, Medium = 0.7x, Easy = 0.5x
New: Hard = 4.0x, Medium = 1.0x, Easy = 0.5x
GUI notes:
- Added Core Hydration Plant unit picture
- Added Core Truck unit picture
- Updated normal cursor and right click interface green/red cursors
- Updated Arm Adv. Aircraft Plant unit/build picture
- Updated Arm Energy Storage build picture
- Updated Core Gimp unit/build picture
- Updated Core Krogoth unit/build picture
- Updated Core Pillager unit picture
- Updated Core Raider unit/build picture
- Updated Core Snake unit picture
- Updated Core Snapper build picture
- Added retextured Core Pillager model to match unit picture and scaled up by 12.5%
- Team colours white/black have been replaced by pink/slate and existing colours have been improved
- Improved mini map dot colours/contrast
- Improved textures
- Added custom megamap icons
- Improved hotkey overlay contrast
Engine notes:
- Updated to new TA engine v2025.8.29
NEW FEATURES IN BRIEF:
*2025.08.29
- Bugfix for multithreaded version/cheat check
*2025.08.19
- Auto kickout of units under build order is now strictly only for own units (previously allowed kickout anyone's units if cheats enabled)
*v2025.8.1
- Preview build square to yellow if requires unit kickout
*2025.07.12
- Allow user to queue build orders underneath their own mobile units; and auto kickout of units that are under a build order
- Mod developers can opt-in to "Improved behaviour of con units". Once enabled, see ctrl-f2 menu for related user configurable options.
- Fix bug with erroneous game results reported to TAF when using in-game +autoteam
- With fixed position, start positions are assigned in order given by TAF auto balance
so that players are positioned opposite an opponent of similar skill
- Fixed bugs with player placement in 2v2+ games on maps with neutral units
- Push anticheat hashing functions into background threads so as to reduce in-game slowdown experienced by some users
*v2025.5.18
- Improved behaviour of construction units when guarding a factory - they stay put after finishing a build
*v2025.4.24
- Fix crash on parsing spawned unit initial commands
- Log cheat warnings to tdrawlog.txt
- Fix for non functional perm los sonar patch
Other notes:
- WGMUS 0.0.24 by MnHebi included in install (updated from 0.0.23)
Commanders
------------------------------------
Arm Commander:
- Reduced weapon velocity (900->700) (laser)
Core Commander:
- Reduced weapon velocity (900->700) (laser)
Buildings
------------------------------------
Core Kbot Lab:
- Fixed build angle shading glitch
Arm Radar Tower:
- Fixed build angle shading glitch
Arm L.L.T.:
- Reduced weapon velocity (900->700)
Core Light Laser Tower:
- Reduced weapon velocity (900->700)
Arm Sentinel:
- Reduced weapon velocity (900->800)
Core Gaat Gun:
- Reduced weapon velocity (900->800)
Core Viper:
- Reduced weapon velocity (900->800)
Arm Hovercraft Platform:
- Increased energy cost (2111->2639)
- Increased metal cost (1254->1355)
- Increased build time (11112->12038)
- Reduced worker time (180->150)
Core Hovercraft Platform:
- Increased energy cost (2168->2711)
- Increased metal cost (1210->1322)
- Increased build time (11403->12353)
- Reduced worker time (180->150)
Arm Torpedo Launcher:
- Added special damage (double) to Arm Apex and Core Krogoth (800)
Core Torpedo Launcher:
- Added special damage (double) to Arm Apex and Core Krogoth (800)
Arm Defender - NS:
- Reduced health (335->295)
Core Stinger:
- Reduced health (340->300)
Arm Stingray:
- Changed footprint from 4x4 to 3x3
- Improved firing over Shark's Teeth in shallow water
- Reduced weapon velocity (900->800)
Core Thunderbolt:
- Reduced weapon velocity (900->800)
Kbots
------------------------------------
Arm Construction Kbot:
- Reduced build distance (90->75)
Core Construction Kbot:
- Reduced build distance (90->75)
Arm Peewee:
- Reduced aiming speed (450->240)
Core A.K.:
- Reduced aiming speed (350->240)
- Increased tolerance (1000->1500)
- Reduced damage per shot (30->27)
- Reduced DPS (60->54)
Arm Rocko:
- Increased weapon velocity (300->350)
- Increased start velocity (300->350)
Core Storm:
- Increased weapon velocity (300->350)
- Increased start velocity (300->350)
Arm Flea:
- Reduced weapon velocity (900->700)
Vehicles
------------------------------------
Arm Jeffy:
- Reduced weapon velocity (900->700)
Arm Flash:
- Increased aiming speed (160->180)
Core Weasel:
- Fixed bug where turret didn't show
- Reduced weapon velocity (900->700)
Core Instigator:
- Reduced aiming speed (240->180)
- Increased tolerance (1000->1500)
- Reduced damage per shot (30->27)
- Reduced DPS (60->54)
Ships
------------------------------------
Arm Skeeter:
- Reduced aiming speed (laser) (200->180)
- Reduced weapon velocity (900->700)
Core Searcher:
- Reduced aiming speed (laser) (200->170)
- Reduced weapon velocity (900->700)
Arm Lurker:
- Added special damage (double) to Arm Apex and Core Krogoth (700)
Core Snake:
- Added special damage (double) to Arm Apex and Core Krogoth (740)
Hovercraft
------------------------------------
Arm Construction Hovercraft:
- Reduced turn rate (480->240)
Core Construction Hovercraft:
- Reduced turn rate (440->220)
Arm Skimmer:
- Increased metal cost (65->76)
- Increased energy cost (993->1169)
- Reduced turn rate (510->419)
- Reduced damage per shot (45->40)
- Reduced DPS (56.25->50)
- Reduced weapon velocity (900->700)
Core Scrubber:
- Increased metal cost (61->79)
- Increased energy cost (1064->1252)
- Reduced turn rate (510->403)
- Reduced range (230->210)
- Increased health (200->210)
- Reduced weapon velocity (900->700)
Arm Anaconda:
- Increased energy cost (2427->2570)
- Increased metal cost (231->245)
- Increased build time (4058->4666)
- Changed weapon from line of sight weapon to ballistic
- Reduced turn rate (350->313)
- Reduced weapon velocity (450->300)
- Increased area of effect (16->48)
- Reduced aiming speed (255->210)
Core Snapper:
- Increased energy cost (2609->2762)
- Increased metal cost (238->252)
- Increased build time (4282->4710)
- Changed weapon from line of sight weapon to ballistic
- Reduced turn rate (340->300)
- Reduced weapon velocity (450->300)
- Increased area of effect (16->48)
- Reduced aiming speed (235->210)
Arm Wombat:
- Increased health (540->563)
- Increased speed (1.9->2)
- Increased range (820->825)
Core Nixer:
- Increased health (552->575)
- Increased range (800->825)
- Reduced damage per shot (320->300)
- Reduced DPS (32->30)
Advanded Buildings
------------------------------------
Arm Moho Mine:
- Increased energy cost (4568->4785)
- Increased metal cost (792->829)
- Reduced health (1573->1298)
Core Moho Mine:
- Increased energy cost (4789->5017)
- Increased metal cost (761->816)
- Increased build time (17875->18688)
- Reduced health (1465->1245)
Core Fusion Power Plant:
- Fixed build angle shading glitch
Arm Ambusher:
- Reduced range (1350->1300)
Core Toaster:
- Reduced range (1350->1300)
Arm Big Bertha:
- Increased reload time (8->10)
- Reduced accuracy (625->750)
Core Intimidator:
- Increased reload time (8.5->10.5)
- Reduced accuracy (625->750)
Arm Vulcan:
- Increased energy cost (239555->479111)
- Increased metal cost (16949->45198)
- Increased build time (293710->587421)
- Reduced accuracy (800->1200)
- Reduced range (4096->3072)
Core Buzzsaw:
- Increased energy cost (231324->462648)
- Increased metal cost (17632->47606)
- Increased build time (317005->634011)
- Reduced accuracy (800->1200)
- Reduced range (4096->3072)
Arm Underwater Moho Mine:
- Increased energy cost (5482->5742)
- Increased metal cost (950->996)
Core Underwater Moho Mine:
- Increased energy cost (5747->6020)
- Increased metal cost (913->979)
- Increased build time (21450->22456)
Arm Adv. Shipyard:
- Increased metal cost (2272->2524)
Core Adv. Shipyard:
- Increased metal cost (2214->2460)
Arm Advanced Torpedo Launcher:
- Added special damage (double) to Arm Apex and Core Krogoth (2000)
Core Advanced Torpedo Launcher:
- Added special damage (double) to Arm Apex and Core Krogoth (2000)
Advanced Kbots
------------------------------------
Arm Adv. Construction Kbot:
- Reduced speed (1.25->1.2)
- Reduced build distance (90->75)
Core Adv. Construction Kbot:
- Increased metal cost (310->325)
- Increased speed (1.2->1.25)
- Reduced turn rate (1005->955)
- Reduced build distance (90->75)
Arm Warrior:
- Increased build time (4747->5138)
- Reduced health (1325->1225)
Core Pyro:
- Increased build time (4862->5250)
- Added new firing sound
- Increased weapon velocity (300->400)
- Increased reload time (0.85->1)
- Increased burst (19->22)
- Reduced DPS (223.53->220)
- Reduced health (1185->1085)
Arm Zeus:
- Increased weapon velocity (600->750)
Core The Can:
- Increased reload time (0.5->0.75)
- Increased damage per shot (90->130)
- Reduced DPS (180->173.33)
- Reduced weapon velocity (900->800)
Arm Pelican:
- Increased aim speed (100->150) (laser)
Core Gimp:
- Changed V Launch AA Missile to Missile
- Reduced range (285->275) (laser)
- Reduced aim speed (200->150) (laser)
- Reduced weapon velocity (900->800) (laser)
- Increased damage per shot (50->70) (laser)
- Increased reload time (1.05->1.5) (laser)
- Reduced DPS (47.62->46.67) (laser)
Arm Zipper:
- Reduced weapon velocity (900->700)
Core Freaker:
- Reduced weapon velocity (900->700)
Core Sumo:
- Reduced weapon velocity (900->800)
Arm FARK:
- Reduced build distance (90->75)
Core Necro:
- Reduced build distance (90->75)
Advanced Vehicles
------------------------------------
Arm Adv. Construction Vehicle:
- Reduced metal cost (457->370)
- Increased health (1205->1290)
- Increased turn rate (240->300)
- Increased brake rate (0.036->0.096)
Core Adv. Construction Vehicle:
- Reduced metal cost (444->350)
- Increased turn rate (210->250)
- Increased brake rate (0.03->0.102)
Arm Panther:
- Increased build time (5080->5564)
Core Leveler:
- Increased build time (5176->5682)
Arm Bulldog:
- Increased build time (8241->8675)
- Increased aiming speed (130->140)
Core Reaper:
- Increased build time (8293->8730)
- Reduced aiming speed (160->150)
Arm Luger:
- Increased energy cost (2140->3745)
- Increased metal cost (264->403)
- Increased build time (4530->7928)
- Increased damage per shot (130->160)
- Reduced reload time (2.75->2.7)
- Increased DPS (47.27->59.26)
- Increased area of effect (64->80)
Core Pillager:
- Increased energy cost (1842->3454)
- Increased metal cost (276->420)
- Increased build time (4523->7915)
- Increased damage per shot (140->175)
- Increased DPS (47.46->59.32)
- Increased area of effect (64->80)
Arm Spider:
- Reduced weapon velocity (900->700)
Arm Scarab:
- Increased energy cost (79200->87120)
- Increased metal cost (1437->1581)
- Increased build time (86110->94721)
- Reduced speed (1.2->0.8)
- Reduced coverage (2000->1800)
Core Hedgehog:
- Increased energy cost (83089->91398)
- Increased metal cost (1508->1659)
- Increased build time (86805->95486)
- Reduced speed (1.2->0.8)
- Reduced coverage (2000->1800)
Advanced Aircraft
------------------------------------
Arm Lancet:
- Added special damage (double) to Arm Apex and Core Krogoth (1500)
Core Titan:
- Added special damage (double) to Arm Apex and Core Krogoth (1560)
Advanced Ships
------------------------------------
Arm Advanced Construction Sub:
- Reduced build distance (120->100)
Core Advanced Construction Sub:
- Reduced build distance (120->100)
Arm Piranha:
- Added special damage (double) to Arm Apex and Core Krogoth (700)
Core Shark:
- Added special damage (double) to Arm Apex and Core Krogoth (740)
Core Warlord:
- Reduced weapon velocity (900->800)
Core Leviathan:
- Added special damage (double) to Arm Apex and Core Krogoth (2000)
- Reduced sight distance (490->300)
Experimental Kbots
------------------------------------
Core Krogoth:
- Added amphibious movement
- Changed to new "experimental gauss" weapon
- Increased health (29918->35902)
- Increased sight distance (255->400)
- Increased weapon tolerance (500->1500) (laser)
- Increased area of effect (8->16) (laser)
- Added twophase weapon tag (rocket)
- Reduced weapon timer (5->2) (rocket)
- Reduced flight time (15->4) (rocket)
- Increased weapon velocity (550->800) (rocket)
- Increased start velocity (250->300) (rocket)
- Increased weapon acceleration (200->250) (rocket)
- Increased weapon tolerance (500->1500) (gauss)
- Increased area of effect (8->16) (gauss)
- Reduced damage per shot (480->360) (gauss)
- Reduced reload time (1.6->1.2) (gauss)
- Increased range (300->400) (gauss)
- Increased aiming speed (100->150) (gauss)
- Changed death explosion (NUCLEAR_MISSILE -> EXP) (5500 damage, 640 AOE -> 2750 damage, 256 AOE)

@ -1,124 +1,48 @@
ProTA - https://prota.tauniverse.com ProTA by TAG_Venom - Readme
A rebalancing of Total Annihilation by the pros that stays true to the original game.
The goal of ProTA is to bring units that were neglected in OTA into balance with the dominant meta of 2000-2010. Key important units from that time remain untouched (Flash, Thunder, Samson, Slasher, Weasel, Pelican, etc) allowing the same strategies from that era to remain viable. Most other units have had subtle and thoughtful changes that bring them into use. You can still go fast advanced and reclaim that factory to get your Fusion going if you want to, but now those formerly neglected advanced units have had their costs and stats altered to make them competitive with standard units. So you might want to keep that advanced factory after all, and you might want to replace those Metal Extractors with Moho Mines first.
Mission Core and Arm have been balanced using the existing Flash/Samson/Slasher meta as a baseline. The Instigator is now viable and competitive against the Flash. The Raider and the Stumpy have a place in the melee. Kbots are an early option as well as vehicles. Each unit has a role where it can be the optimal choice based on the map conditions and player youre up against. Choose the style that best suits you or one that will annihilate your opponent. Despite all the unit stat changes, gameplay tweaks and bug fixes, I still wanted it to feel like playing OTA and not too drastically different, as far as the early game strategies available and the pacing in general. I feel like I have achieved that quite well.
Our mission is to bring a renewed vitality to Total Annihilation by making every unit relevant without compromising the essence of the original game. We acknowledge the inherent conflict in our goals, aiming for a middle ground that retains the familiar pace and strategies while infusing new life into underutilised units. On top of all this, lots of quality of life improvements have been made. The GUI has been improved and extended with 12 build icons per page. Orders are on the same page and you are not required to switch to a separate page to reclaim wreckages or repair units. Build hotkeys are available and overlays are shown on the build menu, showing you which hotkey to press to build each unit. Many visual improvements have been made as well, from the mini map dot colors, to team colors, to the models and textures.
1. Maximising Unit Relevance This mod has been fine-tuned and play tested by an all-star cast of OTA commanders:
Our primary objective is to ensure that every unit in ProTA serves a meaningful purpose within the gameplay. Through careful adjustments and enhancements, we strive to make all units useful, offering players a diverse array of strategic options without diminishing the core Total Annihilation experience.
2. Preserving the Total Annihilation Experience
We are committed to maintaining the original pace and strategies that players know and love. ProTA seeks to retain the familiar feel of Total Annihilation, allowing players to employ classic strategies and tactics while incorporating the newfound usefulness of units.
3. Affordability and Pace
ProTA adopts a strategic approach to unit balancing, prioritising either the reduction of costs for weaker units or strengthening within the current cost framework, depending on the unit and situation. The decision between these two options is made on a case-by-case basis, ensuring the best fit for each unit. Importantly, ProTA strives to avoid increasing costs, maintaining affordability and pace. This ensures units are affordable and replaceable, readily deployable to contribute to the action as soon as possible. ProTA underscores the significance of fighting over and reclaiming wreck fields, adhering to the original game's emphasis on dynamic play rather than adopting a passive strategy of waiting for expensive units to be constructed.
4. Minimal Changes to Established Units
Acknowledging the significance of player familiarity, ProTA strives to make minimal adjustments to frequently used units. This approach ensures that gameplay retains its distinctive identity, staying true to the essence of the original units while providing a sense of continuity for seasoned players.
5. Asymmetric Balance between Arm and Core
ProTA recognises that Arm and Core factions are not mirrored but are balanced asymmetrically. This deliberate asymmetry contributes to the richness of gameplay dynamics, allowing for diverse strategies and interactions between the factions. Importantly, ProTA aims for a balanced asymmetry that ensures both Arm and Core factions remain viable choices on all maps. The goal is to provide players with the freedom to choose their preferred faction without being constrained by the map, fostering a diverse and strategic playing environment.
6. Community Feedback and Evolution
ProTA is built upon the extensive experience and insights of long-time, high level players of the original game. To maintain ProTA's integrity, we prioritise input grounded in real-world gameplay experiences, especially valuing perspectives from seasoned players. However, all feedback is valuable, regardless of experience, provided it aligns with the mod's goals and is substantiated with evidence or replays.
7. Real-World Gameplay over Numbers Critique
ProTA highly values feedback grounded in genuine gameplay experiences. While numbers and data are important, our primary focus is on the real impact of changes in live matches. We approach critiques based solely on game files with caution, recognising the concrete goals we aim to achieve in practical gameplay. It's important to note that some of the data can be misleading in different ways, and our emphasis on real-world experiences helps to navigate through potential discrepancies.
8. Enhancing Gameplay Interaction
ProTA is dedicated to refining the player experience by enhancing the user interface and usability within the constraints of the TA engine. With the addition of intuitive hotkeys and an extended build menu, our aim is to make navigation more seamless and player-friendly. We recognise the limitations imposed by the engine but strive to optimise the available interface elements for improved gameplay accessibility.
By navigating the challenges that arise and exploring exciting possibilities, our commitment to honoring Total Annihilation's legacy persists. Our goal is clear: to craft the ultimate Total Annihilation mod that both seasoned veterans and newcomers can proudly call their own. We deeply appreciate our community's insights, which contribute to the delicate balance of our conflicting goals. As we strive to enhance your gaming experience, we hope we've done our players proud, by elevating Total Annihilation gameplay to new heights. Here's to another 4000 years of total war.
Credits
In the collaborative journey of bringing ProTA to life, a dedicated group of individuals has contributed their time, expertise, and passion. Their collective efforts have played a vital role in shaping the mod and enhancing the Total Annihilation experience. Here, we express our sincere gratitude to those whose contributions have been instrumental in the development and success of ProTA.
This mod has been fine-tuned and play-tested by an all-star cast of OTA commanders:
TAG_Venom TAG_Venom
TAG_ROCK TAG_ROCK
PRO_rANDY PRO_rANDY
Tiptushi Tiptushi
TAG_Metn TAG_Metn
Gnug215
timmyfred timmyfred
TAG_Sensation TAG_Webster
FFAxPostal FFAxPostal
Gnug115
TAG_Dominator TAG_Dominator
Gnug215
OZ_coolnick OZ_coolnick
BTU_Natas BTU_Natas
TAG_Mastah TAG_Mastah
Gnug115 Gnug615
In addition to the help of the play-testers, the mod would not have been possible without the efforts of the following people: In addition to the help of the play testers, the mod would not have been possible without the efforts of the following people:
gamma gamma - Helped me a lot with scripting, brought his experience into balancing discussions and allowed me to use some TA Mayhem scripts, fixes and models
Instrumental in scripting, gamma brought a wealth of experience to balancing discussions. We are grateful for the permission to incorporate TA Mayhem scripts, fixes, and models. Switeck - I used many fixes from Switeck's TA Bugfix. Some of the fixes I disagree with from a gameplay perspective, but many were used and the mod is much better as a result of Switeck's work
ArmouredFish - Helped me a lot with scripting, helped me implement some game changing fixes such as non blocking sea wreckages and offered a lot of general TA knowledge throughout the process
Switeck Vohvelieläin - Helped me a lot with his modding knowledge and helped edit some models and scripts
Leveraging numerous fixes from Switeck's TA Bugfix, we enhanced the mod's functionality. While not in complete alignment from a gameplay perspective, Switeck's work has undeniably elevated the mod. Thaldren - Improved performance in Windows 10 and helped setup the ProTA recorder
Axle1975 - Helped me fix some issues with the recorder and gave ProTA a platform for competitive play (www.taforever.com)
ArmouredFish poosticks - I used his TA guide extensively throughout the modding process to check unit stats and other details
Offering substantial support in scripting, ArmouredFish played a crucial role in implementing game-changing fixes, such as non-blocking sea wreckages. His extensive TA knowledge proved invaluable throughout the development process. Idec Sdawkminn - I used his TAU forum posts "Complete Unit FBI Guide" and "Comprehensive Weapons Guide" a lot which were massively useful when learning how to mod TA
zwzsg - His TAU forum posts provided the knowledge that allowed for non blocking sea wreckages
Vohvelieläin SnakeInTheMirror - For work on the TA complete colour enhancement pack. I used orange, teal and the improved yellow from this mod
Contributing significant modding expertise, Vohvelieläin aided in editing models and scripts, enriching the overall quality of the mod. PlasmoidThunder - Informed me of some sound category bugs within OTA that I wasn't aware of and some other things I had missed
TAAN - I used some of the Evolva models made by TAAN to improve the mod visually. Some I kept as-is, some I made edits to, to fit with my own vision
Axle1975 ACE_Beeky - I often checked his TAU post "A Guide To Every Unit In TA" for things I may have missed
Addressing recorder issues and providing a platform for competitive play on taforever.com, the contributions of Axle1975 have left a lasting impact on ProTA. Additionally, his significant work on the TA engine, including bug fixes and the implementation of game-changing features, has further enhanced the mod's overall experience. Wotan - Changed a stubborn, anti-mod OTA player's mind about mods in general and showed me what was possible
Dragun101 - Promoted the mod to a wider audience and exposed the FAF community to ProTA and TA in general, by involving ProTA in his SCTA mod showmatch livestreams
FunkyFr3sh Postal - Helped promote the mod via his Total Annihilation Replays Youtube channel, offered his Core Commander knowledge in balance discussions and helped keep me motivated to finish the project
Integral to ProTA's functionality on modern operating systems, FunkyFr3sh played a crucial role by adapting his software, CnC-DDraw, to seamlessly integrate with TA. This ensured full compatibility and functionality, addressing potential issues on newer platforms. Furthermore, FunkyFr3sh's expertise extended to valuable contributions in fixing issues within the TA engine, enhancing the overall performance and stability of the mod. timmyfred - Helped keep me motivated after Postal went on paternity leave. Helped with a lot of things along the way from testing fixes, putting in play time and always joined in with balance discussions
TAG_ROCK - Just for being TAG_ROCK
poosticks
A comprehensive TA guide served as an essential reference throughout the modding process, aiding in the verification of unit statistics and other details. To anyone that I may have missed, thank you.
Idec Sdawkminn
Leveraging insights from TAU forum posts, particularly "Complete Unit FBI Guide" and "Comprehensive Weapons Guide," Idec Sdawkminn's resources played a crucial role in learning the intricacies of modding TA.
zwzsg
Thanks to zwzsg's TAU forum posts, knowledge was acquired that facilitated the implementation of non-blocking sea wreckages.
SnakeInTheMirror
Acknowledging the significant work on the TA complete colour enhancement pack, we incorporated the team colours orange and teal, and enhanced the existing yellow, enriching the visual experience within the mod.
PlasmoidThunder
Identifying sound category bugs and providing additional insights, PlasmoidThunder's expertise ensured a more refined end product.
TAAN
Integrated some of the Evolva models by TAAN for a visual boost, some as-is and tweaking others to enhance the mod's aesthetics.
ACE_Beeky
Regular reference to ACE_Beeky's TAU post, "A Guide To Every Unit In TA," ensured comprehensive coverage and understanding, catching details that might have been otherwise overlooked.
Wotan
Effectively challenging the perspectives of anti-mod players, Wotan demonstrated what was achievable through modding.
Dragun101
Elevated the mod's visibility by promoting it to a wider audience and incorporating ProTA into SCTA mod showmatch live streams.
Postal
Played a pivotal role in mod promotion through the Total Annihilation Replays YouTube channel. Also, Postal's Core Commander knowledge and contributions to balance discussions have been invaluable.
timmyfred
Assisted in maintaining motivation during Postal's absence, contributing to various tasks such as testing fixes, actively participating in playtesting, and consistently engaging in discussions on balance improvements.
TAG_ROCK
Has played a pivotal role in showcasing the mod's gameplay, dedicating significant playtime, offering valuable assistance, and generously contributing funds for new 3D models. His dedicated involvement has been indispensable to the project's success.
Tristan
Preserving the mod's visual coherence, Tristan's 3D models for new units seamlessly assimilate into the theme, capturing the essence of Cavedog's original design. Throughout the collaborative process, his keen attention to detail and receptiveness to our ideas and thoughts fostered a dynamic exchange, resulting in finely crafted additions to the mod.
We extend our gratitude to anyone inadvertently omitted from this list. Your contributions have been invaluable to the success of ProTA. A heartfelt thank you to all players, casters, map makers, feedback contributors, content creators, and everyone who has lent their support in any form. Your collective efforts have played a significant role in shaping the success of ProTA, and we appreciate your dedication to the Total Annihilation community.

BIN
ProTA.gp3 (Stored with Git LFS)

Binary file not shown.

@ -1,701 +0,0 @@
//_____________________________/\_______________________________
//==============================================================
//
//
// [CRTS] PUBLIC DOMAIN CRT-STYLED SCALAR - 20180120b
//
// by Timothy Lottes
// https://www.shadertoy.com/view/MtSfRK
// adapted for RetroArch by hunterk
//
//
//==============================================================
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//_____________________________/\_______________________________
//==============================================================
//
// WHAT'S NEW
//
//--------------------------------------------------------------
// Evolution of prior shadertoy example
//--------------------------------------------------------------
// This one is semi-optimized
// - Less texture fetches
// - Didn't get to instruction level optimization
// - Could likely use texture fetch to generate phosphor mask
//--------------------------------------------------------------
// Added options to disable unused features
//--------------------------------------------------------------
// Added in exposure matching
// - Given scan-line effect and mask always darkens image
// - Uses generalized tonemapper to boost mid-level
// - Note this can compress highlights
// - And won't get back peak brightness
// - But best option if one doesn't want as much darkening
//--------------------------------------------------------------
// Includes option saturation and contrast controls
//--------------------------------------------------------------
// Added in subtractive aperture grille
// - This is a bit brighter than prior
//--------------------------------------------------------------
// Make sure input to this filter is already low-resolution
// - This is not designed to work on titles doing the following
// - Rendering to hi-res with nearest sampling
//--------------------------------------------------------------
// Added a fast and more pixely option for 2 tap/pixel
//--------------------------------------------------------------
// Improved the vignette when WARP is enabled
//--------------------------------------------------------------
// Didn't test HLSL or CPU options
// - Will incorportate patches if they are broken
// - But out of time to try them myself
//==============================================================
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//_____________________________/\_______________________________
//==============================================================
//
// LICENSE = UNLICENSE (aka PUBLIC DOMAIN)
//
//--------------------------------------------------------------
// This is free and unencumbered software released into the
// public domain.
//--------------------------------------------------------------
// Anyone is free to copy, modify, publish, use, compile, sell,
// or distribute this software, either in source code form or as
// a compiled binary, for any purpose, commercial or
// non-commercial, and by any means.
//--------------------------------------------------------------
// In jurisdictions that recognize copyright laws, the author or
// authors of this software dedicate any and all copyright
// interest in the software to the public domain. We make this
// dedication for the benefit of the public at large and to the
// detriment of our heirs and successors. We intend this
// dedication to be an overt act of relinquishment in perpetuity
// of all present and future rights to this software under
// copyright law.
//--------------------------------------------------------------
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//--------------------------------------------------------------
// For more information, please refer to
// <http://unlicense.org/>
//==============================================================
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
#pragma parameter MASK "Mask Type" 1.0 0.0 3.0 1.0
#pragma parameter MASK_INTENSITY "Mask Intensity" 0.5 0.0 1.0 0.05
#pragma parameter SCANLINE_THINNESS "Scanline Intensity" 0.5 0.0 1.0 0.1
#pragma parameter SCAN_BLUR "Sharpness" 2.5 1.0 3.0 0.1
#pragma parameter CURVATURE "Curvature" 0.02 0.0 0.25 0.01
#pragma parameter TRINITRON_CURVE "Trinitron-style Curve" 0.0 0.0 1.0 1.0
#pragma parameter CORNER "Corner Round" 3.0 0.0 11.0 1.0
#pragma parameter CRT_GAMMA "CRT Gamma" 2.4 0.0 51.0 0.1
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
vec4 _oPosition1;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
// compatibility #defines
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
void main()
{
gl_Position = MVPMatrix * VertexCoord;
TEX0.xy = TexCoord.xy;
}
#elif defined(FRAGMENT)
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out COMPAT_PRECISION vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
#ifdef PARAMETER_UNIFORM
uniform COMPAT_PRECISION float CRT_GAMMA;
uniform COMPAT_PRECISION float SCANLINE_THINNESS;
uniform COMPAT_PRECISION float SCAN_BLUR;
uniform COMPAT_PRECISION float MASK_INTENSITY;
uniform COMPAT_PRECISION float CURVATURE;
uniform COMPAT_PRECISION float CORNER;
uniform COMPAT_PRECISION float MASK;
uniform COMPAT_PRECISION float TRINITRON_CURVE;
#else
#define CRT_GAMMA 2.4
#define SCANLINE_THINNESS 0.5
#define SCAN_BLUR 2.5
#define MASK_INTENSITY 0.54
#define CURVATURE 0.00
#define CORNER 3.0
#define MASK 1.0
#define TRINITRON_CURVE 0.0
#endif
//_____________________________/\_______________________________
//==============================================================
//
// GAMMA FUNCTIONS
//
//--------------------------------------------------------------
//--------------------------------------------------------------
// Since shadertoy doesn't have sRGB textures
// And we need linear input into shader
// Don't do this in your code
float FromSrgb1(float c){
return (c<=0.04045)?c*(1.0/12.92):
pow(c*(1.0/1.055)+(0.055/1.055),CRT_GAMMA);}
//--------------------------------------------------------------
vec3 FromSrgb(vec3 c){return vec3(
FromSrgb1(c.r),FromSrgb1(c.g),FromSrgb1(c.b));}
// Convert from linear to sRGB
// Since shader toy output is not linear
float ToSrgb1(float c){
return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);}
//--------------------------------------------------------------
vec3 ToSrgb(vec3 c){return vec3(
ToSrgb1(c.r),ToSrgb1(c.g),ToSrgb1(c.b));}
//--------------------------------------------------------------
//_____________________________/\_______________________________
//==============================================================
//
// DEFINES
//
//--------------------------------------------------------------
// CRTS_CPU - CPU code
// CRTS_GPU - GPU code
//--------------------------------------------------------------
// CRTS_GLSL - GLSL
// CRTS_HLSL - HLSL (not tested yet)
//--------------------------------------------------------------
// CRTS_DEBUG - Define to see on/off split screen
//--------------------------------------------------------------
// CRTS_WARP - Apply screen warp
//--------------------------------------------------------------
// CRTS_2_TAP - Faster very pixely 2-tap filter (off is 8)
//--------------------------------------------------------------
// CRTS_MASK_GRILLE - Aperture grille (aka Trinitron)
// CRTS_MASK_GRILLE_LITE - Brighter (subtractive channels)
// CRTS_MASK_NONE - No mask
// CRTS_MASK_SHADOW - Horizontally stretched shadow mask
//--------------------------------------------------------------
// CRTS_TONE - Normalize mid-level and process color
// CRTS_CONTRAST - Process color - enable contrast control
// CRTS_SATURATION - Process color - enable saturation control
//--------------------------------------------------------------
#define CRTS_STATIC
#define CrtsPow
#define CRTS_RESTRICT
//==============================================================
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//==============================================================
// SETUP FOR CRTS
//--------------------------------------------------------------
//==============================================================
//#define CRTS_DEBUG 1
#define CRTS_GPU 1
#define CRTS_GLSL 1
//--------------------------------------------------------------
//#define CRTS_2_TAP 1
//--------------------------------------------------------------
#define CRTS_TONE 1
#define CRTS_CONTRAST 0
#define CRTS_SATURATION 0
//--------------------------------------------------------------
#define CRTS_WARP 1
//--------------------------------------------------------------
// Try different masks -> moved to runtime parameters
//#define CRTS_MASK_GRILLE 1
//#define CRTS_MASK_GRILLE_LITE 1
//#define CRTS_MASK_NONE 1
//#define CRTS_MASK_SHADOW 1
//--------------------------------------------------------------
// Scanline thinness
// 0.50 = fused scanlines
// 0.70 = recommended default
// 1.00 = thinner scanlines (too thin)
#define INPUT_THIN 0.5 + (0.5 * SCANLINE_THINNESS)
//--------------------------------------------------------------
// Horizonal scan blur
// -3.0 = pixely
// -2.5 = default
// -2.0 = smooth
// -1.0 = too blurry
#define INPUT_BLUR -1.0 * SCAN_BLUR
//--------------------------------------------------------------
// Shadow mask effect, ranges from,
// 0.25 = large amount of mask (not recommended, too dark)
// 0.50 = recommended default
// 1.00 = no shadow mask
#define INPUT_MASK 1.0 - MASK_INTENSITY
//--------------------------------------------------------------
#define INPUT_X InputSize.x
#define INPUT_Y InputSize.y
//--------------------------------------------------------------
// Setup the function which returns input image color
vec3 CrtsFetch(vec2 uv){
// For shadertoy, scale to get native texels in the image
uv*=vec2(INPUT_X,INPUT_Y)/TextureSize.xy;
// Move towards intersting parts
// uv+=vec2(0.5,0.5);
// Non-shadertoy case would not have the color conversion
return FromSrgb(COMPAT_TEXTURE(Texture,uv.xy,-16.0).rgb);}
#endif
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//_____________________________/\_______________________________
//==============================================================
//
// GPU CODE
//
//==============================================================
#ifdef CRTS_GPU
//_____________________________/\_______________________________
//==============================================================
// PORTABILITY
//==============================================================
#ifdef CRTS_GLSL
#define CrtsF1 float
#define CrtsF2 vec2
#define CrtsF3 vec3
#define CrtsF4 vec4
#define CrtsFractF1 fract
#define CrtsRcpF1(x) (1.0/(x))
#define CrtsSatF1(x) clamp((x),0.0,1.0)
//--------------------------------------------------------------
CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){
return max(a,max(b,c));}
#endif
//==============================================================
#ifdef CRTS_HLSL
#define CrtsF1 float
#define CrtsF2 float2
#define CrtsF3 float3
#define CrtsF4 float4
#define CrtsFractF1 frac
#define CrtsRcpF1(x) (1.0/(x))
#define CrtsSatF1(x) saturate(x)
//--------------------------------------------------------------
CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){
return max(a,max(b,c));}
#endif
//_____________________________/\_______________________________
//==============================================================
// TONAL CONTROL CONSTANT GENERATION
//--------------------------------------------------------------
// This is in here for rapid prototyping
// Please use the CPU code and pass in as constants
//==============================================================
CrtsF4 CrtsTone(
CrtsF1 contrast,
CrtsF1 saturation,
CrtsF1 thin,
CrtsF1 mask){
//--------------------------------------------------------------
if(MASK == 0.0) mask=1.0;
//--------------------------------------------------------------
if(MASK == 1.0){
// Normal R mask is {1.0,mask,mask}
// LITE R mask is {mask,1.0,1.0}
mask=0.5+mask*0.5;
}
//--------------------------------------------------------------
CrtsF4 ret;
CrtsF1 midOut=0.18/((1.5-thin)*(0.5*mask+0.5));
CrtsF1 pMidIn=pow(0.18,contrast);
ret.x=contrast;
ret.y=((-pMidIn)+midOut)/((1.0-pMidIn)*midOut);
ret.z=((-pMidIn)*midOut+pMidIn)/(midOut*(-pMidIn)+midOut);
ret.w=contrast+saturation;
return ret;}
//_____________________________/\_______________________________
//==============================================================
// MASK
//--------------------------------------------------------------
// Letting LCD/OLED pixel elements function like CRT phosphors
// So "phosphor" resolution scales with display resolution
//--------------------------------------------------------------
// Not applying any warp to the mask (want high frequency)
// Real aperture grille has a mask which gets wider on ends
// Not attempting to be "real" but instead look the best
//--------------------------------------------------------------
// Shadow mask is stretched horizontally
// RRGGBB
// GBBRRG
// RRGGBB
// This tends to look better on LCDs than vertical
// Also 2 pixel width is required to get triad centered
//--------------------------------------------------------------
// The LITE version of the Aperture Grille is brighter
// Uses {dark,1.0,1.0} for R channel
// Non LITE version uses {1.0,dark,dark}
//--------------------------------------------------------------
// 'pos' - This is 'fragCoord.xy'
// Pixel {0,0} should be {0.5,0.5}
// Pixel {1,1} should be {1.5,1.5}
//--------------------------------------------------------------
// 'dark' - Exposure of of masked channel
// 0.0=fully off, 1.0=no effect
//==============================================================
CrtsF3 CrtsMask(CrtsF2 pos,CrtsF1 dark){
if(MASK == 2.0){
CrtsF3 m=CrtsF3(dark,dark,dark);
CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0));
if(x<(1.0/3.0))m.r=1.0;
else if(x<(2.0/3.0))m.g=1.0;
else m.b=1.0;
return m;
}
//--------------------------------------------------------------
if(MASK == 1.0){
CrtsF3 m=CrtsF3(1.0,1.0,1.0);
CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0));
if(x<(1.0/3.0))m.r=dark;
else if(x<(2.0/3.0))m.g=dark;
else m.b=dark;
return m;
}
//--------------------------------------------------------------
if(MASK == 0.0){
return CrtsF3(1.0,1.0,1.0);
}
//--------------------------------------------------------------
if(MASK == 3.0){
pos.x+=pos.y*2.9999;
CrtsF3 m=CrtsF3(dark,dark,dark);
CrtsF1 x=CrtsFractF1(pos.x*(1.0/6.0));
if(x<(1.0/3.0))m.r=1.0;
else if(x<(2.0/3.0))m.g=1.0;
else m.b=1.0;
return m;
}
}
//_____________________________/\_______________________________
//==============================================================
// FILTER ENTRY
//--------------------------------------------------------------
// Input must be linear
// Output color is linear
//--------------------------------------------------------------
// Must have fetch function setup: CrtsF3 CrtsFetch(CrtsF2 uv)
// - The 'uv' range is {0.0 to 1.0} for input texture
// - Output of this must be linear color
//--------------------------------------------------------------
// SCANLINE MATH & AUTO-EXPOSURE NOTES
// ===================================
// Each output line has contribution from at most 2 scanlines
// Scanlines are shaped by a windowed cosine function
// This shape blends together well with only 2 lines of overlap
//--------------------------------------------------------------
// Base scanline intensity is as follows
// which leaves output intensity range from {0 to 1.0}
// --------
// thin := range {thick 0.5 to thin 1.0}
// off := range {0.0 to <1.0},
// sub-pixel offset between two scanlines
// --------
// a0=cos(min(0.5, off *thin)*2pi)*0.5+0.5;
// a1=cos(min(0.5,(1.0-off)*thin)*2pi)*0.5+0.5;
//--------------------------------------------------------------
// This leads to a image darkening factor of roughly:
// {(1.5-thin)/1.0}
// This is further reduced by the mask:
// {1.0/2.0+mask*1.0/2.0}
// Reciprocal of combined effect is used for auto-exposure
// to scale up the mid-level in the tonemapper
//==============================================================
CrtsF3 CrtsFilter(
//--------------------------------------------------------------
// SV_POSITION, fragCoord.xy
CrtsF2 ipos,
//--------------------------------------------------------------
// inputSize / outputSize (in pixels)
CrtsF2 inputSizeDivOutputSize,
//--------------------------------------------------------------
// 0.5 * inputSize (in pixels)
CrtsF2 halfInputSize,
//--------------------------------------------------------------
// 1.0 / inputSize (in pixels)
CrtsF2 rcpInputSize,
//--------------------------------------------------------------
// 1.0 / outputSize (in pixels)
CrtsF2 rcpOutputSize,
//--------------------------------------------------------------
// 2.0 / outputSize (in pixels)
CrtsF2 twoDivOutputSize,
//--------------------------------------------------------------
// inputSize.y
CrtsF1 inputHeight,
//--------------------------------------------------------------
// Warp scanlines but not phosphor mask
// 0.0 = no warp
// 1.0/64.0 = light warping
// 1.0/32.0 = more warping
// Want x and y warping to be different (based on aspect)
CrtsF2 warp,
//--------------------------------------------------------------
// Scanline thinness
// 0.50 = fused scanlines
// 0.70 = recommended default
// 1.00 = thinner scanlines (too thin)
// Shared with CrtsTone() function
CrtsF1 thin,
//--------------------------------------------------------------
// Horizonal scan blur
// -3.0 = pixely
// -2.5 = default
// -2.0 = smooth
// -1.0 = too blurry
CrtsF1 blur,
//--------------------------------------------------------------
// Shadow mask effect, ranges from,
// 0.25 = large amount of mask (not recommended, too dark)
// 0.50 = recommended default
// 1.00 = no shadow mask
// Shared with CrtsTone() function
CrtsF1 mask,
//--------------------------------------------------------------
// Tonal curve parameters generated by CrtsTone()
CrtsF4 tone
//--------------------------------------------------------------
){
//--------------------------------------------------------------
#ifdef CRTS_DEBUG
CrtsF2 uv=ipos*rcpOutputSize;
// Show second half processed, and first half un-processed
if(uv.x<0.5){
// Force nearest to get squares
uv*=1.0/rcpInputSize;
uv=floor(uv)+CrtsF2(0.5,0.5);
uv*=rcpInputSize;
CrtsF3 color=CrtsFetch(uv);
return color;}
#endif
//--------------------------------------------------------------
// Optional apply warp
CrtsF2 pos;
#ifdef CRTS_WARP
// Convert to {-1 to 1} range
pos=ipos*twoDivOutputSize-CrtsF2(1.0,1.0);
// Distort pushes image outside {-1 to 1} range
pos*=CrtsF2(
1.0+(pos.y*pos.y)*warp.x,
1.0+(pos.x*pos.x)*warp.y);
// TODO: Vignette needs optimization
CrtsF1 vin=(1.0-(
(1.0-CrtsSatF1(pos.x*pos.x))*(1.0-CrtsSatF1(pos.y*pos.y)))) * (0.998 + (0.001 * CORNER));
vin=CrtsSatF1((-vin)*inputHeight+inputHeight);
// Leave in {0 to inputSize}
pos=pos*halfInputSize+halfInputSize;
#else
pos=ipos*inputSizeDivOutputSize;
#endif
//--------------------------------------------------------------
// Snap to center of first scanline
CrtsF1 y0=floor(pos.y-0.5)+0.5;
#ifdef CRTS_2_TAP
// Using Inigo's "Improved Texture Interpolation"
// http://iquilezles.org/www/articles/texture/texture.htm
pos.x+=0.5;
CrtsF1 xi=floor(pos.x);
CrtsF1 xf=pos.x-xi;
xf=xf*xf*xf*(xf*(xf*6.0-15.0)+10.0);
CrtsF1 x0=xi+xf-0.5;
CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y);
// Coordinate adjusted bilinear fetch from 2 nearest scanlines
CrtsF3 colA=CrtsFetch(p);
p.y+=rcpInputSize.y;
CrtsF3 colB=CrtsFetch(p);
#else
// Snap to center of one of four pixels
CrtsF1 x0=floor(pos.x-1.5)+0.5;
// Inital UV position
CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y);
// Fetch 4 nearest texels from 2 nearest scanlines
CrtsF3 colA0=CrtsFetch(p);
p.x+=rcpInputSize.x;
CrtsF3 colA1=CrtsFetch(p);
p.x+=rcpInputSize.x;
CrtsF3 colA2=CrtsFetch(p);
p.x+=rcpInputSize.x;
CrtsF3 colA3=CrtsFetch(p);
p.y+=rcpInputSize.y;
CrtsF3 colB3=CrtsFetch(p);
p.x-=rcpInputSize.x;
CrtsF3 colB2=CrtsFetch(p);
p.x-=rcpInputSize.x;
CrtsF3 colB1=CrtsFetch(p);
p.x-=rcpInputSize.x;
CrtsF3 colB0=CrtsFetch(p);
#endif
//--------------------------------------------------------------
// Vertical filter
// Scanline intensity is using sine wave
// Easy filter window and integral used later in exposure
CrtsF1 off=pos.y-y0;
CrtsF1 pi2=6.28318530717958;
CrtsF1 hlf=0.5;
CrtsF1 scanA=cos(min(0.5, off *thin )*pi2)*hlf+hlf;
CrtsF1 scanB=cos(min(0.5,(-off)*thin+thin)*pi2)*hlf+hlf;
//--------------------------------------------------------------
#ifdef CRTS_2_TAP
#ifdef CRTS_WARP
// Get rid of wrong pixels on edge
scanA*=vin;
scanB*=vin;
#endif
// Apply vertical filter
CrtsF3 color=(colA*scanA)+(colB*scanB);
#else
// Horizontal kernel is simple gaussian filter
CrtsF1 off0=pos.x-x0;
CrtsF1 off1=off0-1.0;
CrtsF1 off2=off0-2.0;
CrtsF1 off3=off0-3.0;
CrtsF1 pix0=exp2(blur*off0*off0);
CrtsF1 pix1=exp2(blur*off1*off1);
CrtsF1 pix2=exp2(blur*off2*off2);
CrtsF1 pix3=exp2(blur*off3*off3);
CrtsF1 pixT=CrtsRcpF1(pix0+pix1+pix2+pix3);
#ifdef CRTS_WARP
// Get rid of wrong pixels on edge
pixT*=vin;
#endif
scanA*=pixT;
scanB*=pixT;
// Apply horizontal and vertical filters
CrtsF3 color=
(colA0*pix0+colA1*pix1+colA2*pix2+colA3*pix3)*scanA +
(colB0*pix0+colB1*pix1+colB2*pix2+colB3*pix3)*scanB;
#endif
//--------------------------------------------------------------
// Apply phosphor mask
color*=CrtsMask(ipos,mask);
//--------------------------------------------------------------
// Optional color processing
#ifdef CRTS_TONE
// Tonal control, start by protecting from /0
CrtsF1 peak=max(1.0/(256.0*65536.0),
CrtsMax3F1(color.r,color.g,color.b));
// Compute the ratios of {R,G,B}
CrtsF3 ratio=color*CrtsRcpF1(peak);
// Apply tonal curve to peak value
#ifdef CRTS_CONTRAST
peak=pow(peak,tone.x);
#endif
peak=peak*CrtsRcpF1(peak*tone.y+tone.z);
// Apply saturation
#ifdef CRTS_SATURATION
ratio=pow(ratio,CrtsF3(tone.w,tone.w,tone.w));
#endif
// Reconstruct color
return ratio*peak;
#else
return color;
#endif
//--------------------------------------------------------------
}
void main()
{
vec2 warp_factor;
warp_factor.x = CURVATURE;
warp_factor.y = (3.0 / 4.0) * warp_factor.x; // assume 4:3 aspect
warp_factor.x *= (1.0 - TRINITRON_CURVE);
FragColor.rgb = CrtsFilter(vTexCoord.xy * OutputSize.xy*(TextureSize.xy / InputSize.xy),
InputSize.xy / OutputSize.xy,
InputSize.xy * vec2(0.5,0.5),
1.0/InputSize.xy,
1.0/OutputSize.xy,
2.0/OutputSize.xy,
InputSize.y,
warp_factor,
INPUT_THIN,
INPUT_BLUR,
INPUT_MASK,
CrtsTone(1.0,0.0,INPUT_THIN,INPUT_MASK));
// Shadertoy outputs non-linear color
FragColor.rgb=ToSrgb(FragColor.rgb);
}
#endif

@ -1,73 +0,0 @@
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3];
TEX0.xy = TexCoord.xy;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
void main()
{
FragColor = COMPAT_TEXTURE(Texture, TEX0.xy);
}
#endif

@ -1,137 +0,0 @@
/*
The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae
Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1
Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16.
See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details
ATENTION: This code only work using LINEAR filter sampling set on Retroarch!
Modified to use 5 texture fetches
*/
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
precision COMPAT_PRECISION float;
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
COL0 = COLOR;
TEX0.xy = TexCoord.xy;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out mediump vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define outsize vec4(OutputSize, 1.0 / OutputSize)
void main()
{
// We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding
// down the sample location to get the exact center of our "starting" texel. The starting texel will be at
// location [1, 1] in the grid, where [0, 0] is the top left corner.
vec2 samplePos = vTexCoord * SourceSize.xy;
vec2 texPos1 = floor(samplePos - 0.5) + 0.5;
// Compute the fractional offset from our starting texel to our original sample location, which we'll
// feed into the Catmull-Rom spline function to get our filter weights.
vec2 f = samplePos - texPos1;
// Compute the Catmull-Rom weights using the fractional offset that we calculated earlier.
// These equations are pre-expanded based on our knowledge of where the texels will be located,
// which lets us avoid having to evaluate a piece-wise function.
vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));
vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);
vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));
vec2 w3 = f * f * (-0.5 + 0.5 * f);
// Work out weighting factors and sampling offsets that will let us use bilinear filtering to
// simultaneously evaluate the middle 2 samples from the 4x4 grid.
vec2 w12 = w1 + w2;
vec2 offset12 = w2 / (w1 + w2);
// Compute the final UV coordinates we'll use for sampling the texture
vec2 texPos0 = texPos1 - 1.;
vec2 texPos3 = texPos1 + 2.;
vec2 texPos12 = texPos1 + offset12;
texPos0 *= SourceSize.zw;
texPos3 *= SourceSize.zw;
texPos12 *= SourceSize.zw;
float wtm = w12.x * w0.y;
float wml = w0.x * w12.y;
float wmm = w12.x * w12.y;
float wmr = w3.x * w12.y;
float wbm = w12.x * w3.y;
vec3 result = vec3(0.0f);
result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm;
result += COMPAT_TEXTURE(Source, vec2(texPos0.x, texPos12.y)).rgb * wml;
result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm;
result += COMPAT_TEXTURE(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr;
result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm;
FragColor = vec4(result * (1./(wtm+wml+wmm+wmr+wbm)), 1.0);
}
#endif

@ -1,202 +0,0 @@
/*
Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader
Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#define JINC2_WINDOW_SINC 0.405
#define JINC2_SINC 0.79
#define JINC2_AR_STRENGTH 0.8
#define texCoord TEX0
#if defined(VERTEX)
#if __VERSION__ >= 130
#define OUT out
#define IN in
#define tex2D texture
#else
#define OUT varying
#define IN attribute
#define tex2D texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
IN vec4 VertexCoord;
IN vec4 Color;
IN vec2 TexCoord;
OUT vec4 color;
OUT vec2 texCoord;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
color = Color;
texCoord = TexCoord * 1.0001;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define IN in
#define tex2D texture
out vec4 FragColor;
#else
#define IN varying
#define FragColor gl_FragColor
#define tex2D texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D s_p;
IN vec2 texCoord;
const float halfpi = 1.5707963267948966192313216916398;
const float pi = 3.1415926535897932384626433832795;
const float wa = JINC2_WINDOW_SINC*pi;
const float wb = JINC2_SINC*pi;
// Calculates the distance between two points
float d(vec2 pt1, vec2 pt2)
{
vec2 v = pt2 - pt1;
return sqrt(dot(v,v));
}
vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)
{
return min(a, min(b, min(c, d)));
}
vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)
{
return max(a, max(b, max(c, d)));
}
vec4 resampler(vec4 x)
{
vec4 res;
res = (x==vec4(0.0, 0.0, 0.0, 0.0)) ? vec4(wa*wb) : sin(x*wa)*sin(x*wb)/(x*x);
return res;
}
void main()
{
vec3 color;
vec4 weights[4];
vec2 dx = vec2(1.0, 0.0);
vec2 dy = vec2(0.0, 1.0);
vec2 pc = texCoord*TextureSize;
vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));
weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));
weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));
weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));
weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));
dx = dx/TextureSize;
dy = dy/TextureSize;
tc = tc/TextureSize;
vec3 c00 = tex2D(s_p, tc -dx -dy).xyz;
vec3 c10 = tex2D(s_p, tc -dy).xyz;
vec3 c20 = tex2D(s_p, tc +dx -dy).xyz;
vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz;
vec3 c01 = tex2D(s_p, tc -dx ).xyz;
vec3 c11 = tex2D(s_p, tc ).xyz;
vec3 c21 = tex2D(s_p, tc +dx ).xyz;
vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz;
vec3 c02 = tex2D(s_p, tc -dx +dy).xyz;
vec3 c12 = tex2D(s_p, tc +dy).xyz;
vec3 c22 = tex2D(s_p, tc +dx +dy).xyz;
vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz;
vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz;
vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz;
vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz;
vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz;
color = tex2D(s_p, texCoord).xyz;
// Get min/max samples
vec3 min_sample = min4(c11, c21, c12, c22);
vec3 max_sample = max4(c11, c21, c12, c22);
/*
color = mat4x3(c00, c10, c20, c30) * weights[0];
color+= mat4x3(c01, c11, c21, c31) * weights[1];
color+= mat4x3(c02, c12, c22, c32) * weights[2];
color+= mat4x3(c03, c13, c23, c33) * weights[3];
mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]);
vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0);
color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0)));
*/
color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));
color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));
color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));
color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));
color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));
// Anti-ringing
vec3 aux = color;
color = clamp(color, min_sample, max_sample);
color = mix(aux, color, JINC2_AR_STRENGTH);
// final sum and weight normalization
FragColor.xyz = color;
}
#endif

@ -1,205 +0,0 @@
/*
Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader
Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#define JINC2_WINDOW_SINC 0.5
#define JINC2_SINC 1.0
#define JINC2_AR_STRENGTH 0.8
#define texCoord TEX0
#if defined(VERTEX)
#if __VERSION__ >= 130
#define OUT out
#define IN in
#define tex2D texture
#else
#define OUT varying
#define IN attribute
#define tex2D texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
IN vec4 VertexCoord;
IN vec4 Color;
IN vec2 TexCoord;
OUT vec4 color;
OUT vec2 texCoord;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
color = Color;
texCoord = TexCoord;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define IN in
#define tex2D texture
out vec4 FragColor;
#else
#define IN varying
#define FragColor gl_FragColor
#define tex2D texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D s_p;
IN vec2 texCoord;
const float halfpi = 1.5707963267948966192313216916398;
const float pi = 3.1415926535897932384626433832795;
const float wa = JINC2_WINDOW_SINC*pi;
const float wb = JINC2_SINC*pi;
// Calculates the distance between two points
float d(vec2 pt1, vec2 pt2)
{
vec2 v = pt2 - pt1;
return sqrt(dot(v,v));
}
vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)
{
return min(a, min(b, min(c, d)));
}
vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)
{
return max(a, max(b, max(c, d)));
}
vec4 resampler(vec4 x)
{
vec4 res;
res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);
res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);
res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);
res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);
return res;
}
void main()
{
vec3 color;
vec4 weights[4];
vec2 dx = vec2(1.0, 0.0);
vec2 dy = vec2(0.0, 1.0);
vec2 pc = texCoord*TextureSize;
vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));
weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));
weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));
weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));
weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));
dx = dx/TextureSize;
dy = dy/TextureSize;
tc = tc/TextureSize;
vec3 c00 = tex2D(s_p, tc -dx -dy).xyz;
vec3 c10 = tex2D(s_p, tc -dy).xyz;
vec3 c20 = tex2D(s_p, tc +dx -dy).xyz;
vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz;
vec3 c01 = tex2D(s_p, tc -dx ).xyz;
vec3 c11 = tex2D(s_p, tc ).xyz;
vec3 c21 = tex2D(s_p, tc +dx ).xyz;
vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz;
vec3 c02 = tex2D(s_p, tc -dx +dy).xyz;
vec3 c12 = tex2D(s_p, tc +dy).xyz;
vec3 c22 = tex2D(s_p, tc +dx +dy).xyz;
vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz;
vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz;
vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz;
vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz;
vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz;
color = tex2D(s_p, texCoord).xyz;
// Get min/max samples
vec3 min_sample = min4(c11, c21, c12, c22);
vec3 max_sample = max4(c11, c21, c12, c22);
/*
color = mat4x3(c00, c10, c20, c30) * weights[0];
color+= mat4x3(c01, c11, c21, c31) * weights[1];
color+= mat4x3(c02, c12, c22, c32) * weights[2];
color+= mat4x3(c03, c13, c23, c33) * weights[3];
mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]);
vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0);
color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0)));
*/
color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));
color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));
color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));
color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));
color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));
// Anti-ringing
vec3 aux = color;
color = clamp(color, min_sample, max_sample);
color = mix(aux, color, JINC2_AR_STRENGTH);
// final sum and weight normalization
FragColor.xyz = color;
}
#endif

@ -1,73 +0,0 @@
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3];
TEX0.xy = TexCoord.xy;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
void main()
{
FragColor = COMPAT_TEXTURE(Texture, TEX0.xy);
}
#endif

@ -1,10 +0,0 @@
This is a package of pixel shaders intended for old school emulators.
Copyrights are held by the respective authors.
https://github.com/libretro/glsl-shaders
Note: Filename must end with "bilinear.glsl" to enable bilinear hardware filtering (GL_LINEAR)
Extract shader-package.zip to unlock 100+ additional shaders

@ -1,106 +0,0 @@
// Parameter lines go here:
#pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.95 0.0 1.0 0.01
#pragma parameter SCANLINE_SINE_COMP_A "Scanline Sine Comp A" 0.0 0.0 0.10 0.01
#pragma parameter SCANLINE_SINE_COMP_B "Scanline Sine Comp B" 0.15 0.0 1.0 0.05
#define pi 3.141592654
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING vec2 omega;
vec4 _oPosition1;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
COL0 = COLOR;
TEX0.xy = TexCoord.xy;
omega = vec2(pi * OutputSize.x, 2.0 * pi * TextureSize.y);
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING vec2 omega;
// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutputSize vec4(OutputSize, 1.0 / OutputSize)
#ifdef PARAMETER_UNIFORM
// All parameter floats need to have COMPAT_PRECISION in front of them
uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS;
uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_A;
uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_B;
#else
#define SCANLINE_BASE_BRIGHTNESS 0.95
#define SCANLINE_SINE_COMP_A 0.0
#define SCANLINE_SINE_COMP_B 0.15
#endif
void main()
{
vec2 sine_comp = vec2(SCANLINE_SINE_COMP_A, SCANLINE_SINE_COMP_B);
vec3 res = COMPAT_TEXTURE(Source, vTexCoord).xyz;
vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(vTexCoord * omega), vec2(1.0, 1.0)));
FragColor = vec4(scanline.x, scanline.y, scanline.z, 1.0);
}
#endif

BIN
Shaders/shader-package.zip (Stored with Git LFS)

Binary file not shown.

@ -1,148 +0,0 @@
/*
Fast Sharpen Shader
Copyright (C) 2005 - 2019 guest(r) - guest.r@gmail.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.
*/
#pragma parameter SHARPEN "Sharpen strength" 1.00 0.0 2.00 0.05
#pragma parameter CONTR "Ammount of sharpening" 0.07 0.0 0.25 0.01
#pragma parameter DETAILS "Details sharpened " 1.00 0.0 1.00 0.05
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 TEX0;
vec4 _oPosition1;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
COMPAT_VARYING vec2 g10;
COMPAT_VARYING vec2 g01;
COMPAT_VARYING vec2 g12;
COMPAT_VARYING vec2 g21;
// compatibility #defines
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
void main()
{
gl_Position = MVPMatrix * VertexCoord;
TEX0.xy = TexCoord.xy * 1.00001;
g10 = vec2( 0.3333,-1.0)*SourceSize.zw;
g01 = vec2(-1.0,-0.3333)*SourceSize.zw;
g12 = vec2(-0.3333, 1.0)*SourceSize.zw;
g21 = vec2( 1.0, 0.3333)*SourceSize.zw;
}
#elif defined(FRAGMENT)
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out COMPAT_PRECISION vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING vec2 g10;
COMPAT_VARYING vec2 g01;
COMPAT_VARYING vec2 g12;
COMPAT_VARYING vec2 g21;
// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
#ifdef PARAMETER_UNIFORM
uniform COMPAT_PRECISION float SHARPEN;
uniform COMPAT_PRECISION float CONTR;
uniform COMPAT_PRECISION float DETAILS;
#else
#define SHARPEN 1.2
#define CONTR 0.08
#define DETAILS 1.0
#endif
void main()
{
vec3 c10 = COMPAT_TEXTURE(Source, vTexCoord + g10).rgb;
vec3 c01 = COMPAT_TEXTURE(Source, vTexCoord + g01).rgb;
vec3 c21 = COMPAT_TEXTURE(Source, vTexCoord + g21).rgb;
vec3 c12 = COMPAT_TEXTURE(Source, vTexCoord + g12).rgb;
vec3 c11 = COMPAT_TEXTURE(Source, vTexCoord ).rgb;
vec3 b11 = (c10+c01+c12+c21)*0.25;
float contrast = max(max(c11.r,c11.g),c11.b);
contrast = mix(2.0*CONTR, CONTR, contrast);
vec3 mn1 = min(min(c10,c01),min(c12,c21)); mn1 = min(mn1,c11*(1.0-contrast));
vec3 mx1 = max(max(c10,c01),max(c12,c21)); mx1 = max(mx1,c11*(1.0+contrast));
vec3 dif = pow(mx1-mn1+0.0001, vec3(0.75,0.75,0.75));
vec3 sharpen = mix(vec3(SHARPEN*DETAILS), vec3(SHARPEN), dif);
c11 = clamp(mix(c11,b11,-sharpen), mn1,mx1);
FragColor = vec4(c11,1.0);
}
#endif

@ -1,300 +0,0 @@
#version 130
/*
Hyllian's xBR-lv2-noblend Shader
Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Incorporates some of the ideas from SABR shader. Thanks to Joshua Street.
*/
#pragma parameter XBR_EQ_THRESHOLD "Eq Threshold" 0.6 0.0 2.0 0.1
#pragma parameter XBR_LV2_COEFFICIENT "Lv2 Coefficient" 2.0 1.0 3.0 0.1
#define mul(a,b) (b*a)
// Uncomment just one of the three params below to choose the corner detection
#define CORNER_A
//#define CORNER_B
//#define CORNER_C
//#define CORNER_D
#define lv2_cf XBR_LV2_COEFFICIENT
#define texCoord TEX0
#define t1 TEX1
#define t2 TEX2
#define t3 TEX3
#define t4 TEX4
#define t5 TEX5
#define t6 TEX6
#define t7 TEX7
#if defined(VERTEX)
#if __VERSION__ >= 130
#define OUT out
#define IN in
#define tex2D texture
#else
#define OUT varying
#define IN attribute
#define tex2D texture2D
#endif
#ifdef GL_ES
#define PRECISION mediump
#else
#define PRECISION
#endif
IN vec4 VertexCoord;
IN vec4 Color;
IN vec2 TexCoord;
OUT vec4 color;
OUT vec2 texCoord;
OUT vec4 t1;
OUT vec4 t2;
OUT vec4 t3;
OUT vec4 t4;
OUT vec4 t5;
OUT vec4 t6;
OUT vec4 t7;
uniform mat4 MVPMatrix;
uniform PRECISION int FrameDirection;
uniform PRECISION int FrameCount;
uniform PRECISION vec2 OutputSize;
uniform PRECISION vec2 TextureSize;
uniform PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
color = Color;
float dx = (1.0/TextureSize.x);
float dy = (1.0/TextureSize.y);
texCoord = TexCoord;
texCoord.x *= 1.00000001;
t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1
t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C
t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F
t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I
t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5
t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0
t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define IN in
#define tex2D texture
out vec4 FragColor;
#else
#define IN varying
#define FragColor gl_FragColor
#define tex2D texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define PRECISION mediump
#else
#define PRECISION
#endif
uniform PRECISION int FrameDirection;
uniform PRECISION int FrameCount;
uniform PRECISION vec2 OutputSize;
uniform PRECISION vec2 TextureSize;
uniform PRECISION vec2 InputSize;
uniform sampler2D decal;
IN vec2 texCoord;
IN vec4 t1;
IN vec4 t2;
IN vec4 t3;
IN vec4 t4;
IN vec4 t5;
IN vec4 t6;
IN vec4 t7;
#ifdef PARAMETER_UNIFORM
uniform PRECISION float XBR_EQ_THRESHOLD;
uniform PRECISION float XBR_LV2_COEFFICIENT;
#else
#define XBR_EQ_THRESHOLD 0.6
#define XBR_LV2_COEFFICIENT 2.0
#endif
// END PARAMETERS //
const vec3 Y = vec3(0.2126, 0.7152, 0.0722);
// Difference between vector components.
vec4 df(vec4 A, vec4 B)
{
return vec4(abs(A-B));
}
// Compare two vectors and return their components are different.
vec4 diff(vec4 A, vec4 B)
{
return vec4(notEqual(A, B));
}
// Determine if two vector components are equal based on a threshold.
vec4 eq(vec4 A, vec4 B)
{
return (step(df(A, B), vec4(XBR_EQ_THRESHOLD)));
}
// Determine if two vector components are NOT equal based on a threshold.
vec4 neq(vec4 A, vec4 B)
{
return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B));
}
// Weighted distance.
vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h)
{
return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h));
}
vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l)
{
return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h));
}
float c_df(vec3 c1, vec3 c2)
{
vec3 df = abs(c1 - c2);
return df.r + df.g + df.b;
}
void main()
{
vec4 edri, edr, edr_l, edr_u; // px = pixel, edr = edge detection rule
vec4 irlv1, irlv2l, irlv2u, block_3d;
bvec4 nc, px;
vec4 fx, fx_l, fx_u; // inequations of straight lines.
vec2 fp = fract(texCoord*TextureSize);
vec3 A1 = tex2D(decal, t1.xw ).xyz;
vec3 B1 = tex2D(decal, t1.yw ).xyz;
vec3 C1 = tex2D(decal, t1.zw ).xyz;
vec3 A = tex2D(decal, t2.xw ).xyz;
vec3 B = tex2D(decal, t2.yw ).xyz;
vec3 C = tex2D(decal, t2.zw ).xyz;
vec3 D = tex2D(decal, t3.xw ).xyz;
vec3 E = tex2D(decal, t3.yw ).xyz;
vec3 F = tex2D(decal, t3.zw ).xyz;
vec3 G = tex2D(decal, t4.xw ).xyz;
vec3 H = tex2D(decal, t4.yw ).xyz;
vec3 I = tex2D(decal, t4.zw ).xyz;
vec3 G5 = tex2D(decal, t5.xw ).xyz;
vec3 H5 = tex2D(decal, t5.yw ).xyz;
vec3 I5 = tex2D(decal, t5.zw ).xyz;
vec3 A0 = tex2D(decal, t6.xy ).xyz;
vec3 D0 = tex2D(decal, t6.xz ).xyz;
vec3 G0 = tex2D(decal, t6.xw ).xyz;
vec3 C4 = tex2D(decal, t7.xy ).xyz;
vec3 F4 = tex2D(decal, t7.xz ).xyz;
vec3 I4 = tex2D(decal, t7.xw ).xyz;
vec4 b = mul( mat4x3(B, D, H, F), Y );
vec4 c = mul( mat4x3(C, A, G, I), Y );
vec4 e = mul( mat4x3(E, E, E, E), Y );
vec4 d = b.yzwx;
vec4 f = b.wxyz;
vec4 g = c.zwxy;
vec4 h = b.zwxy;
vec4 i = c.wxyz;
vec4 i4 = mul( mat4x3(I4, C1, A0, G5), Y );
vec4 i5 = mul( mat4x3(I5, C4, A1, G0), Y );
vec4 h5 = mul( mat4x3(H5, F4, B1, D0), Y );
vec4 f4 = h5.yzwx;
vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 );
vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 );
vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 );
vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 );
vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 );
vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 );
vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 );
vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 );
vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 );
// These inequations define the line below which interpolation occurs.
fx = vec4(greaterThan(Ao*fp.y+Bo*fp.x, Co));
fx_l = vec4(greaterThan(Ax*fp.y+Bx*fp.x, Cx));
fx_u = vec4(greaterThan(Ay*fp.y+By*fp.x, Cy));
#ifdef CORNER_A
irlv1 = diff(e,f) * diff(e,h);
#endif
#ifdef CORNER_B
irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c));
#endif
#ifdef CORNER_D
vec4 c1 = i4.yzwx;
vec4 g0 = i5.wxyz;
irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0));
#endif
#ifdef CORNER_C
irlv1 = (neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c));
#endif
irlv2l = diff(e,g) * diff(d,g);
irlv2u = diff(e,c) * diff(b,c);
vec4 wd1 = wd( e, c, g, i, h5, f4, h, f);
vec4 wd2 = wd( h, d, i5, f, i4, b, e, i);
edri = step(wd1, wd2) * irlv1;
edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1);
edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr;
edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr;
nc = bvec4( edr * ( fx + edr_l * (fx_l)) + edr_u * fx_u);
px = lessThanEqual(df(e, f), df(e, h));
vec3 res1 = nc.x ? px.x ? F : H : nc.y ? px.y ? B : F : nc.z ? px.z ? D : B : E;
vec3 res2 = nc.w ? px.w ? H : D : nc.z ? px.z ? D : B : nc.y ? px.y ? B : F : E;
vec2 df12 = abs( mul( mat2x3(res1, res2), Y ) - e.xy);
vec3 res = mix(res1, res2, step(df12.x, df12.y));
FragColor.xyz = res;
}
#endif

@ -1,375 +0,0 @@
/*
Hyllian's xBR-vertex code and texel mapping
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
// This shader also uses code and/or concepts from xBRZ as it appears
// in the Desmume source code. The license for which is as follows:
// ****************************************************************************
// * This file is part of the HqMAME project. It is distributed under *
// * GNU General Public License: http://www.gnu.org/licenses/gpl-3.0 *
// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
// * *
// * Additionally and as a special exception, the author gives permission *
// * to link the code of this program with the MAME library (or with modified *
// * versions of MAME that use the same license as MAME), and distribute *
// * linked combinations including the two. You must obey the GNU General *
// * Public License in all respects for all of the code used other than MAME. *
// * If you modify this file, you may extend this exception to your version *
// * of the file, but you are not obligated to do so. If you do not wish to *
// * do so, delete this exception statement from your version. *
// ****************************************************************************
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
vec4 _oPosition1;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
// compatibility #defines
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
#ifdef PARAMETER_UNIFORM
uniform COMPAT_PRECISION float WHATEVER;
#else
#define WHATEVER 0.0
#endif
void main()
{
gl_Position = MVPMatrix * VertexCoord;
TEX0.xy = TexCoord.xy * 1.0001;
}
#elif defined(FRAGMENT)
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out COMPAT_PRECISION vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
#define BLEND_NONE 0
#define BLEND_NORMAL 1
#define BLEND_DOMINANT 2
#define LUMINANCE_WEIGHT 1.0
#define EQUAL_COLOR_TOLERANCE 30.0/255.0
#define STEEP_DIRECTION_THRESHOLD 2.2
#define DOMINANT_DIRECTION_THRESHOLD 3.6
float DistYCbCr(vec3 pixA, vec3 pixB)
{
const vec3 w = vec3(0.2627, 0.6780, 0.0593);
const float scaleB = 0.5 / (1.0 - w.b);
const float scaleR = 0.5 / (1.0 - w.r);
vec3 diff = pixA - pixB;
float Y = dot(diff.rgb, w);
float Cb = scaleB * (diff.b - Y);
float Cr = scaleR * (diff.r - Y);
return sqrt(((LUMINANCE_WEIGHT * Y) * (LUMINANCE_WEIGHT * Y)) + (Cb * Cb) + (Cr * Cr));
}
bool IsPixEqual(const vec3 pixA, const vec3 pixB)
{
return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);
}
float get_left_ratio(vec2 center, vec2 origin, vec2 direction, vec2 scale)
{
vec2 P0 = center - origin;
vec2 proj = direction * (dot(P0, direction) / dot(direction, direction));
vec2 distv = P0 - proj;
vec2 orth = vec2(-direction.y, direction.x);
float side = sign(dot(P0, orth));
float v = side * length(distv * scale);
// return step(0, v);
return smoothstep(-sqrt(2.0)/2.0, sqrt(2.0)/2.0, v);
}
#define eq(a,b) (a == b)
#define neq(a,b) (a != b)
#define P(x,y) COMPAT_TEXTURE(Source, coord + SourceSize.zw * vec2(x, y)).rgb
void main()
{
//---------------------------------------
// Input Pixel Mapping: -|x|x|x|-
// x|A|B|C|x
// x|D|E|F|x
// x|G|H|I|x
// -|x|x|x|-
vec2 scale = OutputSize.xy * SourceSize.zw;
vec2 pos = fract(vTexCoord * SourceSize.xy) - vec2(0.5, 0.5);
vec2 coord = vTexCoord - pos * SourceSize.zw;
vec3 A = P(-1.,-1.);
vec3 B = P( 0.,-1.);
vec3 C = P( 1.,-1.);
vec3 D = P(-1., 0.);
vec3 E = P( 0., 0.);
vec3 F = P( 1., 0.);
vec3 G = P(-1., 1.);
vec3 H = P( 0., 1.);
vec3 I = P( 1., 1.);
// blendResult Mapping: x|y|
// w|z|
ivec4 blendResult = ivec4(BLEND_NONE,BLEND_NONE,BLEND_NONE,BLEND_NONE);
// Preprocess corners
// Pixel Tap Mapping: -|-|-|-|-
// -|-|B|C|-
// -|D|E|F|x
// -|G|H|I|x
// -|-|x|x|-
if (!((eq(E,F) && eq(H,I)) || (eq(E,H) && eq(F,I))))
{
float dist_H_F = DistYCbCr(G, E) + DistYCbCr(E, C) + DistYCbCr(P(0,2), I) + DistYCbCr(I, P(2.,0.)) + (4.0 * DistYCbCr(H, F));
float dist_E_I = DistYCbCr(D, H) + DistYCbCr(H, P(1,2)) + DistYCbCr(B, F) + DistYCbCr(F, P(2.,1.)) + (4.0 * DistYCbCr(E, I));
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_H_F) < dist_E_I;
blendResult.z = ((dist_H_F < dist_E_I) && neq(E,F) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
}
// Pixel Tap Mapping: -|-|-|-|-
// -|A|B|-|-
// x|D|E|F|-
// x|G|H|I|-
// -|x|x|-|-
if (!((eq(D,E) && eq(G,H)) || (eq(D,G) && eq(E,H))))
{
float dist_G_E = DistYCbCr(P(-2.,1.) , D) + DistYCbCr(D, B) + DistYCbCr(P(-1.,2.), H) + DistYCbCr(H, F) + (4.0 * DistYCbCr(G, E));
float dist_D_H = DistYCbCr(P(-2.,0.) , G) + DistYCbCr(G, P(0.,2.)) + DistYCbCr(A, E) + DistYCbCr(E, I) + (4.0 * DistYCbCr(D, H));
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_H) < dist_G_E;
blendResult.w = ((dist_G_E > dist_D_H) && neq(E,D) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
}
// Pixel Tap Mapping: -|-|x|x|-
// -|A|B|C|x
// -|D|E|F|x
// -|-|H|I|-
// -|-|-|-|-
if (!((eq(B,C) && eq(E,F)) || (eq(B,E) && eq(C,F))))
{
float dist_E_C = DistYCbCr(D, B) + DistYCbCr(B, P(1.,-2.)) + DistYCbCr(H, F) + DistYCbCr(F, P(2.,-1.)) + (4.0 * DistYCbCr(E, C));
float dist_B_F = DistYCbCr(A, E) + DistYCbCr(E, I) + DistYCbCr(P(0.,-2.), C) + DistYCbCr(C, P(2.,0.)) + (4.0 * DistYCbCr(B, F));
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_B_F) < dist_E_C;
blendResult.y = ((dist_E_C > dist_B_F) && neq(E,B) && neq(E,F)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
}
// Pixel Tap Mapping: -|x|x|-|-
// x|A|B|C|-
// x|D|E|F|-
// -|G|H|-|-
// -|-|-|-|-
if (!((eq(A,B) && eq(D,E)) || (eq(A,D) && eq(B,E))))
{
float dist_D_B = DistYCbCr(P(-2.,0.), A) + DistYCbCr(A, P(0.,-2.)) + DistYCbCr(G, E) + DistYCbCr(E, C) + (4.0 * DistYCbCr(D, B));
float dist_A_E = DistYCbCr(P(-2.,-1.), D) + DistYCbCr(D, H) + DistYCbCr(P(-1.,-2.), B) + DistYCbCr(B, F) + (4.0 * DistYCbCr(A, E));
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_B) < dist_A_E;
blendResult.x = ((dist_D_B < dist_A_E) && neq(E,D) && neq(E,B)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
}
vec3 res = E;
// Pixel Tap Mapping: -|-|-|-|-
// -|-|B|C|-
// -|D|E|F|x
// -|G|H|I|x
// -|-|x|x|-
if(blendResult.z != BLEND_NONE)
{
float dist_F_G = DistYCbCr(F, G);
float dist_H_C = DistYCbCr(H, C);
bool doLineBlend = (blendResult.z == BLEND_DOMINANT ||
!((blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || (blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) ||
(IsPixEqual(G, H) && IsPixEqual(H, I) && IsPixEqual(I, F) && IsPixEqual(F, C) && !IsPixEqual(E, I))));
vec2 origin = vec2(0.0, 1.0 / sqrt(2.0));
vec2 direction = vec2(1.0, -1.0);
if(doLineBlend)
{
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_F_G <= dist_H_C) && neq(E,G) && neq(D,G);
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_H_C <= dist_F_G) && neq(E,C) && neq(B,C);
origin = haveShallowLine? vec2(0.0, 0.25) : vec2(0.0, 0.5);
direction.x += haveShallowLine? 1.0: 0.0;
direction.y -= haveSteepLine? 1.0: 0.0;
}
vec3 blendPix = mix(H,F, step(DistYCbCr(E, F), DistYCbCr(E, H)));
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
}
// Pixel Tap Mapping: -|-|-|-|-
// -|A|B|-|-
// x|D|E|F|-
// x|G|H|I|-
// -|x|x|-|-
if(blendResult.w != BLEND_NONE)
{
float dist_H_A = DistYCbCr(H, A);
float dist_D_I = DistYCbCr(D, I);
bool doLineBlend = (blendResult.w == BLEND_DOMINANT ||
!((blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || (blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) ||
(IsPixEqual(A, D) && IsPixEqual(D, G) && IsPixEqual(G, H) && IsPixEqual(H, I) && !IsPixEqual(E, G))));
vec2 origin = vec2(-1.0 / sqrt(2.0), 0.0);
vec2 direction = vec2(1.0, 1.0);
if(doLineBlend)
{
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_H_A <= dist_D_I) && neq(E,A) && neq(B,A);
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_D_I <= dist_H_A) && neq(E,I) && neq(F,I);
origin = haveShallowLine? vec2(-0.25, 0.0) : vec2(-0.5, 0.0);
direction.y += haveShallowLine? 1.0: 0.0;
direction.x += haveSteepLine? 1.0: 0.0;
}
origin = origin;
direction = direction;
vec3 blendPix = mix(H,D, step(DistYCbCr(E, D), DistYCbCr(E, H)));
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
}
// Pixel Tap Mapping: -|-|x|x|-
// -|A|B|C|x
// -|D|E|F|x
// -|-|H|I|-
// -|-|-|-|-
if(blendResult.y != BLEND_NONE)
{
float dist_B_I = DistYCbCr(B, I);
float dist_F_A = DistYCbCr(F, A);
bool doLineBlend = (blendResult.y == BLEND_DOMINANT ||
!((blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || (blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) ||
(IsPixEqual(I, F) && IsPixEqual(F, C) && IsPixEqual(C, B) && IsPixEqual(B, A) && !IsPixEqual(E, C))));
vec2 origin = vec2(1.0 / sqrt(2.0), 0.0);
vec2 direction = vec2(-1.0, -1.0);
if(doLineBlend)
{
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_B_I <= dist_F_A) && neq(E,I) && neq(H,I);
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_F_A <= dist_B_I) && neq(E,A) && neq(D,A);
origin = haveShallowLine? vec2(0.25, 0.0) : vec2(0.5, 0.0);
direction.y -= haveShallowLine? 1.0: 0.0;
direction.x -= haveSteepLine? 1.0: 0.0;
}
vec3 blendPix = mix(F,B, step(DistYCbCr(E, B), DistYCbCr(E, F)));
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
}
// Pixel Tap Mapping: -|x|x|-|-
// x|A|B|C|-
// x|D|E|F|-
// -|G|H|-|-
// -|-|-|-|-
if(blendResult.x != BLEND_NONE)
{
float dist_D_C = DistYCbCr(D, C);
float dist_B_G = DistYCbCr(B, G);
bool doLineBlend = (blendResult.x == BLEND_DOMINANT ||
!((blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || (blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) ||
(IsPixEqual(C, B) && IsPixEqual(B, A) && IsPixEqual(A, D) && IsPixEqual(D, G) && !IsPixEqual(E, A))));
vec2 origin = vec2(0.0, -1.0 / sqrt(2.0));
vec2 direction = vec2(-1.0, 1.0);
if(doLineBlend)
{
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_D_C <= dist_B_G) && neq(E,C) && neq(F,C);
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_B_G <= dist_D_C) && neq(E,G) && neq(H,G);
origin = haveShallowLine? vec2(0.0, -0.25) : vec2(0.0, -0.5);
direction.x -= haveShallowLine? 1.0: 0.0;
direction.y += haveSteepLine? 1.0: 0.0;
}
vec3 blendPix = mix(D,B, step(DistYCbCr(E, B), DistYCbCr(E, D)));
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
}
FragColor = vec4(res, 1.0);
}
#endif

@ -1,96 +1,75 @@
; ProTA 4.8 settings (TA v2025.8.29) ; Total Annihilation v3.9.02 advanced settings
; Original windowed mode will disable many TA v2025.8.29 features (including some of these) and is not recommended ; Windowed mode will disable many TA v3.9.02 features (including some of these) and is not recommended
; You can use cnc-ddraw for windowed mode instead: https://github.com/FunkyFr3sh/cnc-ddraw/releases (included with ProTA 4.8)
[Preferences] [Preferences] ; custom settings, if any entry is disabled the "TA v3.9.02 default" values will be used
; custom settings, if any entry is disabled the "TA v2025.8.29 default" values will be used
; Create DirectDraw surfaces in video memory rather than system memory UseVideoMemory=TRUE;
; Change the following setting if your game is not running smoothly
; This setting is ignored if you are using cnc-ddraw
; TA v2025.8.29 default is TRUE
; ProTA 4.8 default is TRUE
UseVideoMemory = TRUE;
; Override your "DisplayModeHeight" registry setting if lower than 768
; If "DisplayModeWidth" is below 1024 it will override it as well
; Resolutions shown in the in-game list (EnumDisplayModes) are only filtered by height (768 minimum), any width is allowed still if supported by your hardware
; TA v2025.8.29 default is FALSE
; ProTA 4.8 default is TRUE
DisplayModeMinHeight768 = TRUE;
; Megamap FPS Limit
; Supports the following values: 0-1000
; 0 = no limit
; TA v2025.8.29 default is 60
; ProTA 4.8 default is 0
MegamapFPSLimit = 0;
; Unit limit per player ; Unit limit per player
; Set from 20 - 1500 ; Set from 20 - 6553 (setting higher than 1500 may cause instability)
; TA v3.1 default is 250 ; TA v3.1 default is 250
; TA v2025.8.29 default is 1500 ; TA v3.9.02 default is 1500
; ProTA 4.8 default is 1500
UnitLimit = 1500; UnitLimit = 1500;
; Pathfinding cycles ; Pathfinding cycles
; Setting too low (such as TA v3.1 default) ruins pathfinding but setting extremely high lowers fps ; Setting too low (such as TA v3.1 default) ruins pathfinding but setting extremely high lowers fps
; TA v3.1 default is 1333 ; TA v3.1 default is 1333
; TA v2025.8.29 default is 66650 ; TA v3.9.02 default is 66650
; ProTA 4.8 default is 66650
AISearchMapEntries = 66650; AISearchMapEntries = 66650;
; Special effects limit (smoke, etc.) ; Special effects limit (smoke, etc.)
; Setting too low (such as TA v3.1 default) will degrade visual quality ; Setting too low (such as TA v3.1 default) will degrade visual quality
; This setting is still experimental, if you experience visual issues set to 400 ; This setting is still experimental, if you experience visual issues set to 400
; TA v3.1 default is 400 ; TA v3.1 default is 400
; TA v2025.8.29 default is 20480 ; TA v3.9.02 default is 20480
; ProTA 4.8 default is 20480
SfxLimit = 20480; SfxLimit = 20480;
; Unit model size limit ; Unit model size limit
; Set max width and height for unit model drawing buffer ; Set max width and height for unit model drawing buffer
; TA v3.1 default is 600x600 ; TA v3.1 default is 600x600
; TA v2025.8.29 default is 1280x1280 ; TA v3.9.02 default is 1280x1280
; ProTA 4.8 default is 1280x1280
X_CompositeBuf = 1280; X_CompositeBuf = 1280;
Y_CompositeBuf = 1280; Y_CompositeBuf = 1280;
; Unit ID limit ; Unit ID limit
; Set the maximum number of unique unit IDs ; Set the maximum number of unique unit IDs
; TA v3.1 default is 512 ; TA v3.1 default is 512
; TA v2025.8.29 default is 16000 ; TA v3.9.02 default is 16000
; ProTA 4.8 default is 16000
UnitType = 16000; UnitType = 16000;
; Weapon ID limit ; Weapon ID limit
; Set the maximum number of unique weapon IDs ; Set the maximum number of unique weapon IDs
; TA v3.1 default is 256 ; TA v3.1 default is 256
; TA v2025.8.29 default is 16000 ; TA v3.9.02 default is 16000
; ProTA 4.8 default is 16000
WeaponType = 16000; WeaponType = 16000;
; Weapon ID multiplayer patch ; Weapon ID multiplayer patch
; Set to TRUE to enable increased Weapon ID limit in multiplayer ; Set to TRUE to enable increased Weapon ID limit in multiplayer
; Set to FALSE to allow increased Weapon ID limit only in single player ; Set to FALSE to allow increased Weapon ID limit only in single player
; TA v3.1 default is FALSE ; TA v3.1 default is FALSE
; TA v2025.8.29 default is FALSE (Weapon ID limit increase not yet compatible with Replayer) ; TA v3.9.02 default is FALSE (Weapon ID limit increase not yet compatible with Replayer)
; ProTA 4.8 default is FALSE
MultiGameWeapon = FALSE; MultiGameWeapon = FALSE;
; Double-click selection ; Double-click selection
; Enable or disable the new "double-click to select all units of the same type on screen" feature ; Enable or disable the new "double-click to select all units of the same type on screen" feature
; TA v3.1 default is FALSE ; TA v3.1 default is FALSE
; TA v2025.8.29 default is TRUE ; TA v3.9.02 default is TRUE
; ProTA 4.8 default is TRUE
DoubleClick = TRUE; DoubleClick = TRUE;
; Expanded Multiplayer Sharing Menu ; Expanded Multiplayer Sharing Menu
; Enable or disable the new expanded multiplayer sharing menu ; Enable or disable the new expanded multiplayer sharing menu
; TA v3.1 default is FALSE ; TA v3.1 default is FALSE
; TA v2025.8.29 default is TRUE ; TA v3.9.02 default is TRUE
; ProTA 4.8 default is TRUE
ShareDialogExpand = TRUE; ShareDialogExpand = TRUE;
; Main menu resolution adjuster ; Main menu resolution adjuster
@ -98,22 +77,26 @@ ShareDialogExpand = TRUE;
; Set to TRUE to match main menu resolution to the in-game resolution set via options menu ; Set to TRUE to match main menu resolution to the in-game resolution set via options menu
; If TRUE, the main menu will not be upscaled to fit increased output resolution ; If TRUE, the main menu will not be upscaled to fit increased output resolution
; If resolution is not valid, the game will not start (use resolution overrider below to fix) ; If resolution is not valid, the game will not start (use resolution overrider below to fix)
; Note: This setting is ignored if you are using cnc-ddraw
; TA v3.1 default is FALSE ; TA v3.1 default is FALSE
; TA v2025.8.29 default is FALSE ; TA v3.9.02 default is FALSE
; ProTA 4.8 default is FALSE
MenuResolution = FALSE; MenuResolution = FALSE;
; Megamap ; Megamap
; Enable or disable the new megamap ; Enable or disable the new megamap
; TA v3.1 default is FALSE ; TA v3.1 default is FALSE
; TA v2025.8.29 default is TRUE ; TA v3.9.02 default is TRUE
; ProTA 4.8 default is TRUE
FullScreenMinimap = TRUE; FullScreenMinimap = TRUE;
; Megamap FPS Limit
MegamapFpsLimit = 1000;
; Megamap Icon Configuration File ; Megamap Icon Configuration File
; Set the location of the megamap's icon configuration file ; Set the location of the megamap's icon configuration file
; TA v2025.8.29 default is .\Icon\iconcfg.ini ; TA v3.9.02 default is .\Icon\iconcfg.ini
MegaMapConfig = .\Icon\iconcfg.ini; MegaMapConfig = .\Icon\iconcfg.ini;
; Megamap Configuration Settings ; Megamap Configuration Settings
@ -121,33 +104,34 @@ MegaMapConfig = .\Icon\iconcfg.ini;
; Megamap Mouse Wheel Zooming ; Megamap Mouse Wheel Zooming
; Enable or disable ability to zoom in and out of the megamap with the mouse wheel ; Enable or disable ability to zoom in and out of the megamap with the mouse wheel
; TA v2025.8.29 default is TRUE ; TA v3.9.02 default is TRUE;
; ProTA 4.8 default is TRUE
WheelZoom = TRUE; WheelZoom = TRUE;
; Megamap Mouse Wheel Zoom In Mode ; Megamap Mouse Wheel Zoom In Mode
; Set to TRUE to zoom to the cursor location when rolling the wheel up from the megamap ; Set to TRUE to zoom to the cursor location when rolling the wheel up from the megamap
; Set to FALSE to zoom to the previous camera location when rolling the wheel up from the megamap ; Set to FALSE to zoom to the previous camera location when rolling the wheel up from the megamap
; TA v2025.8.29 default is TRUE ; TA v3.9.02 default is TRUE;
; ProTA 4.8 default is TRUE
WheelMoveMegaMap = TRUE; WheelMoveMegaMap = TRUE;
; Megamap Double-Click to Zoom Option ; Megamap Double-Click to Zoom Option
; Enable or disable the option to zoom to the cursor location... ; Enable or disable the option to zoom to the cursor location...
; ...when double-clicking terrain on the megamap ; ...when double-clicking terrain on the megamap
; TA v2025.8.29 default is FALSE ; TA v3.9.02 default is FALSE;
; ProTA 4.8 default is FALSE
DoubleClickMoveMegamap = FALSE; DoubleClickMoveMegamap = FALSE;
; Megamap Unit Icon Flashing When Under Attack ; Megamap Unit Icon Flashing When Under Attack
; Enable or disable megamap unit icon flashing when under attack ; Enable or disable megamap unit icon flashing when under attack
UnderAttackFlash=TRUE; UnderAttackFlash=TRUE;
; Megamap Minimum Sensor Range Ring Distances ; Megamap Minimum Sensor Range Ring Distances
; Set the minimum sensor values required to display range rings on the megamap ; Set the minimum sensor values required to display range rings on the megamap
; These settings could be helpful if you want to eliminate clutter from short-ranged rings ; These settings could be helpful if you want to eliminate clutter from short-ranged rings
; TA v2025.8.29 default is 0 for all sensors ; TA v3.9.02 default is 0 for all sensors
; ProTA 4.8 default is 0 for all sensors
MegamapRadarMinimum = 0; MegamapRadarMinimum = 0;
MegamapSonarMinimum = 0; MegamapSonarMinimum = 0;
MegamapSonarJamMinimum = 0; MegamapSonarJamMinimum = 0;
@ -158,16 +142,17 @@ MegamapAntiNukeMinimum = 0;
; Customize the colors of the player minimap/megamap icons and line markers ; Customize the colors of the player minimap/megamap icons and line markers
; Set from 0 to 255 to select colors from the TA indexed color palette ; Set from 0 to 255 to select colors from the TA indexed color palette
; These settings are disabled by default (remove the semicolons to enable) ; These settings are disabled by default (remove the semicolons to enable)
Player1DotColors=227; ;Default is 227 ProTA 4.8 default is 227
Player2DotColors=249; ;Default is 212 ProTA 4.8 default is 249 Player1DotColors=252; ;Default is 227
Player3DotColors=18; ;Default is 80 ProTA 4.8 default is 18 Player2DotColors=249; ;Default is 212
Player4DotColors=250; ;Default is 235 ProTA 4.8 default is 250 Player3DotColors=80; ;Default is 80
Player5DotColors=67; ;Default is 108 ProTA 4.8 default is 67 Player4DotColors=250; ;Default is 235
Player6DotColors=149; ;Default is 219 ProTA 4.8 default is 149 Player5DotColors=66; ;Default is 108
Player7DotColors=208; ;Default is 208 ProTA 4.8 default is 208 Player6DotColors=148; ;Default is 219
Player8DotColors=117; ;Default is 93 ProTA 4.8 default is 117 Player7DotColors=208; ;Default is 208
Player9DotColors=210; ;Default is 130 ProTA 4.8 default is 210 Player8DotColors=0; ;Default is 93
Player10DotColors=34; ;Default is 67 ProTA 4.8 default is 34 Player9DotColors=210; ;Default is 130
Player10DotColors=33; ;Default is 67
; Player Dot Marker Colors ; Player Dot Marker Colors
; Customize the colors of player dot markers by setting a custom icon file ; Customize the colors of player dot markers by setting a custom icon file
@ -175,6 +160,7 @@ Player10DotColors=34; ;Default is 67 ProTA 4.8 default is 34
; The icon file must contain all 10 player markers from left to right ; The icon file must contain all 10 player markers from left to right
; The icon width and height settings must match the dimensions of your icons ; The icon width and height settings must match the dimensions of your icons
; These settings are disabled by default (remove the semicolons to enable) ; These settings are disabled by default (remove the semicolons to enable)
PerPlayerMarkerWidth=10; PerPlayerMarkerWidth=10;
PerPlayerMarkerHeight=10; PerPlayerMarkerHeight=10;
PlayerMarkerPcx=Icon\smallcircle.pcx; PlayerMarkerPcx=Icon\smallcircle.pcx;
@ -186,44 +172,44 @@ PlayerMarkerPcx=Icon\smallcircle.pcx;
; When set to 3D, the speaker layout is read from the Windows control panel ; When set to 3D, the speaker layout is read from the Windows control panel
; All speaker layouts are supported by the 3D sound engine (stereo, 5.1, 7.1, etc.) ; All speaker layouts are supported by the 3D sound engine (stereo, 5.1, 7.1, etc.)
; TA v3.1 default is Mono (dword:1) ; TA v3.1 default is Mono (dword:1)
; TA v2025.8.29 default is 3D (dword:2) ; TA v3.9.02 default is 3D (dword:2)
; ProTA 4.8 default is 3D (dword:2)
"Sound Mode" = dword:2 "Sound Mode" = dword:2
; Max number of simultaneous sounds before sounds are cut off ; Max number of simultaneous sounds before sounds are cut off
; Set from 2 - 32 for specific limits or 33 or higher for unlimited ; Set from 2 - 32 for specific limits or 33 or higher for unlimited
; TA v3.1 default is 8 (dword:8) ; TA v3.1 default is 8 (dword:8)
; TA v2025.8.29 default is 128 / unlimited (dword:128) ; TA v3.9.02 default is 128 / unlimited (dword:128)
; ProTA 4.8 default is 128 / unlimited (dword:128)
"MixingBuffers" = dword:128 "MixingBuffers" = dword:128
; Default game speed ; Default game speed
; Set from 0 - 20 (corresponding to game speed -10 to +10) ; Set from 0 - 20 (corresponding to game speed -10 to +10)
; Use plus and minus keys to adjust while playing ; Use plus and minus keys to adjust while playing
; TA and TA v2025.8.29 default is 10 which is equivalent to Normal game speed (dword:10) ; TA and TA v3.9.02 default is 10 which is equivalent to Normal game speed (dword:10)
; ProTA 4.8 default is 10 which is equivalent to Normal game speed (dword:10)
"GameSpeed" = dword:10 "GameSpeed" = dword:10
; Group selection hotkey modifier ; Group selection hotkey modifier
; Set to 1 to select unit groups with number key and build menus with ALT + number key ; Set to 1 to select unit groups with number key and build menus with ALT + number key
; Set to 0 to select build menus with number key and unit groups with ALT + number key ; Set to 0 to select build menus with number key and unit groups with ALT + number key
; TA v3.1 default is 0 (dword:0) ; TA v3.1 default is 0 (dword:0)
; TA v2025.8.29 default is 1 (dword:1) ; TA v3.9.02 default is 1 (dword:1)
; ProTA 4.8 default is 1 (dword:1)
"SwitchAlt" = dword:1 "SwitchAlt" = dword:1
; Max number of players in skirmish mode ; Max number of players in skirmish mode
; Set from 2 - 10 ; Set from 2 - 10
; TA v3.1 default is 4 (dword:4) ; TA v3.1 default is 4 (dword:4)
; TA v2025.8.29 default is 10 (dword:10) ; TA v3.9.02 default is 10 (dword:10)
; ProTA 4.8 default is 10 (dword:10)
"NumSkirmishPlayers" = dword:10 "NumSkirmishPlayers" = dword:10
; Default setting for display of chat messages from other players ; Default setting for display of chat messages from other players
; Set to 1 to enable and 0 to disable ; Set to 1 to enable and 0 to disable
; Use "+screenchat" command in-game to toggle setting for the current game ; Use "+screenchat" command in-game to toggle setting for the current game
; TA and TA v2025.8.29 default is 1 ; TA and TA v3.9.02 default is 1
; ProTA 4.8 default is 1
"ScreenChat" = dword:1 "ScreenChat" = dword:1
; Music playback mode ; Music playback mode
@ -233,8 +219,8 @@ PlayerMarkerPcx=Icon\smallcircle.pcx;
; ...resulting in only a single track being played, either stopping thereafter (CD version)... ; ...resulting in only a single track being played, either stopping thereafter (CD version)...
; ...or looping forever (MP3 version), therefore Random is best for most people ; ...or looping forever (MP3 version), therefore Random is best for most people
; TA v3.1 default is Custom (dword:4) ; TA v3.1 default is Custom (dword:4)
; TA v2025.8.29 default is Random (dword:2) ; TA v3.9.02 default is Random (dword:2)
; ProTA 4.8 default is Random (dword:2)
"CDMode" = dword:2 "CDMode" = dword:2
; Resolution overrider (disabled by default) ; Resolution overrider (disabled by default)
@ -244,5 +230,6 @@ PlayerMarkerPcx=Icon\smallcircle.pcx;
; If you set a resolution not supported by your setup (driver or display) the game will crash ; If you set a resolution not supported by your setup (driver or display) the game will crash
; The override is set at game launch, using options menu will defeat override until next launch ; The override is set at game launch, using options menu will defeat override until next launch
; Example: dword:1920 x dword:1080 (1920x1080) ; Example: dword:1920 x dword:1080 (1920x1080)
;"DisplayModeWidth" = dword:1920 ;"DisplayModeWidth" = dword:1920
;"DisplayModeHeight" = dword:1080 ;"DisplayModeHeight" = dword:1080

BIN
TADemo/SERVER.EXE (Stored with Git LFS)

Binary file not shown.

BIN
TotalA.exe (Stored with Git LFS)

Binary file not shown.

BIN
Viewer.exe (Stored with Git LFS)

Binary file not shown.

@ -0,0 +1,20 @@
;;; www.bitpatch.com ;;;
RealDDrawPath = AUTO
BltMirror = 0
BltNoTearing = 0
ColorFix = 0
DisableHighDpiScaling = 1
FakeVsync = 1
FakeVsyncInterval = 1
ForceBltNoTearing = 0
ForceDirectDrawEmulation = 1
NoVideoMemory = 1
SingleProcAffinity = 0
ShowFPS = 0

BIN
bass.dll (Stored with Git LFS)

Binary file not shown.

BIN
basscd.dll (Stored with Git LFS)

Binary file not shown.

BIN
bassflac.dll (Stored with Git LFS)

Binary file not shown.

BIN
bassmix.dll (Stored with Git LFS)

Binary file not shown.

BIN
basswasapi.dll (Stored with Git LFS)

Binary file not shown.

BIN
cnc-ddraw config.exe (Stored with Git LFS)

Binary file not shown.

BIN
ddraw.dll (Stored with Git LFS)

Binary file not shown.

@ -1,906 +0,0 @@
; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw
[ddraw]
; ### Optional settings ###
; Use the following settings to adjust the look and feel to your liking
; Stretch to custom resolution, 0 = defaults to the size game requests
width=0
height=0
; Override the width/height settings shown above and always stretch to fullscreen
; Note: Can be combined with 'windowed=true' to get windowed-fullscreen aka borderless mode
fullscreen=true
; Run in windowed mode rather than going fullscreen
windowed=true
; Maintain aspect ratio
maintas=false
; Windowboxing / Integer Scaling
boxing=false
; Real rendering rate, -1 = screen rate, 0 = unlimited, n = cap
; Note: Does not have an impact on the game speed, to limit your game speed use 'maxgameticks='
maxfps=-1
; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl*/direct3d9*')
; Note: vsync=true can fix tearing but it will cause input lag
vsync=false
; Automatic mouse sensitivity scaling
; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window
adjmouse=false
; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders
; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV
; You can specify a full path to a .glsl shader file here or use one of the values listed below
; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2
shader=Shaders\interpolation\catmull-rom-bilinear.glsl
; Window position, -32000 = center to screen
posX=-32000
posY=-32000
; Renderer, possible values: auto, opengl, openglcore, gdi, direct3d9, direct3d9on12 (auto = try direct3d9/opengl, fallback = gdi)
renderer=opengl
; Developer mode (don't lock the cursor)
devmode=false
; Show window borders in windowed mode
border=true
; Save window position/size/state on game exit and restore it automatically on next game start
; Possible values: 0 = disabled, 1 = save to global 'ddraw' section, 2 = save to game specific section
savesettings=1
; Should the window be resizable by the user in windowed mode?
resizable=true
; Upscaling filter for the direct3d9* renderers
; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games)
d3d9_filter=2
; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)
vhack=false
; Where should screenshots be saved
screenshotdir=.\Screenshots\
; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes
toggle_borderless=true
; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes
toggle_upscaled=false
; ### Compatibility settings ###
; Use the following settings in case there are any issues with the game
; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab
noactivateapp=false
; Max game ticks per second, possible values: -1 = disabled, -2 = refresh rate, 0 = emulate 60hz vblank, 1-1000 = custom game speed
; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations
; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)
maxgameticks=-1
; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS
; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)
minfps=0
; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers
; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible
nonexclusive=false
; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact
; Note: Disable this if the game is not running smooth or there are sound issues
singlecpu=false
; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list
; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list
; Note: Set this to 1 if the game is crashing on startup
resolutions=0
; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide
; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)
fixchilds=2
; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled
hook_peekmessage=false
hook_getmessage=false
; Undocumented settings - You may or may not change these (You should rather focus on the settings above)
releasealt=false
game_handles_close=true
fixnotresponding=false
hook=4
guard_lines=200
max_resolutions=32
limit_bltfast=false
lock_surfaces=false
allow_wmactivate=false
flipclear=false
fixmousehook=false
rgb555=false
no_dinput_hook=false
refresh_rate=0
anti_aliased_fonts_min_size=13
custom_width=0
custom_height=0
min_font_size=0
direct3d_passthrough=false
; ### Hotkeys ###
; Use the following settings to configure your hotkeys, 0x00 = disabled
; Virtual-Key Codes: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
; Switch between windowed and fullscreen mode = [Alt] + ???
keytogglefullscreen=0x0D
; Maximize window = [Alt] + ???
keytogglemaximize=0x22
; Unlock cursor 1 = [Ctrl] + ???
keyunlockcursor1=0x09
; Unlock cursor 2 = [Right Alt] + ???
keyunlockcursor2=0xA3
; Screenshot
keyscreenshot=0x2C
; ### Config program settings ###
; The following settings are for cnc-ddraw config.exe
; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian
configlang=auto
; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia
configtheme=Cobalt XEMedia
; Hide the 'Compatibility Settings' tab in cnc-ddraw config
hide_compat_tab=false
; Allow the users to 'Restore default settings' via cnc-ddraw config
allow_reset=false
; ### Game specific settings ###
; The following settings override all settings shown above, section name = executable name
; Atrox
[Atrox]
fixchilds=0
allow_wmactivate=true
; Atomic Bomberman
[BM]
maxgameticks=60
; Age of Empires
[empires]
nonexclusive=true
adjmouse=true
resolutions=2
; Age of Empires: The Rise of Rome
[empiresx]
nonexclusive=true
adjmouse=true
resolutions=2
; Age of Empires II
[EMPIRES2]
nonexclusive=true
adjmouse=true
; Age of Empires II: The Conquerors
[age2_x1]
nonexclusive=true
adjmouse=true
; American Conquest / Cossacks
[DMCR]
resolutions=2
guard_lines=300
minfps=-2
; Age of Wonders 2
[AoW2]
resolutions=2
renderer=opengl
singlecpu=false
; Age of Wonders 2
[AoW2Compat]
resolutions=2
renderer=opengl
singlecpu=false
; Age of Wonders 2 Config Tool
[aow2Setup]
resolutions=2
; Age of Wonders: Shadow Magic
[AoWSM]
resolutions=2
renderer=opengl
singlecpu=false
; Age of Wonders: Shadow Magic
[AoWSMCompat]
resolutions=2
renderer=opengl
singlecpu=false
; Age of Wonders: Shadow Magic Config Tool
[AoWSMSetup]
resolutions=2
; Anstoss 3
[anstoss3]
renderer=gdi
adjmouse=true
; Anno 1602
[1602]
adjmouse=true
; Alien Nations
[AN]
adjmouse=true
; Atlantis
[ATLANTIS]
renderer=opengl
maxgameticks=60
; Airline Tycoon Deluxe
[AT]
fixchilds=0
; Baldur's Gate II
; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe
[BGMain]
resolutions=2
; BALDR FORCE EXE
[BaldrForce]
noactivateapp=true
; Blade & Sword
[comeon]
maxgameticks=60
fixchilds=3
; Blood II - The Chosen / Shogo - Mobile Armor Division
[Client]
checkfile=.\SOUND.REZ
noactivateapp=true
; Carmageddon
[CARMA95]
noactivateapp=true
flipclear=true
; Carmageddon
[CARM95]
noactivateapp=true
flipclear=true
; Carmageddon 2
[Carma2_SW]
noactivateapp=true
; Captain Claw
[claw]
adjmouse=true
noactivateapp=true
nonexclusive=true
; Command & Conquer: Sole Survivor
[SOLE]
maxgameticks=120
maxfps=60
minfps=-1
; Command & Conquer Gold - CnCNet
[cnc95]
maxfps=125
; Command & Conquer Gold
[C&C95]
maxgameticks=120
maxfps=60
minfps=-1
; Command & Conquer: Red Alert - CnCNet
[ra95-spawn]
maxfps=125
; Command & Conquer: Red Alert
[ra95]
maxgameticks=120
maxfps=60
minfps=-1
; Command & Conquer: Red Alert
[ra95_Mod-Launcher]
maxgameticks=120
maxfps=60
minfps=-1
; Command & Conquer: Red Alert
[ra95p]
maxfps=60
minfps=-1
; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2
[game]
checkfile=.\blowfish.dll
tshack=true
noactivateapp=true
adjmouse=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Tiberian Sun Demo
[SUN]
noactivateapp=true
tshack=true
adjmouse=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Tiberian Sun - CnCNet
[ts-spawn]
noactivateapp=true
tshack=true
adjmouse=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Red Alert 2 - XWIS
[ra2]
noactivateapp=true
tshack=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Red Alert 2 - XWIS
[Red Alert 2]
noactivateapp=true
tshack=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Red Alert 2: Yuri's Revenge
[gamemd]
noactivateapp=true
tshack=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe?
[ra2md]
noactivateapp=true
tshack=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet
[gamemd-spawn]
noactivateapp=true
tshack=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS
[Yuri's Revenge]
noactivateapp=true
tshack=true
maxfps=60
minfps=-1
maintas=false
boxing=false
; Commandos
[comandos]
maxgameticks=-1
; Commandos
[comandos_w10]
maxgameticks=-1
; Caesar III
[c3]
nonexclusive=true
adjmouse=true
; Chris Sawyer's Locomotion
[LOCO]
adjmouse=true
; Cultures 2
[Cultures2]
adjmouse=true
; Cultures 2 MP
[Cultures2MP]
adjmouse=true
; Close Combat 2: A Bridge Too Far
[cc2]
adjmouse=true
nonexclusive=true
; Close Combat 3: The Russian Front
[cc3]
adjmouse=true
nonexclusive=true
; Close Combat 4: The Battle of the Bulge
[cc4]
adjmouse=true
nonexclusive=true
; Close Combat 5: Invasion: Normandy
[cc5]
adjmouse=true
nonexclusive=true
; Call To Power 2
[ctp2]
maintas=false
boxing=false
; Corsairs Gold
[corsairs]
adjmouse=true
; Divine Divinity
[div]
resolutions=2
singlecpu=false
; Dragon Throne: Battle of Red Cliffs
[AdSanguo]
maxgameticks=60
noactivateapp=true
limit_bltfast=true
; Dark Reign: The Future of War
[DKReign]
maxgameticks=60
; Dungeon Keeper 2
[DKII]
maxgameticks=60
noactivateapp=true
; Deadlock 2
[DEADLOCK]
fixchilds=0
adjmouse=false
maintas=false
boxing=false
; Diablo
[Diablo]
devmode=true
; Diablo: Hellfire
[hellfire]
devmode=true
; Escape Velocity Nova
[EV Nova]
nonexclusive=true
hook_peekmessage=true
rgb555=true
keytogglefullscreen=0x46
adjmouse=true
; Economic War
[EcoW]
maxgameticks=60
fixnotresponding=true
; Enemy Infestation
[EI]
hook_getmessage=true
; Fairy Tale About Father Frost, Ivan and Nastya
[mrazik]
guard_lines=0
; Future Cop - L.A.P.D.
[FCopLAPD]
nonexclusive=true
adjmouse=true
; G-Police
[GPOLICE]
maxgameticks=60
; Gangsters: Organized Crime
[gangsters]
adjmouse=true
nonexclusive=true
; Grand Theft Auto
[Grand Theft Auto]
singlecpu=false
; Grand Theft Auto: London 1969
[gta_uk]
singlecpu=false
; Grand Theft Auto: London 1961
[Gta_61]
singlecpu=false
; Gruntz
[GRUNTZ]
adjmouse=true
noactivateapp=true
nonexclusive=true
; Heroes of Might and Magic II: The Succession Wars
[HEROES2W]
adjmouse=true
; Heroes of Might and Magic III
[Heroes3]
game_handles_close=true
; Heroes of Might and Magic III HD Mod
[Heroes3 HD]
game_handles_close=true
; Hard Truck: Road to Victory
[htruck]
maxgameticks=25
renderer=opengl
noactivateapp=true
; Icewind Dale 2
; Note: 'Full Screen' must be enabled in Config.exe
; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)
[iwd2]
resolutions=2
custom_width=1070
custom_height=602
; Invictus
[Invictus]
adjmouse=true
renderer=opengl
; Interstate 76
[i76]
adjmouse=true
; Infantry Online
[infantry]
devmode=true
resolutions=2
infantryhack=true
max_resolutions=90
; Jagged Alliance 2
[ja2]
singlecpu=false
fixmousehook=true
noactivateapp=true
releasealt=true
; Jagged Alliance 2: Unfinished Business
[JA2UB]
singlecpu=false
fixmousehook=true
noactivateapp=true
releasealt=true
; Jagged Alliance 2: Wildfire
[WF6]
singlecpu=false
fixmousehook=true
noactivateapp=true
releasealt=true
; Jagged Alliance 2 - UC mod
[JA2_UC]
singlecpu=false
fixmousehook=true
noactivateapp=true
releasealt=true
; Jagged Alliance 2 - Vengeance Reloaded mod
[JA2_Vengeance]
singlecpu=false
fixmousehook=true
noactivateapp=true
releasealt=true
; Jedi Knight Dark Forces 2
[JK]
direct3d_passthrough=true
; Kings Quest 8
[Mask]
renderer=opengl
; Konung
[konung]
fixchilds=0
; Konung 2
[Konung2]
fixchilds=0
; KKND Xtreme (With high resolution patch)
[KKNDgame]
vhack=true
; KKND2: Krossfire
[KKND2]
noactivateapp=true
; Lionheart
[Lionheart]
hook_peekmessage=true
; Majesty Gold
[Majesty]
minfps=-2
; Majesty Gold HD
[MajestyHD]
adjmouse=true
; Majesty Gold HD
[MajestyHD - Old]
adjmouse=true
; Mech Warrior 3
[Mech3]
nonexclusive=true
; Moorhuhn 2
[Moorhuhn2]
releasealt=true
; New Robinson
[ROBY]
adjmouse=true
hook_peekmessage=true
; Nox
[NOX]
checkfile=.\NOX.ICD
renderer=direct3d9
nonexclusive=false
windowed=false
maxgameticks=125
; Nox Reloaded
[NoxReloaded]
maxgameticks=125
; Nox GOG
[Game/2]
checkfile=.\nox.cfg
maxgameticks=125
; Outlaws
[olwin]
noactivateapp=true
maxgameticks=60
adjmouse=true
renderer=gdi
; Pharaoh
[Pharaoh]
adjmouse=true
; Pax Imperia
[Pax Imperia]
nonexclusive=true
; Railroad Tycoon II
[RT2]
adjmouse=true
; ROAD RASH
[RoadRash]
adjmouse=true
fixchilds=1
; Sim Copter
[SimCopter]
nonexclusive=true
; Settlers 3
[s3]
nonexclusive=true
; Star Trek - Armada
[Armada]
armadahack=true
nonexclusive=true
adjmouse=true
maintas=false
boxing=false
; Star Wars: Galactic Battlegrounds
[battlegrounds]
nonexclusive=true
adjmouse=true
; Star Wars: Galactic Battlegrounds: Clone Campaigns
[battlegrounds_x1]
nonexclusive=true
adjmouse=true
; Starcraft
[StarCraft]
game_handles_close=true
; Space Rangers
[Rangers]
hook_peekmessage=true
; Stronghold Crusader HD
[Stronghold Crusader]
resolutions=2
stronghold_hack=true
adjmouse=true
; Stronghold Crusader Extreme HD
[Stronghold_Crusader_Extreme]
resolutions=2
stronghold_hack=true
adjmouse=true
; Stronghold HD
[Stronghold]
resolutions=2
stronghold_hack=true
adjmouse=true
; Sim City 3000
[SC3]
minfps=-2
; Shadow Watch
[sw]
adjmouse=true
; Shadow Flare
[ShadowFlare]
nonexclusive=true
adjmouse=true
maintas=false
boxing=false
; Total Annihilation (Unofficial Beta Patch v3.9.02)
[TotalA]
max_resolutions=32
lock_surfaces=true
singlecpu=false
; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)
[Viewer]
max_resolutions=32
lock_surfaces=true
singlecpu=false
; Total Annihilation: Kingdoms
[Kingdoms]
game_handles_close=true
max_resolutions=32
; Three Kingdoms: Fate of the Dragon
[sanguo]
maxgameticks=60
noactivateapp=true
limit_bltfast=true
; RollerCoaster Tycoon
[rct]
no_dinput_hook=true
singlecpu=false
maxfps=0
adjmouse=true
; Twisted Metal
[TWISTED]
nonexclusive=true
maxgameticks=25
minfps=5
; Twisted Metal 2
[Tm2]
nonexclusive=true
maxgameticks=60
adjmouse=true
fixchilds=1
maintas=false
boxing=false
; Tzar: The Burden of the Crown
; Note: Must set 'DIRECTXDEVICE=0' in 'Tzar.ini'
[Tzar]
adjmouse=true
; Uprising
[uprising]
adjmouse=true
; Uprising 2
[Uprising 2]
renderer=opengl
adjmouse=true
; Vermeer
[vermeer]
adjmouse=true
vermeer_hack=true
; Wizardry 8
[Wiz8]
fixmousehook=true
noactivateapp=true
releasealt=true
; Worms 2
[worms2]
game_handles_close=true
; Worms Armageddon
[WA]
adjmouse=true
width=0
height=0
resizable=false
; War Wind
[WW]
minfps=-1
; Zeus and Poseidon
[Zeus]
adjmouse=true

BIN
dplayx.dll (Stored with Git LFS)

Binary file not shown.

BIN
pdraw.dll (Stored with Git LFS)

Binary file not shown.

BIN
tdraw.dll (Stored with Git LFS)

Binary file not shown.

BIN
tplayx.dll (Stored with Git LFS)

Binary file not shown.

@ -1,30 +0,0 @@
/***************************************************************************/
WGMUS.DLL (WARGAME MUSIC DLL) IS DESIGNED FOR USE WITH TOTAL ANNIHILATION TO ENABLE MUSIC PLAYBACK FROM FILES ON HARD DRIVE, OR FROM CD AS OF NOW, PLAYBACK IS SUPPORTED VIA BASS ( https://www.un4seen.com/ ) AND ADDON BASS CD PLANS FOR SUPPORTING AUDIERE, OPENAL, WINMM, AND DIRECTSHOW. PARTIALLY BASED ON OGG-WINMM https://github.com/hifi-unmaintained/ogg-winmm
PLACE INTO TOTAL ANNIHILATION DIRECTORY, AND REGEDIT TOTALA.EXE REPLACE MENTION OF WINMM.DLL, or WIN32.DLL DEPENDING ON RELEASE WITH WGMUS.DLL
DEFAULT MUSIC FOLDER NAME IS tamus IT IS ADVISED TO NAME TRACKS IN A MANNER THAT IS CONSISTENT FOR EXAMPLE, 00.mp3, 01.mp3, AND SO FORTH NOT 1.mp3 to 9.mp3, THEN 10 to 16 MP3 AS THEY WILL BE LOADED IN THE "WRONG" ORDER.
SETTINGS ARE CONTROLLED VIA wgmus.ini
SPECIAL THANKS:
FunkyFr3sh,
Kevin Hake,
Armoured Fish.
COPYRIGHT MENTIONS:
ogg-winmm
Copyright (c) 2012 Toni Spets <toni.spets@iki.fi>
BASS 2.4
Copyright (c) 1999-2022 Un4seen Developments Ltd. All rights reserved.
BASSCD 2.4
Copyright (c) 2003-2022 Un4seen Developments Ltd. All rights reserved.
BASSFLAC 2.4
Copyright (c) 2004-2023 Un4seen Developments Ltd. All rights reserved.
BASSmix 2.4
Copyright (c) 2005-2022 Un4seen Developments Ltd. All rights reserved.
BASSWASAPI 2.4
Copyright (c) 2009-2020 Un4seen Developments Ltd. All rights reserved.
/***************************************************************************/

BIN
wgmus.dll (Stored with Git LFS)

Binary file not shown.

@ -1,13 +0,0 @@
[Settings]
;Accepted file formats
;0 wav
;1 mp3
;2 ogg
;3 flac
;4 aiff
FileFormat=1
;Accepted music playback modes
;0 CD
;1 Folder
PlaybackMode=1
MusicFolder=music

BIN
win32.dll (Stored with Git LFS)

Binary file not shown.
Loading…
Cancel
Save