1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-14 10:09:11 +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:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v2
- name: Setup cache
uses: actions/cache@v3
uses: actions/cache@v2
with:
path: /emsdk/upstream/emscripten/cache
key: 2.0.31-${{ runner.os }}
@@ -91,7 +91,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v2
- name: Install dependencies
run: |
@@ -166,15 +166,15 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v2
- name: Prepare cache key
id: key
run: |
echo "image=$ImageOS-$ImageVersion" >> $GITHUB_OUTPUT
echo "::set-output name=image::$ImageOS-$ImageVersion"
- name: Enable vcpkg cache
uses: actions/cache@v3
uses: actions/cache@v2
with:
path: /usr/local/share/vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
@@ -244,7 +244,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v2
- name: Prepare cache key
id: key
@@ -253,10 +253,10 @@ jobs:
# Work around caching failure with GNU tar
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
uses: actions/cache@v3
uses: actions/cache@v2
with:
path: vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
@@ -338,7 +338,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v2
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
@@ -408,4 +408,4 @@ jobs:
steps:
- name: Check annotations
uses: OpenTTD/actions/annotation-check@v3
uses: OpenTTD/actions/annotation-check@v2

View File

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

View File

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

View File

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

View File

@@ -29,14 +29,14 @@ jobs:
steps:
- name: Checkout (Release)
if: github.event_name == 'release'
uses: actions/checkout@v3
uses: actions/checkout@v2
with:
# We generate a changelog; for this we need the full git log.
fetch-depth: 0
- name: Checkout (Manual)
if: github.event_name == 'workflow_dispatch'
uses: actions/checkout@v3
uses: actions/checkout@v2
with:
ref: ${{ github.event.inputs.ref }}
# We generate a changelog; for this we need the full git log.
@@ -44,7 +44,7 @@ jobs:
- name: Checkout (Trigger)
if: github.event_name == 'repository_dispatch'
uses: actions/checkout@v3
uses: actions/checkout@v2
with:
ref: ${{ github.event.client_payload.ref }}
# We generate a changelog; for this we need the full git log.
@@ -138,10 +138,10 @@ jobs:
echo "Folder on CDN: ${FOLDER}"
echo "Workflow trigger: ${TRIGGER_TYPE}"
echo "version=$(cat .version)" >> $GITHUB_OUTPUT
echo "is_tag=${IS_TAG}" >> $GITHUB_OUTPUT
echo "folder=${FOLDER}" >> $GITHUB_OUTPUT
echo "trigger_type=${TRIGGER_TYPE}" >> $GITHUB_OUTPUT
echo "::set-output name=version::$(cat .version)"
echo "::set-output name=is_tag::${IS_TAG}"
echo "::set-output name=folder::${FOLDER}"
echo "::set-output name=trigger_type::${TRIGGER_TYPE}"
env:
NIGHTLIES_BRANCH: master
FOLDER_RELEASES: openttd-releases
@@ -174,14 +174,14 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: openttd-source
path: build/bundles/*
retention-days: 5
- name: Store source (for other jobs)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: internal-source
path: source.tar.gz
@@ -195,7 +195,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
with:
name: internal-source
@@ -258,7 +258,7 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: openttd-docs
path: build/bundles/*.tar.xz
@@ -276,7 +276,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
with:
name: internal-source
@@ -355,7 +355,7 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: openttd-linux-generic
path: build/bundles
@@ -371,11 +371,14 @@ jobs:
fail-fast: false
matrix:
include:
- container_image: "ubuntu:18.04"
bundle_name: "bionic"
compiler: "g++-8"
- container_image: "ubuntu:20.04"
bundle_name: "focal"
compiler: "g++"
- container_image: "ubuntu:22.04"
bundle_name: "jammy"
- container_image: "debian:buster"
bundle_name: "buster"
compiler: "g++"
- container_image: "debian:bullseye"
bundle_name: "bullseye"
@@ -387,7 +390,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
with:
name: internal-source
@@ -457,7 +460,7 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: openttd-linux-${{ matrix.bundle_name }}
path: build/bundles
@@ -467,13 +470,13 @@ jobs:
name: MacOS
needs: source
runs-on: macos-11
runs-on: macos-10.15
env:
MACOSX_DEPLOYMENT_TARGET: 10.14
steps:
- name: Download source
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
with:
name: internal-source
@@ -491,10 +494,10 @@ jobs:
- name: Prepare cache key
id: key
run: |
echo "image=$ImageOS-$ImageVersion" >> $GITHUB_OUTPUT
echo "::set-output name=image::$ImageOS-$ImageVersion"
- name: Enable vcpkg cache
uses: actions/cache@v3
uses: actions/cache@v2
with:
path: /usr/local/share/vcpkg/installed
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/
- name: Store bundles
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: openttd-macos-universal
path: build-x64/bundles
@@ -673,7 +676,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
with:
name: internal-source
@@ -694,10 +697,10 @@ jobs:
# Work around caching failure with GNU tar
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
uses: actions/cache@v3
uses: actions/cache@v2
with:
path: vcpkg/installed
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 }}
- name: Store bundles
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: openttd-windows-${{ matrix.arch }}
path: build/bundles
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:
name: Upload (AWS)
needs:
@@ -1051,7 +871,7 @@ jobs:
steps:
- name: Download all bundles
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
- name: Calculate checksums
run: |
@@ -1083,7 +903,7 @@ jobs:
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
- name: Trigger 'New OpenTTD release'
uses: peter-evans/repository-dispatch@v2
uses: peter-evans/repository-dispatch@v1
with:
token: ${{ secrets.DEPLOYMENT_TOKEN }}
repository: OpenTTD/workflows
@@ -1104,7 +924,7 @@ jobs:
steps:
- name: Download all bundles
uses: actions/download-artifact@v3
uses: actions/download-artifact@v2
- name: Setup steamcmd
uses: CyberAndrii/setup-steamcmd@v1

View File

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

View File

@@ -5,7 +5,7 @@ if(NOT BINARY_NAME)
endif()
project(${BINARY_NAME}
VERSION 13.0
VERSION 12.2
)
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.
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.
Discussion can take time, but it can be productive and avoid disappointment. :)
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 in irc can take time, but it can be productive and avoid disappointment :)
## 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.
- *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.
The preferred method to alter and extend the gameplay is via add-ons like NewGRF and GameScripts.
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 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.
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):
- 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)
- Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)
- 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)
- 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)
- Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
- Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
- Remko Bijker (Rubidium) - Coder and way more (since 0.4.5)
- Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op
- Tyler Trahan (2TallTyler) - General coding (since 13)
- Ingo von Borstel (planetmaker) - General coding, Support (since 1.1)
- Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)
- José Soler (Terkhen) - General coding (since 1.0)
### 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)
- 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)
- Ulf Hermann (fonsinchen) - Cargo Distribution (1.3 - 1.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)
- Attila Bán (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5)
- Ingo von Borstel (planetmaker) - General coding, Support (1.1 - 1.9)
- Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5)
- 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)
- Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
- Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)
- 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)
- 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)
- Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (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)
- Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)
@@ -53,7 +52,7 @@
- Alberto Demichelis - Squirrel scripting language
- L. Peter Deutsch - MD5 implementation
- Michael Blunck - For revolutionizing TTD with awesome graphics
- George - Canal/Lock graphics
- George - Canal graphics
- Andrew Parkhouse (andythenorth) - River graphics
- David Dallaston (Pikka) - Tram tracks
- 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).
### 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
@@ -133,7 +162,6 @@ If you want to compile OpenTTD from source, instructions can be found in [COMPIL
'Official' channels
- [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)
- [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

View File

@@ -379,16 +379,3 @@ AIGroup.CreateGroup <- function(vehicle_type)
{
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);
}
/* 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);
}
/* 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.");
/* 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.");
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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.");
/* 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.
* 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);
}
/* 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.");
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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);
}
/* 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.
* 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)
------------------------------------------------------------------------
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
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
add_compile_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, ...)
add_link_options(
"$<$<CONFIG:Debug>:-Wl,--disable-dynamicbase,--disable-high-entropy-va,--default-image-base-low>" # ASLR somehow breaks linking for x64 Debug builds
)
endif()
endif()
@@ -56,11 +56,6 @@ macro(compile_flags)
if(MSVC)
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")
add_compile_options(
-W

View File

@@ -122,8 +122,6 @@ set(CPACK_STRIP_FILES YES)
set(CPACK_OUTPUT_FILE_PREFIX "bundles")
if(APPLE)
# Stripping would produce unreadable stacktraces.
set(CPACK_STRIP_FILES NO)
set(CPACK_GENERATOR "Bundle")
include(PackageBundle)
@@ -131,7 +129,7 @@ if(APPLE)
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macos-universal")
else()
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macos-${CPACK_SYSTEM_NAME}")
endif()
endif()
elseif(WIN32)
set(CPACK_GENERATOR "ZIP")
if(OPTION_USE_NSIS)
@@ -183,10 +181,6 @@ elseif(UNIX)
if(DISTRO_ID STREQUAL "arch")
set(PLATFORM "arch")
set(CPACK_GENERATOR "TXZ")
elseif(DISTRO_ID STREQUAL "fedora" OR DISTRO_ID STREQUAL "rhel")
set(PLATFORM "fedora")
set(CPACK_GENERATOR "RPM")
include(PackageRPM)
else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
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}")
endif()
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()
endfunction()

View File

@@ -3,7 +3,6 @@
source_group("AI Core" REGULAR_EXPRESSION "src/ai/")
source_group("Blitters" REGULAR_EXPRESSION "src/blitter/")
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("MD5" REGULAR_EXPRESSION "src/3rdparty/md5/")
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_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)
# Although pthreads is supported, it is not in a way yet that is
# 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 "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)
@@ -42,7 +41,6 @@ foreach(ENUM IN LISTS ENUM_LINES)
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" FILE ${FILE})
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}/* automatically generated from ${FILE} */")
list(APPEND INCLUDES "#include \"${FILE}\"")
foreach(LINE IN LISTS SOURCE_LINES)
string(REPLACE "${RM_INDENT}" "" LINE "${LINE}")
@@ -118,7 +116,4 @@ foreach(ENUM IN LISTS ENUM_LINES)
endforeach()
endforeach()
list(REMOVE_DUPLICATES INCLUDES)
string(REPLACE ";" "\n" INCLUDES "${INCLUDES}")
configure_file(${GENERATE_SOURCE_FILE} ${GENERATE_BINARY_FILE})

View File

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

View File

@@ -12,11 +12,32 @@ endif()
if(NOT APIUC)
message(FATAL_ERROR "Script needs APIUC defined")
endif()
if(NOT API_FILES)
message(FATAL_ERROR "Script needs API_FILES defined")
endif()
file(READ "${API_FILES}" SCRIPT_API_BINARY_FILES)
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()
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)
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 "aqueduct.nfo"
#include "autorail.nfo"
#include "flags.nfo"
#include "openttdgui.nfo"
#include "airport_preview.nfo"
#include "chars.nfo"

Binary file not shown.

View File

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

View File

@@ -10,7 +10,6 @@
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<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>
</application>
<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 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 GetAPIVersion() { return "13"; }
function GetAPIVersion() { return "12"; }
function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "Regression"; }
function UseAsRandomAI() { return false; }

View File

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

View File

@@ -4,7 +4,7 @@ class StationList extends AIInfo {
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 GetVersion() { return 1; }
function GetAPIVersion() { return "13"; }
function GetAPIVersion() { return "12"; }
function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "StationList"; }
function UseAsRandomAI() { return false; }

View File

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

View File

@@ -139,9 +139,9 @@ public:
static int GetStartNextTime();
/** 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 */
static std::string GetConsoleLibraryList();
static char *GetConsoleLibraryList(char *p, const char *last);
/** Wrapper function for AIScanner::GetAIInfoList */
static const ScriptInfoList *GetInfoList();
/** Wrapper function for AIScanner::GetUniqueAIInfoList */

View File

@@ -315,14 +315,14 @@
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()

View File

@@ -28,8 +28,6 @@
#include "../hotkeys.h"
#include "../core/geometry_func.hpp"
#include "../guitimer_func.h"
#include "../company_cmd.h"
#include "../misc_cmd.h"
#include "ai.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
{
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->height = this->line_height;
@@ -125,18 +123,18 @@ struct AIListWindow : public Window {
switch (widget) {
case WID_AIL_LIST: {
/* 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 */
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);
tr.top += this->line_height;
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);
y += this->line_height;
}
int i = 0;
for (const auto &item : *this->info_list) {
i++;
if (this->vscroll->IsVisible(i)) {
DrawString(tr, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE);
tr.top += this->line_height;
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);
y += this->line_height;
}
}
break;
@@ -150,20 +148,20 @@ struct AIListWindow : public Window {
}
/* Some info about the currently selected AI. */
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());
DrawString(tr, STR_AI_LIST_AUTHOR);
tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_AUTHOR);
y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
SetDParam(0, selected_info->GetVersion());
DrawString(tr, STR_AI_LIST_VERSION);
tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_VERSION);
y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
if (selected_info->GetURL() != nullptr) {
SetDParamStr(0, selected_info->GetURL());
DrawString(tr, STR_AI_LIST_URL);
tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_URL);
y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
}
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;
}
@@ -182,7 +180,7 @@ struct AIListWindow : public Window {
for (int i = 0; i < this->selected; i++) it++;
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);
CloseWindowByClass(WC_QUERY_STRING);
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(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIL_SCROLLBAR),
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(),
NWidget(NWID_HORIZONTAL),
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.
* @param slot The slot to change the AI of.
*/
void ShowAIListWindow(CompanyID slot)
static void ShowAIListWindow(CompanyID slot)
{
CloseWindowByClass(WC_AI_LIST);
new AIListWindow(&_ai_list_desc, slot);
@@ -296,7 +294,7 @@ struct AISettingsWindow : public Window {
int clicked_row; ///< The clicked row of settings.
int line_height; ///< Height of a row in the matrix widget.
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
/**
@@ -320,6 +318,15 @@ struct AISettingsWindow : public Window {
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
* 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
{
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->height = this->line_height;
@@ -359,10 +366,11 @@ struct AISettingsWindow : public Window {
int i = 0;
for (; !this->vscroll->IsVisible(i); i++) it++;
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
bool rtl = _current_text_dir == TD_RTL;
Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl);
Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl);
uint buttons_left = rtl ? r.right - SETTING_BUTTON_WIDTH - 3 : r.left + 4;
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 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) {
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);
} else {
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 {
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)) {
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;
}
}
@@ -426,8 +434,8 @@ struct AISettingsWindow : public Window {
{
switch (widget) {
case WID_AIS_BACKGROUND: {
Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero);
int num = (pt.y - r.top) / this->line_height + this->vscroll->GetPosition();
const NWidgetBase *wid = this->GetWidget<NWidgetBase>(WID_AIS_BACKGROUND);
int num = (pt.y - wid->pos_y) / this->line_height + this->vscroll->GetPosition();
if (num >= (int)this->visible_settings.size()) break;
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;
int x = pt.x - r.left;
if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x;
int x = pt.x - wid->pos_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) */
int old_val = this->ai_config->GetSetting(config_item.name);
@@ -456,7 +465,8 @@ struct AISettingsWindow : public Window {
this->clicked_dropdown = false;
this->closing_dropdown = false;
} 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;
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.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) {
this->clicked_dropdown = true;
this->closing_dropdown = false;
@@ -521,15 +531,24 @@ struct AISettingsWindow : public Window {
void OnQueryTextFinished(char *str) override
{
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);
SetValue(value);
this->ai_config->SetSetting(config_item.name, value);
this->SetDirty();
}
void OnDropdownSelect(int widget, int index) override
{
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
@@ -571,21 +590,7 @@ struct AISettingsWindow : public Window {
private:
bool IsEditableItem(const ScriptConfigItem &config_item) const
{
return _game_mode == GM_MENU
|| _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();
return _game_mode == GM_MENU || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)) || (config_item.flags & SCRIPTCONFIG_INGAME) != 0;
}
};
@@ -593,7 +598,7 @@ private:
static const NWidgetPart _nested_ai_settings_widgets[] = {
NWidget(NWID_HORIZONTAL),
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),
EndContainer(),
NWidget(NWID_HORIZONTAL),
@@ -673,15 +678,15 @@ void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot)
static const NWidgetPart _nested_ai_config_widgets[] = {
NWidget(NWID_HORIZONTAL),
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(),
NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND),
NWidget(NWID_VERTICAL), SetPIP(4, 4, 4),
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_INCREASE), SetDataTip(AWV_INCREASE, 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), SetFill(0, 1), SetDataTip(AWV_INCREASE, STR_NULL),
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(),
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),
@@ -695,13 +700,16 @@ static const NWidgetPart _nested_ai_config_widgets[] = {
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 9),
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_AI, 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_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL),
NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetPadding(0, 5, 4, 5),
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_GAMELIST), SetMinimalSize(288, 14), SetFill(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP),
EndContainer(),
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),
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_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL),
EndContainer(),
@@ -749,22 +757,53 @@ struct AIConfigWindow : public Window {
case WID_AIC_NUMBER:
SetDParam(0, GetGameSettings().difficulty.max_no_competitors);
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
{
switch (widget) {
case WID_AIC_DECREASE:
case WID_AIC_INCREASE:
*size = maxdim(*size, NWidgetScrollbar::GetHorizontalDimension());
case WID_AIC_GAMELIST:
this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
size->height = 1 * this->line_height;
break;
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;
size->height = 8 * this->line_height;
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)
{
if (slot == OWNER_DEITY) return _game_mode != GM_NORMAL || Game::GetInstance() != nullptr;
if (_game_mode != GM_NORMAL) {
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
{
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: {
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++) {
StringID text;
@@ -803,9 +858,9 @@ struct AIConfigWindow : public Window {
} else {
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));
tr.top += this->line_height;
y += this->line_height;
}
break;
}
@@ -834,6 +889,13 @@ struct AIConfigWindow : public Window {
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
this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget);
this->InvalidateData();
@@ -875,7 +937,7 @@ struct AIConfigWindow : public Window {
if (!_network_available) {
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
} else {
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI);
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI, CONTENT_TYPE_GAME);
}
break;
}
@@ -896,10 +958,10 @@ struct AIConfigWindow : public Window {
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_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_MOVE_UP, 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_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 == OWNER_DEITY || this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1)));
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));
@@ -939,6 +1001,9 @@ static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused)
* Window with everything an AI prints via ScriptLog.
*/
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 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
{
if (widget == WID_AID_LOG_PANEL) {
resize->height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
size->height = 14 * resize->height + WidgetDimensions::scaled.framerect.Vertical();
resize->height = FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
size->height = 14 * resize->height + this->top_offset + this->bottom_offset;
}
}
@@ -1157,8 +1222,7 @@ struct AIDebugWindow : public Window {
ScriptLog::LogData *log = this->GetLogPointer();
if (log == nullptr) return;
Rect br = r.Shrink(WidgetDimensions::scaled.bevel);
Rect tr = r.Shrink(WidgetDimensions::scaled.framerect);
int y = this->top_offset;
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;
if (log->lines[pos] == nullptr) break;
@@ -1175,12 +1239,12 @@ struct AIDebugWindow : public Window {
/* Check if the current line should be highlighted */
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.
}
DrawString(tr, log->lines[pos], colour, SA_LEFT | SA_FORCE);
tr.top += this->resize.step_height;
DrawString(r.left + 7, r.right - 7, r.top + y, log->lines[pos], colour, SA_LEFT | SA_FORCE);
y += this->resize.step_height;
}
break;
}
@@ -1226,8 +1290,8 @@ struct AIDebugWindow : public Window {
case WID_AID_RELOAD_TOGGLE:
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 */
Command<CMD_COMPANY_CTRL>::Post(CCA_DELETE, ai_debug_company, CRR_MANUAL, INVALID_CLIENT_ID);
Command<CMD_COMPANY_CTRL>::Post(CCA_NEW_AI, ai_debug_company, CRR_NONE, INVALID_CLIENT_ID);
DoCommandP(0, CCA_DELETE | ai_debug_company << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL);
DoCommandP(0, CCA_NEW_AI | ai_debug_company << 16, 0, CMD_COMPANY_CTRL);
break;
case WID_AID_SETTINGS:
@@ -1266,7 +1330,7 @@ struct AIDebugWindow : public Window {
}
if (all_unpaused) {
/* 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. */
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 */
@@ -1352,12 +1416,14 @@ struct AIDebugWindow : public Window {
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;
};
const int AIDebugWindow::top_offset = WD_FRAMERECT_TOP + 2;
const int AIDebugWindow::bottom_offset = WD_FRAMERECT_BOTTOM;
CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY;
char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = "";
bool AIDebugWindow::break_check_enabled = true;

View File

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

View File

@@ -25,7 +25,7 @@
*/
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();
}

View File

@@ -18,7 +18,6 @@
#include "ai.hpp"
#include "../script/script_storage.hpp"
#include "../script/script_cmd.h"
#include "ai_info.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.
* @param cmd cmd as given to DoCommandPInternal.
* @param result The result of the command.
* @param tile The tile on which the command was executed.
* @param data Command data as given to Command<>::Post.
* @param result_data Additional returned data from the command.
* @param p1 p1 as given to DoCommandPInternal.
* @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.
@@ -110,12 +109,12 @@ void CcAI(Commands cmd, const CommandCost &result, TileIndex tile, const Command
const Company *c = Company::GetIfValid(_current_company);
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();
}
}
CommandCallbackData *AIInstance::GetDoCommandCallback()
CommandCallback *AIInstance::GetDoCommandCallback()
{
return &CcAI;
}

View File

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

View File

@@ -91,7 +91,7 @@ struct Aircraft FINAL : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
void MarkDirty();
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(); }
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const;
int GetDisplaySpeed() const { return this->cur_speed; }

View File

@@ -37,8 +37,6 @@
#include "disaster_vehicle.h"
#include "newgrf_airporttiles.h"
#include "framerate_type.h"
#include "aircraft_cmd.h"
#include "vehicle_cmd.h"
#include "table/strings.h"
@@ -190,7 +188,7 @@ void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteS
const Aircraft *w = v->Next()->Next();
if (is_custom_sprite(v->spritenum)) {
GetCustomRotorSprite(v, image_type, result);
GetCustomRotorSprite(v, false, image_type, result);
if (result->IsValid()) return;
}
@@ -231,7 +229,7 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en
VehicleSpriteSeq rotor_seq;
GetCustomRotorIcon(engine, image_type, &rotor_seq);
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;
seq.GetBounds(&rect);
width = UnScaleGUI(rect.Width());
height = UnScaleGUI(rect.Height());
width = UnScaleGUI(rect.right - rect.left + 1);
height = UnScaleGUI(rect.bottom - rect.top + 1);
xoffs = UnScaleGUI(rect.left);
yoffs = UnScaleGUI(rect.top);
}
/**
* Build an aircraft.
* @param flags type of operation.
* @param tile tile of the depot where aircraft is built.
* @param flags type of operation.
* @param e the engine to build.
* @param data unused.
* @param[out] ret the vehicle that has been built.
* @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 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->max_age = e->GetLifeLengthInDays();
_new_vehicle_id = v->index;
v->pos = GetVehiclePosOnBuild(tile);
v->state = HANGAR;
@@ -1273,7 +1274,7 @@ void HandleMissingAircraftOrders(Aircraft *v)
const Station *st = GetTargetAirportIfValid(v);
if (st == nullptr) {
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();
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));
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
NewsType newstype = NT_ACCIDENT;
if (v->owner != _local_company) {
newstype = NT_ACCIDENT_OTHER;
}
AddTileNewsItem(newsitem, newstype, vt, nullptr, st != nullptr ? st->index : INVALID_STATION);
AddTileNewsItem(newsitem, NT_ACCIDENT, vt, nullptr, st != nullptr ? st->index : INVALID_STATION);
ModifyStationRatingAround(vt, v->owner, -160, 30);
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 */
if (v->NeedsAutomaticServicing()) {
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();
}
}
@@ -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 */
if (v->NeedsAutomaticServicing()) {
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();
}
}

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
*
* @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;
int y = r.top;
for (const Aircraft *u = v; u != nullptr; u = u->Next()) {
if (u->IsNormalAircraft()) {
SetDParam(0, u->engine_type);
SetDParam(1, u->build_year);
SetDParam(2, u->value);
DrawString(r.left, r.right, y, STR_VEHICLE_INFO_BUILT_VALUE);
y += FONT_HEIGHT_NORMAL;
DrawString(left, right, y, STR_VEHICLE_INFO_BUILT_VALUE);
SetDParam(0, u->cargo_type);
SetDParam(1, u->cargo_cap);
SetDParam(2, u->Next()->cargo_type);
SetDParam(3, u->Next()->cargo_cap);
SetDParam(4, GetCargoSubtypeText(u));
DrawString(r.left, r.right, y, (u->Next()->cargo_cap != 0) ? STR_VEHICLE_INFO_CAPACITY_CAPACITY : STR_VEHICLE_INFO_CAPACITY);
y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal;
DrawString(left, right, y + FONT_HEIGHT_NORMAL, (u->Next()->cargo_cap != 0) ? STR_VEHICLE_INFO_CAPACITY_CAPACITY : STR_VEHICLE_INFO_CAPACITY);
}
if (u->cargo_cap != 0) {
uint cargo_count = u->cargo.StoredCount();
y_offset += FONT_HEIGHT_NORMAL + 1;
if (cargo_count != 0) {
/* Cargo names (fix pluralness) */
SetDParam(0, u->cargo_type);
SetDParam(1, cargo_count);
SetDParam(2, u->cargo.Source());
DrawString(r.left, r.right, y, STR_VEHICLE_DETAILS_CARGO_FROM);
y += FONT_HEIGHT_NORMAL;
DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, STR_VEHICLE_DETAILS_CARGO_FROM);
feeder_share += u->cargo.FeederShare();
}
}
}
y += WidgetDimensions::scaled.vsep_normal;
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
* @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
*/
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;
@@ -86,29 +87,27 @@ void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, Eng
Rect 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 = rtl ? r.right - width - x_offs : r.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);
int x = rtl ? right - width - x_offs : left - x_offs;
bool helicopter = v->subtype == AIR_HELICOPTER;
int y_offs = ScaleGUITrad(10);
int heli_offs = 0;
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) {
const Aircraft *a = Aircraft::From(v);
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);
heli_offs = ScaleSpriteTrad(5);
rotor_seq.Draw(x, y - heli_offs, PAL_NONE, false);
heli_offs = ScaleGUITrad(5);
rotor_seq.Draw(x, y + y_offs - heli_offs, PAL_NONE, false);
}
if (v->index == selection) {
x += x_offs;
y += UnScaleGUI(rect.top) - heli_offs;
Rect hr = {x, y, x + width - 1, y + UnScaleGUI(rect.Height()) + heli_offs - 1};
DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY);
y += UnScaleGUI(rect.top) + y_offs - heli_offs;
DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + heli_offs + 1, 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. */
#include "stdafx.h"
#include "economy_func.h"
#include "window_gui.h"
#include "station_gui.h"
#include "terraform_gui.h"
@@ -27,10 +26,6 @@
#include "hotkeys.h"
#include "vehicle_func.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"
@@ -45,7 +40,7 @@ static void ShowBuildAirportPicker(Window *parent);
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;
@@ -60,20 +55,13 @@ void CcBuildAirport(Commands cmd, const CommandCost &result, TileIndex tile)
static void PlaceAirport(TileIndex tile)
{
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();
byte layout = _selected_airport_layout;
bool adjacent = _ctrl_pressed;
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);
uint32 p1 = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex();
p1 |= _selected_airport_layout << 8;
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));
}
/** Airport build toolbar window handler. */
@@ -340,10 +328,10 @@ public:
const AirportSpec *as = AirportSpec::Get(i);
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;
break;
}
@@ -356,8 +344,8 @@ public:
SpriteID sprite = GetCustomAirportSprite(as, layout);
if (sprite != 0) {
Dimension d = GetSpriteSize(sprite);
d.width += WidgetDimensions::scaled.framerect.Horizontal();
d.height += WidgetDimensions::scaled.framerect.Vertical();
d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
*size = maxdim(d, *size);
}
}
@@ -388,17 +376,15 @@ public:
{
switch (widget) {
case WID_AP_AIRPORT_LIST: {
Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel);
Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix);
int y = r.top;
AirportClass *apclass = AirportClass::Get(_selected_airport_class);
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) {
const AirportSpec *as = apclass->GetSpec(i);
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);
row = row.Translate(0, this->line_height);
text = text.Translate(0, this->line_height);
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);
y += this->line_height;
}
break;
}
@@ -406,7 +392,7 @@ public:
case WID_AP_AIRPORT_SPRITE:
if (this->preview_sprite != 0) {
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;
@@ -427,8 +413,11 @@ public:
{
this->DrawWidgets();
Rect r = this->GetWidget<NWidgetBase>(WID_AP_ACCEPTANCE)->GetCurrentRect();
int top = r.top + WidgetDimensions::scaled.vsep_normal;
uint16 top = this->GetWidget<NWidgetBase>(WID_AP_BTN_DOHILIGHT)->pos_y + this->GetWidget<NWidgetBase>(WID_AP_BTN_DOHILIGHT)->current_y + WD_PAR_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) {
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
@@ -438,27 +427,20 @@ public:
if (_settings_game.economy.station_noise_level) {
/* show the noise of the selected airport */
SetDParam(0, as->noise_level);
DrawString(r.left, r.right, top, STR_STATION_BUILD_NOISE);
top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.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;
DrawString(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_STATION_BUILD_NOISE);
top += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
}
/* strings such as 'Size' and 'Coverage Area' */
top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + WidgetDimensions::scaled.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, false) + WD_PAR_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.
* 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.) */
if (top > r.bottom) {
ResizeWindow(this, 0, top - r.bottom, false);
if (top > bottom) {
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),
EndContainer(),
/* Bottom panel. */
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), SetPIP(2, 2, 2),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
@@ -616,7 +598,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
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(),
};

View File

@@ -22,11 +22,6 @@
#include "ai/ai.hpp"
#include "news_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"
@@ -211,7 +206,7 @@ static int GetIncompatibleRefitOrderIdForAutoreplace(const Vehicle *v, EngineID
const Order *o;
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;
for (VehicleOrderID i = 0; i < orders->GetNumOrders(); i++) {
o = orders->GetOrderAt(i);
@@ -345,24 +340,23 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
}
/* Build the new vehicle */
VehicleID new_veh_id;
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);
cost = DoCommand(old_veh->tile, e | (CT_INVALID << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
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;
/* Refit the vehicle if needed */
if (refit_cargo != CT_NO_REFIT) {
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()
}
/* 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)) {
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;
@@ -374,9 +368,9 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
* @param evaluate_callback shall the start/stop callback be evaluated?
* @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)
{
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();
/* 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 */
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. */
if (cost.Succeeded()) {
/* Start the vehicle, might be denied by certain things */
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 */
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 */
@@ -472,11 +466,11 @@ static CommandCost ReplaceFreeUnit(Vehicle **single_unit, DoCommandFlag flags, b
}
/* 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 ((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);
/* 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());
new_vehs[i] = nullptr;
@@ -635,7 +629,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
/* Sell the vehicle.
* Note: This might temporarily construct new trains, so use DC_AUTOREPLACE to prevent
* 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) {
old_vehs[i] = 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) {
for (int i = num_units - 1; i >= 0; i--) {
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;
}
}
@@ -697,12 +691,12 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
}
/* 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 ((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
* 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 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
*/
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;
CommandCost ret = CheckOwnership(v->owner);
if (ret.Failed()) return ret;
if (!v->IsChainInDepot()) return CMD_ERROR;
if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
bool free_wagon = false;
@@ -736,7 +734,6 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
} else {
if (!v->IsPrimaryVehicle()) return CMD_ERROR;
}
if (!v->IsChainInDepot()) return CMD_ERROR;
const Company *c = Company::Get(_current_company);
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);
/* Stop the vehicle */
if (!was_stopped) cost.AddCost(DoCmdStartStopVehicle(v, true));
if (!was_stopped) cost.AddCost(CmdStartStopVehicle(v, true));
if (cost.Failed()) return cost;
assert(free_wagon || v->IsStoppedInDepot());
@@ -790,7 +787,7 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
}
/* 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);
@@ -799,29 +796,35 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlag flags, VehicleID veh_id)
/**
* Change engine renewal parameters
* @param tile unused
* @param flags operation to perform
* @param id_g engine group
* @param old_engine_type old engine type
* @param new_engine_type new engine type
* @param when_old replace when engine gets old?
* @param p1 packed data
* - bit 0 = replace when engine gets old?
* - bits 16-31 = engine group
* @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
*/
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);
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;
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 (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 (!Engine::IsValidID(new_engine_type)) 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 {
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 "road_gui.h"
#include "widgets/dropdown_func.h"
#include "autoreplace_cmd.h"
#include "group_cmd.h"
#include "settings_cmd.h"
#include "widgets/autoreplace_widget.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)
{
@@ -220,7 +217,7 @@ class ReplaceVehicleWindow : public Window {
{
EngineID veh_from = this->sel_engine[0];
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:
@@ -304,8 +301,8 @@ public:
case WID_RV_INFO_TAB: {
Dimension d = GetStringBoundingBox(STR_REPLACE_NOT_REPLACING);
d = maxdim(d, GetStringBoundingBox(STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED));
d.width += padding.width;
d.height += padding.height;
d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT;
d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
*size = maxdim(*size, d);
break;
}
@@ -422,7 +419,7 @@ public:
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;
}
@@ -433,7 +430,8 @@ public:
EngineID end = static_cast<EngineID>(std::min<size_t>(this->vscroll[side]->GetCapacity() + start, this->engines[side].size()));
/* 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;
}
}
@@ -484,10 +482,10 @@ public:
ted.cargo = e->GetDefaultCargoType();
ted.capacity = e->GetDisplayDefaultCapacity(&ted.mail_capacity);
const Rect r = this->GetWidget<NWidgetBase>(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS)->GetCurrentRect()
.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect);
int text_end = DrawVehiclePurchaseInfo(r.left, r.right, r.top, this->sel_engine[side], ted);
needed_height = std::max(needed_height, (text_end - r.top) / FONT_HEIGHT_NORMAL);
NWidgetBase *nwi = this->GetWidget<NWidgetBase>(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS);
int text_end = DrawVehiclePurchaseInfo(nwi->pos_x + WD_FRAMETEXT_LEFT, nwi->pos_x + nwi->current_x - WD_FRAMETEXT_RIGHT,
nwi->pos_y + WD_FRAMERECT_TOP, this->sel_engine[side], ted);
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.
@@ -543,10 +541,10 @@ public:
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: {
const Group *g = Group::GetIfValid(this->sel_group);
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 {
// 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;
}
@@ -564,7 +562,7 @@ public:
case WID_RV_STOP_REPLACE: { // Stop replacing
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;
}
@@ -580,16 +578,6 @@ public:
size_t engine_count = this->engines[click_side].size();
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
this->sel_engine[click_side] = e;
if (click_side == 0) {

View File

@@ -62,7 +62,8 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
Owner owner; ///< The owner of this station
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

View File

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

View File

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

View File

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

View File

@@ -29,7 +29,6 @@ static FBlitter_32bppSSE4_Anim iFBlitter_32bppSSE4_Anim;
*/
IGNORE_UNINITIALIZED_WARNING_START
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)
{
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 pack_low_cm = PACK_LOW_CONTROL_MASK;
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
const __m128i a_am = ALPHA_AND_MASK;
for (int y = bp->height; y != 0; y--) {
Colour *dst = dst_line;
@@ -145,7 +143,7 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL
/* Blend colours. */
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:
_mm_storel_epi64((__m128i *) dst, srcABCD);
bmno_full_transparency:
@@ -172,7 +170,7 @@ bmno_full_transparency:
} else {
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;
@@ -256,7 +254,7 @@ bmno_full_transparency:
/* Blend colours. */
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:
_mm_storel_epi64((__m128i *) dst, srcABCD);
bmcr_full_transparency:
@@ -289,7 +287,7 @@ bmcr_full_transparency:
if (src->a < 255) {
bmcr_alpha_blend_single:
__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);
}
@@ -368,12 +366,6 @@ IGNORE_UNINITIALIZED_WARNING_STOP
*/
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;
switch (mode) {
default: {

View File

@@ -16,10 +16,6 @@
#define SSE_VERSION 4
#endif
#ifndef SSE_TARGET
#define SSE_TARGET "sse4.1"
#endif
#ifndef FULL_ANIMATION
#define FULL_ANIMATION 1
#endif
@@ -32,7 +28,7 @@
#define MARGIN_NORMAL_THRESHOLD 4
/** 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:
public:
@@ -43,14 +39,13 @@ public:
return Blitter_32bppSSE_Base::Encode(sprite, allocator);
}
const char *GetName() override { return "32bpp-sse4-anim"; }
using Blitter_32bppSSE2_Anim::LookupColourInPalette;
};
/** Factory for the SSE4 32 bpp blitter (with palette animation). */
class FBlitter_32bppSSE4_Anim: public BlitterFactory {
public:
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 */

View File

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

View File

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

View File

@@ -12,7 +12,6 @@
#ifdef WITH_SSE
GNU_TARGET(SSE_TARGET)
static inline void InsertFirstUint32(const uint32 value, __m128i &into)
{
#if (SSE_VERSION >= 4)
@@ -23,7 +22,6 @@ static inline void InsertFirstUint32(const uint32 value, __m128i &into)
#endif
}
GNU_TARGET(SSE_TARGET)
static inline void InsertSecondUint32(const uint32 value, __m128i &into)
{
#if (SSE_VERSION >= 4)
@@ -34,7 +32,6 @@ static inline void InsertSecondUint32(const uint32 value, __m128i &into)
#endif
}
GNU_TARGET(SSE_TARGET)
static inline void LoadUint64(const uint64 value, __m128i &into)
{
#ifdef POINTER_IS_64BIT
@@ -49,7 +46,6 @@ static inline void LoadUint64(const uint64 value, __m128i &into)
#endif
}
GNU_TARGET(SSE_TARGET)
static inline __m128i PackUnsaturated(__m128i from, const __m128i &mask)
{
#if (SSE_VERSION == 2)
@@ -60,43 +56,36 @@ static inline __m128i PackUnsaturated(__m128i from, const __m128i &mask)
#endif
}
GNU_TARGET(SSE_TARGET)
static inline __m128i DistributeAlpha(const __m128i from, const __m128i &mask)
{
#if (SSE_VERSION == 2)
__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_andnot_si128(mask, alphaAB); // PANDN, set alpha fields to 0
return _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2
#else
return _mm_shuffle_epi8(from, mask);
#endif
}
GNU_TARGET(SSE_TARGET)
static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask, const __m128i &alpha_mask)
static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask)
{
__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 alphaMaskAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW (alpha > 0) ? 0xFFFF : 0
__m128i alphaAB = _mm_sub_epi16(srcAB, alphaMaskAB); // if (alpha > 0) a++;
__m128i alphaAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW, if (alpha > 0) a++;
alphaAB = _mm_srli_epi16(alphaAB, 15);
alphaAB = _mm_add_epi16(alphaAB, srcAB);
alphaAB = DistributeAlpha(alphaAB, distribution_mask);
srcAB = _mm_sub_epi16(srcAB, dstAB); // PSUBW, (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_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);
}
/* Darken 2 pixels.
* 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)
{
__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
GNU_TARGET(SSE_TARGET)
static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness)
{
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);
}
GNU_TARGET(SSE_TARGET)
static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightness)
{
#if (SSE_VERSION < 3)
@@ -205,7 +192,6 @@ static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightnes
*/
IGNORE_UNINITIALIZED_WARNING_START
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent>
GNU_TARGET(SSE_TARGET)
#if (SSE_VERSION == 2)
inline void Blitter_32bppSSE2::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
#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;
/* 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)
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 DARKEN_PARAM_1 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--) {
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
__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;
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) {
__m128i srcABCD = _mm_cvtsi32_si128(src->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;
@@ -334,7 +318,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
}
/* 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;
src += 2;
src_mv += 2;
@@ -363,7 +347,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
if (src->a < 255) {
bmcr_alpha_blend_single:
__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);
}

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_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 ALPHA_AND_MASK _mm_setr_epi16( 0, 0, 0, -1, 0, 0, 0, -1)
#endif /* WITH_SSE */
#endif /* BLITTER_32BPP_SSE_TYPE_H */

View File

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

View File

@@ -1,3 +1,5 @@
/* $Id$ */
/*
* 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.

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