1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-22 05:59:10 +00:00

Compare commits

..

89 Commits

Author SHA1 Message Date
Patric Stout
1893dba8a1 Fix: [Actions] Remove Ubuntu:groovy from release pipeline (#9846)
It no longer exists upstream. Let's focus on LTS only for now.
2022-04-02 12:36:29 +02:00
Patric Stout
b9816f142b Doc: Prepare for 12.2 release (#9844) 2022-04-02 12:01:32 +02:00
Patric Stout
50bfa4fff8 Update: Backport language changes 2022-04-02 11:46:11 +02:00
Aaron Katzin
081d242a4c Fix #9736: Duplicate multiplayer window opens upon canceling password entry (#9842) 2022-04-02 11:46:11 +02:00
Owen Rudge
22169eb182 Change: [Actions] Switch back to primary source for 'gon' in macOS build job
This reverts commit 7a97a33598.
2022-04-02 11:46:11 +02:00
Owen Rudge
7d26f4c434 Fix: [Actions] Switch source for 'gon' in macOS build job 2022-04-02 11:46:11 +02:00
ALEX11BR
3a7d2f32a4 Fix: correct some mistaken Romanian real towns 2022-04-02 11:46:11 +02:00
Loïc Guilloux
18ef2607f9 Change: [Actions] Remove VS2017 and restore VS2019 for CI (#9835) 2022-04-02 11:46:11 +02:00
Patric Stout
9a20c47b42 Fix: removing long roads doesn't prioritize refusal of local authority over other errors (#9831) 2022-04-02 11:46:11 +02:00
Tyler Trahan
b076369469 Fix #9020: Update station coverage highlight when adding/removing tiles 2022-04-02 11:46:11 +02:00
Tyler Trahan
29607d27fa Doc: Fix broken links to Bootstrap CONTRIBUTING guide and doc license 2022-04-02 11:46:11 +02:00
Rubidium
b63b3082ef Fix: do not let shares in the company taking over another company disappear 2022-04-02 11:46:11 +02:00
Niels Martin Hansen
4a309ebb4d Fix: Original music playback rate was slightly too fast
Found a new tempo value experimentally. The new value gives a timing error of less than 0.01 second per minute.
2022-04-02 11:46:11 +02:00
frosch
6f6bc66997 Fix #9811, 9156d7b: Use the NewGRF-defined vehicle center when dragging ships and aircraft. (#9812)
The alignment using the total-width of the vehicle-chain was meant for articulated trains and road vehicles only.
2022-04-02 11:46:11 +02:00
Tyler Trahan
45a1036177 Feature: Remember the last-used signal between games (#9792) 2022-04-02 11:46:11 +02:00
glx22
8639e222c8 Change: add a timestamp in name of crash files 2022-04-02 11:46:11 +02:00
Jonathan G Rennison
cce665c07b Fix #9802: Assertion failure in BuildRailWaypointWindow constructor 2022-04-02 11:46:11 +02:00
Matthijs Kooijman
3b6ba45268 Fix: [CMake] openttd.32.bmp wasn't installed but used by SDL (#9772)
This file is used to set the SDL application icon, but it was no longer
installed since the switch to CMake.
2022-04-02 11:46:11 +02:00
Tyler Trahan
429a356e4e Doc: Fix broken link to GitHub docs (#9769) 2022-04-02 11:46:11 +02:00
Loïc Guilloux
46b8382c64 Fix #9766: Don't write uninitialised data in config file (#9767) 2022-04-02 11:46:11 +02:00
Patric Stout
0966f7b3d6 Update: Backport language changes 2022-01-05 13:10:50 +01:00
Michael Lutz
32e2a99dfd Codechange: Extend DrawSpriteToRgbaBuffer to work with 8bpp blitters. 2022-01-05 13:10:50 +01:00
Michael Lutz
bde0de370d Codechange: [OSX] Simplify touchbar button data definition. 2022-01-05 13:10:50 +01:00
Michael Lutz
c1806bfca1 Fix #9743: [OSX] Only (re-)create touchbar sprites when requested by the main loop. 2022-01-05 13:10:50 +01:00
Michael Lutz
f24c334770 Fix #9743: [OSX] Don't try to render touchbar sprites with invalid zoom level. 2022-01-05 13:10:50 +01:00
Michael Lutz
ea80e46e73 Change: [OSX] Allow touchbar usage on all supported OS versions.
Touchbar support was introduced in 10.12.2. There's no need to limit
support to 10.15+, as the convenience class NSButtonTouchBarItem is
easily replicated.
2022-01-05 13:10:50 +01:00
Jonathan G Rennison
e0ccc58ed1 Fix #9774: CmdBuildRoadStop updated station acceptance in estimate mode 2022-01-05 13:10:50 +01:00
Loïc Guilloux
b185c80cb8 Fix: [MinGW] Disable ASLR for x64 Debug builds (#9773) 2022-01-05 13:10:50 +01:00
benda
2df71a1752 Doc: use only double quotes for cmake command line example in COMPILING.md (#9758)
While powershell happily accepts single quotes, it's not the case for cmd.
2022-01-05 13:10:50 +01:00
trautamaki
a81f4cb6fe Doc: fix broken links to Open{GFX,SFX,MSX} in README.md (#9759) 2022-01-05 13:10:50 +01:00
Jonathan G Rennison
b8dbca465a Fix #9735: Fix OrderBackup::Reset in non-GUI case 2022-01-05 13:10:50 +01:00
frosch
24eb8164ba Fix: if vehicles only refit to cargo-slots >= 32, the default cargo was wrong. (#9744) 2022-01-05 13:10:50 +01:00
Jonathan G Rennison
e38c779b52 Fix #9740: Fix loading of gamelog change items from savegame ver >= 294 2022-01-05 13:10:50 +01:00
Patric Stout
97f545ba05 Fix #9730: [Network] connections can use an invalid socket due to a race condition
A race condition happens when an IPv6 connection takes more than
250ms to report an error, but does return before the IPv4 connection
is established.
In result, an invalid socket might be used for that connection.
2022-01-05 13:10:50 +01:00
Patric Stout
8aaed83338 Codechange: ensure OnConnect() always gets called with a valid socket (#9729)
This should already be the case, but now assert()s will tell us
if this isn't.
2022-01-05 13:10:50 +01:00
Tyler Trahan
4524acea38 Fix: Don't try to rename OWNER_DEITY signs in-game (#9716) 2022-01-05 13:10:50 +01:00
Michael Lutz
94dfd1df21 Fix: Insufficient input validation for CmdIndustryCtrl. (#9711) 2022-01-05 13:10:50 +01:00
nchappe
a4428a0cbe Fix: Update last servicing dates when using the date cheat (#9694) 2022-01-05 13:10:50 +01:00
Bernard Teo
521287839b Fix #9702: Display order window for vehicle group on ctrl-click only when using shared orders (#9704) 2022-01-05 13:10:50 +01:00
Charles Pigott
5bd95ab7a0 Fix #9680: Recalculating aircraft positions before map array updates caused crashes (#9699) 2022-01-05 13:10:50 +01:00
Patric Stout
6b12a05cc5 Change: [Emscripten] update to 2.0.34 and use Release over RelWithDebInfo (#9696)
It turns out that having "-g" in the compile-statement causes
Emscripten to pick -g3, which makes for very big binaries. This
is very likely not your intention when building Emscripten, as
smaller really is better.

For comparison, with RelWithDebInfo the binary is ~80MB. With
Release it is ~7.4MB.
2022-01-05 13:10:50 +01:00
frosch
ec816c5746 Fix: don't complain when the sprite font is missing glyphs. (#9692)
Silently auto-pick a suitable font.
2022-01-05 13:10:50 +01:00
Owen Rudge
280f54c0f7 Add: Specify minimum version for macOS (#9689) 2022-01-05 13:10:50 +01:00
Owen Rudge
cf4cf63b00 Change: Explicitly specify SHA1 for legacy code signing on Windows 2022-01-05 13:10:50 +01:00
Charles Pigott
17dfc6e28a Doc: Prepare for 12.1 release 2021-11-08 18:36:15 +00:00
Tyler Trahan
14ac0db7af Fix #9579: Object and HQ construction is Construction cost, not Property Maintenance (#9673) 2021-11-08 18:36:15 +00:00
Patric Stout
a45f0a4d9b Update: Backport language changes 2021-11-07 20:36:38 +01:00
Tyler Trahan
2890a4f9da Fix: Don't show screenshot GUI in screenshots (#9674) 2021-11-07 20:36:38 +01:00
J0anJosep
460a216d69 Fix: Do not redraw vehicle lists when skip order command is tested. 2021-11-07 20:36:38 +01:00
Michael Lutz
443e31faab Fix 55a11710: Curly braces need to be double-escaped for (std::)fmt. 2021-11-07 20:36:38 +01:00
Michael Lutz
ff2445c6f2 Fix 65cbde4b: Writing to uninitialized string when loading a currency NewGRF. 2021-11-07 20:36:38 +01:00
Loïc Guilloux
84580a49d2 Fix #9669, cbe00ec: Only try valid reverse directions (#9672) 2021-11-07 20:36:38 +01:00
Dmitry Erlikh
5a472beaa1 Fix #9648: add missing commas in crash message 2021-11-07 20:36:38 +01:00
dP
5e1164b093 Fix 3a1a915: Every 16th client never reconnects after server restart 2021-11-07 20:36:38 +01:00
Patric Stout
eb59912c65 Update: Backport language changes 2021-10-23 20:01:59 +02:00
frosch
cfdfb6dcd7 Change: Suppress panning in intro game, while user is interacting with the GUI. (#9645) 2021-10-23 20:01:59 +02:00
Joan Josep
f03ad12d4d Fix: Draw rotor in cursor when dragging helicopters. (#9612) 2021-10-23 20:01:59 +02:00
Loïc Guilloux
f13052b742 Fix #9643, 95386dc: Incorrect determination of screenshot format (#9644) 2021-10-23 20:01:59 +02:00
Loïc Guilloux
09d881d579 Change: Don't store not to be activated newGRFs in savegames (#9627) 2021-10-23 20:01:59 +02:00
Loïc Guilloux
61479fdcdc Fix #9630: intro game could zoom in/out more than allowed by settings (#9633)
Also fixes #9622
2021-10-23 20:01:59 +02:00
Loïc Guilloux
a652ea23c8 Fix #9626, ddafc0d: Incorrect loading of script saved data (#9629) 2021-10-23 20:01:59 +02:00
glx22
8a250da3bb Fix #9624: compilation with RANDOM_DEBUG 2021-10-23 20:01:59 +02:00
glx22
6c7812636a Change: [Actions] Also check desync debug 2021-10-23 20:01:59 +02:00
Charles Pigott
0ebfae6a8d Fix #9595: Always use plural forms of cargo for subsidy strings (#9619) 2021-10-23 20:01:59 +02:00
Patric Stout
465a660a7a Fix 01603d9e: [Preview] publishing preview failed due to recent changes (#9621)
Since 01603d9e we run under root, not under github user. In result,
the location of "aws" binary changed.
2021-10-23 20:01:59 +02:00
Patric Stout
1b0f8fe2e4 Fix 3046a6ce: [Preview] building preview failed to patch LZMA (#9620)
The job was started under a non-priv user, which did not have
permission to patch the emscripten files required to make LZMA
work.
2021-10-23 20:01:59 +02:00
Charles Pigott
fc7ed25915 Change: Ignore refresh_rate setting when vsync is enabled 2021-10-23 20:01:59 +02:00
Charles Pigott
3072b1904f Fix #9614: Refresh rate dropdown was still active when vsync was enabled 2021-10-23 20:01:59 +02:00
Charles Pigott
7d96a2d993 Feature: Button to toggle showing advanced signal types (#9617) 2021-10-23 20:01:59 +02:00
Charles Pigott
8eb646dea0 Change: Don't use 'server address' string in server list when displaying an invite code (#9615) 2021-10-23 20:01:59 +02:00
Patric Stout
33201896bf Change: Title game for 12.0 release 2021-10-17 11:27:57 +02:00
Patric Stout
0b526fe1f0 Doc: Prepare for 12.0 release 2021-10-17 11:27:57 +02:00
Patric Stout
06b2fa17e0 Codechange: "set but not used" warning when disabling assert()
DebugCheckSanity() is unused when asserts are disabled. While at it,
use WITH_ASSERT over NDEBUG, as that means we also run this code
during beta/RC.
2021-10-17 11:27:57 +02:00
Patric Stout
faca51686b Update: Backport language changes 2021-10-16 20:33:50 +02:00
glx22
3d46c6fc4c Fix: Try all possible reverse directions when a ship reaches a dead end 2021-10-16 20:33:50 +02:00
glx22
8d97ff816f Change: Reverse ship when leaving docks if a better path exists 2021-10-16 20:33:50 +02:00
Patric Stout
4137c2e2e8 Change: upgrade Emscripten to 2.0.31 and enable LZMA by default (#9604) 2021-10-16 20:33:50 +02:00
SamuXarick
1bb94a51e1 Fix #9591: Update station docking tiles upon placing a water object on a docking tile (#9594) 2021-10-16 20:33:50 +02:00
Patric Stout
ca91e767ed Update: Backport language changes 2021-10-03 20:25:13 +02:00
Patric Stout
9d3a188e88 Add: [Network] Keep the refresh button in lowered state while refreshing (#9600)
This gives user visual feedback that the refresh is still pending, and
prevents people from clicking again and again thinking nothing is
happening. This is especially true for connections that fall back to
TURN, as that takes a few seconds to kick in.

Additionally, prevent clicking on the button again while a refresh
is pending. This is only delaying a successful result.
2021-10-03 20:25:13 +02:00
Loïc Guilloux
c06175cf27 Fix: Incorrect Romanian own name (#9598) 2021-10-03 20:25:13 +02:00
Loïc Guilloux
5d5ff3e246 Fix #9548, e5fedcd: [Squirrel] Crash during engine cleanup after reaching memory limit on realloc (#9592) 2021-10-03 20:25:13 +02:00
dP
b69c7bd928 Cleanup: Swap comments for IConsoleModes (#9587) 2021-10-03 20:25:13 +02:00
Loïc Guilloux
9c1f2b384b Fix #9588, 140a96b: [Squirrel] Reaching memory limit during script registration could prevent further script detections (#9589)
Also the memory allocation triggering the limit was never freed.
And if the exception was thrown in a constructor using placement new, the pre-allocated memory was not freed either.
2021-10-03 20:25:13 +02:00
Niels Martin Hansen
f10f95034a Add: Console command to list search directories for various things 2021-10-03 20:25:13 +02:00
Loïc Guilloux
c369f56320 Change: Allow all tiles around docks to be docking tiles (#9578) 2021-10-03 20:25:13 +02:00
Loïc Guilloux
bd6b0db3c5 Revert 7ca1793: Using Trackdir keyed node is not required, Exitdir keyed node still have the correct trackdir (#9576) 2021-10-03 20:25:13 +02:00
r-a-sattarov
36e4ef0578 Add: use of Intel Intrinsics & RDTSC on e2k (MCST Elbrus 2000) (#9575)
MCST e2k (Elbrus 2000) architecture has half native / half software support of most Intel/AMD SIMD
e.g. MMX/SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2/AES/AVX/AVX2 & 3DNow!/SSE4a/XOP/FMA4

E2K - this is VLIW/EPIC architecture, like Intel Itanium (IA-64) architecture.
Ref: https://en.wikipedia.org/wiki/Elbrus_2000

Co-authored-by: Alexander Troosh @troosh, Konstantin Ivlev @sse4 and Dmitry Shcherbakov @crypto-das
2021-10-03 20:25:13 +02:00
Patric Stout
79dc634d41 Doc: Prepare for 12.0-RC1 release (#9574) 2021-09-25 15:58:41 +02:00
574 changed files with 17230 additions and 24120 deletions

34
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,34 @@
daysUntilClose: 7
staleLabel: stale
closeComment: false
exemptMilestones: true
exemptAssignees: true
issues:
daysUntilStale: 60
exemptLabels:
- pinned
- security
- "good first issue"
- regression
markComment: >
This issue has been automatically marked as stale because it has not had any activity in the last two months.
If you believe the issue is still relevant, please test on the latest nightly and report back.
It will be closed if no further activity occurs within 7 days.
Thank you for your contributions.
pulls:
daysUntilStale: 30
exemptLabels:
- pinned
markComment: >
This pull request has been automatically marked as stale because it has not had any activity in the last month.
Please feel free to give a status update now, ping for review, or re-open when it's ready.
It will be closed if no further activity occurs within 7 days.
Thank you for your contributions.

View File

@@ -20,10 +20,10 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
- name: Setup cache - name: Setup cache
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: /emsdk/upstream/emscripten/cache path: /emsdk/upstream/emscripten/cache
key: 2.0.31-${{ runner.os }} key: 2.0.31-${{ runner.os }}
@@ -91,7 +91,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
- name: Install dependencies - name: Install dependencies
run: | run: |
@@ -166,15 +166,15 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
- name: Prepare cache key - name: Prepare cache key
id: key id: key
run: | run: |
echo "image=$ImageOS-$ImageVersion" >> $GITHUB_OUTPUT echo "::set-output name=image::$ImageOS-$ImageVersion"
- name: Enable vcpkg cache - name: Enable vcpkg cache
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: /usr/local/share/vcpkg/installed path: /usr/local/share/vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
@@ -244,7 +244,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
- name: Prepare cache key - name: Prepare cache key
id: key id: key
@@ -253,10 +253,10 @@ jobs:
# Work around caching failure with GNU tar # Work around caching failure with GNU tar
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
Write-Output "image=$env:ImageOS-$env:ImageVersion" >> $env:GITHUB_OUTPUT Write-Output "::set-output name=image::$env:ImageOS-$env:ImageVersion"
- name: Enable vcpkg cache - name: Enable vcpkg cache
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: vcpkg/installed path: vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
@@ -338,7 +338,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
- name: Setup MSYS2 - name: Setup MSYS2
uses: msys2/setup-msys2@v2 uses: msys2/setup-msys2@v2
@@ -408,4 +408,4 @@ jobs:
steps: steps:
- name: Check annotations - name: Check annotations
uses: OpenTTD/actions/annotation-check@v3 uses: OpenTTD/actions/annotation-check@v2

View File

@@ -10,7 +10,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
fetch-depth: 4 fetch-depth: 4

View File

@@ -31,7 +31,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
ref: ${{ github.event.client_payload.sha }} ref: ${{ github.event.client_payload.sha }}
@@ -41,7 +41,7 @@ jobs:
git checkout -b ${name} git checkout -b ${name}
- name: Setup cache - name: Setup cache
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: /emsdk/upstream/emscripten/cache path: /emsdk/upstream/emscripten/cache
key: 2.0.31-${{ runner.os }} key: 2.0.31-${{ runner.os }}

View File

@@ -59,7 +59,7 @@ jobs:
- if: steps.core_developer.outcome == 'success' - if: steps.core_developer.outcome == 'success'
name: Trigger 'preview build' name: Trigger 'preview build'
uses: peter-evans/repository-dispatch@v2 uses: peter-evans/repository-dispatch@v1
with: with:
token: ${{ secrets.PREVIEW_GITHUB_TOKEN }} token: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
event-type: "Preview build #${{ github.event.number }}" event-type: "Preview build #${{ github.event.number }}"

View File

@@ -59,7 +59,7 @@ jobs:
- if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' && contains(fromJson(steps.preview_label.outputs.data).*.name, 'preview') - if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' && contains(fromJson(steps.preview_label.outputs.data).*.name, 'preview')
name: Trigger 'preview build' name: Trigger 'preview build'
uses: peter-evans/repository-dispatch@v2 uses: peter-evans/repository-dispatch@v1
with: with:
token: ${{ secrets.PREVIEW_GITHUB_TOKEN }} token: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
event-type: "Preview build #${{ github.event.number }}" event-type: "Preview build #${{ github.event.number }}"

View File

@@ -29,14 +29,14 @@ jobs:
steps: steps:
- name: Checkout (Release) - name: Checkout (Release)
if: github.event_name == 'release' if: github.event_name == 'release'
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
# We generate a changelog; for this we need the full git log. # We generate a changelog; for this we need the full git log.
fetch-depth: 0 fetch-depth: 0
- name: Checkout (Manual) - name: Checkout (Manual)
if: github.event_name == 'workflow_dispatch' if: github.event_name == 'workflow_dispatch'
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
ref: ${{ github.event.inputs.ref }} ref: ${{ github.event.inputs.ref }}
# We generate a changelog; for this we need the full git log. # We generate a changelog; for this we need the full git log.
@@ -44,7 +44,7 @@ jobs:
- name: Checkout (Trigger) - name: Checkout (Trigger)
if: github.event_name == 'repository_dispatch' if: github.event_name == 'repository_dispatch'
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
ref: ${{ github.event.client_payload.ref }} ref: ${{ github.event.client_payload.ref }}
# We generate a changelog; for this we need the full git log. # We generate a changelog; for this we need the full git log.
@@ -138,10 +138,10 @@ jobs:
echo "Folder on CDN: ${FOLDER}" echo "Folder on CDN: ${FOLDER}"
echo "Workflow trigger: ${TRIGGER_TYPE}" echo "Workflow trigger: ${TRIGGER_TYPE}"
echo "version=$(cat .version)" >> $GITHUB_OUTPUT echo "::set-output name=version::$(cat .version)"
echo "is_tag=${IS_TAG}" >> $GITHUB_OUTPUT echo "::set-output name=is_tag::${IS_TAG}"
echo "folder=${FOLDER}" >> $GITHUB_OUTPUT echo "::set-output name=folder::${FOLDER}"
echo "trigger_type=${TRIGGER_TYPE}" >> $GITHUB_OUTPUT echo "::set-output name=trigger_type::${TRIGGER_TYPE}"
env: env:
NIGHTLIES_BRANCH: master NIGHTLIES_BRANCH: master
FOLDER_RELEASES: openttd-releases FOLDER_RELEASES: openttd-releases
@@ -174,14 +174,14 @@ jobs:
echo "::endgroup::" echo "::endgroup::"
- name: Store bundles - name: Store bundles
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: openttd-source name: openttd-source
path: build/bundles/* path: build/bundles/*
retention-days: 5 retention-days: 5
- name: Store source (for other jobs) - name: Store source (for other jobs)
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: internal-source name: internal-source
path: source.tar.gz path: source.tar.gz
@@ -195,7 +195,7 @@ jobs:
steps: steps:
- name: Download source - name: Download source
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: internal-source name: internal-source
@@ -258,7 +258,7 @@ jobs:
echo "::endgroup::" echo "::endgroup::"
- name: Store bundles - name: Store bundles
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: openttd-docs name: openttd-docs
path: build/bundles/*.tar.xz path: build/bundles/*.tar.xz
@@ -276,7 +276,7 @@ jobs:
steps: steps:
- name: Download source - name: Download source
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: internal-source name: internal-source
@@ -355,7 +355,7 @@ jobs:
echo "::endgroup::" echo "::endgroup::"
- name: Store bundles - name: Store bundles
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: openttd-linux-generic name: openttd-linux-generic
path: build/bundles path: build/bundles
@@ -371,11 +371,14 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- container_image: "ubuntu:18.04"
bundle_name: "bionic"
compiler: "g++-8"
- container_image: "ubuntu:20.04" - container_image: "ubuntu:20.04"
bundle_name: "focal" bundle_name: "focal"
compiler: "g++" compiler: "g++"
- container_image: "ubuntu:22.04" - container_image: "debian:buster"
bundle_name: "jammy" bundle_name: "buster"
compiler: "g++" compiler: "g++"
- container_image: "debian:bullseye" - container_image: "debian:bullseye"
bundle_name: "bullseye" bundle_name: "bullseye"
@@ -387,7 +390,7 @@ jobs:
steps: steps:
- name: Download source - name: Download source
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: internal-source name: internal-source
@@ -457,7 +460,7 @@ jobs:
echo "::endgroup::" echo "::endgroup::"
- name: Store bundles - name: Store bundles
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: openttd-linux-${{ matrix.bundle_name }} name: openttd-linux-${{ matrix.bundle_name }}
path: build/bundles path: build/bundles
@@ -467,13 +470,13 @@ jobs:
name: MacOS name: MacOS
needs: source needs: source
runs-on: macos-11 runs-on: macos-10.15
env: env:
MACOSX_DEPLOYMENT_TARGET: 10.14 MACOSX_DEPLOYMENT_TARGET: 10.14
steps: steps:
- name: Download source - name: Download source
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: internal-source name: internal-source
@@ -491,10 +494,10 @@ jobs:
- name: Prepare cache key - name: Prepare cache key
id: key id: key
run: | run: |
echo "image=$ImageOS-$ImageVersion" >> $GITHUB_OUTPUT echo "::set-output name=image::$ImageOS-$ImageVersion"
- name: Enable vcpkg cache - name: Enable vcpkg cache
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: /usr/local/share/vcpkg/installed path: /usr/local/share/vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-release-0 # Increase the number whenever dependencies are modified key: ${{ steps.key.outputs.image }}-vcpkg-release-0 # Increase the number whenever dependencies are modified
@@ -648,7 +651,7 @@ jobs:
mv _CPack_Packages/*/Bundle/openttd-*.zip bundles/ mv _CPack_Packages/*/Bundle/openttd-*.zip bundles/
- name: Store bundles - name: Store bundles
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: openttd-macos-universal name: openttd-macos-universal
path: build-x64/bundles path: build-x64/bundles
@@ -673,7 +676,7 @@ jobs:
steps: steps:
- name: Download source - name: Download source
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: internal-source name: internal-source
@@ -694,10 +697,10 @@ jobs:
# Work around caching failure with GNU tar # Work around caching failure with GNU tar
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
Write-Output "image=$env:ImageOS-$env:ImageVersion" >> $env:GITHUB_OUTPUT Write-Output "::set-output name=image::$env:ImageOS-$env:ImageVersion"
- name: Enable vcpkg cache - name: Enable vcpkg cache
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: vcpkg/installed path: vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
@@ -841,195 +844,12 @@ jobs:
WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }} WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }}
- name: Store bundles - name: Store bundles
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: openttd-windows-${{ matrix.arch }} name: openttd-windows-${{ matrix.arch }}
path: build/bundles path: build/bundles
retention-days: 5 retention-days: 5
windows-appx:
name: Windows Store
needs:
- source
- windows
if: needs.source.outputs.is_tag == 'true'
runs-on: windows-latest
steps:
- name: Download source
uses: actions/download-artifact@v3
with:
name: internal-source
- name: Unpack source
shell: bash
run: |
tar -xf source.tar.gz --strip-components=1
- name: Download x86 build
uses: actions/download-artifact@v3
with:
name: openttd-windows-x86
- name: Download x64 build
uses: actions/download-artifact@v3
with:
name: openttd-windows-x64
- name: Download arm64 build
uses: actions/download-artifact@v3
with:
name: openttd-windows-arm64
- name: Unpack builds
shell: bash
run: |
mkdir builds
cd builds
function extract {
mkdir $1
# Extract the zip version of the release
unzip ../openttd-*-windows-$2.zip -d $1
# Remove the extraneous directory
mv $1/openttd-*-windows-$2/* $1/
rmdir $1/openttd-*-windows-$2
# Move the openttd.exe to the '{arch}-binaries' folder
mkdir $1-binaries
mv $1/openttd.exe $1-binaries/
}
extract x86 win32
extract x64 win64
extract arm64 arm64
# Use the "x86" folder as the source of the common binaries (lang files, etc) and remove the others
mv x86 common-binaries
rm -rf x64 arm64
- name: Install OpenGFX
shell: bash
run: |
mkdir -p builds/common-binaries/baseset
cd builds/common-binaries/baseset
echo "::group::Download OpenGFX"
curl -L https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip -o opengfx-all.zip
echo "::endgroup::"
echo "::group::Unpack OpenGFX"
unzip opengfx-all.zip
tar xf opengfx-*.tar
echo "::endgroup::"
rm -f opengfx-all.zip opengfx-*.tar
- name: Install OpenMSX
shell: bash
run: |
mkdir -p builds/common-binaries/baseset
cd builds/common-binaries/baseset
echo "::group::Download OpenMSX"
curl -L https://cdn.openttd.org/openmsx-releases/0.4.2/openmsx-0.4.2-all.zip -o openmsx-all.zip
echo "::endgroup::"
echo "::group::Unpack OpenGFX"
unzip openmsx-all.zip
tar xf openmsx-*.tar
echo "::endgroup::"
rm -f openmsx-all.zip openmsx-*.tar
- name: Install OpenSFX
shell: bash
run: |
mkdir -p builds/common-binaries/baseset/opensfx
cd builds/common-binaries/baseset/opensfx
echo "::group::Download OpenSFX"
curl -L https://cdn.openttd.org/opensfx-releases/1.0.3/opensfx-1.0.3-all.zip -o opensfx-all.zip
echo "::endgroup::"
echo "::group::Unpack OpenSFX"
unzip opensfx-all.zip
tar xf opensfx-*.tar
echo "::endgroup::"
rm -f opensfx-all.zip opensfx-*.tar
- name: Generate signing certificate
shell: cmd
run: |
cd builds
REM We need to provide a signed .appx to the Windows Store, so generate a certificate with password 'password'
call ..\os\windows\winstore\generate-key.bat "CN=78024DA8-4BE4-4C77-B12E-547BBF7359D2" password cert.pfx
- name: Generate assets
shell: cmd
run: |
cd os\windows\winstore
call generate-assets.bat
- name: Prepare manifests
shell: cmd
run: |
cd builds
mkdir manifests
REM Set the version environment variable
call ..\os\windows\winstore\set-version.bat x86-binaries\openttd.exe
call ..\os\windows\winstore\prepare-manifests.bat manifests "CN=78024DA8-4BE4-4C77-B12E-547BBF7359D2" "57420OpenTTDDevelopers.OpenTTDofficial"
- name: Prepare binaries
shell: bash
run: |
cd builds
# Copy the Windows Store assets
mkdir common-binaries/Assets
cp -R ../os/windows/winstore/assets-common/* common-binaries/Assets/
mkdir Assets
cp -R ../os/windows/winstore/assets/* Assets/
cp manifests/*.xml .
- name: Build
shell: cmd
run: |
REM Add the Windows SDK tools to the PATH
echo|set /p="SET VS_INSTALLDIR=" > _vspath.bat
vswhere -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath >> _vspath.bat
call _vspath.bat
call "%VS_INSTALLDIR%\Common7\Tools\VsDevCmd.bat"
REM Set the version environment variable
call os\windows\winstore\set-version.bat builds\x86-binaries\openttd.exe
cd builds
mkdir output
REM Build and sign the package
makeappx build /v /f PackagingLayout.xml /op output\ /bv %OTTD_VERSION% /pv %OTTD_VERSION% /ca
SignTool sign /fd sha256 /a /f cert.pfx /p password "output\OpenTTD.appxbundle"
- name: Store appx
uses: actions/upload-artifact@v3
with:
name: openttd-windows-store
path: |
builds/output/OpenTTD.appxbundle
builds/cert.pfx
retention-days: 5
upload: upload:
name: Upload (AWS) name: Upload (AWS)
needs: needs:
@@ -1051,7 +871,7 @@ jobs:
steps: steps:
- name: Download all bundles - name: Download all bundles
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
- name: Calculate checksums - name: Calculate checksums
run: | run: |
@@ -1083,7 +903,7 @@ jobs:
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }} AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
- name: Trigger 'New OpenTTD release' - name: Trigger 'New OpenTTD release'
uses: peter-evans/repository-dispatch@v2 uses: peter-evans/repository-dispatch@v1
with: with:
token: ${{ secrets.DEPLOYMENT_TOKEN }} token: ${{ secrets.DEPLOYMENT_TOKEN }}
repository: OpenTTD/workflows repository: OpenTTD/workflows
@@ -1104,7 +924,7 @@ jobs:
steps: steps:
- name: Download all bundles - name: Download all bundles
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
- name: Setup steamcmd - name: Setup steamcmd
uses: CyberAndrii/setup-steamcmd@v1 uses: CyberAndrii/setup-steamcmd@v1

View File

@@ -10,7 +10,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v2
- name: Check for unused strings - name: Check for unused strings
run: | run: |

View File

@@ -5,7 +5,7 @@ if(NOT BINARY_NAME)
endif() endif()
project(${BINARY_NAME} project(${BINARY_NAME}
VERSION 13.0 VERSION 12.2
) )
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)

View File

@@ -94,8 +94,8 @@ Although we really appreciate feedback and ideas, we will close feature requests
Many of those ideas etc do have a place on the [forums](https://www.tt-forums.net); and if enough people like it, someone will stand up and make it. Many of those ideas etc do have a place on the [forums](https://www.tt-forums.net); and if enough people like it, someone will stand up and make it.
It's usually best to discuss on [Discord](https://discord.gg/openttd) before opening a feature request or working on a large feature in a fork. It's usually best discuss in [irc](https://wiki.openttd.org/en/Development/IRC%20channel) before opening a feature request or working on a large feature in a fork.
Discussion can take time, but it can be productive and avoid disappointment. :) Discussion in irc can take time, but it can be productive and avoid disappointment :)
## Pull requests ## Pull requests
@@ -212,8 +212,8 @@ When it comes to gameplay features there are at least these groups of interests:
- *Control freak:* micromanagement like conditional orders, refitting and loading etc. - *Control freak:* micromanagement like conditional orders, refitting and loading etc.
- *Casual:* automatisation like cargodist, path based signalling etc. - *Casual:* automatisation like cargodist, path based signalling etc.
To please everyone, the official branch tries to stay close to the original gameplay; after all, that is what brought everyone here. To please everyone, the official branch tries to stay close to the original gameplay; after all, that is what everyone brought here.
The preferred method to alter and extend the gameplay is via add-ons like NewGRF and GameScripts. The preferred method to alter and extent the gameplay is via add-ons like NewGRF and GameScripts.
For a long time, the official branch was also open to features which could be enabled/disabled, but the corner-cases that came with some configurations have rendered some parts of the code very complicated. For a long time, the official branch was also open to features which could be enabled/disabled, but the corner-cases that came with some configurations have rendered some parts of the code very complicated.
Today, new features have to work with all the already existing features, which is not only challenging in corner cases, but also requires spending considerable more work than just "making it work in the game mode that I play". Today, new features have to work with all the already existing features, which is not only challenging in corner cases, but also requires spending considerable more work than just "making it work in the game mode that I play".

View File

@@ -1,32 +1,31 @@
### The OpenTTD team (in alphabetical order): ### The OpenTTD team (in alphabetical order):
- Grzegorz Duczyński (adf88) - General coding (since 1.7.2)
- Albert Hofkamp (Alberth) - GUI expert (since 0.7)
- Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3) - Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)
- Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)
- Christoph Elsenhans (frosch) - General coding (since 0.6) - Christoph Elsenhans (frosch) - General coding (since 0.6)
- Loïc Guilloux (glx) - General / Windows Expert (since 0.4.5) - Loïc Guilloux (glx) - Windows Expert (since 0.4.5)
- Charles Pigott (LordAro) - General / Correctness police (since 1.9) - Charles Pigott (LordAro) - General / Correctness police (since 1.9)
- Michael Lutz (michi_cc) - General / Path based signals (since 0.7) - Michael Lutz (michi_cc) - Path based signals (since 0.7)
- Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9) - Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)
- Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1) - Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
- Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5) - Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
- Remko Bijker (Rubidium) - Coder and way more (since 0.4.5) - Ingo von Borstel (planetmaker) - General coding, Support (since 1.1)
- Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op - Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)
- Tyler Trahan (2TallTyler) - General coding (since 13) - José Soler (Terkhen) - General coding (since 1.0)
### Inactive Developers: ### Inactive Developers:
- Grzegorz Duczyński (adf88) - General coding (1.7 - 1.8)
- Albert Hofkamp (Alberth) - GUI expert (0.7 - 1.9)
- Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0) - Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0)
- Bjarni Corfitzen (Bjarni) - macOS port, coder and vehicles (0.3 - 0.7) - Bjarni Corfitzen (Bjarni) - macOS port, coder and vehicles (0.3 - 0.7)
- Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6) - Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)
- Ulf Hermann (fonsinchen) - Cargo Distribution (1.3 - 1.6)
- Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6) - Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)
- Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6) - Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)
- Attila Bán (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5) - Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5)
- Ingo von Borstel (planetmaker) - General coding, Support (1.1 - 1.9)
- Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3) - Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)
- José Soler (Terkhen) - General coding (1.0 - 1.4)
- Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5) - Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)
- Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
- Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3) - Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)
- Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6) - Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6)
@@ -34,11 +33,11 @@
- Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5) - Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5)
- Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3) - Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)
- Emil Djupfeld (egladil) - macOS port (0.4.5 - 0.6) - Emil Djupfeld (egladil) - macOS port (0.4 - 0.6)
- Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5) - Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5)
- Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3) - Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)
- Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3) - Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)
- Petr Baudiš (pasky) - Many patches, newgrf support (0.3 - 0.3) - Petr Baudiš (pasky) - Many patches, newgrf support, etc. (0.3 - 0.3)
- Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7) - Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)
- Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3) - Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)
@@ -53,7 +52,7 @@
- Alberto Demichelis - Squirrel scripting language - Alberto Demichelis - Squirrel scripting language
- L. Peter Deutsch - MD5 implementation - L. Peter Deutsch - MD5 implementation
- Michael Blunck - For revolutionizing TTD with awesome graphics - Michael Blunck - For revolutionizing TTD with awesome graphics
- George - Canal/Lock graphics - George - Canal graphics
- Andrew Parkhouse (andythenorth) - River graphics - Andrew Parkhouse (andythenorth) - River graphics
- David Dallaston (Pikka) - Tram tracks - David Dallaston (Pikka) - Tram tracks
- All Translators - For their support to make OpenTTD a truly international game - All Translators - For their support to make OpenTTD a truly international game

View File

@@ -116,6 +116,35 @@ Most types of add-on content can be downloaded within OpenTTD via the 'Check Onl
Add-on content can also be installed manually, but that's more complicated; the [OpenTTD wiki](https://wiki.openttd.org/) may offer help with that, or the [OpenTTD directory structure guide](./docs/directory_structure.md). Add-on content can also be installed manually, but that's more complicated; the [OpenTTD wiki](https://wiki.openttd.org/) may offer help with that, or the [OpenTTD directory structure guide](./docs/directory_structure.md).
### 1.5.1) AI opponents
OpenTTD comes without AI opponents, so if you want to play with AIs you have to download them.
The easiest way is via the 'Check Online Content' button in the main menu.
You can select some AIs that you think are compatible with your playing style.
AI help and discussions may also be found in the [AI section of the forum](https://www.tt-forums.net/viewforum.php?f=65).
### 1.5.2) Scenarios and height maps
Scenarios and heightmaps can be added via the 'Check Online Content' button in the main menu.
### 1.5.3) NewGRFs
A wide range of add-content is available as NewGRFs, including vehicles, industries, stations, landscape objects, town names and more.
NewGRFs can be added via the 'Check Online Content' button in the main menu.
See also the wiki [guide to NewGRFs](https://wiki.openttd.org/en/Manual/NewGRF) and [the forum graphics development section](https://www.tt-forums.net/viewforum.php?f=66).
### 1.5.4) Game scripts
Game scripts can provide additional challenges or changes to the standard OpenTTD gameplay, for example setting transport goals, or changing town growth behaviour.
Game scripts can be added via the 'Check Online Content' button in the main menu.
See also the wiki [guide to game scripts](https://wiki.openttd.org/en/Manual/Game%20script) and [the forum graphics game script section](https://www.tt-forums.net/viewforum.php?f=65).
### 1.6) OpenTTD directories ### 1.6) OpenTTD directories
@@ -133,7 +162,6 @@ If you want to compile OpenTTD from source, instructions can be found in [COMPIL
'Official' channels 'Official' channels
- [OpenTTD website](https://www.openttd.org) - [OpenTTD website](https://www.openttd.org)
- [OpenTTD official Discord](https://discord.gg/openttd)
- IRC chat using #openttd on irc.oftc.net [more info about our irc channel](https://wiki.openttd.org/en/Development/IRC%20channel) - IRC chat using #openttd on irc.oftc.net [more info about our irc channel](https://wiki.openttd.org/en/Development/IRC%20channel)
- [OpenTTD on Github](https://github.com/OpenTTD/) for code repositories and for reporting issues - [OpenTTD on Github](https://github.com/OpenTTD/) for code repositories and for reporting issues
- [forum.openttd.org](https://forum.openttd.org/) - the primary community forum site for discussing OpenTTD and related games - [forum.openttd.org](https://forum.openttd.org/) - the primary community forum site for discussing OpenTTD and related games

View File

@@ -379,16 +379,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -131,16 +131,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -68,16 +68,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -6,16 +6,3 @@
*/ */
AILog.Info("1.10 API compatibility in effect."); AILog.Info("1.10 API compatibility in effect.");
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -6,16 +6,3 @@
*/ */
AILog.Info("1.11 API compatibility in effect."); AILog.Info("1.11 API compatibility in effect.");
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{ {
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
} }
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -6,16 +6,3 @@
*/ */
AILog.Info("1.9 API compatibility in effect."); AILog.Info("1.9 API compatibility in effect.");
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -4,18 +4,3 @@
* OpenTTD 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. * OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/ */
AILog.Info("12 API compatibility in effect.");
/* 13 really checks RoadType against RoadType */
AIRoad._HasRoadType <- AIRoad.HasRoadType;
AIRoad.HasRoadType <- function(tile, road_type)
{
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (AIRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -1,6 +0,0 @@
/*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/

View File

@@ -13,16 +13,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -6,16 +6,3 @@
*/ */
GSLog.Info("1.11 API compatibility in effect."); GSLog.Info("1.11 API compatibility in effect.");
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -35,16 +35,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -35,16 +35,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -28,15 +28,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -20,16 +20,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -13,16 +13,3 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
{ {
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
} }
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -4,18 +4,3 @@
* OpenTTD 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. * OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/ */
GSLog.Info("12 API compatibility in effect.");
/* 13 really checks RoadType against RoadType */
GSRoad._HasRoadType <- GSRoad.HasRoadType;
GSRoad.HasRoadType <- function(tile, road_type)
{
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
foreach (rt, _ in list) {
if (GSRoad._HasRoadType(tile, rt)) {
return true;
}
}
return false;
}

View File

@@ -1,6 +0,0 @@
/*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/

View File

@@ -1,117 +1,3 @@
13.0-beta2 (2022-11-27)
------------------------------------------------------------------------
Feature: Allow AI/GS to be fully modified in scenario editor (#10152)
Feature: Display power-to-weight ratio in ground vehicle details GUI (#10123)
Feature: Variable interface scaling (with chunky bevels!) (#10114)
Feature: Hotkey to honk a vehicle's horn (#10110)
Feature: Split AI/Game Script configuration windows and add them to world gen window (#10058)
Feature: [GS] Scriptable league tables (#10001)
Feature: Multi-track level crossings (#9931)
Feature: Improved local authority action window (#9928)
Feature: Automatic console command screenshot numbering with a filename ending in '#' (#9781)
Feature: Add buttons to toggle music in the Game Options menu (#9727)
Feature: Contextual actions for vehicles grouped by shared orders (#8425)
Feature: Add cargo filter support to vehicle list (#8308)
Feature: Show the cargoes the vehicles can carry in the vehicle list window (#8304)
Change: Allow building canal by area outside editor (#10173)
Change: Minor improvements to the new Finance GUI (#10168)
Change: Let AI developers edit non-editable AI/Game Script Parameters (#8895)
Change: Allow building docks on clearable watered object tiles (#8514)
Fix #8770: Center vehicle status bar icon (#10178)
Fix: Crash if error message window is too wide for screen. (#10172)
Fix #10155: Network games not syncing company settings properly (#10158)
Fix #10154: Network game desync related to setting a random company face (#10157)
Fix #10011: Incorrect infrastructure totals when overbuilding bay road stop (#10143)
Fix #10117: Object burst limit allowed one fewer object than the setting (#10120)
Fix #10023: Allow negative input in text fields when needed (#10112)
Fix #9908: Fix crash which could occur when a company was deleted when a depot window was open (#9912)
13.0-beta1 (2022-10-31)
------------------------------------------------------------------------
Feature: Airport construction GUI displays infrastructure cost (#10094)
Feature: Purchase land multiple tiles at a time (#10027)
Feature: Add sticky pin & shade widgets to Object Selection UI panel (#10019, #10020)
Feature: Improved handling of HiDPI and mixed-DPI screens (#9994, #9996, #9997, #10064)
Feature: Alternative linkgraph colour schemes (#9866)
Feature: Allow Shift+Insert as paste in edit box (#9836)
Feature: Setting to make the local town authority rubber-stamp all actions (#9833)
Feature: Add/extend console commands to enable screenshot automation (#9771)
Feature: [Linkgraph] Show a tooltip with statistics when hovering a link (#9760)
Feature: Build objects by area (#9709)
Feature: Add setting to hide news about competitors vehicle crash (#9653)
Feature: Ctrl-click to remove fully autoreplaced vehicles from list (#9639)
Feature: Wide rivers on map generation (#9628)
Add: [Script] ScriptCargo::GetWeight to get cargo weights (#9930)
Add: Command line option to skip NewGRF scanning (#9879)
Add: Show video driver name in Game Options window (#9872)
Add: [NewGRF] Map seed as global variable (#9834)
Add: [Script] IndustryType::ResolveNewGRFID to resolve industry id from grf_local_id and grfid (#9798)
Add: [Script] ObjectType::ResolveNewGRFID to resolve object id from grfid and grf_local_id (#9795)
Update: To all the friends we have lost and those we have gained (#10000)
Change: Use the Simulation subcategory to openttd.desktop (#10015)
Change: Constantly update destination of 'any depot' orders (#9959)
Change: Use an indent, not a dash, to list train capacity (#9887)
Change: [NewGRF] Increase vehicle sprite stack from 4 layers to 8 (#9863)
Change: Don't pay Property Maintenance on stations when Infrastructure Maintenance is disabled (#9828)
Change: Improved layout of the finance window (#9827)
Change: [Admin] Bump admin port protocol due to command changes (#9754)
Change: Suppress vehicle age warnings for stopped vehicles (#9718)
Change: Make pf.yapf.rail_firstred_twoway_eol on by default (#9544)
Change: Deliver cargo to the closest industry first (#9536)
Fix: Lots of fixes to how windows handle resizing (#10040, #10042, #10046, #10051, #10056, #10068, #10070, #10098)
Fix: Console commands list_ai output was truncated with a suitably large number of AIs (#10075)
Fix #9876: MacBook Touch Bar crash / render issues w/ 32bpp graphics (#10060)
Fix: Reduce framerate overhead in Train::Tick (#10055)
Fix: Only open scenario editor date query once (#10050)
Fix #10048: Don't relocate company HQ on the same exact location (#10049)
Fix #10038: Missing upper bounds check when loading custom playlists (#10039)
Fix: Wrong string used to determine size of zoomed out station sign (#10036)
Fix: Disable "turn around" button for other companies' road vehicles (#10033)
Fix: Online Players list mouse hover behaviour (#10031)
Fix: [NewGRF] Weirdness of new stations (#10017)
Fix #9854: DrawStringMultiLine() could draw beyond its bounding box (#10014)
Fix: Incorrect player name in online players window (#10013)
Fix #8099: News window zoom level fixes (#10005)
Fix: [NewGRF] Upper 16 random bits should be the same for all station tiles in callback 140 (#9992)
Fix #9989: £0 Net Profit is neither negative nor positive (#9991)
Fix #9804: Only apply sprite_zoom_min setting when sprites available (#9988)
Fix #9972: Add missing fill/resize flags on Framerate window widgets (#9982)
Fix #9935: Use more selectivity when building SSE specific code (#9980)
Fix #9940: Print debuglevel parse errors to console when changed from console (#9979)
Fix #9977: Clearing the console with a large number of lines could cause a crash (#9978)
Fix #9974: Console command getsysdate did not work due to off-by-one error (#9975)
Fix: [NewGRF] Default value of RailVehicleInfo::railveh_type was inconsistent with other default properties (#9967)
Fix #8584: Vehicles with shared orders getting invalid or unexpected start dates (#9955)
Fix #9951: [NewGRF] Scenario editor random industries button broke NewGRF persistent storage (#9952)
Fix: Validation of various internal command parameters that could have allowed a rogue client to crash servers (#9942, #9943, #9944, #9945, #9946, #9947, #9948, #9950)
Fix #9937: Station industries_near incorrect after removing part moved sign (#9938)
Fix: [Script] ScriptRoad::HasRoadType really check for RoadType (#9934)
Fix #9363: Rebuild client list on reinit event (#9929)
Fix #9925: Industry tile layout validation for layouts of only one tile (#9926)
Fix #9918: Reset industy last production year on scenario start (#9920)
Fix #9914: Prevent more useless pathfinder run for blocked vehicles (#9917)
Fix: List a max of four share owners instead of three (#9905)
Fix: [NewGRF] Industry layouts with zero regular tiles should be invalid (#9902)
Fix #9869: Remove docking tile when doing a clear square (#9898)
Fix: New player companies use favorite manager face, if saved (#9895)
Fix: Towns don't build parallel, redundant bridges (#9891)
Fix #9712: Cap town bridge length at original 11-tile limit (#9890)
Fix #9883: Show cost/income float over end tile of rail or road construction (#9889)
Fix #9870: Don't update infrastructure totals when overbuilding object on canal (#9888)
Fix #9877: GS could trigger 'Cost: £0' cost message (#9878)
Fix 44f2ef1: [strgen] Allow gender for {CARGO_SHORT} (#9873)
Fix #9867: Industry::stations_near not filled at industry creation (#9868)
Fix #9853: Incorrect merge of guiflags and flags for osk_activation (#9855)
Fix #6544: Don't join AI company when loading network game in singleplayer (#9794)
Fix: Company values do not properly account for shares (#9770)
Fix #9546: Crash when no industries are present in game (#9726)
Fix #9708: [Linkgraph] Don't assume vehicles have a non-zero max speed (#9693)
Fix #9665: [Linkgraph] Fix travel times of non-direct journeys (#9693)
Fix #8797: Use logical rail length when placing signals (#9652)
Cleanup: [NewGRF] Remove unused flag sprites (#10052)
12.2 (2022-04-02) 12.2 (2022-04-02)
------------------------------------------------------------------------ ------------------------------------------------------------------------
Feature: Remember the last-used signal between games (#9792) Feature: Remember the last-used signal between games (#9792)

View File

@@ -44,8 +44,8 @@ macro(compile_flags)
"$<$<NOT:$<CONFIG:Debug>>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0 "$<$<NOT:$<CONFIG:Debug>>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0
) )
if(CMAKE_SIZEOF_VOID_P EQUAL 8) if(CMAKE_SIZEOF_VOID_P EQUAL 8)
add_compile_options( add_link_options(
"$<$<CONFIG:Debug>:-Wa,-mbig-obj>" # Switch to pe-bigobj-x86-64 as x64 Debug builds push pe-x86-64 to the limits (linking errors with ASLR, ...) "$<$<CONFIG:Debug>:-Wl,--disable-dynamicbase,--disable-high-entropy-va,--default-image-base-low>" # ASLR somehow breaks linking for x64 Debug builds
) )
endif() endif()
endif() endif()
@@ -56,11 +56,6 @@ macro(compile_flags)
if(MSVC) if(MSVC)
add_compile_options(/W3) add_compile_options(/W3)
if(MSVC_VERSION GREATER 1929)
# Starting with version 19.30, there is an optimisation bug, see #9966 for details
# This flag disables the broken optimisation to work around the bug
add_compile_options(/d2ssa-rse-)
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
add_compile_options( add_compile_options(
-W -W

View File

@@ -122,8 +122,6 @@ set(CPACK_STRIP_FILES YES)
set(CPACK_OUTPUT_FILE_PREFIX "bundles") set(CPACK_OUTPUT_FILE_PREFIX "bundles")
if(APPLE) if(APPLE)
# Stripping would produce unreadable stacktraces.
set(CPACK_STRIP_FILES NO)
set(CPACK_GENERATOR "Bundle") set(CPACK_GENERATOR "Bundle")
include(PackageBundle) include(PackageBundle)
@@ -183,10 +181,6 @@ elseif(UNIX)
if(DISTRO_ID STREQUAL "arch") if(DISTRO_ID STREQUAL "arch")
set(PLATFORM "arch") set(PLATFORM "arch")
set(CPACK_GENERATOR "TXZ") set(CPACK_GENERATOR "TXZ")
elseif(DISTRO_ID STREQUAL "fedora" OR DISTRO_ID STREQUAL "rhel")
set(PLATFORM "fedora")
set(CPACK_GENERATOR "RPM")
include(PackageRPM)
else() else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release") set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
endif() endif()

View File

@@ -18,6 +18,6 @@ function(link_package NAME)
message(STATUS "${NAME} found -- -DWITH_${UCNAME} -- ${${NAME}_INCLUDE_DIRS} ${${NAME}_INCLUDE_DIR} -- ${${NAME}_LIBRARIES} ${${NAME}_LIBRARY}") message(STATUS "${NAME} found -- -DWITH_${UCNAME} -- ${${NAME}_INCLUDE_DIRS} ${${NAME}_INCLUDE_DIR} -- ${${NAME}_LIBRARIES} ${${NAME}_LIBRARY}")
endif() endif()
elseif(LP_ENCOURAGED) elseif(LP_ENCOURAGED)
message(WARNING "${NAME} not found; compiling OpenTTD without ${NAME} is strongly discouraged") message(WARNING "${NAME} not found; compiling OpenTTD without ${NAME} is strongly disencouraged")
endif() endif()
endfunction() endfunction()

View File

@@ -3,7 +3,6 @@
source_group("AI Core" REGULAR_EXPRESSION "src/ai/") source_group("AI Core" REGULAR_EXPRESSION "src/ai/")
source_group("Blitters" REGULAR_EXPRESSION "src/blitter/") source_group("Blitters" REGULAR_EXPRESSION "src/blitter/")
source_group("Core Source Code" REGULAR_EXPRESSION "src/core/") source_group("Core Source Code" REGULAR_EXPRESSION "src/core/")
source_group("Font Cache" REGULAR_EXPRESSION "src/fontcache/")
source_group("Game Core" REGULAR_EXPRESSION "src/game/") source_group("Game Core" REGULAR_EXPRESSION "src/game/")
source_group("MD5" REGULAR_EXPRESSION "src/3rdparty/md5/") source_group("MD5" REGULAR_EXPRESSION "src/3rdparty/md5/")
source_group("Misc" REGULAR_EXPRESSION "src/misc/") source_group("Misc" REGULAR_EXPRESSION "src/misc/")

View File

@@ -56,7 +56,7 @@ function(set_options)
option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF) option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF)
option(OPTION_INSTALL_FHS "Install with Filesystem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS}) option(OPTION_INSTALL_FHS "Install with Filesystem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS})
option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" ON) option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" OFF)
if(EMSCRIPTEN) if(EMSCRIPTEN)
# Although pthreads is supported, it is not in a way yet that is # Although pthreads is supported, it is not in a way yet that is
# useful for us. # useful for us.

View File

@@ -1 +0,0 @@
set(CPACK_RPM_PACKAGE_ARCHITECTURE "${ARCHITECTURE}")

View File

@@ -13,7 +13,6 @@ cmake_minimum_required(VERSION 3.5)
# The parameter "enumname" specifies the enumeration to extract. This can also be a regular expression. # The parameter "enumname" specifies the enumeration to extract. This can also be a regular expression.
# The parameter "filename" specifies the relative path to the file, where the enumeration is extracted from. This can also be a glob expression. # The parameter "filename" specifies the relative path to the file, where the enumeration is extracted from. This can also be a glob expression.
# #
# All files where enumerations are extracted from are automatically added via #include
# #
if(NOT GENERATE_SOURCE_FILE) if(NOT GENERATE_SOURCE_FILE)
@@ -42,7 +41,6 @@ foreach(ENUM IN LISTS ENUM_LINES)
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" FILE ${FILE}) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" FILE ${FILE})
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}/* automatically generated from ${FILE} */") string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}/* automatically generated from ${FILE} */")
list(APPEND INCLUDES "#include \"${FILE}\"")
foreach(LINE IN LISTS SOURCE_LINES) foreach(LINE IN LISTS SOURCE_LINES)
string(REPLACE "${RM_INDENT}" "" LINE "${LINE}") string(REPLACE "${RM_INDENT}" "" LINE "${LINE}")
@@ -118,7 +116,4 @@ foreach(ENUM IN LISTS ENUM_LINES)
endforeach() endforeach()
endforeach() endforeach()
list(REMOVE_DUPLICATES INCLUDES)
string(REPLACE ";" "\n" INCLUDES "${INCLUDES}")
configure_file(${GENERATE_SOURCE_FILE} ${GENERATE_BINARY_FILE}) configure_file(${GENERATE_SOURCE_FILE} ${GENERATE_BINARY_FILE})

View File

@@ -35,7 +35,6 @@ execute_process(COMMAND ${OPENTTD_EXECUTABLE}
-vnull:ticks=30000 -vnull:ticks=30000
-d script=2 -d script=2
-d misc=9 -d misc=9
-Q
OUTPUT_VARIABLE REGRESSION_OUTPUT OUTPUT_VARIABLE REGRESSION_OUTPUT
ERROR_VARIABLE REGRESSION_RESULT ERROR_VARIABLE REGRESSION_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE

View File

@@ -12,11 +12,32 @@ endif()
if(NOT APIUC) if(NOT APIUC)
message(FATAL_ERROR "Script needs APIUC defined") message(FATAL_ERROR "Script needs APIUC defined")
endif() endif()
if(NOT API_FILES)
message(FATAL_ERROR "Script needs API_FILES defined") set(ARGC 1)
set(ARG_READ NO)
# For MSVC CMake runs this script from a batch file using || to detect errors,
# depending on source path it may quote args, and cause cmd to not understand ||
# and pass it as argument to ourself.
# Read all the arguments given to CMake; we are looking for -- and everything
# that follows, until ||. Those are our api files.
while(ARGC LESS CMAKE_ARGC)
set(ARG ${CMAKE_ARGV${ARGC}})
if(ARG STREQUAL "||")
set(ARG_READ NO)
endif() endif()
file(READ "${API_FILES}" SCRIPT_API_BINARY_FILES) if(ARG_READ)
list(APPEND SCRIPT_API_BINARY_FILES "${ARG}")
endif()
if(ARG STREQUAL "--")
set(ARG_READ YES)
endif()
math(EXPR ARGC "${ARGC} + 1")
endwhile()
foreach(FILE IN LISTS SCRIPT_API_BINARY_FILES) foreach(FILE IN LISTS SCRIPT_API_BINARY_FILES)
file(STRINGS "${FILE}" LINES REGEX "^void SQ${APIUC}.*_Register\\(Squirrel \\*engine\\)$") file(STRINGS "${FILE}" LINES REGEX "^void SQ${APIUC}.*_Register\\(Squirrel \\*engine\\)$")

Binary file not shown.

View File

@@ -0,0 +1,43 @@
// This file is part of OpenTTD.
// OpenTTD 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, version 2.
// OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
//
-1 * 0 0C "Flag graphics"
-1 * 3 05 14 24
-1 sprites/flags.png 8bpp 34 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 50 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 66 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 82 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 98 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 114 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 130 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 146 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 162 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 178 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 194 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 210 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 226 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 242 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 258 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 274 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 290 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 306 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 322 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 338 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 354 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 370 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 386 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 402 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 418 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 434 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 450 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 466 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 482 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 498 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 514 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 530 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 546 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 562 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 578 8 11 8 0 0 normal
-1 sprites/flags.png 8bpp 594 8 11 8 0 0 normal

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -92,6 +92,7 @@
#include "roadstops.nfo" #include "roadstops.nfo"
#include "aqueduct.nfo" #include "aqueduct.nfo"
#include "autorail.nfo" #include "autorail.nfo"
#include "flags.nfo"
#include "openttdgui.nfo" #include "openttdgui.nfo"
#include "airport_preview.nfo" #include "airport_preview.nfo"
#include "chars.nfo" #include "chars.nfo"

Binary file not shown.

View File

@@ -6,6 +6,6 @@ Name=OpenTTD
Icon=${BINARY_NAME} Icon=${BINARY_NAME}
Exec=${BINARY_NAME} Exec=${BINARY_NAME}
Terminal=false Terminal=false
Categories=Game;Simulation; Categories=Game;
Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo; Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo;
@Comment_STR_DESKTOP_SHORTCUT_COMMENT@ @Comment_STR_DESKTOP_SHORTCUT_COMMENT@

View File

@@ -10,7 +10,6 @@
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings> <windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
</windowsSettings> </windowsSettings>
</application> </application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">

View File

@@ -1,2 +0,0 @@
@echo off
powershell -File "%~dp0generate-assets.ps1"

View File

@@ -1,48 +0,0 @@
function ResizeImage() {
param([String]$sourcePath, [Int]$targetWidth, [Int]$targetHeight, [String]$targetPath)
Add-Type -AssemblyName "System.Drawing"
$img = [System.Drawing.Image]::FromFile($sourcePath)
$ratioX = $targetWidth / $img.Width;
$ratioY = $targetHeight / $img.Height;
$ratio = $ratioY
if ($ratioX -le $ratioY) {
$ratio = $ratioX
}
$newWidth = [int] ($img.Width * $ratio)
$newHeight = [int] ($img.Height * $ratio)
$resizedImage = New-Object System.Drawing.Bitmap($targetWidth, $targetHeight)
$graph = [System.Drawing.Graphics]::FromImage($resizedImage)
$graph.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$graph.Clear([System.Drawing.Color]::Transparent)
$graph.DrawImage($img, $targetWidth / 2 - $newWidth / 2, $targetHeight / 2 - $newHeight / 2, $newWidth, $newHeight)
$resizedImage.Save($targetPath)
$resizedImage.Dispose()
$img.Dispose()
}
$logoPath = "..\..\..\media\openttd.2048.png"
# Create the main image assets required for the Windows Store
New-Item -Path "." -Name "assets" -ItemType "directory" -Force
ResizeImage $logoPath 1240 1240 "assets\LargeTile.png"
ResizeImage $logoPath 284 284 "assets\SmallTile.png"
ResizeImage $logoPath 2480 1200 "assets\SplashScreen.png"
ResizeImage $logoPath 176 176 "assets\Square44x44Logo.png"
Copy-Item "assets\Square44x44Logo.png" -Destination "assets\Square44x44Logo.targetsize-44_altform-unplated.png"
ResizeImage $logoPath 600 600 "assets\Square150x150Logo.png"
Copy-Item "assets\Square150x150Logo.png" -Destination "assets\Square150x150Logo.targetsize-150_altform-unplated.png"
ResizeImage $logoPath 200 200 "assets\StoreLogo.png"
ResizeImage $logoPath 1240 600 "assets\Wide310x150Logo.png"
# Copy the logo for the store for the common package
New-Item -Path "." -Name "assets-common" -ItemType "directory" -Force
Copy-Item "assets\StoreLogo.png" -Destination "assets-common\StoreLogo.png"

View File

@@ -1,2 +0,0 @@
@echo off
powershell -File "%~dp0generate-key.ps1" %1 %2 %3

View File

@@ -1,21 +0,0 @@
[CmdletBinding()]
[Alias()]
Param
(
# Publisher ("CN=xyz")
[Parameter(Mandatory=$true, Position=0)]
$Publisher,
# Password
[Parameter(Mandatory=$true, Position=1)]
$PasswordParam,
# Filename
[Parameter(Mandatory=$true, Position=2)]
$OutputFilename
)
$cert = New-SelfSignedCertificate -Type Custom -Subject $Publisher -KeyUsage DigitalSignature -FriendlyName "OpenTTD signing certificate" -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
$password = ConvertTo-SecureString -String $PasswordParam -Force -AsPlainText
Export-PfxCertificate -cert "Cert:\CurrentUser\My\$($cert.Thumbprint)" -FilePath $OutputFilename -Password $password

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap6="http://schemas.microsoft.com/appx/manifest/uap/windows10/6" IgnorableNamespaces="uap uap6">
<Identity Name="$IDENTITY_NAME$" Publisher="$PUBLISHER$" Version="$VERSION$" ResourceId="OpenTTD-common" />
<Properties>
<uap6:AllowExecution>false</uap6:AllowExecution>
<DisplayName>OpenTTD (official)</DisplayName>
<PublisherDisplayName>OpenTTD Developers</PublisherDisplayName>
<Logo>Assets\StoreLogoCommon.png</Logo>
</Properties>
<Resources>
<Resource Language="en-gb" />
<Resource Language="en-us" />
<Resource Language="en-au" />
<Resource Language="af-za" />
<Resource Language="ar-eg" />
<Resource Language="eu-es" />
<Resource Language="be-by" />
<Resource Language="pt-br" />
<Resource Language="bg-bg" />
<Resource Language="ca-es" />
<Resource Language="hr-hr" />
<Resource Language="cs-cz" />
<Resource Language="da-dk" />
<Resource Language="nl-nl" />
<Resource Language="et-ee" />
<Resource Language="fo-fo" />
<Resource Language="fr-fr" />
<Resource Language="gd-gb" />
<Resource Language="gl-es" />
<Resource Language="de-de" />
<Resource Language="el-gr" />
<Resource Language="he-il" />
<Resource Language="hu-hu" />
<Resource Language="is-is" />
<Resource Language="id-id" />
<Resource Language="ga-ie" />
<Resource Language="it-it" />
<Resource Language="ja-jp" />
<Resource Language="ko-kr" />
<Resource Language="lv-lv" />
<Resource Language="lt-lt" />
<Resource Language="lb-lu" />
<Resource Language="ms-my" />
<Resource Language="nb-no" />
<Resource Language="no-no" />
<Resource Language="pl-pl" />
<Resource Language="pt-pt" />
<Resource Language="ro-ro" />
<Resource Language="ru-ru" />
<Resource Language="sr-latn-rs" />
<Resource Language="zh-cn" />
<Resource Language="sk-sk" />
<Resource Language="sl-si" />
<Resource Language="es-es" />
<Resource Language="es-mx" />
<Resource Language="sv-se" />
<Resource Language="ta-in" />
<Resource Language="th-th" />
<Resource Language="zh-tw" />
<Resource Language="tr-tr" />
<Resource Language="uk-ua" />
<Resource Language="vi-vn" />
<Resource Language="cy-gb" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17134.0" MaxVersionTested="10.0.18363.0" />
</Dependencies>
</Package>

View File

@@ -1,83 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap">
<Identity Name="$IDENTITY_NAME$" Publisher="$PUBLISHER$" Version="$VERSION$" ProcessorArchitecture="$ARCHITECTURE$" />
<Properties>
<DisplayName>OpenTTD (official)</DisplayName>
<PublisherDisplayName>OpenTTD Developers</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17134.0" MaxVersionTested="10.0.18363.0" />
</Dependencies>
<Resources>
<Resource Language="en-gb" />
<Resource Language="en-us" />
<Resource Language="en-au" />
<Resource Language="af-za" />
<Resource Language="ar-eg" />
<Resource Language="eu-es" />
<Resource Language="be-by" />
<Resource Language="pt-br" />
<Resource Language="bg-bg" />
<Resource Language="ca-es" />
<Resource Language="hr-hr" />
<Resource Language="cs-cz" />
<Resource Language="da-dk" />
<Resource Language="nl-nl" />
<!-- <Resource Language="eo-eo" />-->
<Resource Language="et-ee" />
<Resource Language="fo-fo" />
<!-- <Resource Language="fi-fi" />-->
<Resource Language="fr-fr" />
<Resource Language="gd-gb" />
<Resource Language="gl-es" />
<Resource Language="de-de" />
<Resource Language="el-gr" />
<Resource Language="he-il" />
<Resource Language="hu-hu" />
<Resource Language="is-is" />
<Resource Language="id-id" />
<Resource Language="ga-ie" />
<Resource Language="it-it" />
<Resource Language="ja-jp" />
<Resource Language="ko-kr" />
<!-- <Resource Language="la-va" />-->
<Resource Language="lv-lv" />
<Resource Language="lt-lt" />
<Resource Language="lb-lu" />
<Resource Language="ms-my" />
<Resource Language="nb-no" />
<Resource Language="no-no" />
<Resource Language="pl-pl" />
<Resource Language="pt-pt" />
<Resource Language="ro-ro" />
<Resource Language="ru-ru" />
<Resource Language="sr-latn-rs" />
<Resource Language="zh-cn" />
<Resource Language="sk-sk" />
<Resource Language="sl-si" />
<Resource Language="es-es" />
<Resource Language="es-mx" />
<Resource Language="sv-se" />
<Resource Language="ta-in" />
<Resource Language="th-th" />
<Resource Language="zh-tw" />
<Resource Language="tr-tr" />
<Resource Language="uk-ua" />
<Resource Language="vi-vn" />
<Resource Language="cy-gb" />
</Resources>
<Applications>
<Application Id="OpenTTD" Executable="openttd.exe" EntryPoint="Windows.FullTrustApplication">
<uap:VisualElements DisplayName="OpenTTD (official)" Description="OpenTTD is an open source simulation game based upon Transport Tycoon Deluxe." BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClientServer" />
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

View File

@@ -1,35 +0,0 @@
<PackagingLayout xmlns="http://schemas.microsoft.com/appx/makeappx/2017">
<!-- Main game -->
<PackageFamily ID="OpenTTD" FlatBundle="false" ManifestPath="manifests\Package.appxmanifest" ResourceManager="false">
<!-- x86 code package-->
<Package ID="OpenTTD-x86" ProcessorArchitecture="x86" ManifestPath="manifests\Package-x86.appxmanifest">
<Files>
<File DestinationPath="**" SourcePath="x86-binaries\**"/>
<File DestinationPath="Assets\**" SourcePath="Assets\**"/>
</Files>
</Package>
<!-- x64 code package-->
<Package ID="OpenTTD-x64" ProcessorArchitecture="x64" ManifestPath="manifests\Package-x64.appxmanifest">
<Files>
<File DestinationPath="**" SourcePath="x64-binaries\**"/>
<File DestinationPath="Assets\**" SourcePath="Assets\**"/>
</Files>
</Package>
<!-- ARM64 code package-->
<Package ID="OpenTTD-ARM64" ProcessorArchitecture="arm64" ManifestPath="manifests\Package-ARM64.appxmanifest">
<Files>
<File DestinationPath="**" SourcePath="ARM64-binaries\**"/>
<File DestinationPath="Assets\**" SourcePath="Assets\**"/>
</Files>
</Package>
<!-- Common asset package-->
<AssetPackage ID="OpenTTD-common" AllowExecution="false" ManifestPath="manifests\AssetsPackage.appxmanifest">
<Files>
<File DestinationPath="**" SourcePath="common-binaries\**"/>
</Files>
</AssetPackage>
</PackageFamily>
</PackagingLayout>

View File

@@ -1,2 +0,0 @@
@echo off
powershell -File "%~dp0prepare-manifests.ps1" %1 %2 %3 %OTTD_VERSION%

View File

@@ -1,42 +0,0 @@
[CmdletBinding()]
[Alias()]
Param
(
# Output folder
[Parameter(Mandatory=$true, Position=0)]
$OutputFolder,
# Publisher ("CN=xyz")
[Parameter(Mandatory=$true, Position=1)]
$Publisher,
# IdentityName
[Parameter(Mandatory=$true, Position=2)]
$IdentityName,
# Version
[Parameter(Mandatory=$true, Position=3)]
$AppVersion
)
function Prepare-Manifest {
param (
$Architecture
)
(Get-Content "$($PSScriptRoot)\manifests\Package.appxmanifest").replace('$PUBLISHER$', $Publisher).replace('$IDENTITY_NAME$', $IdentityName).replace('$VERSION$', $AppVersion).replace('$ARCHITECTURE$', $Architecture) | Set-Content "$($OutputFolder)\Package-$($Architecture).appxmanifest"
}
# Prepare the application binary manifests
Prepare-Manifest x86
Prepare-Manifest x64
Prepare-Manifest arm64
# Prepare the assets package manifest
(Get-Content "$($PSScriptRoot)\manifests\AssetsPackage.appxmanifest").replace('$PUBLISHER$', $Publisher).replace('$IDENTITY_NAME$', $IdentityName).replace('$VERSION$', $AppVersion) | Set-Content "$($OutputFolder)\AssetsPackage.appxmanifest"
# Prepare the overall package manifest
(Get-Content "$($PSScriptRoot)\manifests\Package.appxmanifest").replace('$PUBLISHER$', $Publisher).replace('$IDENTITY_NAME$', $IdentityName).replace('$VERSION$', $AppVersion).replace(' ProcessorArchitecture="$ARCHITECTURE$"', '') | Set-Content "$($OutputFolder)\Package.appxmanifest"
# Copy the PackagingLayout XML file
(Get-Content "$($PSScriptRoot)\manifests\PackagingLayout.xml") | Set-Content "$($OutputFolder)\PackagingLayout.xml"

View File

@@ -1,14 +0,0 @@
@echo off
if [%1]==[] goto err
powershell -File "%~dp0set-version.ps1" %1 > "%temp%\ottd-set-version.bat"
if not errorlevel 0 goto err
call "%temp%\ottd-set-version.bat"
del /q "%temp%\ottd-set-version.bat"
@rem Version number will now be in %OTTD_VERSION%
goto :eof
:err
echo Please supply the path of openttd.exe as the argument to this batch file.

View File

@@ -1,23 +0,0 @@
[CmdletBinding()]
[Alias()]
Param
(
# EXE path
[Parameter(Mandatory=$true, Position=0)]
$ExePath
)
try
{
$versionInfo = (Get-Item "$ExePath").VersionInfo
# Generate the app version - the build number (MS calls it revision) is always 0 because the Windows Store requires that
$AppVersion = "$($versionInfo.FileMajorPart).$($versionInfo.FileMinorPart).$($versionInfo.FileBuildPart).0"
Write-Output "SET OTTD_VERSION=$($AppVersion)"
}
catch
{
Write-Output "@ECHO Error retrieving EXE version - did you provide a path?"
exit 1
}

View File

@@ -4,7 +4,7 @@ class Regression extends AIInfo {
function GetShortName() { return "REGR"; } function GetShortName() { return "REGR"; }
function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; } function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; } function GetVersion() { return 1; }
function GetAPIVersion() { return "13"; } function GetAPIVersion() { return "12"; }
function GetDate() { return "2007-03-18"; } function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "Regression"; } function CreateInstance() { return "Regression"; }
function UseAsRandomAI() { return false; } function UseAsRandomAI() { return false; }

View File

@@ -341,7 +341,6 @@ function Regression::Cargo()
print(" GetCargoIncome(10, 10): " + AICargo.GetCargoIncome(i, 10, 10)); print(" GetCargoIncome(10, 10): " + AICargo.GetCargoIncome(i, 10, 10));
print(" GetCargoIncome(100, 10): " + AICargo.GetCargoIncome(i, 100, 10)); print(" GetCargoIncome(100, 10): " + AICargo.GetCargoIncome(i, 100, 10));
print(" GetCargoIncome(10, 100): " + AICargo.GetCargoIncome(i, 10, 100)); print(" GetCargoIncome(10, 100): " + AICargo.GetCargoIncome(i, 10, 100));
print(" GetWeight(100): " + AICargo.GetWeight(i, 100));
print(" GetRoadVehicleTypeForCargo(): " + AIRoad.GetRoadVehicleTypeForCargo(i)); print(" GetRoadVehicleTypeForCargo(): " + AIRoad.GetRoadVehicleTypeForCargo(i));
} }
} }
@@ -1024,30 +1023,6 @@ function Regression::Rail()
print(" IsRailTile(): " + AIRail.IsRailTile(10002)); print(" IsRailTile(): " + AIRail.IsRailTile(10002));
print(" BuildRailTrack(): " + AIRail.BuildRailTrack(10002, AIRail.RAILTRACK_NW_SE)); print(" BuildRailTrack(): " + AIRail.BuildRailTrack(10002, AIRail.RAILTRACK_NW_SE));
print(" BuildSignal(): " + AIRail.BuildSignal(10002, 10258, AIRail.SIGNALTYPE_PBS)); print(" BuildSignal(): " + AIRail.BuildSignal(10002, 10258, AIRail.SIGNALTYPE_PBS));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10258));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 9746));
print(" RemoveSignal(): " + AIRail.RemoveSignal(10002, 10258));
print(" BuildSignal(): " + AIRail.BuildSignal(10002, 9746, AIRail.SIGNALTYPE_ENTRY));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10258));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 9746));
print(" RemoveSignal(): " + AIRail.RemoveSignal(10002, 9746));
print(" BuildSignal(): " + AIRail.BuildSignal(10002, 9746, AIRail.SIGNALTYPE_EXIT_TWOWAY));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10258));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 9746));
print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_NE));
print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_SE));
print(" BuildRailTrack(): " + AIRail.BuildRailTrack(10002, AIRail.RAILTRACK_NW_NE));
print(" BuildSignal(): " + AIRail.BuildSignal(10002, 10003, AIRail.SIGNALTYPE_PBS));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10003));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10001));
print(" RemoveSignal(): " + AIRail.RemoveSignal(10002, 10003));
print(" BuildSignal(): " + AIRail.BuildSignal(10002, 10001, AIRail.SIGNALTYPE_ENTRY));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10003));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10001));
print(" RemoveSignal(): " + AIRail.RemoveSignal(10002, 10001));
print(" BuildSignal(): " + AIRail.BuildSignal(10002, 10001, AIRail.SIGNALTYPE_EXIT_TWOWAY));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10003));
print(" GetSignalType(): " + AIRail.GetSignalType(10002, 10001));
print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_NE)); print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_NE));
print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_SE)); print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_SE));
print(" BuildRail(): " + AIRail.BuildRail(10002, 10003, 10006)); print(" BuildRail(): " + AIRail.BuildRail(10002, 10003, 10006));

View File

@@ -1118,7 +1118,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): -1 GetCargoIncome(10, 10): -1
GetCargoIncome(100, 10): -1 GetCargoIncome(100, 10): -1
GetCargoIncome(10, 100): -1 GetCargoIncome(10, 100): -1
GetWeight(100): -1
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 0 Cargo 0
IsValidCargo(): true IsValidCargo(): true
@@ -1131,7 +1130,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 3 GetCargoIncome(10, 10): 3
GetCargoIncome(100, 10): 38 GetCargoIncome(100, 10): 38
GetCargoIncome(10, 100): 3 GetCargoIncome(10, 100): 3
GetWeight(100): 6
GetRoadVehicleTypeForCargo(): 0 GetRoadVehicleTypeForCargo(): 0
Cargo 1 Cargo 1
IsValidCargo(): true IsValidCargo(): true
@@ -1144,7 +1142,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 7 GetCargoIncome(10, 10): 7
GetCargoIncome(100, 10): 71 GetCargoIncome(100, 10): 71
GetCargoIncome(10, 100): 6 GetCargoIncome(10, 100): 6
GetWeight(100): 100
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 2 Cargo 2
IsValidCargo(): true IsValidCargo(): true
@@ -1157,7 +1154,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 5 GetCargoIncome(10, 10): 5
GetCargoIncome(100, 10): 55 GetCargoIncome(100, 10): 55
GetCargoIncome(10, 100): 5 GetCargoIncome(10, 100): 5
GetWeight(100): 25
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 3 Cargo 3
IsValidCargo(): true IsValidCargo(): true
@@ -1170,7 +1166,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 5 GetCargoIncome(10, 10): 5
GetCargoIncome(100, 10): 53 GetCargoIncome(100, 10): 53
GetCargoIncome(10, 100): 5 GetCargoIncome(10, 100): 5
GetWeight(100): 100
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 4 Cargo 4
IsValidCargo(): true IsValidCargo(): true
@@ -1183,7 +1178,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 5 GetCargoIncome(10, 10): 5
GetCargoIncome(100, 10): 52 GetCargoIncome(100, 10): 52
GetCargoIncome(10, 100): 4 GetCargoIncome(10, 100): 4
GetWeight(100): 18
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 5 Cargo 5
IsValidCargo(): true IsValidCargo(): true
@@ -1196,7 +1190,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 7 GetCargoIncome(10, 10): 7
GetCargoIncome(100, 10): 74 GetCargoIncome(100, 10): 74
GetCargoIncome(10, 100): 6 GetCargoIncome(10, 100): 6
GetWeight(100): 50
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 6 Cargo 6
IsValidCargo(): true IsValidCargo(): true
@@ -1209,7 +1202,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 5 GetCargoIncome(10, 10): 5
GetCargoIncome(100, 10): 58 GetCargoIncome(100, 10): 58
GetCargoIncome(10, 100): 4 GetCargoIncome(10, 100): 4
GetWeight(100): 100
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 7 Cargo 7
IsValidCargo(): true IsValidCargo(): true
@@ -1222,7 +1214,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 6 GetCargoIncome(10, 10): 6
GetCargoIncome(100, 10): 60 GetCargoIncome(100, 10): 60
GetCargoIncome(10, 100): 5 GetCargoIncome(10, 100): 5
GetWeight(100): 100
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 8 Cargo 8
IsValidCargo(): true IsValidCargo(): true
@@ -1235,7 +1226,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 6 GetCargoIncome(10, 10): 6
GetCargoIncome(100, 10): 62 GetCargoIncome(100, 10): 62
GetCargoIncome(10, 100): 5 GetCargoIncome(10, 100): 5
GetWeight(100): 100
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 9 Cargo 9
IsValidCargo(): true IsValidCargo(): true
@@ -1248,7 +1238,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 6 GetCargoIncome(10, 10): 6
GetCargoIncome(100, 10): 69 GetCargoIncome(100, 10): 69
GetCargoIncome(10, 100): 6 GetCargoIncome(10, 100): 6
GetWeight(100): 100
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 10 Cargo 10
IsValidCargo(): true IsValidCargo(): true
@@ -1261,7 +1250,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): 9 GetCargoIncome(10, 10): 9
GetCargoIncome(100, 10): 90 GetCargoIncome(100, 10): 90
GetCargoIncome(10, 100): 7 GetCargoIncome(10, 100): 7
GetWeight(100): 12
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 11 Cargo 11
IsValidCargo(): false IsValidCargo(): false
@@ -1274,7 +1262,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): -1 GetCargoIncome(10, 10): -1
GetCargoIncome(100, 10): -1 GetCargoIncome(100, 10): -1
GetCargoIncome(10, 100): -1 GetCargoIncome(10, 100): -1
GetWeight(100): -1
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 12 Cargo 12
IsValidCargo(): false IsValidCargo(): false
@@ -1287,7 +1274,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): -1 GetCargoIncome(10, 10): -1
GetCargoIncome(100, 10): -1 GetCargoIncome(100, 10): -1
GetCargoIncome(10, 100): -1 GetCargoIncome(10, 100): -1
GetWeight(100): -1
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 13 Cargo 13
IsValidCargo(): false IsValidCargo(): false
@@ -1300,7 +1286,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): -1 GetCargoIncome(10, 10): -1
GetCargoIncome(100, 10): -1 GetCargoIncome(100, 10): -1
GetCargoIncome(10, 100): -1 GetCargoIncome(10, 100): -1
GetWeight(100): -1
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
Cargo 14 Cargo 14
IsValidCargo(): false IsValidCargo(): false
@@ -1313,7 +1298,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoIncome(10, 10): -1 GetCargoIncome(10, 10): -1
GetCargoIncome(100, 10): -1 GetCargoIncome(100, 10): -1
GetCargoIncome(10, 100): -1 GetCargoIncome(10, 100): -1
GetWeight(100): -1
GetRoadVehicleTypeForCargo(): 1 GetRoadVehicleTypeForCargo(): 1
--CargoList-- --CargoList--
@@ -7427,32 +7411,8 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsRailTile(): false IsRailTile(): false
BuildRailTrack(): true BuildRailTrack(): true
BuildSignal(): true BuildSignal(): true
GetSignalType(): 4
GetSignalType(): 255
RemoveSignal(): true
BuildSignal(): true
GetSignalType(): 255
GetSignalType(): 1
RemoveSignal(): true
BuildSignal(): true
GetSignalType(): 10
GetSignalType(): 10
RemoveRailTrack(): false RemoveRailTrack(): false
RemoveRailTrack(): true RemoveRailTrack(): true
BuildRailTrack(): true
BuildSignal(): false
GetSignalType(): 255
GetSignalType(): 255
RemoveSignal(): false
BuildSignal(): true
GetSignalType(): 255
GetSignalType(): 1
RemoveSignal(): true
BuildSignal(): true
GetSignalType(): 255
GetSignalType(): 10
RemoveRailTrack(): true
RemoveRailTrack(): false
BuildRail(): true BuildRail(): true
HasTransportType(): true HasTransportType(): true
HasTransportType(): false HasTransportType(): false
@@ -9312,12 +9272,12 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetLocation(): 33417 GetLocation(): 33417
GetEngineType(): 153 GetEngineType(): 153
GetUnitNumber(): 1 GetUnitNumber(): 1
GetAge(): 0 GetAge(): 1
GetMaxAge(): 5490 GetMaxAge(): 5490
GetAgeLeft(): 5490 GetAgeLeft(): 5489
GetCurrentSpeed(): 7 GetCurrentSpeed(): 7
GetRunningCost(): 421 GetRunningCost(): 421
GetProfitThisYear(): 0 GetProfitThisYear(): -1
GetProfitLastYear(): 0 GetProfitLastYear(): 0
GetCurrentValue(): 5947 GetCurrentValue(): 5947
GetVehicleType(): 1 GetVehicleType(): 1
@@ -9327,7 +9287,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsInDepot(): false IsInDepot(): false
GetNumWagons(): 1 GetNumWagons(): 1
GetWagonEngineType(): 153 GetWagonEngineType(): 153
GetWagonAge(): 0 GetWagonAge(): 1
GetLength(): 8 GetLength(): 8
GetOwner(): 1 GetOwner(): 1
BuildVehicle(): 14 BuildVehicle(): 14
@@ -9400,11 +9360,11 @@ ERROR: IsEnd() is invalid as Begin() is never called
14 => 1 14 => 1
12 => 1 12 => 1
Age ListDump: Age ListDump:
17 => 1
16 => 1
14 => 1
13 => 1 13 => 1
12 => 1 12 => 1
17 => 0
16 => 0
14 => 0
MaxAge ListDump: MaxAge ListDump:
16 => 10980 16 => 10980
14 => 10980 14 => 10980
@@ -9412,9 +9372,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
13 => 5490 13 => 5490
12 => 5490 12 => 5490
AgeLeft ListDump: AgeLeft ListDump:
16 => 10979 16 => 10980
14 => 10979 14 => 10980
17 => 7319 17 => 7320
13 => 5489 13 => 5489
12 => 5489 12 => 5489
CurrentSpeed ListDump: CurrentSpeed ListDump:

View File

@@ -4,7 +4,7 @@ class StationList extends AIInfo {
function GetShortName() { return "REGS"; } function GetShortName() { return "REGS"; }
function GetDescription() { return "This runs stationlist-tests on some commands. On the same map the result should always be the same."; } function GetDescription() { return "This runs stationlist-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; } function GetVersion() { return 1; }
function GetAPIVersion() { return "13"; } function GetAPIVersion() { return "12"; }
function GetDate() { return "2007-03-18"; } function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "StationList"; } function CreateInstance() { return "StationList"; }
function UseAsRandomAI() { return false; } function UseAsRandomAI() { return false; }

View File

@@ -10,7 +10,6 @@ add_subdirectory(3rdparty)
add_subdirectory(ai) add_subdirectory(ai)
add_subdirectory(blitter) add_subdirectory(blitter)
add_subdirectory(core) add_subdirectory(core)
add_subdirectory(fontcache)
add_subdirectory(game) add_subdirectory(game)
add_subdirectory(lang) add_subdirectory(lang)
add_subdirectory(linkgraph) add_subdirectory(linkgraph)
@@ -30,15 +29,18 @@ add_files(
viewport_sprite_sorter_sse4.cpp viewport_sprite_sorter_sse4.cpp
CONDITION SSE_FOUND CONDITION SSE_FOUND
) )
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set_compile_flags(
viewport_sprite_sorter_sse4.cpp
COMPILE_FLAGS -msse4.1)
endif()
add_files( add_files(
aircraft.h aircraft.h
aircraft_cmd.cpp aircraft_cmd.cpp
aircraft_cmd.h
aircraft_gui.cpp aircraft_gui.cpp
airport.cpp airport.cpp
airport.h airport.h
airport_cmd.h
airport_gui.cpp airport_gui.cpp
animated_tile.cpp animated_tile.cpp
animated_tile_func.h animated_tile_func.h
@@ -47,7 +49,6 @@ add_files(
autoreplace.cpp autoreplace.cpp
autoreplace_base.h autoreplace_base.h
autoreplace_cmd.cpp autoreplace_cmd.cpp
autoreplace_cmd.h
autoreplace_func.h autoreplace_func.h
autoreplace_gui.cpp autoreplace_gui.cpp
autoreplace_gui.h autoreplace_gui.h
@@ -83,12 +84,12 @@ add_files(
clear_cmd.cpp clear_cmd.cpp
clear_func.h clear_func.h
clear_map.h clear_map.h
cmd_helper.h
command.cpp command.cpp
command_func.h command_func.h
command_type.h command_type.h
company_base.h company_base.h
company_cmd.cpp company_cmd.cpp
company_cmd.h
company_func.h company_func.h
company_gui.cpp company_gui.cpp
company_gui.h company_gui.h
@@ -118,7 +119,6 @@ add_files(
depot.cpp depot.cpp
depot_base.h depot_base.h
depot_cmd.cpp depot_cmd.cpp
depot_cmd.h
depot_func.h depot_func.h
depot_gui.cpp depot_gui.cpp
depot_map.h depot_map.h
@@ -127,13 +127,11 @@ add_files(
direction_type.h direction_type.h
disaster_vehicle.cpp disaster_vehicle.cpp
disaster_vehicle.h disaster_vehicle.h
dock_cmd.h
dock_gui.cpp dock_gui.cpp
driver.cpp driver.cpp
driver.h driver.h
economy.cpp economy.cpp
economy_base.h economy_base.h
economy_cmd.h
economy_func.h economy_func.h
economy_type.h economy_type.h
effectvehicle.cpp effectvehicle.cpp
@@ -143,7 +141,6 @@ add_files(
elrail_func.h elrail_func.h
engine.cpp engine.cpp
engine_base.h engine_base.h
engine_cmd.h
engine_func.h engine_func.h
engine_gui.cpp engine_gui.cpp
engine_gui.h engine_gui.h
@@ -158,6 +155,7 @@ add_files(
fios_gui.cpp fios_gui.cpp
fontcache.cpp fontcache.cpp
fontcache.h fontcache.h
fontcache_internal.h
fontdetection.h fontdetection.h
framerate_gui.cpp framerate_gui.cpp
framerate_type.h framerate_type.h
@@ -176,7 +174,6 @@ add_files(
gfxinit.h gfxinit.h
goal.cpp goal.cpp
goal_base.h goal_base.h
goal_cmd.h
goal_gui.cpp goal_gui.cpp
goal_type.h goal_type.h
graph_gui.cpp graph_gui.cpp
@@ -185,7 +182,6 @@ add_files(
ground_vehicle.hpp ground_vehicle.hpp
group.h group.h
group_cmd.cpp group_cmd.cpp
group_cmd.h
group_gui.cpp group_gui.cpp
group_gui.h group_gui.h
group_type.h group_type.h
@@ -202,7 +198,6 @@ add_files(
house_type.h house_type.h
industry.h industry.h
industry_cmd.cpp industry_cmd.cpp
industry_cmd.h
industry_gui.cpp industry_gui.cpp
industry_map.h industry_map.h
industry_type.h industry_type.h
@@ -213,15 +208,8 @@ add_files(
intro_gui.cpp intro_gui.cpp
landscape.cpp landscape.cpp
landscape.h landscape.h
landscape_cmd.h
landscape_type.h landscape_type.h
language.h language.h
league_base.h
league_cmd.h
league_cmd.cpp
league_gui.h
league_gui.cpp
league_type.h
livery.h livery.h
main_gui.cpp main_gui.cpp
map.cpp map.cpp
@@ -229,7 +217,6 @@ add_files(
map_type.h map_type.h
misc.cpp misc.cpp
misc_cmd.cpp misc_cmd.cpp
misc_cmd.h
misc_gui.cpp misc_gui.cpp
mixer.cpp mixer.cpp
mixer.h mixer.h
@@ -290,7 +277,6 @@ add_files(
newgrf_town.h newgrf_town.h
newgrf_townname.cpp newgrf_townname.cpp
newgrf_townname.h newgrf_townname.h
news_cmd.h
news_func.h news_func.h
news_gui.cpp news_gui.cpp
news_gui.h news_gui.h
@@ -298,7 +284,6 @@ add_files(
object.h object.h
object_base.h object_base.h
object_cmd.cpp object_cmd.cpp
object_cmd.h
object_gui.cpp object_gui.cpp
object_map.h object_map.h
object_type.h object_type.h
@@ -308,7 +293,6 @@ add_files(
order_backup.h order_backup.h
order_base.h order_base.h
order_cmd.cpp order_cmd.cpp
order_cmd.h
order_func.h order_func.h
order_gui.cpp order_gui.cpp
order_type.h order_type.h
@@ -321,7 +305,6 @@ add_files(
rail.cpp rail.cpp
rail.h rail.h
rail_cmd.cpp rail_cmd.cpp
rail_cmd.h
rail_gui.cpp rail_gui.cpp
rail_gui.h rail_gui.h
rail_map.h rail_map.h
@@ -344,7 +327,6 @@ add_files(
roadstop_base.h roadstop_base.h
roadveh.h roadveh.h
roadveh_cmd.cpp roadveh_cmd.cpp
roadveh_cmd.h
roadveh_gui.cpp roadveh_gui.cpp
safeguards.h safeguards.h
screenshot_gui.cpp screenshot_gui.cpp
@@ -352,7 +334,6 @@ add_files(
screenshot.cpp screenshot.cpp
screenshot.h screenshot.h
settings.cpp settings.cpp
settings_cmd.h
settings_func.h settings_func.h
settings_gui.cpp settings_gui.cpp
settings_gui.h settings_gui.h
@@ -362,7 +343,6 @@ add_files(
settings_type.h settings_type.h
ship.h ship.h
ship_cmd.cpp ship_cmd.cpp
ship_cmd.h
ship_gui.cpp ship_gui.cpp
signal.cpp signal.cpp
signal_func.h signal_func.h
@@ -370,7 +350,6 @@ add_files(
signs.cpp signs.cpp
signs_base.h signs_base.h
signs_cmd.cpp signs_cmd.cpp
signs_cmd.h
signs_func.h signs_func.h
signs_gui.cpp signs_gui.cpp
signs_type.h signs_type.h
@@ -389,7 +368,6 @@ add_files(
station.cpp station.cpp
station_base.h station_base.h
station_cmd.cpp station_cmd.cpp
station_cmd.h
station_func.h station_func.h
station_gui.cpp station_gui.cpp
station_gui.h station_gui.h
@@ -401,7 +379,6 @@ add_files(
stdafx.h stdafx.h
story.cpp story.cpp
story_base.h story_base.h
story_cmd.h
story_gui.cpp story_gui.cpp
story_type.h story_type.h
strgen/strgen.h strgen/strgen.h
@@ -416,13 +393,11 @@ add_files(
strings_type.h strings_type.h
subsidy.cpp subsidy.cpp
subsidy_base.h subsidy_base.h
subsidy_cmd.h
subsidy_func.h subsidy_func.h
subsidy_gui.cpp subsidy_gui.cpp
subsidy_type.h subsidy_type.h
tar_type.h tar_type.h
terraform_cmd.cpp terraform_cmd.cpp
terraform_cmd.h
terraform_gui.cpp terraform_gui.cpp
terraform_gui.h terraform_gui.h
textbuf.cpp textbuf.cpp
@@ -447,13 +422,11 @@ add_files(
tilematrix_type.hpp tilematrix_type.hpp
timetable.h timetable.h
timetable_cmd.cpp timetable_cmd.cpp
timetable_cmd.h
timetable_gui.cpp timetable_gui.cpp
toolbar_gui.cpp toolbar_gui.cpp
toolbar_gui.h toolbar_gui.h
town.h town.h
town_cmd.cpp town_cmd.cpp
town_cmd.h
town_gui.cpp town_gui.cpp
town_kdtree.h town_kdtree.h
town_map.h town_map.h
@@ -465,26 +438,22 @@ add_files(
track_type.h track_type.h
train.h train.h
train_cmd.cpp train_cmd.cpp
train_cmd.h
train_gui.cpp train_gui.cpp
transparency.h transparency.h
transparency_gui.cpp transparency_gui.cpp
transparency_gui.h transparency_gui.h
transport_type.h transport_type.h
tree_cmd.cpp tree_cmd.cpp
tree_cmd.h
tree_gui.cpp tree_gui.cpp
tree_map.h tree_map.h
tunnel_map.cpp tunnel_map.cpp
tunnel_map.h tunnel_map.h
tunnelbridge.h tunnelbridge.h
tunnelbridge_cmd.cpp tunnelbridge_cmd.cpp
tunnelbridge_cmd.h
tunnelbridge_map.h tunnelbridge_map.h
vehicle.cpp vehicle.cpp
vehicle_base.h vehicle_base.h
vehicle_cmd.cpp vehicle_cmd.cpp
vehicle_cmd.h
vehicle_func.h vehicle_func.h
vehicle_gui.cpp vehicle_gui.cpp
vehicle_gui.h vehicle_gui.h
@@ -493,7 +462,6 @@ add_files(
vehiclelist.cpp vehiclelist.cpp
vehiclelist.h vehiclelist.h
viewport.cpp viewport.cpp
viewport_cmd.h
viewport_func.h viewport_func.h
viewport_gui.cpp viewport_gui.cpp
viewport_kdtree.h viewport_kdtree.h
@@ -504,12 +472,10 @@ add_files(
walltime_func.h walltime_func.h
water.h water.h
water_cmd.cpp water_cmd.cpp
water_cmd.h
water_map.h water_map.h
waypoint.cpp waypoint.cpp
waypoint_base.h waypoint_base.h
waypoint_cmd.cpp waypoint_cmd.cpp
waypoint_cmd.h
waypoint_func.h waypoint_func.h
waypoint_gui.cpp waypoint_gui.cpp
widget.cpp widget.cpp

View File

@@ -139,9 +139,9 @@ public:
static int GetStartNextTime(); static int GetStartNextTime();
/** Wrapper function for AIScanner::GetAIConsoleList */ /** Wrapper function for AIScanner::GetAIConsoleList */
static std::string GetConsoleList(bool newest_only = false); static char *GetConsoleList(char *p, const char *last, bool newest_only = false);
/** Wrapper function for AIScanner::GetAIConsoleLibraryList */ /** Wrapper function for AIScanner::GetAIConsoleLibraryList */
static std::string GetConsoleLibraryList(); static char *GetConsoleLibraryList(char *p, const char *last);
/** Wrapper function for AIScanner::GetAIInfoList */ /** Wrapper function for AIScanner::GetAIInfoList */
static const ScriptInfoList *GetInfoList(); static const ScriptInfoList *GetInfoList();
/** Wrapper function for AIScanner::GetUniqueAIInfoList */ /** Wrapper function for AIScanner::GetUniqueAIInfoList */

View File

@@ -315,14 +315,14 @@
return DAYS_IN_YEAR; return DAYS_IN_YEAR;
} }
/* static */ std::string AI::GetConsoleList(bool newest_only) /* static */ char *AI::GetConsoleList(char *p, const char *last, bool newest_only)
{ {
return AI::scanner_info->GetConsoleList(newest_only); return AI::scanner_info->GetConsoleList(p, last, newest_only);
} }
/* static */ std::string AI::GetConsoleLibraryList() /* static */ char *AI::GetConsoleLibraryList(char *p, const char *last)
{ {
return AI::scanner_library->GetConsoleList(true); return AI::scanner_library->GetConsoleList(p, last, true);
} }
/* static */ const ScriptInfoList *AI::GetInfoList() /* static */ const ScriptInfoList *AI::GetInfoList()

View File

@@ -28,8 +28,6 @@
#include "../hotkeys.h" #include "../hotkeys.h"
#include "../core/geometry_func.hpp" #include "../core/geometry_func.hpp"
#include "../guitimer_func.h" #include "../guitimer_func.h"
#include "../company_cmd.h"
#include "../misc_cmd.h"
#include "ai.hpp" #include "ai.hpp"
#include "ai_gui.hpp" #include "ai_gui.hpp"
@@ -112,7 +110,7 @@ struct AIListWindow : public Window {
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
{ {
if (widget == WID_AIL_LIST) { if (widget == WID_AIL_LIST) {
this->line_height = FONT_HEIGHT_NORMAL + padding.height; this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
resize->width = 1; resize->width = 1;
resize->height = this->line_height; resize->height = this->line_height;
@@ -125,18 +123,18 @@ struct AIListWindow : public Window {
switch (widget) { switch (widget) {
case WID_AIL_LIST: { case WID_AIL_LIST: {
/* Draw a list of all available AIs. */ /* Draw a list of all available AIs. */
Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); int y = this->GetWidget<NWidgetBase>(WID_AIL_LIST)->pos_y;
/* First AI in the list is hardcoded to random */ /* First AI in the list is hardcoded to random */
if (this->vscroll->IsVisible(0)) { if (this->vscroll->IsVisible(0)) {
DrawString(tr, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE); DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE);
tr.top += this->line_height; y += this->line_height;
} }
int i = 0; int i = 0;
for (const auto &item : *this->info_list) { for (const auto &item : *this->info_list) {
i++; i++;
if (this->vscroll->IsVisible(i)) { if (this->vscroll->IsVisible(i)) {
DrawString(tr, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE); DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE);
tr.top += this->line_height; y += this->line_height;
} }
} }
break; break;
@@ -150,20 +148,20 @@ struct AIListWindow : public Window {
} }
/* Some info about the currently selected AI. */ /* Some info about the currently selected AI. */
if (selected_info != nullptr) { if (selected_info != nullptr) {
Rect tr = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); int y = r.top + WD_FRAMERECT_TOP;
SetDParamStr(0, selected_info->GetAuthor()); SetDParamStr(0, selected_info->GetAuthor());
DrawString(tr, STR_AI_LIST_AUTHOR); DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_AUTHOR);
tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
SetDParam(0, selected_info->GetVersion()); SetDParam(0, selected_info->GetVersion());
DrawString(tr, STR_AI_LIST_VERSION); DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_VERSION);
tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
if (selected_info->GetURL() != nullptr) { if (selected_info->GetURL() != nullptr) {
SetDParamStr(0, selected_info->GetURL()); SetDParamStr(0, selected_info->GetURL());
DrawString(tr, STR_AI_LIST_URL); DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_URL);
tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
} }
SetDParamStr(0, selected_info->GetDescription()); SetDParamStr(0, selected_info->GetDescription());
DrawStringMultiLine(tr, STR_JUST_RAW_STRING, TC_WHITE); DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_FRAMERECT_BOTTOM, STR_JUST_RAW_STRING, TC_WHITE);
} }
break; break;
} }
@@ -182,7 +180,7 @@ struct AIListWindow : public Window {
for (int i = 0; i < this->selected; i++) it++; for (int i = 0; i < this->selected; i++) it++;
GetConfig(slot)->Change((*it).second->GetName(), (*it).second->GetVersion()); GetConfig(slot)->Change((*it).second->GetName(), (*it).second->GetVersion());
} }
InvalidateWindowData(WC_GAME_OPTIONS, slot == OWNER_DEITY ? WN_GAME_OPTIONS_GS : WN_GAME_OPTIONS_AI); InvalidateWindowData(WC_GAME_OPTIONS, WN_GAME_OPTIONS_AI);
InvalidateWindowClassesData(WC_AI_SETTINGS); InvalidateWindowClassesData(WC_AI_SETTINGS);
CloseWindowByClass(WC_QUERY_STRING); CloseWindowByClass(WC_QUERY_STRING);
InvalidateWindowClassesData(WC_TEXTFILE); InvalidateWindowClassesData(WC_TEXTFILE);
@@ -253,7 +251,7 @@ static const NWidgetPart _nested_ai_list_widgets[] = {
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIL_LIST), SetMinimalSize(188, 112), SetFill(1, 1), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_AI_LIST_TOOLTIP), SetScrollbar(WID_AIL_SCROLLBAR), NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIL_LIST), SetMinimalSize(188, 112), SetFill(1, 1), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_AI_LIST_TOOLTIP), SetScrollbar(WID_AIL_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIL_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIL_SCROLLBAR),
EndContainer(), EndContainer(),
NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIL_INFO_BG), SetMinimalTextLines(8, WidgetDimensions::unscaled.framerect.Vertical() + WidgetDimensions::unscaled.vsep_normal * 3), SetResize(1, 0), NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIL_INFO_BG), SetMinimalTextLines(8, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), SetResize(1, 0),
EndContainer(), EndContainer(),
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
@@ -276,7 +274,7 @@ static WindowDesc _ai_list_desc(
* Open the AI list window to chose an AI for the given company slot. * Open the AI list window to chose an AI for the given company slot.
* @param slot The slot to change the AI of. * @param slot The slot to change the AI of.
*/ */
void ShowAIListWindow(CompanyID slot) static void ShowAIListWindow(CompanyID slot)
{ {
CloseWindowByClass(WC_AI_LIST); CloseWindowByClass(WC_AI_LIST);
new AIListWindow(&_ai_list_desc, slot); new AIListWindow(&_ai_list_desc, slot);
@@ -296,7 +294,7 @@ struct AISettingsWindow : public Window {
int clicked_row; ///< The clicked row of settings. int clicked_row; ///< The clicked row of settings.
int line_height; ///< Height of a row in the matrix widget. int line_height; ///< Height of a row in the matrix widget.
Scrollbar *vscroll; ///< Cache of the vertical scrollbar. Scrollbar *vscroll; ///< Cache of the vertical scrollbar.
typedef std::vector<const ScriptConfigItem *> VisibleSettingsList; ///< typdef for a vector of script settings typedef std::vector<const ScriptConfigItem *> VisibleSettingsList;
VisibleSettingsList visible_settings; ///< List of visible AI settings VisibleSettingsList visible_settings; ///< List of visible AI settings
/** /**
@@ -320,6 +318,15 @@ struct AISettingsWindow : public Window {
this->RebuildVisibleSettings(); this->RebuildVisibleSettings();
} }
void SetStringParameters(int widget) const override
{
switch (widget) {
case WID_AIS_CAPTION:
SetDParam(0, (this->slot == OWNER_DEITY) ? STR_AI_SETTINGS_CAPTION_GAMESCRIPT : STR_AI_SETTINGS_CAPTION_AI);
break;
}
}
/** /**
* Rebuilds the list of visible settings. AI settings with the flag * Rebuilds the list of visible settings. AI settings with the flag
* AICONFIG_AI_DEVELOPER set will only be visible if the game setting * AICONFIG_AI_DEVELOPER set will only be visible if the game setting
@@ -342,7 +349,7 @@ struct AISettingsWindow : public Window {
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
{ {
if (widget == WID_AIS_BACKGROUND) { if (widget == WID_AIS_BACKGROUND) {
this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + padding.height; this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
resize->width = 1; resize->width = 1;
resize->height = this->line_height; resize->height = this->line_height;
@@ -359,10 +366,11 @@ struct AISettingsWindow : public Window {
int i = 0; int i = 0;
for (; !this->vscroll->IsVisible(i); i++) it++; for (; !this->vscroll->IsVisible(i); i++) it++;
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
bool rtl = _current_text_dir == TD_RTL; bool rtl = _current_text_dir == TD_RTL;
Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); uint buttons_left = rtl ? r.right - SETTING_BUTTON_WIDTH - 3 : r.left + 4;
Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : SETTING_BUTTON_WIDTH + 8);
uint text_right = r.right - (rtl ? SETTING_BUTTON_WIDTH + 8 : WD_FRAMERECT_RIGHT);
int y = r.top; int y = r.top;
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
@@ -391,13 +399,13 @@ struct AISettingsWindow : public Window {
} }
if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) { if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) {
DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); DrawBoolButton(buttons_left, y + button_y_offset, current_value != 0, editable);
SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON);
} else { } else {
if (config_item.complete_labels) { if (config_item.complete_labels) {
DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); DrawDropDownButton(buttons_left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable);
} else { } else {
DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); DrawArrowButtons(buttons_left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value);
} }
if (config_item.labels != nullptr && config_item.labels->Contains(current_value)) { if (config_item.labels != nullptr && config_item.labels->Contains(current_value)) {
SetDParam(idx++, STR_JUST_RAW_STRING); SetDParam(idx++, STR_JUST_RAW_STRING);
@@ -408,7 +416,7 @@ struct AISettingsWindow : public Window {
} }
} }
DrawString(tr.left, tr.right, y + text_y_offset, str, colour); DrawString(text_left, text_right, y + text_y_offset, str, colour);
y += this->line_height; y += this->line_height;
} }
} }
@@ -426,8 +434,8 @@ struct AISettingsWindow : public Window {
{ {
switch (widget) { switch (widget) {
case WID_AIS_BACKGROUND: { case WID_AIS_BACKGROUND: {
Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero); const NWidgetBase *wid = this->GetWidget<NWidgetBase>(WID_AIS_BACKGROUND);
int num = (pt.y - r.top) / this->line_height + this->vscroll->GetPosition(); int num = (pt.y - wid->pos_y) / this->line_height + this->vscroll->GetPosition();
if (num >= (int)this->visible_settings.size()) break; if (num >= (int)this->visible_settings.size()) break;
VisibleSettingsList::const_iterator it = this->visible_settings.begin(); VisibleSettingsList::const_iterator it = this->visible_settings.begin();
@@ -444,8 +452,9 @@ struct AISettingsWindow : public Window {
bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0; bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0;
int x = pt.x - r.left; int x = pt.x - wid->pos_x;
if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; if (_current_text_dir == TD_RTL) x = wid->current_x - 1 - x;
x -= 4;
/* One of the arrows is clicked (or green/red rect in case of bool value) */ /* One of the arrows is clicked (or green/red rect in case of bool value) */
int old_val = this->ai_config->GetSetting(config_item.name); int old_val = this->ai_config->GetSetting(config_item.name);
@@ -456,7 +465,8 @@ struct AISettingsWindow : public Window {
this->clicked_dropdown = false; this->clicked_dropdown = false;
this->closing_dropdown = false; this->closing_dropdown = false;
} else { } else {
int rel_y = (pt.y - r.top) % this->line_height; const NWidgetBase *wid = this->GetWidget<NWidgetBase>(WID_AIS_BACKGROUND);
int rel_y = (pt.y - (int)wid->pos_y) % this->line_height;
Rect wi_rect; Rect wi_rect;
wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x);
@@ -464,7 +474,7 @@ struct AISettingsWindow : public Window {
wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2; wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1; wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1;
/* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */ /* For dropdowns we also have to check the y position thoroughly, the mouse may not above the just opening dropdown */
if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) { if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) {
this->clicked_dropdown = true; this->clicked_dropdown = true;
this->closing_dropdown = false; this->closing_dropdown = false;
@@ -521,15 +531,24 @@ struct AISettingsWindow : public Window {
void OnQueryTextFinished(char *str) override void OnQueryTextFinished(char *str) override
{ {
if (StrEmpty(str)) return; if (StrEmpty(str)) return;
VisibleSettingsList::const_iterator it = this->visible_settings.begin();
for (int i = 0; i < this->clicked_row; i++) it++;
const ScriptConfigItem config_item = **it;
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
int32 value = atoi(str); int32 value = atoi(str);
this->ai_config->SetSetting(config_item.name, value);
SetValue(value); this->SetDirty();
} }
void OnDropdownSelect(int widget, int index) override void OnDropdownSelect(int widget, int index) override
{ {
assert(this->clicked_dropdown); assert(this->clicked_dropdown);
SetValue(index); VisibleSettingsList::const_iterator it = this->visible_settings.begin();
for (int i = 0; i < this->clicked_row; i++) it++;
const ScriptConfigItem config_item = **it;
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
this->ai_config->SetSetting(config_item.name, index);
this->SetDirty();
} }
void OnDropdownClose(Point pt, int widget, int index, bool instant_close) override void OnDropdownClose(Point pt, int widget, int index, bool instant_close) override
@@ -571,21 +590,7 @@ struct AISettingsWindow : public Window {
private: private:
bool IsEditableItem(const ScriptConfigItem &config_item) const bool IsEditableItem(const ScriptConfigItem &config_item) const
{ {
return _game_mode == GM_MENU return _game_mode == GM_MENU || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)) || (config_item.flags & SCRIPTCONFIG_INGAME) != 0;
|| _game_mode == GM_EDITOR
|| ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot))
|| (config_item.flags & SCRIPTCONFIG_INGAME) != 0
|| _settings_client.gui.ai_developer_tools;
}
void SetValue(int value)
{
VisibleSettingsList::const_iterator it = this->visible_settings.begin();
for (int i = 0; i < this->clicked_row; i++) it++;
const ScriptConfigItem config_item = **it;
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
this->ai_config->SetSetting(config_item.name, value);
this->SetDirty();
} }
}; };
@@ -593,7 +598,7 @@ private:
static const NWidgetPart _nested_ai_settings_widgets[] = { static const NWidgetPart _nested_ai_settings_widgets[] = {
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE),
NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_AIS_CAPTION), SetDataTip(STR_AI_SETTINGS_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_AIS_CAPTION), SetDataTip(STR_AI_SETTINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE),
EndContainer(), EndContainer(),
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
@@ -673,15 +678,15 @@ void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot)
static const NWidgetPart _nested_ai_config_widgets[] = { static const NWidgetPart _nested_ai_config_widgets[] = {
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE),
NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(), EndContainer(),
NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND), NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND),
NWidget(NWID_VERTICAL), SetPIP(4, 4, 4), NWidget(NWID_VERTICAL), SetPIP(4, 4, 4),
NWidget(NWID_HORIZONTAL), SetPIP(7, 0, 7), NWidget(NWID_HORIZONTAL), SetPIP(7, 0, 7),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetDataTip(AWV_DECREASE, STR_NULL), NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetFill(0, 1), SetDataTip(AWV_DECREASE, STR_NULL),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetDataTip(AWV_INCREASE, STR_NULL), NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetFill(0, 1), SetDataTip(AWV_INCREASE, STR_NULL),
NWidget(NWID_SPACER), SetMinimalSize(6, 0), NWidget(NWID_SPACER), SetMinimalSize(6, 0),
NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_AI_CONFIG_MAX_COMPETITORS, STR_NULL), SetFill(1, 0), NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS, STR_NULL), SetFill(1, 0), SetPadding(1, 0, 0, 0),
EndContainer(), EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP),
@@ -695,13 +700,16 @@ static const NWidgetPart _nested_ai_config_widgets[] = {
EndContainer(), EndContainer(),
EndContainer(), EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 9), NWidget(NWID_SPACER), SetMinimalSize(0, 9),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetPadding(0, 5, 4, 5),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP), NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_GAMELIST), SetMinimalSize(288, 14), SetFill(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL),
EndContainer(), EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE, STR_AI_CONFIG_CHANGE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL),
EndContainer(), EndContainer(),
@@ -749,22 +757,53 @@ struct AIConfigWindow : public Window {
case WID_AIC_NUMBER: case WID_AIC_NUMBER:
SetDParam(0, GetGameSettings().difficulty.max_no_competitors); SetDParam(0, GetGameSettings().difficulty.max_no_competitors);
break; break;
case WID_AIC_CHANGE:
switch (selected_slot) {
case OWNER_DEITY:
SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT);
break;
case INVALID_COMPANY:
SetDParam(0, STR_AI_CONFIG_CHANGE_NONE);
break;
default:
SetDParam(0, STR_AI_CONFIG_CHANGE_AI);
break;
}
break;
} }
} }
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
{ {
switch (widget) { switch (widget) {
case WID_AIC_DECREASE: case WID_AIC_GAMELIST:
case WID_AIC_INCREASE: this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
*size = maxdim(*size, NWidgetScrollbar::GetHorizontalDimension()); size->height = 1 * this->line_height;
break; break;
case WID_AIC_LIST: case WID_AIC_LIST:
this->line_height = FONT_HEIGHT_NORMAL + padding.height; this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
resize->height = this->line_height; resize->height = this->line_height;
size->height = 8 * this->line_height; size->height = 8 * this->line_height;
break; break;
case WID_AIC_CHANGE: {
SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT);
Dimension dim = GetStringBoundingBox(STR_AI_CONFIG_CHANGE);
SetDParam(0, STR_AI_CONFIG_CHANGE_NONE);
dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE));
SetDParam(0, STR_AI_CONFIG_CHANGE_AI);
dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE));
dim.width += padding.width;
dim.height += padding.height;
*size = maxdim(*size, dim);
break;
}
} }
} }
@@ -775,6 +814,8 @@ struct AIConfigWindow : public Window {
*/ */
static bool IsEditable(CompanyID slot) static bool IsEditable(CompanyID slot)
{ {
if (slot == OWNER_DEITY) return _game_mode != GM_NORMAL || Game::GetInstance() != nullptr;
if (_game_mode != GM_NORMAL) { if (_game_mode != GM_NORMAL) {
return slot > 0 && slot <= GetGameSettings().difficulty.max_no_competitors; return slot > 0 && slot <= GetGameSettings().difficulty.max_no_competitors;
} }
@@ -790,8 +831,22 @@ struct AIConfigWindow : public Window {
void DrawWidget(const Rect &r, int widget) const override void DrawWidget(const Rect &r, int widget) const override
{ {
switch (widget) { switch (widget) {
case WID_AIC_GAMELIST: {
StringID text = STR_AI_CONFIG_NONE;
if (GameConfig::GetConfig()->GetInfo() != nullptr) {
SetDParamStr(0, GameConfig::GetConfig()->GetInfo()->GetName());
text = STR_JUST_RAW_STRING;
}
DrawString(r.left + 10, r.right - 10, r.top + WD_MATRIX_TOP, text,
(this->selected_slot == OWNER_DEITY) ? TC_WHITE : (IsEditable(OWNER_DEITY) ? TC_ORANGE : TC_SILVER));
break;
}
case WID_AIC_LIST: { case WID_AIC_LIST: {
Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); int y = r.top;
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < MAX_COMPANIES; i++) { for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < MAX_COMPANIES; i++) {
StringID text; StringID text;
@@ -803,9 +858,9 @@ struct AIConfigWindow : public Window {
} else { } else {
text = STR_AI_CONFIG_RANDOM_AI; text = STR_AI_CONFIG_RANDOM_AI;
} }
DrawString(tr, text, DrawString(r.left + 10, r.right - 10, y + WD_MATRIX_TOP, text,
(this->selected_slot == i) ? TC_WHITE : (IsEditable((CompanyID)i) ? TC_ORANGE : TC_SILVER)); (this->selected_slot == i) ? TC_WHITE : (IsEditable((CompanyID)i) ? TC_ORANGE : TC_SILVER));
tr.top += this->line_height; y += this->line_height;
} }
break; break;
} }
@@ -834,6 +889,13 @@ struct AIConfigWindow : public Window {
break; break;
} }
case WID_AIC_GAMELIST: {
this->selected_slot = OWNER_DEITY;
this->InvalidateData();
if (click_count > 1 && this->selected_slot != INVALID_COMPANY && _game_mode != GM_NORMAL) ShowAIListWindow((CompanyID)this->selected_slot);
break;
}
case WID_AIC_LIST: { // Select a slot case WID_AIC_LIST: { // Select a slot
this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget); this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget);
this->InvalidateData(); this->InvalidateData();
@@ -875,7 +937,7 @@ struct AIConfigWindow : public Window {
if (!_network_available) { if (!_network_available) {
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR); ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
} else { } else {
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI); ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI, CONTENT_TYPE_GAME);
} }
break; break;
} }
@@ -896,10 +958,10 @@ struct AIConfigWindow : public Window {
this->SetWidgetDisabledState(WID_AIC_DECREASE, GetGameSettings().difficulty.max_no_competitors == 0); this->SetWidgetDisabledState(WID_AIC_DECREASE, GetGameSettings().difficulty.max_no_competitors == 0);
this->SetWidgetDisabledState(WID_AIC_INCREASE, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES - 1); this->SetWidgetDisabledState(WID_AIC_INCREASE, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES - 1);
this->SetWidgetDisabledState(WID_AIC_CHANGE, this->selected_slot == INVALID_COMPANY); this->SetWidgetDisabledState(WID_AIC_CHANGE, (this->selected_slot == OWNER_DEITY && _game_mode == GM_NORMAL) || this->selected_slot == INVALID_COMPANY);
this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot)->GetConfigList()->size() == 0); this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot)->GetConfigList()->size() == 0);
this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1))); this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == OWNER_DEITY || this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1)));
this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1))); this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == OWNER_DEITY || this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1)));
for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) { for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) {
this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || (GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot) == nullptr)); this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || (GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot) == nullptr));
@@ -939,6 +1001,9 @@ static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused)
* Window with everything an AI prints via ScriptLog. * Window with everything an AI prints via ScriptLog.
*/ */
struct AIDebugWindow : public Window { struct AIDebugWindow : public Window {
static const int top_offset; ///< Offset of the text at the top of the WID_AID_LOG_PANEL.
static const int bottom_offset; ///< Offset of the text at the bottom of the WID_AID_LOG_PANEL.
static const uint MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string. static const uint MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string.
static CompanyID ai_debug_company; ///< The AI that is (was last) being debugged. static CompanyID ai_debug_company; ///< The AI that is (was last) being debugged.
@@ -1042,8 +1107,8 @@ struct AIDebugWindow : public Window {
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
{ {
if (widget == WID_AID_LOG_PANEL) { if (widget == WID_AID_LOG_PANEL) {
resize->height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; resize->height = FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
size->height = 14 * resize->height + WidgetDimensions::scaled.framerect.Vertical(); size->height = 14 * resize->height + this->top_offset + this->bottom_offset;
} }
} }
@@ -1157,8 +1222,7 @@ struct AIDebugWindow : public Window {
ScriptLog::LogData *log = this->GetLogPointer(); ScriptLog::LogData *log = this->GetLogPointer();
if (log == nullptr) return; if (log == nullptr) return;
Rect br = r.Shrink(WidgetDimensions::scaled.bevel); int y = this->top_offset;
Rect tr = r.Shrink(WidgetDimensions::scaled.framerect);
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) { for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) {
int pos = (i + log->pos + 1 - log->used + log->count) % log->count; int pos = (i + log->pos + 1 - log->used + log->count) % log->count;
if (log->lines[pos] == nullptr) break; if (log->lines[pos] == nullptr) break;
@@ -1175,12 +1239,12 @@ struct AIDebugWindow : public Window {
/* Check if the current line should be highlighted */ /* Check if the current line should be highlighted */
if (pos == this->highlight_row) { if (pos == this->highlight_row) {
GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK); GfxFillRect(r.left + 1, r.top + y, r.right - 1, r.top + y + this->resize.step_height - WD_PAR_VSEP_NORMAL, PC_BLACK);
if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white. if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white.
} }
DrawString(tr, log->lines[pos], colour, SA_LEFT | SA_FORCE); DrawString(r.left + 7, r.right - 7, r.top + y, log->lines[pos], colour, SA_LEFT | SA_FORCE);
tr.top += this->resize.step_height; y += this->resize.step_height;
} }
break; break;
} }
@@ -1226,8 +1290,8 @@ struct AIDebugWindow : public Window {
case WID_AID_RELOAD_TOGGLE: case WID_AID_RELOAD_TOGGLE:
if (ai_debug_company == OWNER_DEITY) break; if (ai_debug_company == OWNER_DEITY) break;
/* First kill the company of the AI, then start a new one. This should start the current AI again */ /* First kill the company of the AI, then start a new one. This should start the current AI again */
Command<CMD_COMPANY_CTRL>::Post(CCA_DELETE, ai_debug_company, CRR_MANUAL, INVALID_CLIENT_ID); DoCommandP(0, CCA_DELETE | ai_debug_company << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL);
Command<CMD_COMPANY_CTRL>::Post(CCA_NEW_AI, ai_debug_company, CRR_NONE, INVALID_CLIENT_ID); DoCommandP(0, CCA_NEW_AI | ai_debug_company << 16, 0, CMD_COMPANY_CTRL);
break; break;
case WID_AID_SETTINGS: case WID_AID_SETTINGS:
@@ -1266,7 +1330,7 @@ struct AIDebugWindow : public Window {
} }
if (all_unpaused) { if (all_unpaused) {
/* All scripts have been unpaused => unpause the game. */ /* All scripts have been unpaused => unpause the game. */
Command<CMD_PAUSE>::Post(PM_PAUSED_NORMAL, false); DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE);
} }
} }
} }
@@ -1315,7 +1379,7 @@ struct AIDebugWindow : public Window {
/* Pause the game. */ /* Pause the game. */
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) { if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) {
Command<CMD_PAUSE>::Post(PM_PAUSED_NORMAL, true); DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
} }
/* Highlight row that matched */ /* Highlight row that matched */
@@ -1352,12 +1416,14 @@ struct AIDebugWindow : public Window {
void OnResize() override void OnResize() override
{ {
this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL, WidgetDimensions::scaled.framerect.Vertical()); this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL);
} }
static HotkeyList hotkeys; static HotkeyList hotkeys;
}; };
const int AIDebugWindow::top_offset = WD_FRAMERECT_TOP + 2;
const int AIDebugWindow::bottom_offset = WD_FRAMERECT_BOTTOM;
CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY; CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY;
char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = ""; char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = "";
bool AIDebugWindow::break_check_enabled = true; bool AIDebugWindow::break_check_enabled = true;

View File

@@ -12,10 +12,8 @@
#include "../company_type.h" #include "../company_type.h"
void ShowAIListWindow(CompanyID slot);
Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY); Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
void ShowAIConfigWindow(); void ShowAIConfigWindow();
void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot);
void ShowAIDebugWindowIfAIError(); void ShowAIDebugWindowIfAIError();
void InitializeAIGui(); void InitializeAIGui();

View File

@@ -25,7 +25,7 @@
*/ */
static bool CheckAPIVersion(const char *api_version) static bool CheckAPIVersion(const char *api_version)
{ {
static const std::set<std::string> versions = { "0.7", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "12", "13" }; static const std::set<std::string> versions = { "0.7", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "12" };
return versions.find(api_version) != versions.end(); return versions.find(api_version) != versions.end();
} }

View File

@@ -18,7 +18,6 @@
#include "ai.hpp" #include "ai.hpp"
#include "../script/script_storage.hpp" #include "../script/script_storage.hpp"
#include "../script/script_cmd.h"
#include "ai_info.hpp" #include "ai_info.hpp"
#include "ai_instance.hpp" #include "ai_instance.hpp"
@@ -93,13 +92,13 @@ ScriptInfo *AIInstance::FindLibrary(const char *library, int version)
/** /**
* DoCommand callback function for all commands executed by AIs. * DoCommand callback function for all commands executed by AIs.
* @param cmd cmd as given to DoCommandPInternal.
* @param result The result of the command. * @param result The result of the command.
* @param tile The tile on which the command was executed. * @param tile The tile on which the command was executed.
* @param data Command data as given to Command<>::Post. * @param p1 p1 as given to DoCommandPInternal.
* @param result_data Additional returned data from the command. * @param p2 p2 as given to DoCommandPInternal.
* @param cmd cmd as given to DoCommandPInternal.
*/ */
void CcAI(Commands cmd, const CommandCost &result, TileIndex tile, const CommandDataBuffer &data, CommandDataBuffer result_data) void CcAI(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
{ {
/* /*
* The company might not exist anymore. Check for this. * The company might not exist anymore. Check for this.
@@ -110,12 +109,12 @@ void CcAI(Commands cmd, const CommandCost &result, TileIndex tile, const Command
const Company *c = Company::GetIfValid(_current_company); const Company *c = Company::GetIfValid(_current_company);
if (c == nullptr || c->ai_instance == nullptr) return; if (c == nullptr || c->ai_instance == nullptr) return;
if (c->ai_instance->DoCommandCallback(result, tile, data, std::move(result_data), cmd)) { if (c->ai_instance->DoCommandCallback(result, tile, p1, p2, cmd)) {
c->ai_instance->Continue(); c->ai_instance->Continue();
} }
} }
CommandCallbackData *AIInstance::GetDoCommandCallback() CommandCallback *AIInstance::GetDoCommandCallback()
{ {
return &CcAI; return &CcAI;
} }

View File

@@ -29,7 +29,7 @@ public:
private: private:
void RegisterAPI() override; void RegisterAPI() override;
void Died() override; void Died() override;
CommandCallbackData *GetDoCommandCallback() override; CommandCallback *GetDoCommandCallback() override;
void LoadDummyScript() override; void LoadDummyScript() override;
}; };

View File

@@ -91,7 +91,7 @@ struct Aircraft FINAL : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
void MarkDirty(); void MarkDirty();
void UpdateDeltaXY(); void UpdateDeltaXY();
ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_AIRCRAFT_REVENUE : EXPENSES_AIRCRAFT_RUN; } ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_AIRCRAFT_INC : EXPENSES_AIRCRAFT_RUN; }
bool IsPrimaryVehicle() const { return this->IsNormalAircraft(); } bool IsPrimaryVehicle() const { return this->IsNormalAircraft(); }
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const;
int GetDisplaySpeed() const { return this->cur_speed; } int GetDisplaySpeed() const { return this->cur_speed; }

View File

@@ -37,8 +37,6 @@
#include "disaster_vehicle.h" #include "disaster_vehicle.h"
#include "newgrf_airporttiles.h" #include "newgrf_airporttiles.h"
#include "framerate_type.h" #include "framerate_type.h"
#include "aircraft_cmd.h"
#include "vehicle_cmd.h"
#include "table/strings.h" #include "table/strings.h"
@@ -190,7 +188,7 @@ void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteS
const Aircraft *w = v->Next()->Next(); const Aircraft *w = v->Next()->Next();
if (is_custom_sprite(v->spritenum)) { if (is_custom_sprite(v->spritenum)) {
GetCustomRotorSprite(v, image_type, result); GetCustomRotorSprite(v, false, image_type, result);
if (result->IsValid()) return; if (result->IsValid()) return;
} }
@@ -231,7 +229,7 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en
VehicleSpriteSeq rotor_seq; VehicleSpriteSeq rotor_seq;
GetCustomRotorIcon(engine, image_type, &rotor_seq); GetCustomRotorIcon(engine, image_type, &rotor_seq);
if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED); if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED);
rotor_seq.Draw(preferred_x, y - ScaleSpriteTrad(5), PAL_NONE, false); rotor_seq.Draw(preferred_x, y - ScaleGUITrad(5), PAL_NONE, false);
} }
} }
@@ -252,21 +250,22 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoff
Rect rect; Rect rect;
seq.GetBounds(&rect); seq.GetBounds(&rect);
width = UnScaleGUI(rect.Width()); width = UnScaleGUI(rect.right - rect.left + 1);
height = UnScaleGUI(rect.Height()); height = UnScaleGUI(rect.bottom - rect.top + 1);
xoffs = UnScaleGUI(rect.left); xoffs = UnScaleGUI(rect.left);
yoffs = UnScaleGUI(rect.top); yoffs = UnScaleGUI(rect.top);
} }
/** /**
* Build an aircraft. * Build an aircraft.
* @param flags type of operation.
* @param tile tile of the depot where aircraft is built. * @param tile tile of the depot where aircraft is built.
* @param flags type of operation.
* @param e the engine to build. * @param e the engine to build.
* @param data unused.
* @param[out] ret the vehicle that has been built. * @param[out] ret the vehicle that has been built.
* @return the cost of this operation or an error. * @return the cost of this operation or an error.
*/ */
CommandCost CmdBuildAircraft(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret) CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *e, uint16 data, Vehicle **ret)
{ {
const AircraftVehicleInfo *avi = &e->u.air; const AircraftVehicleInfo *avi = &e->u.air;
const Station *st = Station::GetByTile(tile); const Station *st = Station::GetByTile(tile);
@@ -328,6 +327,8 @@ CommandCost CmdBuildAircraft(DoCommandFlag flags, TileIndex tile, const Engine *
v->reliability_spd_dec = e->reliability_spd_dec; v->reliability_spd_dec = e->reliability_spd_dec;
v->max_age = e->GetLifeLengthInDays(); v->max_age = e->GetLifeLengthInDays();
_new_vehicle_id = v->index;
v->pos = GetVehiclePosOnBuild(tile); v->pos = GetVehiclePosOnBuild(tile);
v->state = HANGAR; v->state = HANGAR;
@@ -1273,7 +1274,7 @@ void HandleMissingAircraftOrders(Aircraft *v)
const Station *st = GetTargetAirportIfValid(v); const Station *st = GetTargetAirportIfValid(v);
if (st == nullptr) { if (st == nullptr) {
Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE); Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE);
CommandCost ret = Command<CMD_SEND_VEHICLE_TO_DEPOT>::Do(DC_EXEC, v->index, DepotCommand::None, {}); CommandCost ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_VEHICLE_TO_DEPOT);
cur_company.Restore(); cur_company.Restore();
if (ret.Failed()) CrashAirplane(v); if (ret.Failed()) CrashAirplane(v);
@@ -1340,12 +1341,7 @@ static void CrashAirplane(Aircraft *v)
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
NewsType newstype = NT_ACCIDENT; AddTileNewsItem(newsitem, NT_ACCIDENT, vt, nullptr, st != nullptr ? st->index : INVALID_STATION);
if (v->owner != _local_company) {
newstype = NT_ACCIDENT_OTHER;
}
AddTileNewsItem(newsitem, newstype, vt, nullptr, st != nullptr ? st->index : INVALID_STATION);
ModifyStationRatingAround(vt, v->owner, -160, 30); ModifyStationRatingAround(vt, v->owner, -160, 30);
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v); if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
@@ -1636,7 +1632,7 @@ static void AircraftEventHandler_HeliTakeOff(Aircraft *v, const AirportFTAClass
/* Send the helicopter to a hangar if needed for replacement */ /* Send the helicopter to a hangar if needed for replacement */
if (v->NeedsAutomaticServicing()) { if (v->NeedsAutomaticServicing()) {
Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE); Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE);
Command<CMD_SEND_VEHICLE_TO_DEPOT>::Do(DC_EXEC, v->index, DepotCommand::Service | DepotCommand::LocateHangar, {}); DoCommand(v->tile, v->index | DEPOT_SERVICE | DEPOT_LOCATE_HANGAR, 0, DC_EXEC, CMD_SEND_VEHICLE_TO_DEPOT);
cur_company.Restore(); cur_company.Restore();
} }
} }
@@ -1687,7 +1683,7 @@ static void AircraftEventHandler_Landing(Aircraft *v, const AirportFTAClass *apc
/* check if the aircraft needs to be replaced or renewed and send it to a hangar if needed */ /* check if the aircraft needs to be replaced or renewed and send it to a hangar if needed */
if (v->NeedsAutomaticServicing()) { if (v->NeedsAutomaticServicing()) {
Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE); Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE);
Command<CMD_SEND_VEHICLE_TO_DEPOT>::Do(DC_EXEC, v->index, DepotCommand::Service, {}); DoCommand(v->tile, v->index | DEPOT_SERVICE, 0, DC_EXEC, CMD_SEND_VEHICLE_TO_DEPOT);
cur_company.Restore(); cur_company.Restore();
} }
} }

View File

@@ -1,19 +0,0 @@
/*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file aircraft_cmd.h Command definitions related to aircraft. */
#ifndef AIRCRAFT_CMD_H
#define AIRCRAFT_CMD_H
#include "command_type.h"
#include "engine_type.h"
#include "vehicle_type.h"
CommandCost CmdBuildAircraft(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **v);
#endif /* AIRCRAFT_CMD_H */

View File

@@ -25,58 +25,59 @@
* Draw the details for the given vehicle at the given position * Draw the details for the given vehicle at the given position
* *
* @param v current vehicle * @param v current vehicle
* @param r the Rect to draw within * @param left The left most coordinate to draw
* @param right The right most coordinate to draw
* @param y The y coordinate
*/ */
void DrawAircraftDetails(const Aircraft *v, const Rect &r) void DrawAircraftDetails(const Aircraft *v, int left, int right, int y)
{ {
int y_offset = (v->Next()->cargo_cap != 0) ? -(FONT_HEIGHT_NORMAL + 1): 0;
Money feeder_share = 0; Money feeder_share = 0;
int y = r.top;
for (const Aircraft *u = v; u != nullptr; u = u->Next()) { for (const Aircraft *u = v; u != nullptr; u = u->Next()) {
if (u->IsNormalAircraft()) { if (u->IsNormalAircraft()) {
SetDParam(0, u->engine_type); SetDParam(0, u->engine_type);
SetDParam(1, u->build_year); SetDParam(1, u->build_year);
SetDParam(2, u->value); SetDParam(2, u->value);
DrawString(r.left, r.right, y, STR_VEHICLE_INFO_BUILT_VALUE); DrawString(left, right, y, STR_VEHICLE_INFO_BUILT_VALUE);
y += FONT_HEIGHT_NORMAL;
SetDParam(0, u->cargo_type); SetDParam(0, u->cargo_type);
SetDParam(1, u->cargo_cap); SetDParam(1, u->cargo_cap);
SetDParam(2, u->Next()->cargo_type); SetDParam(2, u->Next()->cargo_type);
SetDParam(3, u->Next()->cargo_cap); SetDParam(3, u->Next()->cargo_cap);
SetDParam(4, GetCargoSubtypeText(u)); SetDParam(4, GetCargoSubtypeText(u));
DrawString(r.left, r.right, y, (u->Next()->cargo_cap != 0) ? STR_VEHICLE_INFO_CAPACITY_CAPACITY : STR_VEHICLE_INFO_CAPACITY); DrawString(left, right, y + FONT_HEIGHT_NORMAL, (u->Next()->cargo_cap != 0) ? STR_VEHICLE_INFO_CAPACITY_CAPACITY : STR_VEHICLE_INFO_CAPACITY);
y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
} }
if (u->cargo_cap != 0) { if (u->cargo_cap != 0) {
uint cargo_count = u->cargo.StoredCount(); uint cargo_count = u->cargo.StoredCount();
y_offset += FONT_HEIGHT_NORMAL + 1;
if (cargo_count != 0) { if (cargo_count != 0) {
/* Cargo names (fix pluralness) */ /* Cargo names (fix pluralness) */
SetDParam(0, u->cargo_type); SetDParam(0, u->cargo_type);
SetDParam(1, cargo_count); SetDParam(1, cargo_count);
SetDParam(2, u->cargo.Source()); SetDParam(2, u->cargo.Source());
DrawString(r.left, r.right, y, STR_VEHICLE_DETAILS_CARGO_FROM); DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, STR_VEHICLE_DETAILS_CARGO_FROM);
y += FONT_HEIGHT_NORMAL;
feeder_share += u->cargo.FeederShare(); feeder_share += u->cargo.FeederShare();
} }
} }
} }
y += WidgetDimensions::scaled.vsep_normal;
SetDParam(0, feeder_share); SetDParam(0, feeder_share);
DrawString(r.left, r.right, y, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); DrawString(left, right, y + 3 * FONT_HEIGHT_NORMAL + 3 + y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);
} }
/** /**
* Draws an image of an aircraft * Draws an image of an aircraft
* @param v Front vehicle * @param v Front vehicle
* @param r Rect to draw at * @param left The minimum horizontal position
* @param right The maximum horizontal position
* @param y Vertical position to draw at
* @param selection Selected vehicle to draw a frame around * @param selection Selected vehicle to draw a frame around
*/ */
void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type) void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type)
{ {
bool rtl = _current_text_dir == TD_RTL; bool rtl = _current_text_dir == TD_RTL;
@@ -86,29 +87,27 @@ void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, Eng
Rect rect; Rect rect;
seq.GetBounds(&rect); seq.GetBounds(&rect);
int width = UnScaleGUI(rect.Width()); int width = UnScaleGUI(rect.right - rect.left + 1);
int x_offs = UnScaleGUI(rect.left); int x_offs = UnScaleGUI(rect.left);
int x = rtl ? r.right - width - x_offs : r.left - x_offs; int x = rtl ? right - width - x_offs : left - x_offs;
/* This magic -1 offset is related to the sprite_y_offsets in build_vehicle_gui.cpp */
int y = ScaleSpriteTrad(-1) + CenterBounds(r.top, r.bottom, 0);
bool helicopter = v->subtype == AIR_HELICOPTER; bool helicopter = v->subtype == AIR_HELICOPTER;
int y_offs = ScaleGUITrad(10);
int heli_offs = 0; int heli_offs = 0;
PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
seq.Draw(x, y, pal, (v->vehstatus & VS_CRASHED) != 0); seq.Draw(x, y + y_offs, pal, (v->vehstatus & VS_CRASHED) != 0);
if (helicopter) { if (helicopter) {
const Aircraft *a = Aircraft::From(v); const Aircraft *a = Aircraft::From(v);
VehicleSpriteSeq rotor_seq; VehicleSpriteSeq rotor_seq;
GetCustomRotorSprite(a, image_type, &rotor_seq); GetCustomRotorSprite(a, true, image_type, &rotor_seq);
if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED); if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED);
heli_offs = ScaleSpriteTrad(5); heli_offs = ScaleGUITrad(5);
rotor_seq.Draw(x, y - heli_offs, PAL_NONE, false); rotor_seq.Draw(x, y + y_offs - heli_offs, PAL_NONE, false);
} }
if (v->index == selection) { if (v->index == selection) {
x += x_offs; x += x_offs;
y += UnScaleGUI(rect.top) - heli_offs; y += UnScaleGUI(rect.top) + y_offs - heli_offs;
Rect hr = {x, y, x + width - 1, y + UnScaleGUI(rect.Height()) + heli_offs - 1}; DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY);
DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY);
} }
} }

View File

@@ -1,17 +0,0 @@
/*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file airport_cmd.h Command definitions related to airports. */
#ifndef AIRPORT_CMD_H
#define AIRPORT_CMD_H
#include "command_type.h"
CommandCallback CcBuildAirport;
#endif /* AIRPORT_CMD_H */

View File

@@ -8,7 +8,6 @@
/** @file airport_gui.cpp The GUI for airports. */ /** @file airport_gui.cpp The GUI for airports. */
#include "stdafx.h" #include "stdafx.h"
#include "economy_func.h"
#include "window_gui.h" #include "window_gui.h"
#include "station_gui.h" #include "station_gui.h"
#include "terraform_gui.h" #include "terraform_gui.h"
@@ -27,10 +26,6 @@
#include "hotkeys.h" #include "hotkeys.h"
#include "vehicle_func.h" #include "vehicle_func.h"
#include "gui.h" #include "gui.h"
#include "command_func.h"
#include "airport_cmd.h"
#include "station_cmd.h"
#include "zoom_func.h"
#include "widgets/airport_widget.h" #include "widgets/airport_widget.h"
@@ -45,7 +40,7 @@ static void ShowBuildAirportPicker(Window *parent);
SpriteID GetCustomAirportSprite(const AirportSpec *as, byte layout); SpriteID GetCustomAirportSprite(const AirportSpec *as, byte layout);
void CcBuildAirport(Commands cmd, const CommandCost &result, TileIndex tile) void CcBuildAirport(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
{ {
if (result.Failed()) return; if (result.Failed()) return;
@@ -60,20 +55,13 @@ void CcBuildAirport(Commands cmd, const CommandCost &result, TileIndex tile)
static void PlaceAirport(TileIndex tile) static void PlaceAirport(TileIndex tile)
{ {
if (_selected_airport_index == -1) return; if (_selected_airport_index == -1) return;
uint32 p2 = _ctrl_pressed;
SB(p2, 16, 16, INVALID_STATION); // no station to join
byte airport_type = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex(); uint32 p1 = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex();
byte layout = _selected_airport_layout; p1 |= _selected_airport_layout << 8;
bool adjacent = _ctrl_pressed; CommandContainer cmdcont = { tile, p1, p2, CMD_BUILD_AIRPORT | CMD_MSG(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE), CcBuildAirport, "" };
ShowSelectStationIfNeeded(cmdcont, TileArea(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE));
auto proc = [=](bool test, StationID to_join) -> bool {
if (test) {
return Command<CMD_BUILD_AIRPORT>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_AIRPORT>()), tile, airport_type, layout, INVALID_STATION, adjacent).Succeeded();
} else {
return Command<CMD_BUILD_AIRPORT>::Post(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE, CcBuildAirport, tile, airport_type, layout, to_join, adjacent);
}
};
ShowSelectStationIfNeeded(TileArea(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE), proc);
} }
/** Airport build toolbar window handler. */ /** Airport build toolbar window handler. */
@@ -340,10 +328,10 @@ public:
const AirportSpec *as = AirportSpec::Get(i); const AirportSpec *as = AirportSpec::Get(i);
if (!as->enabled) continue; if (!as->enabled) continue;
size->width = std::max(size->width, GetStringBoundingBox(as->name).width + padding.width); size->width = std::max(size->width, GetStringBoundingBox(as->name).width);
} }
this->line_height = FONT_HEIGHT_NORMAL + padding.height; this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
size->height = 5 * this->line_height; size->height = 5 * this->line_height;
break; break;
} }
@@ -356,8 +344,8 @@ public:
SpriteID sprite = GetCustomAirportSprite(as, layout); SpriteID sprite = GetCustomAirportSprite(as, layout);
if (sprite != 0) { if (sprite != 0) {
Dimension d = GetSpriteSize(sprite); Dimension d = GetSpriteSize(sprite);
d.width += WidgetDimensions::scaled.framerect.Horizontal(); d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
d.height += WidgetDimensions::scaled.framerect.Vertical(); d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
*size = maxdim(d, *size); *size = maxdim(d, *size);
} }
} }
@@ -388,17 +376,15 @@ public:
{ {
switch (widget) { switch (widget) {
case WID_AP_AIRPORT_LIST: { case WID_AP_AIRPORT_LIST: {
Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel); int y = r.top;
Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix);
AirportClass *apclass = AirportClass::Get(_selected_airport_class); AirportClass *apclass = AirportClass::Get(_selected_airport_class);
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) { for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) {
const AirportSpec *as = apclass->GetSpec(i); const AirportSpec *as = apclass->GetSpec(i);
if (!as->IsAvailable()) { if (!as->IsAvailable()) {
GfxFillRect(row, PC_BLACK, FILLRECT_CHECKER); GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->line_height - 2, PC_BLACK, FILLRECT_CHECKER);
} }
DrawString(text, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK);
row = row.Translate(0, this->line_height); y += this->line_height;
text = text.Translate(0, this->line_height);
} }
break; break;
} }
@@ -406,7 +392,7 @@ public:
case WID_AP_AIRPORT_SPRITE: case WID_AP_AIRPORT_SPRITE:
if (this->preview_sprite != 0) { if (this->preview_sprite != 0) {
Dimension d = GetSpriteSize(this->preview_sprite); Dimension d = GetSpriteSize(this->preview_sprite);
DrawSprite(this->preview_sprite, COMPANY_SPRITE_COLOUR(_local_company), CenterBounds(r.left, r.right, d.width), CenterBounds(r.top, r.bottom, d.height)); DrawSprite(this->preview_sprite, COMPANY_SPRITE_COLOUR(_local_company), (r.left + r.right - d.width) / 2, (r.top + r.bottom - d.height) / 2);
} }
break; break;
@@ -427,8 +413,11 @@ public:
{ {
this->DrawWidgets(); this->DrawWidgets();
Rect r = this->GetWidget<NWidgetBase>(WID_AP_ACCEPTANCE)->GetCurrentRect(); uint16 top = this->GetWidget<NWidgetBase>(WID_AP_BTN_DOHILIGHT)->pos_y + this->GetWidget<NWidgetBase>(WID_AP_BTN_DOHILIGHT)->current_y + WD_PAR_VSEP_NORMAL;
int top = r.top + WidgetDimensions::scaled.vsep_normal; NWidgetBase *panel_nwi = this->GetWidget<NWidgetBase>(WID_AP_BOTTOMPANEL);
int right = panel_nwi->pos_x + panel_nwi->current_x;
int bottom = panel_nwi->pos_y + panel_nwi->current_y;
if (_selected_airport_index != -1) { if (_selected_airport_index != -1) {
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index); const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
@@ -438,27 +427,20 @@ public:
if (_settings_game.economy.station_noise_level) { if (_settings_game.economy.station_noise_level) {
/* show the noise of the selected airport */ /* show the noise of the selected airport */
SetDParam(0, as->noise_level); SetDParam(0, as->noise_level);
DrawString(r.left, r.right, top, STR_STATION_BUILD_NOISE); DrawString(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_STATION_BUILD_NOISE);
top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; top += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
}
if (_settings_game.economy.infrastructure_maintenance) {
Money monthly = _price[PR_INFRASTRUCTURE_AIRPORT] * as->maintenance_cost >> 3;
SetDParam(0, monthly * 12);
DrawString(r.left, r.right, top, STR_STATION_BUILD_INFRASTRUCTURE_COST);
top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
} }
/* strings such as 'Size' and 'Coverage Area' */ /* strings such as 'Size' and 'Coverage Area' */
top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + WidgetDimensions::scaled.vsep_normal; top = DrawStationCoverageAreaText(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL;
top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + WidgetDimensions::scaled.vsep_normal; top = DrawStationCoverageAreaText(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL;
} }
/* Resize background if the window is too small. /* Resize background if the window is too small.
* Never make the window smaller to avoid oscillating if the size change affects the acceptance. * Never make the window smaller to avoid oscillating if the size change affects the acceptance.
* (This is the case, if making the window bigger moves the mouse into the window.) */ * (This is the case, if making the window bigger moves the mouse into the window.) */
if (top > r.bottom) { if (top > bottom) {
ResizeWindow(this, 0, top - r.bottom, false); ResizeWindow(this, 0, top - bottom, false);
} }
} }
@@ -604,8 +586,8 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0), NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0),
EndContainer(), EndContainer(),
/* Bottom panel. */ /* Bottom panel. */
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), SetPIP(2, 2, 2),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0), NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
@@ -616,7 +598,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
EndContainer(), EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0), NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
EndContainer(), EndContainer(),
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_ACCEPTANCE), SetPadding(WidgetDimensions::unscaled.framerect), SetResize(0, 1), SetFill(1, 0), NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), SetFill(1, 0),
EndContainer(), EndContainer(),
}; };

View File

@@ -22,11 +22,6 @@
#include "ai/ai.hpp" #include "ai/ai.hpp"
#include "news_func.h" #include "news_func.h"
#include "strings_func.h" #include "strings_func.h"
#include "autoreplace_cmd.h"
#include "group_cmd.h"
#include "order_cmd.h"
#include "train_cmd.h"
#include "vehicle_cmd.h"
#include "table/strings.h" #include "table/strings.h"
@@ -211,7 +206,7 @@ static int GetIncompatibleRefitOrderIdForAutoreplace(const Vehicle *v, EngineID
const Order *o; const Order *o;
const Vehicle *u = (v->type == VEH_TRAIN) ? v->First() : v; const Vehicle *u = (v->type == VEH_TRAIN) ? v->First() : v;
const OrderList *orders = u->orders; const OrderList *orders = u->orders.list;
if (orders == nullptr) return -1; if (orders == nullptr) return -1;
for (VehicleOrderID i = 0; i < orders->GetNumOrders(); i++) { for (VehicleOrderID i = 0; i < orders->GetNumOrders(); i++) {
o = orders->GetOrderAt(i); o = orders->GetOrderAt(i);
@@ -345,24 +340,23 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
} }
/* Build the new vehicle */ /* Build the new vehicle */
VehicleID new_veh_id; cost = DoCommand(old_veh->tile, e | (CT_INVALID << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
std::tie(cost, new_veh_id, std::ignore, std::ignore) = Command<CMD_BUILD_VEHICLE>::Do(DC_EXEC | DC_AUTOREPLACE, old_veh->tile, e, true, CT_INVALID, INVALID_CLIENT_ID);
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
Vehicle *new_veh = Vehicle::Get(new_veh_id); Vehicle *new_veh = Vehicle::Get(_new_vehicle_id);
*new_vehicle = new_veh; *new_vehicle = new_veh;
/* Refit the vehicle if needed */ /* Refit the vehicle if needed */
if (refit_cargo != CT_NO_REFIT) { if (refit_cargo != CT_NO_REFIT) {
byte subtype = GetBestFittingSubType(old_veh, new_veh, refit_cargo); byte subtype = GetBestFittingSubType(old_veh, new_veh, refit_cargo);
cost.AddCost(std::get<0>(Command<CMD_REFIT_VEHICLE>::Do(DC_EXEC, new_veh->index, refit_cargo, subtype, false, false, 0))); cost.AddCost(DoCommand(0, new_veh->index, refit_cargo | (subtype << 8), DC_EXEC, GetCmdRefitVeh(new_veh)));
assert(cost.Succeeded()); // This should be ensured by GetNewCargoTypeForReplace() assert(cost.Succeeded()); // This should be ensured by GetNewCargoTypeForReplace()
} }
/* Try to reverse the vehicle, but do not care if it fails as the new type might not be reversible */ /* Try to reverse the vehicle, but do not care if it fails as the new type might not be reversible */
if (new_veh->type == VEH_TRAIN && HasBit(Train::From(old_veh)->flags, VRF_REVERSE_DIRECTION)) { if (new_veh->type == VEH_TRAIN && HasBit(Train::From(old_veh)->flags, VRF_REVERSE_DIRECTION)) {
Command<CMD_REVERSE_TRAIN_DIRECTION>::Do(DC_EXEC, new_veh->index, true); DoCommand(0, new_veh->index, true, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION);
} }
return cost; return cost;
@@ -374,9 +368,9 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
* @param evaluate_callback shall the start/stop callback be evaluated? * @param evaluate_callback shall the start/stop callback be evaluated?
* @return success or error * @return success or error
*/ */
static inline CommandCost DoCmdStartStopVehicle(const Vehicle *v, bool evaluate_callback) static inline CommandCost CmdStartStopVehicle(const Vehicle *v, bool evaluate_callback)
{ {
return Command<CMD_START_STOP_VEHICLE>::Do(DC_EXEC | DC_AUTOREPLACE, v->index, evaluate_callback); return DoCommand(0, v->index, evaluate_callback ? 1 : 0, DC_EXEC | DC_AUTOREPLACE, CMD_START_STOP_VEHICLE);
} }
/** /**
@@ -389,7 +383,7 @@ static inline CommandCost DoCmdStartStopVehicle(const Vehicle *v, bool evaluate_
*/ */
static inline CommandCost CmdMoveVehicle(const Vehicle *v, const Vehicle *after, DoCommandFlag flags, bool whole_chain) static inline CommandCost CmdMoveVehicle(const Vehicle *v, const Vehicle *after, DoCommandFlag flags, bool whole_chain)
{ {
return Command<CMD_MOVE_RAIL_VEHICLE>::Do(flags | DC_NO_CARGO_CAP_CHECK, v->index, after != nullptr ? after->index : INVALID_VEHICLE, whole_chain); return DoCommand(0, v->index | (whole_chain ? 1 : 0) << 20, after != nullptr ? after->index : INVALID_VEHICLE, flags | DC_NO_CARGO_CAP_CHECK, CMD_MOVE_RAIL_VEHICLE);
} }
/** /**
@@ -403,19 +397,19 @@ static CommandCost CopyHeadSpecificThings(Vehicle *old_head, Vehicle *new_head,
CommandCost cost = CommandCost(); CommandCost cost = CommandCost();
/* Share orders */ /* Share orders */
if (cost.Succeeded() && old_head != new_head) cost.AddCost(Command<CMD_CLONE_ORDER>::Do(DC_EXEC, CO_SHARE, new_head->index, old_head->index)); if (cost.Succeeded() && old_head != new_head) cost.AddCost(DoCommand(0, new_head->index | CO_SHARE << 30, old_head->index, DC_EXEC, CMD_CLONE_ORDER));
/* Copy group membership */ /* Copy group membership */
if (cost.Succeeded() && old_head != new_head) cost.AddCost(std::get<0>(Command<CMD_ADD_VEHICLE_GROUP>::Do(DC_EXEC, old_head->group_id, new_head->index, false))); if (cost.Succeeded() && old_head != new_head) cost.AddCost(DoCommand(0, old_head->group_id, new_head->index, DC_EXEC, CMD_ADD_VEHICLE_GROUP));
/* Perform start/stop check whether the new vehicle suits newgrf restrictions etc. */ /* Perform start/stop check whether the new vehicle suits newgrf restrictions etc. */
if (cost.Succeeded()) { if (cost.Succeeded()) {
/* Start the vehicle, might be denied by certain things */ /* Start the vehicle, might be denied by certain things */
assert((new_head->vehstatus & VS_STOPPED) != 0); assert((new_head->vehstatus & VS_STOPPED) != 0);
cost.AddCost(DoCmdStartStopVehicle(new_head, true)); cost.AddCost(CmdStartStopVehicle(new_head, true));
/* Stop the vehicle again, but do not care about evil newgrfs allowing starting but not stopping :p */ /* Stop the vehicle again, but do not care about evil newgrfs allowing starting but not stopping :p */
if (cost.Succeeded()) cost.AddCost(DoCmdStartStopVehicle(new_head, false)); if (cost.Succeeded()) cost.AddCost(CmdStartStopVehicle(new_head, false));
} }
/* Last do those things which do never fail (resp. we do not care about), but which are not undo-able */ /* Last do those things which do never fail (resp. we do not care about), but which are not undo-able */
@@ -472,11 +466,11 @@ static CommandCost ReplaceFreeUnit(Vehicle **single_unit, DoCommandFlag flags, b
} }
/* Sell the old vehicle */ /* Sell the old vehicle */
cost.AddCost(Command<CMD_SELL_VEHICLE>::Do(flags, old_v->index, false, false, INVALID_CLIENT_ID)); cost.AddCost(DoCommand(0, old_v->index, 0, flags, GetCmdSellVeh(old_v)));
/* If we are not in DC_EXEC undo everything */ /* If we are not in DC_EXEC undo everything */
if ((flags & DC_EXEC) == 0) { if ((flags & DC_EXEC) == 0) {
Command<CMD_SELL_VEHICLE>::Do(DC_EXEC, new_v->index, false, false, INVALID_CLIENT_ID); DoCommand(0, new_v->index, 0, DC_EXEC, GetCmdSellVeh(new_v));
} }
} }
@@ -603,7 +597,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
assert(RailVehInfo(wagon->engine_type)->railveh_type == RAILVEH_WAGON); assert(RailVehInfo(wagon->engine_type)->railveh_type == RAILVEH_WAGON);
/* Sell wagon */ /* Sell wagon */
[[maybe_unused]] CommandCost ret = Command<CMD_SELL_VEHICLE>::Do(DC_EXEC, wagon->index, false, false, INVALID_CLIENT_ID); [[maybe_unused]] CommandCost ret = DoCommand(0, wagon->index, 0, DC_EXEC, GetCmdSellVeh(wagon));
assert(ret.Succeeded()); assert(ret.Succeeded());
new_vehs[i] = nullptr; new_vehs[i] = nullptr;
@@ -635,7 +629,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
/* Sell the vehicle. /* Sell the vehicle.
* Note: This might temporarily construct new trains, so use DC_AUTOREPLACE to prevent * Note: This might temporarily construct new trains, so use DC_AUTOREPLACE to prevent
* it from failing due to engine limits. */ * it from failing due to engine limits. */
cost.AddCost(Command<CMD_SELL_VEHICLE>::Do(flags | DC_AUTOREPLACE, w->index, false, false, INVALID_CLIENT_ID)); cost.AddCost(DoCommand(0, w->index, 0, flags | DC_AUTOREPLACE, GetCmdSellVeh(w)));
if ((flags & DC_EXEC) != 0) { if ((flags & DC_EXEC) != 0) {
old_vehs[i] = nullptr; old_vehs[i] = nullptr;
if (i == 0) old_head = nullptr; if (i == 0) old_head = nullptr;
@@ -666,7 +660,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
if ((flags & DC_EXEC) == 0) { if ((flags & DC_EXEC) == 0) {
for (int i = num_units - 1; i >= 0; i--) { for (int i = num_units - 1; i >= 0; i--) {
if (new_vehs[i] != nullptr) { if (new_vehs[i] != nullptr) {
Command<CMD_SELL_VEHICLE>::Do(DC_EXEC, new_vehs[i]->index, false, false, INVALID_CLIENT_ID); DoCommand(0, new_vehs[i]->index, 0, DC_EXEC, GetCmdSellVeh(new_vehs[i]));
new_vehs[i] = nullptr; new_vehs[i] = nullptr;
} }
} }
@@ -697,12 +691,12 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
} }
/* Sell the old vehicle */ /* Sell the old vehicle */
cost.AddCost(Command<CMD_SELL_VEHICLE>::Do(flags, old_head->index, false, false, INVALID_CLIENT_ID)); cost.AddCost(DoCommand(0, old_head->index, 0, flags, GetCmdSellVeh(old_head)));
} }
/* If we are not in DC_EXEC undo everything */ /* If we are not in DC_EXEC undo everything */
if ((flags & DC_EXEC) == 0) { if ((flags & DC_EXEC) == 0) {
Command<CMD_SELL_VEHICLE>::Do(DC_EXEC, new_head->index, false, false, INVALID_CLIENT_ID); DoCommand(0, new_head->index, 0, DC_EXEC, GetCmdSellVeh(new_head));
} }
} }
} }
@@ -713,18 +707,22 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
/** /**
* Autoreplaces a vehicle * Autoreplaces a vehicle
* Trains are replaced as a whole chain, free wagons in depot are replaced on their own * Trains are replaced as a whole chain, free wagons in depot are replaced on their own
* @param tile not used
* @param flags type of operation * @param flags type of operation
* @param veh_id Index of vehicle * @param p1 Index of vehicle
* @param p2 not used
* @param text unused
* @return the cost of this operation or an error * @return the cost of this operation or an error
*/ */
CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id) CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const std::string &text)
{ {
Vehicle *v = Vehicle::GetIfValid(veh_id); Vehicle *v = Vehicle::GetIfValid(p1);
if (v == nullptr) return CMD_ERROR; if (v == nullptr) return CMD_ERROR;
CommandCost ret = CheckOwnership(v->owner); CommandCost ret = CheckOwnership(v->owner);
if (ret.Failed()) return ret; if (ret.Failed()) return ret;
if (!v->IsChainInDepot()) return CMD_ERROR;
if (v->vehstatus & VS_CRASHED) return CMD_ERROR; if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
bool free_wagon = false; bool free_wagon = false;
@@ -736,7 +734,6 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
} else { } else {
if (!v->IsPrimaryVehicle()) return CMD_ERROR; if (!v->IsPrimaryVehicle()) return CMD_ERROR;
} }
if (!v->IsChainInDepot()) return CMD_ERROR;
const Company *c = Company::Get(_current_company); const Company *c = Company::Get(_current_company);
bool wagon_removal = c->settings.renew_keep_length; bool wagon_removal = c->settings.renew_keep_length;
@@ -762,7 +759,7 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
bool was_stopped = free_wagon || ((v->vehstatus & VS_STOPPED) != 0); bool was_stopped = free_wagon || ((v->vehstatus & VS_STOPPED) != 0);
/* Stop the vehicle */ /* Stop the vehicle */
if (!was_stopped) cost.AddCost(DoCmdStartStopVehicle(v, true)); if (!was_stopped) cost.AddCost(CmdStartStopVehicle(v, true));
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
assert(free_wagon || v->IsStoppedInDepot()); assert(free_wagon || v->IsStoppedInDepot());
@@ -790,7 +787,7 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
} }
/* Restart the vehicle */ /* Restart the vehicle */
if (!was_stopped) cost.AddCost(DoCmdStartStopVehicle(v, false)); if (!was_stopped) cost.AddCost(CmdStartStopVehicle(v, false));
} }
if (cost.Succeeded() && nothing_to_do) cost = CommandCost(STR_ERROR_AUTOREPLACE_NOTHING_TO_DO); if (cost.Succeeded() && nothing_to_do) cost = CommandCost(STR_ERROR_AUTOREPLACE_NOTHING_TO_DO);
@@ -799,29 +796,35 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
/** /**
* Change engine renewal parameters * Change engine renewal parameters
* @param tile unused
* @param flags operation to perform * @param flags operation to perform
* @param id_g engine group * @param p1 packed data
* @param old_engine_type old engine type * - bit 0 = replace when engine gets old?
* @param new_engine_type new engine type * - bits 16-31 = engine group
* @param when_old replace when engine gets old? * @param p2 packed data
* - bits 0-15 = old engine type
* - bits 16-31 = new engine type
* @param text unused
* @return the cost of this operation or an error * @return the cost of this operation or an error
*/ */
CommandCost CmdSetAutoReplace(DoCommandFlag flags, GroupID id_g, EngineID old_engine_type, EngineID new_engine_type, bool when_old) CommandCost CmdSetAutoReplace(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const std::string &text)
{ {
Company *c = Company::GetIfValid(_current_company); Company *c = Company::GetIfValid(_current_company);
if (c == nullptr) return CMD_ERROR; if (c == nullptr) return CMD_ERROR;
EngineID old_engine_type = GB(p2, 0, 16);
EngineID new_engine_type = GB(p2, 16, 16);
GroupID id_g = GB(p1, 16, 16);
CommandCost cost; CommandCost cost;
if (Group::IsValidID(id_g) ? Group::Get(id_g)->owner != _current_company : !IsAllGroupID(id_g) && !IsDefaultGroupID(id_g)) return CMD_ERROR; if (Group::IsValidID(id_g) ? Group::Get(id_g)->owner != _current_company : !IsAllGroupID(id_g) && !IsDefaultGroupID(id_g)) return CMD_ERROR;
if (!Engine::IsValidID(old_engine_type)) return CMD_ERROR; if (!Engine::IsValidID(old_engine_type)) return CMD_ERROR;
if (Group::IsValidID(id_g) && Group::Get(id_g)->vehicle_type != Engine::Get(old_engine_type)->type) return CMD_ERROR;
if (new_engine_type != INVALID_ENGINE) { if (new_engine_type != INVALID_ENGINE) {
if (!Engine::IsValidID(new_engine_type)) return CMD_ERROR; if (!Engine::IsValidID(new_engine_type)) return CMD_ERROR;
if (!CheckAutoreplaceValidity(old_engine_type, new_engine_type, _current_company)) return CMD_ERROR; if (!CheckAutoreplaceValidity(old_engine_type, new_engine_type, _current_company)) return CMD_ERROR;
cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, when_old, flags); cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, HasBit(p1, 0), flags);
} else { } else {
cost = RemoveEngineReplacementForCompany(c, old_engine_type, id_g, flags); cost = RemoveEngineReplacementForCompany(c, old_engine_type, id_g, flags);
} }

View File

@@ -1,24 +0,0 @@
/*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file autoreplace_cmd.h Command definitions related to autoreplace. */
#ifndef AUTOREPLACE_CMD_H
#define AUTOREPLACE_CMD_H
#include "command_type.h"
#include "vehicle_type.h"
#include "engine_type.h"
#include "group_type.h"
CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id);
CommandCost CmdSetAutoReplace(DoCommandFlag flags, GroupID id_g, EngineID old_engine_type, EngineID new_engine_type, bool when_old);
DEF_CMD_TRAIT(CMD_AUTOREPLACE_VEHICLE, CmdAutoreplaceVehicle, 0, CMDT_VEHICLE_MANAGEMENT)
DEF_CMD_TRAIT(CMD_SET_AUTOREPLACE, CmdSetAutoReplace, 0, CMDT_VEHICLE_MANAGEMENT)
#endif /* AUTOREPLACE_CMD_H */

View File

@@ -25,15 +25,12 @@
#include "rail_gui.h" #include "rail_gui.h"
#include "road_gui.h" #include "road_gui.h"
#include "widgets/dropdown_func.h" #include "widgets/dropdown_func.h"
#include "autoreplace_cmd.h"
#include "group_cmd.h"
#include "settings_cmd.h"
#include "widgets/autoreplace_widget.h" #include "widgets/autoreplace_widget.h"
#include "safeguards.h" #include "safeguards.h"
void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group); void DrawEngineList(VehicleType type, int x, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group);
static bool EngineNumberSorter(const EngineID &a, const EngineID &b) static bool EngineNumberSorter(const EngineID &a, const EngineID &b)
{ {
@@ -220,7 +217,7 @@ class ReplaceVehicleWindow : public Window {
{ {
EngineID veh_from = this->sel_engine[0]; EngineID veh_from = this->sel_engine[0];
EngineID veh_to = this->sel_engine[1]; EngineID veh_to = this->sel_engine[1];
Command<CMD_SET_AUTOREPLACE>::Post(this->sel_group, veh_from, veh_to, replace_when_old); DoCommandP(0, (replace_when_old ? 1 : 0) | (this->sel_group << 16), veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
} }
public: public:
@@ -304,8 +301,8 @@ public:
case WID_RV_INFO_TAB: { case WID_RV_INFO_TAB: {
Dimension d = GetStringBoundingBox(STR_REPLACE_NOT_REPLACING); Dimension d = GetStringBoundingBox(STR_REPLACE_NOT_REPLACING);
d = maxdim(d, GetStringBoundingBox(STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED)); d = maxdim(d, GetStringBoundingBox(STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED));
d.width += padding.width; d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT;
d.height += padding.height; d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
*size = maxdim(*size, d); *size = maxdim(*size, d);
break; break;
} }
@@ -422,7 +419,7 @@ public:
str = STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED; str = STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED;
} }
DrawString(r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect), str, TC_BLACK, SA_HOR_CENTER); DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, str, TC_BLACK, SA_HOR_CENTER);
break; break;
} }
@@ -433,7 +430,8 @@ public:
EngineID end = static_cast<EngineID>(std::min<size_t>(this->vscroll[side]->GetCapacity() + start, this->engines[side].size())); EngineID end = static_cast<EngineID>(std::min<size_t>(this->vscroll[side]->GetCapacity() + start, this->engines[side].size()));
/* Do the actual drawing */ /* Do the actual drawing */
DrawEngineList((VehicleType)this->window_number, r, &this->engines[side], start, end, this->sel_engine[side], side == 0, this->sel_group); DrawEngineList((VehicleType)this->window_number, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP,
&this->engines[side], start, end, this->sel_engine[side], side == 0, this->sel_group);
break; break;
} }
} }
@@ -484,10 +482,10 @@ public:
ted.cargo = e->GetDefaultCargoType(); ted.cargo = e->GetDefaultCargoType();
ted.capacity = e->GetDisplayDefaultCapacity(&ted.mail_capacity); ted.capacity = e->GetDisplayDefaultCapacity(&ted.mail_capacity);
const Rect r = this->GetWidget<NWidgetBase>(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS)->GetCurrentRect() NWidgetBase *nwi = this->GetWidget<NWidgetBase>(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS);
.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); int text_end = DrawVehiclePurchaseInfo(nwi->pos_x + WD_FRAMETEXT_LEFT, nwi->pos_x + nwi->current_x - WD_FRAMETEXT_RIGHT,
int text_end = DrawVehiclePurchaseInfo(r.left, r.right, r.top, this->sel_engine[side], ted); nwi->pos_y + WD_FRAMERECT_TOP, this->sel_engine[side], ted);
needed_height = std::max(needed_height, (text_end - r.top) / FONT_HEIGHT_NORMAL); needed_height = std::max(needed_height, (text_end - (int)nwi->pos_y - WD_FRAMERECT_TOP) / FONT_HEIGHT_NORMAL);
} }
} }
if (needed_height != this->details_height) { // Details window are not high enough, enlarge them. if (needed_height != this->details_height) { // Details window are not high enough, enlarge them.
@@ -543,10 +541,10 @@ public:
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: { case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: {
const Group *g = Group::GetIfValid(this->sel_group); const Group *g = Group::GetIfValid(this->sel_group);
if (g != nullptr) { if (g != nullptr) {
Command<CMD_SET_GROUP_FLAG>::Post(this->sel_group, GroupFlags::GF_REPLACE_WAGON_REMOVAL, !HasBit(g->flags, GroupFlags::GF_REPLACE_WAGON_REMOVAL), _ctrl_pressed); DoCommandP(0, this->sel_group | (GroupFlags::GF_REPLACE_WAGON_REMOVAL << 16), (HasBit(g->flags, GroupFlags::GF_REPLACE_WAGON_REMOVAL) ? 0 : 1) | (_ctrl_pressed << 1), CMD_SET_GROUP_FLAG);
} else { } else {
// toggle renew_keep_length // toggle renew_keep_length
Command<CMD_CHANGE_COMPANY_SETTING>::Post("company.renew_keep_length", Company::Get(_local_company)->settings.renew_keep_length ? 0 : 1); DoCommandP(0, 0, Company::Get(_local_company)->settings.renew_keep_length ? 0 : 1, CMD_CHANGE_COMPANY_SETTING, nullptr, "company.renew_keep_length");
} }
break; break;
} }
@@ -564,7 +562,7 @@ public:
case WID_RV_STOP_REPLACE: { // Stop replacing case WID_RV_STOP_REPLACE: { // Stop replacing
EngineID veh_from = this->sel_engine[0]; EngineID veh_from = this->sel_engine[0];
Command<CMD_SET_AUTOREPLACE>::Post(this->sel_group, veh_from, INVALID_ENGINE, false); DoCommandP(0, this->sel_group << 16, veh_from + (INVALID_ENGINE << 16), CMD_SET_AUTOREPLACE);
break; break;
} }
@@ -580,16 +578,6 @@ public:
size_t engine_count = this->engines[click_side].size(); size_t engine_count = this->engines[click_side].size();
EngineID e = engine_count > i ? this->engines[click_side][i] : INVALID_ENGINE; EngineID e = engine_count > i ? this->engines[click_side][i] : INVALID_ENGINE;
/* If Ctrl is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing.
* This is most common when we have finished autoreplacing the engine and want to remove it from the list. */
if (click_side == 0 && _ctrl_pressed && e != INVALID_ENGINE &&
(GetGroupNumEngines(_local_company, sel_group, e) == 0 || GetGroupNumEngines(_local_company, ALL_GROUP, e) == 0)) {
EngineID veh_from = e;
Command<CMD_SET_AUTOREPLACE>::Post(this->sel_group, veh_from, INVALID_ENGINE, false);
break;
}
if (e == this->sel_engine[click_side]) break; // we clicked the one we already selected if (e == this->sel_engine[click_side]) break; // we clicked the one we already selected
this->sel_engine[click_side] = e; this->sel_engine[click_side] = e;
if (click_side == 0) { if (click_side == 0) {

View File

@@ -62,7 +62,8 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
Owner owner; ///< The owner of this station Owner owner; ///< The owner of this station
StationFacility facilities; ///< The facilities that this station has StationFacility facilities; ///< The facilities that this station has
std::vector<StationSpecList> speclist; ///< List of rail station specs of this station. uint8 num_specs; ///< Number of specs in the speclist
StationSpecList *speclist; ///< List of station specs of this station
Date build_date; ///< Date of construction Date build_date; ///< Date of construction

View File

@@ -58,8 +58,8 @@ public:
void Initialize(const Rect &r) void Initialize(const Rect &r)
{ {
this->tile = TileXY(r.left, r.top); this->tile = TileXY(r.left, r.top);
this->w = r.Width(); this->w = r.right - r.left + 1;
this->h = r.Height(); this->h = r.bottom - r.top + 1;
this->data.clear(); this->data.clear();
this->data.resize(Index(w, h)); this->data.resize(Index(w, h));
} }

View File

@@ -19,7 +19,6 @@
/** Instantiation of the partially SSSE2 32bpp with animation blitter factory. */ /** Instantiation of the partially SSSE2 32bpp with animation blitter factory. */
static FBlitter_32bppSSE2_Anim iFBlitter_32bppSSE2_Anim; static FBlitter_32bppSSE2_Anim iFBlitter_32bppSSE2_Anim;
GNU_TARGET("sse2")
void Blitter_32bppSSE2_Anim::PaletteAnimate(const Palette &palette) void Blitter_32bppSSE2_Anim::PaletteAnimate(const Palette &palette)
{ {
assert(!_screen_disable_anim); assert(!_screen_disable_anim);

View File

@@ -16,10 +16,6 @@
#define SSE_VERSION 2 #define SSE_VERSION 2
#endif #endif
#ifndef SSE_TARGET
#define SSE_TARGET "sse2"
#endif
#ifndef FULL_ANIMATION #ifndef FULL_ANIMATION
#define FULL_ANIMATION 1 #define FULL_ANIMATION 1
#endif #endif

View File

@@ -29,7 +29,6 @@ static FBlitter_32bppSSE4_Anim iFBlitter_32bppSSE4_Anim;
*/ */
IGNORE_UNINITIALIZED_WARNING_START IGNORE_UNINITIALIZED_WARNING_START
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent, bool animated> template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent, bool animated>
GNU_TARGET("sse4.1")
inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom) inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
{ {
const byte * const remap = bp->remap; const byte * const remap = bp->remap;
@@ -53,7 +52,6 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL
const __m128i a_cm = ALPHA_CONTROL_MASK; const __m128i a_cm = ALPHA_CONTROL_MASK;
const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK; const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK;
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE; const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
const __m128i a_am = ALPHA_AND_MASK;
for (int y = bp->height; y != 0; y--) { for (int y = bp->height; y != 0; y--) {
Colour *dst = dst_line; Colour *dst = dst_line;
@@ -145,7 +143,7 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL
/* Blend colours. */ /* Blend colours. */
bmno_alpha_blend: bmno_alpha_blend:
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am); srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
bmno_full_opacity: bmno_full_opacity:
_mm_storel_epi64((__m128i *) dst, srcABCD); _mm_storel_epi64((__m128i *) dst, srcABCD);
bmno_full_transparency: bmno_full_transparency:
@@ -172,7 +170,7 @@ bmno_full_transparency:
} else { } else {
srcABCD = _mm_cvtsi32_si128(src->data); srcABCD = _mm_cvtsi32_si128(src->data);
} }
dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am)); dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm));
} }
} }
break; break;
@@ -256,7 +254,7 @@ bmno_full_transparency:
/* Blend colours. */ /* Blend colours. */
bmcr_alpha_blend: bmcr_alpha_blend:
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am); srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
bmcr_full_opacity: bmcr_full_opacity:
_mm_storel_epi64((__m128i *) dst, srcABCD); _mm_storel_epi64((__m128i *) dst, srcABCD);
bmcr_full_transparency: bmcr_full_transparency:
@@ -289,7 +287,7 @@ bmcr_full_transparency:
if (src->a < 255) { if (src->a < 255) {
bmcr_alpha_blend_single: bmcr_alpha_blend_single:
__m128i dstABCD = _mm_cvtsi32_si128(dst->data); __m128i dstABCD = _mm_cvtsi32_si128(dst->data);
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am); srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
} }
dst->data = _mm_cvtsi128_si32(srcABCD); dst->data = _mm_cvtsi128_si32(srcABCD);
} }
@@ -368,12 +366,6 @@ IGNORE_UNINITIALIZED_WARNING_STOP
*/ */
void Blitter_32bppSSE4_Anim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) void Blitter_32bppSSE4_Anim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
{ {
if (_screen_disable_anim) {
/* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent Draw() */
Blitter_32bppSSE4::Draw(bp, mode, zoom);
return;
}
const Blitter_32bppSSE_Base::SpriteFlags sprite_flags = ((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags; const Blitter_32bppSSE_Base::SpriteFlags sprite_flags = ((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags;
switch (mode) { switch (mode) {
default: { default: {

View File

@@ -16,10 +16,6 @@
#define SSE_VERSION 4 #define SSE_VERSION 4
#endif #endif
#ifndef SSE_TARGET
#define SSE_TARGET "sse4.1"
#endif
#ifndef FULL_ANIMATION #ifndef FULL_ANIMATION
#define FULL_ANIMATION 1 #define FULL_ANIMATION 1
#endif #endif
@@ -32,7 +28,7 @@
#define MARGIN_NORMAL_THRESHOLD 4 #define MARGIN_NORMAL_THRESHOLD 4
/** The SSE4 32 bpp blitter with palette animation. */ /** The SSE4 32 bpp blitter with palette animation. */
class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppSSE2_Anim, public Blitter_32bppSSE4 { class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppSSE2_Anim, public Blitter_32bppSSE_Base {
private: private:
public: public:
@@ -43,14 +39,13 @@ public:
return Blitter_32bppSSE_Base::Encode(sprite, allocator); return Blitter_32bppSSE_Base::Encode(sprite, allocator);
} }
const char *GetName() override { return "32bpp-sse4-anim"; } const char *GetName() override { return "32bpp-sse4-anim"; }
using Blitter_32bppSSE2_Anim::LookupColourInPalette;
}; };
/** Factory for the SSE4 32 bpp blitter (with palette animation). */ /** Factory for the SSE4 32 bpp blitter (with palette animation). */
class FBlitter_32bppSSE4_Anim: public BlitterFactory { class FBlitter_32bppSSE4_Anim: public BlitterFactory {
public: public:
FBlitter_32bppSSE4_Anim() : BlitterFactory("32bpp-sse4-anim", "32bpp SSE4 Blitter (palette animation)", HasCPUIDFlag(1, 2, 19)) {} FBlitter_32bppSSE4_Anim() : BlitterFactory("32bpp-sse4-anim", "32bpp SSE4 Blitter (palette animation)", HasCPUIDFlag(1, 2, 19)) {}
Blitter *CreateInstance() override { return static_cast<Blitter_32bppSSE2_Anim *>(new Blitter_32bppSSE4_Anim()); } Blitter *CreateInstance() override { return new Blitter_32bppSSE4_Anim(); }
}; };
#endif /* WITH_SSE */ #endif /* WITH_SSE */

View File

@@ -16,10 +16,6 @@
#define SSE_VERSION 2 #define SSE_VERSION 2
#endif #endif
#ifndef SSE_TARGET
#define SSE_TARGET "sse2"
#endif
#ifndef FULL_ANIMATION #ifndef FULL_ANIMATION
#define FULL_ANIMATION 0 #define FULL_ANIMATION 0
#endif #endif

View File

@@ -16,10 +16,6 @@
#define SSE_VERSION 4 #define SSE_VERSION 4
#endif #endif
#ifndef SSE_TARGET
#define SSE_TARGET "sse4.1"
#endif
#ifndef FULL_ANIMATION #ifndef FULL_ANIMATION
#define FULL_ANIMATION 0 #define FULL_ANIMATION 0
#endif #endif

View File

@@ -12,7 +12,6 @@
#ifdef WITH_SSE #ifdef WITH_SSE
GNU_TARGET(SSE_TARGET)
static inline void InsertFirstUint32(const uint32 value, __m128i &into) static inline void InsertFirstUint32(const uint32 value, __m128i &into)
{ {
#if (SSE_VERSION >= 4) #if (SSE_VERSION >= 4)
@@ -23,7 +22,6 @@ static inline void InsertFirstUint32(const uint32 value, __m128i &into)
#endif #endif
} }
GNU_TARGET(SSE_TARGET)
static inline void InsertSecondUint32(const uint32 value, __m128i &into) static inline void InsertSecondUint32(const uint32 value, __m128i &into)
{ {
#if (SSE_VERSION >= 4) #if (SSE_VERSION >= 4)
@@ -34,7 +32,6 @@ static inline void InsertSecondUint32(const uint32 value, __m128i &into)
#endif #endif
} }
GNU_TARGET(SSE_TARGET)
static inline void LoadUint64(const uint64 value, __m128i &into) static inline void LoadUint64(const uint64 value, __m128i &into)
{ {
#ifdef POINTER_IS_64BIT #ifdef POINTER_IS_64BIT
@@ -49,7 +46,6 @@ static inline void LoadUint64(const uint64 value, __m128i &into)
#endif #endif
} }
GNU_TARGET(SSE_TARGET)
static inline __m128i PackUnsaturated(__m128i from, const __m128i &mask) static inline __m128i PackUnsaturated(__m128i from, const __m128i &mask)
{ {
#if (SSE_VERSION == 2) #if (SSE_VERSION == 2)
@@ -60,43 +56,36 @@ static inline __m128i PackUnsaturated(__m128i from, const __m128i &mask)
#endif #endif
} }
GNU_TARGET(SSE_TARGET)
static inline __m128i DistributeAlpha(const __m128i from, const __m128i &mask) static inline __m128i DistributeAlpha(const __m128i from, const __m128i &mask)
{ {
#if (SSE_VERSION == 2) #if (SSE_VERSION == 2)
__m128i alphaAB = _mm_shufflelo_epi16(from, 0x3F); // PSHUFLW, put alpha1 in front of each rgb1 __m128i alphaAB = _mm_shufflelo_epi16(from, 0x3F); // PSHUFLW, put alpha1 in front of each rgb1
alphaAB = _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2 return _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2
return _mm_andnot_si128(mask, alphaAB); // PANDN, set alpha fields to 0
#else #else
return _mm_shuffle_epi8(from, mask); return _mm_shuffle_epi8(from, mask);
#endif #endif
} }
GNU_TARGET(SSE_TARGET) static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask)
static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask, const __m128i &alpha_mask)
{ {
__m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128()); // PUNPCKLBW, expand each uint8 into uint16 __m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128()); // PUNPCKLBW, expand each uint8 into uint16
__m128i dstAB = _mm_unpacklo_epi8(dst, _mm_setzero_si128()); __m128i dstAB = _mm_unpacklo_epi8(dst, _mm_setzero_si128());
__m128i alphaMaskAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW (alpha > 0) ? 0xFFFF : 0 __m128i alphaAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW, if (alpha > 0) a++;
__m128i alphaAB = _mm_sub_epi16(srcAB, alphaMaskAB); // if (alpha > 0) a++; alphaAB = _mm_srli_epi16(alphaAB, 15);
alphaAB = _mm_add_epi16(alphaAB, srcAB);
alphaAB = DistributeAlpha(alphaAB, distribution_mask); alphaAB = DistributeAlpha(alphaAB, distribution_mask);
srcAB = _mm_sub_epi16(srcAB, dstAB); // PSUBW, (r - Cr) srcAB = _mm_sub_epi16(srcAB, dstAB); // PSUBW, (r - Cr)
srcAB = _mm_mullo_epi16(srcAB, alphaAB); // PMULLW, a*(r - Cr) srcAB = _mm_mullo_epi16(srcAB, alphaAB); // PMULLW, a*(r - Cr)
srcAB = _mm_srli_epi16(srcAB, 8); // PSRLW, a*(r - Cr)/256 srcAB = _mm_srli_epi16(srcAB, 8); // PSRLW, a*(r - Cr)/256
srcAB = _mm_add_epi16(srcAB, dstAB); // PADDW, a*(r - Cr)/256 + Cr srcAB = _mm_add_epi16(srcAB, dstAB); // PADDW, a*(r - Cr)/256 + Cr
alphaMaskAB = _mm_and_si128(alphaMaskAB, alpha_mask); // PAND, set non alpha fields to 0
srcAB = _mm_or_si128(srcAB, alphaMaskAB); // POR, set alpha fields to 0xFFFF is src alpha was > 0
return PackUnsaturated(srcAB, pack_mask); return PackUnsaturated(srcAB, pack_mask);
} }
/* Darken 2 pixels. /* Darken 2 pixels.
* rgb = rgb * ((256/4) * 4 - (alpha/4)) / ((256/4) * 4) * rgb = rgb * ((256/4) * 4 - (alpha/4)) / ((256/4) * 4)
*/ */
GNU_TARGET(SSE_TARGET)
static inline __m128i DarkenTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &tr_nom_base) static inline __m128i DarkenTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &tr_nom_base)
{ {
__m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128()); __m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128());
@@ -110,7 +99,6 @@ static inline __m128i DarkenTwoPixels(__m128i src, __m128i dst, const __m128i &d
} }
IGNORE_UNINITIALIZED_WARNING_START IGNORE_UNINITIALIZED_WARNING_START
GNU_TARGET(SSE_TARGET)
static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness) static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness)
{ {
uint64 c16 = colour.b | (uint64) colour.g << 16 | (uint64) colour.r << 32; uint64 c16 = colour.b | (uint64) colour.g << 16 | (uint64) colour.r << 32;
@@ -153,7 +141,6 @@ static inline Colour AdjustBrightneSSE(Colour colour, uint8 brightness)
return ReallyAdjustBrightness(colour, brightness); return ReallyAdjustBrightness(colour, brightness);
} }
GNU_TARGET(SSE_TARGET)
static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightness) static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightness)
{ {
#if (SSE_VERSION < 3) #if (SSE_VERSION < 3)
@@ -205,7 +192,6 @@ static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightnes
*/ */
IGNORE_UNINITIALIZED_WARNING_START IGNORE_UNINITIALIZED_WARNING_START
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent> template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent>
GNU_TARGET(SSE_TARGET)
#if (SSE_VERSION == 2) #if (SSE_VERSION == 2)
inline void Blitter_32bppSSE2::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom) inline void Blitter_32bppSSE2::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
#elif (SSE_VERSION == 3) #elif (SSE_VERSION == 3)
@@ -231,11 +217,9 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
const MapValue *src_mv = src_mv_line; const MapValue *src_mv = src_mv_line;
/* Load these variables into register before loop. */ /* Load these variables into register before loop. */
const __m128i alpha_and = ALPHA_AND_MASK;
#define ALPHA_BLEND_PARAM_3 alpha_and
#if (SSE_VERSION == 2) #if (SSE_VERSION == 2)
const __m128i clear_hi = CLEAR_HIGH_BYTE_MASK; const __m128i clear_hi = CLEAR_HIGH_BYTE_MASK;
#define ALPHA_BLEND_PARAM_1 alpha_and #define ALPHA_BLEND_PARAM_1 clear_hi
#define ALPHA_BLEND_PARAM_2 clear_hi #define ALPHA_BLEND_PARAM_2 clear_hi
#define DARKEN_PARAM_1 tr_nom_base #define DARKEN_PARAM_1 tr_nom_base
#define DARKEN_PARAM_2 tr_nom_base #define DARKEN_PARAM_2 tr_nom_base
@@ -281,7 +265,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
for (uint x = (uint) effective_width / 2; x > 0; x--) { for (uint x = (uint) effective_width / 2; x > 0; x--) {
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src); __m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst); __m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
_mm_storel_epi64((__m128i*) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3)); _mm_storel_epi64((__m128i*) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2));
src += 2; src += 2;
dst += 2; dst += 2;
} }
@@ -289,7 +273,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) { if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) {
__m128i srcABCD = _mm_cvtsi32_si128(src->data); __m128i srcABCD = _mm_cvtsi32_si128(src->data);
__m128i dstABCD = _mm_cvtsi32_si128(dst->data); __m128i dstABCD = _mm_cvtsi32_si128(dst->data);
dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3)); dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2));
} }
break; break;
@@ -334,7 +318,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
} }
/* Blend colours. */ /* Blend colours. */
_mm_storel_epi64((__m128i *) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3)); _mm_storel_epi64((__m128i *) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2));
dst += 2; dst += 2;
src += 2; src += 2;
src_mv += 2; src_mv += 2;
@@ -363,7 +347,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
if (src->a < 255) { if (src->a < 255) {
bmcr_alpha_blend_single: bmcr_alpha_blend_single:
__m128i dstABCD = _mm_cvtsi32_si128(dst->data); __m128i dstABCD = _mm_cvtsi32_si128(dst->data);
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3); srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2);
} }
dst->data = _mm_cvtsi128_si32(srcABCD); dst->data = _mm_cvtsi128_si32(srcABCD);
} }

View File

@@ -51,7 +51,6 @@ typedef union ALIGN(16) um128i {
#define OVERBRIGHT_VALUE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0) #define OVERBRIGHT_VALUE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0)
#define OVERBRIGHT_CONTROL_MASK _mm_setr_epi8( 0, 1, 0, 1, 0, 1, 7, 7, 2, 3, 2, 3, 2, 3, 7, 7) #define OVERBRIGHT_CONTROL_MASK _mm_setr_epi8( 0, 1, 0, 1, 0, 1, 7, 7, 2, 3, 2, 3, 2, 3, 7, 7)
#define TRANSPARENT_NOM_BASE _mm_setr_epi16(256, 256, 256, 256, 256, 256, 256, 256) #define TRANSPARENT_NOM_BASE _mm_setr_epi16(256, 256, 256, 256, 256, 256, 256, 256)
#define ALPHA_AND_MASK _mm_setr_epi16( 0, 0, 0, -1, 0, 0, 0, -1)
#endif /* WITH_SSE */ #endif /* WITH_SSE */
#endif /* BLITTER_32BPP_SSE_TYPE_H */ #endif /* BLITTER_32BPP_SSE_TYPE_H */

View File

@@ -16,10 +16,6 @@
#define SSE_VERSION 3 #define SSE_VERSION 3
#endif #endif
#ifndef SSE_TARGET
#define SSE_TARGET "ssse3"
#endif
#ifndef FULL_ANIMATION #ifndef FULL_ANIMATION
#define FULL_ANIMATION 0 #define FULL_ANIMATION 0
#endif #endif

View File

@@ -1,3 +1,5 @@
/* $Id$ */
/* /*
* This file is part of OpenTTD. * This file is part of OpenTTD.
* OpenTTD 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, version 2. * OpenTTD 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, version 2.

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