mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2026-09-15 04:49:36 +00:00
Compare commits
1
Commits
1.3.0
..
1.3.0-beta1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c91b5dffd4 |
@@ -26,13 +26,11 @@ endif
|
||||
# An OSX application bundle needs the data files, lang files and openttd executable in a different location.
|
||||
ifdef OSXAPP
|
||||
AI_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/ai
|
||||
GAME_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/game
|
||||
BASESET_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/baseset
|
||||
LANG_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/lang
|
||||
TTD_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/MacOS
|
||||
else
|
||||
AI_DIR = $(BUNDLE_DIR)/ai
|
||||
GAME_DIR = $(BUNDLE_DIR)/game
|
||||
BASESET_DIR = $(BUNDLE_DIR)/baseset
|
||||
LANG_DIR = $(BUNDLE_DIR)/lang
|
||||
TTD_DIR = $(BUNDLE_DIR)
|
||||
@@ -47,7 +45,6 @@ bundle: all
|
||||
$(Q)mkdir -p "$(BUNDLE_DIR)/scripts"
|
||||
$(Q)mkdir -p "$(TTD_DIR)"
|
||||
$(Q)mkdir -p "$(AI_DIR)"
|
||||
$(Q)mkdir -p "$(GAME_DIR)"
|
||||
$(Q)mkdir -p "$(BASESET_DIR)"
|
||||
$(Q)mkdir -p "$(LANG_DIR)"
|
||||
ifdef OSXAPP
|
||||
@@ -62,7 +59,6 @@ ifeq ($(OS),UNIX)
|
||||
endif
|
||||
$(Q)cp "$(BIN_DIR)/$(TTD)" "$(TTD_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/ai/"compat_*.nut "$(AI_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/game/"compat_*.nut "$(GAME_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/baseset/"*.grf "$(BASESET_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/baseset/"*.obg "$(BASESET_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/baseset/"*.obs "$(BASESET_DIR)/"
|
||||
|
||||
+1
-2
@@ -36,7 +36,6 @@ endif
|
||||
|
||||
GRFCODEC := !!GRFCODEC!!
|
||||
NFORENUM := !!NFORENUM!!
|
||||
CC_BUILD := !!CC_BUILD!!
|
||||
MD5SUM := $(shell [ "$(OS)" = "OSX" ] && echo "md5 -r" || echo "md5sum")
|
||||
|
||||
# Some "should not be changed" settings.
|
||||
@@ -64,7 +63,7 @@ $(BIN_DIR)/openttd.grf: $(OBJS_DIR)/openttd.grf
|
||||
$(OBJS_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites
|
||||
$(E) '$(STAGE) Assembling openttd.nfo'
|
||||
$(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null
|
||||
$(Q) $(CC_BUILD) -nostdinc -I$(GRF_DIR) -C -E - < "$(GRF_DIR)/openttd.nfo" | sed -e '/^#/d' -e '/^$$/d' > $(OBJS_DIR)/sprites/openttd.nfo
|
||||
$(Q) gcc -I$(GRF_DIR) -C -E - < "$(GRF_DIR)/openttd.nfo" | sed -e '/^#/d' -e '/^$$/d' > $(OBJS_DIR)/sprites/openttd.nfo
|
||||
$(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo
|
||||
$(E) '$(STAGE) Compiling openttd.grf'
|
||||
$(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
|
||||
OPENTTD.GRF = c683a77e1a43aed7db29ef318b166dd9
|
||||
OPENTTD.GRF = 891f2dc7c81346d8fd5fbf4cf42dc5bd
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
||||
@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
|
||||
OPENTTD.GRF = c683a77e1a43aed7db29ef318b166dd9
|
||||
OPENTTD.GRF = 891f2dc7c81346d8fd5fbf4cf42dc5bd
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
||||
@@ -55,7 +55,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
|
||||
TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
|
||||
TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
|
||||
TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
|
||||
OPENTTD.GRF = c683a77e1a43aed7db29ef318b166dd9
|
||||
OPENTTD.GRF = 891f2dc7c81346d8fd5fbf4cf42dc5bd
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
||||
+3
-89
@@ -1,89 +1,3 @@
|
||||
1.3.0 (2013-04-01)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Station rebuilding could leave reserved tiles which caused crashes later on [FS#5510, FS#5516] (r25132)
|
||||
- Fix: When the count for a scrollbar was 0, the inter distance was subtracted too much causing a scrollbar with a negative size (r25123)
|
||||
|
||||
|
||||
1.3.0-RC3 (2013-03-18)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Limit aircraft property 0D to 19, since the conversion result to km-ish/h needs to fit into a byte [FS#5492] (r25099)
|
||||
- Fix: Clicking the statusbar crashed, when news were pending but no news were shown yet [FS#5486] (r25093)
|
||||
- Fix: Make editbox character filters also apply to pasted content from clipboard (r25090, r25089)
|
||||
- Fix: Catch exception anonymously, if the exception content is not of interest [FS#5500] (r25081)
|
||||
|
||||
|
||||
1.3.0-RC2 (2013-03-05)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Make sizes of the station preview list and direction selection identical in the station build window [FS#5472] (r25064)
|
||||
- Fix: When allocation of the sprite cache fails, try to allocate less memory and display an error message later on (r25061)
|
||||
- Fix: Refactor Script Debug GUI to only set widget states in OnInvalidateData [FS#5490] (r25052)
|
||||
- Fix: Do not let gcc include files from the "standard C" include directories to avoid inclusion of header files at the top of the preprocessed nfo files, which cause NFOrenum/GRFcodec to make invalid assumptions about the NFO version (r25050)
|
||||
- Fix: Minimise gaps feature caused removal to only happen at the signal build interval instead of the implicit interval of 1 [FS#5479] (r25038)
|
||||
- Fix: Green path signals would be shown when building them 'under' a train, and they would keep showing green until they were passed again [FS#5480] (r25037)
|
||||
|
||||
|
||||
1.3.0-RC1 (2013-02-19)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: Searching of (missing) content via GrfCrawler (r25024, r25023)
|
||||
- Change: Cleanup goals and cargo monitors of companies when they go bankrupt or are taken over (r24986)
|
||||
- Change: Apply the same name sorting rules to content and NewGRF list as for the server list (r24983)
|
||||
- Fix: [SDL] Crash after bootstrap download of 32bits base set due to referencing a deleted mutex [FS#5466] (r25017)
|
||||
- Fix: [SDL] Improve 8bpp hardware palette support. Instead of always requesting SDL_HWPALETTE, it is now only done for 8bp blitters in fullscreen mode (r25003, r25002, r24993)
|
||||
- Fix: Set vehicle's service interval is percent flag appropriately on creation [FS#5137] (r24998)
|
||||
- Fix: When choosing a train in a depot to attach a newly purchased wagon to, do not consider trains currently moving in and out of the depot (r24987)
|
||||
- Fix: [Script] Crash when passing too many parameters [FS#5465] (r24982, r24981, r24980)
|
||||
|
||||
|
||||
1.3.0-beta2 (2013-02-07)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: [NewGRF] Station randomisation triggers (r24906, r24905)
|
||||
- Feature: Settings type filter included in the advanced settings GUI (r24862, r24863)
|
||||
- Change: Revert to opening the vehicle GUI again when cloning vehicles using the clone-button from the depot GUI [FS#4458] (r24955)
|
||||
- Fix: Additional zoom in levels could glitch by a few pixels due to incorrect rounding [FS#5463] (r24975)
|
||||
- Fix: Honour pause_on_newgame setting when running as a dedicated server [FS#5279] (r24974)
|
||||
- Fix: [NewGRF] Prevent access to tile-based variables when tile is invalid [FS#5462] (r24973)
|
||||
- Fix: Do not make overbuilding rivers with canals insanely expensive [FS#5258] (r24972)
|
||||
- Fix: Crash when an infinite loop occurred during loading of a script [FS#5346] (r24970)
|
||||
- Fix: company window was not updated when shares were enabled/disabled [FS#5379] (r24968)
|
||||
- Fix: Trams would get stuck on water [FS#5228] (r24966)
|
||||
- Fix: With YAPF the docking behaviour differed per direction; now favour docking in the direction you approached [FS#5416] (r24964)
|
||||
- Fix: Do not stop loading if there are reservations left [FS#5435] (r24963)
|
||||
- Fix: Reserve all capacity while unloading to avoid 'stealing' cargo, i.e. loading cargo onto a second vehicle when the first cannot be fully filled yet [FS#5438] (r24962)
|
||||
- Fix: If a platform is enlarged and there is a reservation, reserve the whole platform [FS#5362] (r24961)
|
||||
- Fix: Inconsistencies in the 'thanks to' lists [FS#5423] (r24960)
|
||||
- Fix: Set 'replace when old' flag when replacing an autoreplace (r24950)
|
||||
- Fix: Deleting implicit orders was not able to deal with the various side-effects of DeleteOrder [FS#5452] (r24944)
|
||||
- Fix: Redraw autoreplace window properly in network games (r24939)
|
||||
- Fix: Never put a space between cargo name and subtype [FS#5447] (r24938)
|
||||
- Fix: Do not allow order refit to be set for no-load orders [FS#5446] (r24936)
|
||||
- Fix: Make group names unique per company and vehicle type [FS#3473] (r24933)
|
||||
- Fix: Prevent more NewGRFs being selected than is possible to load [FS#5158] (r24932)
|
||||
- Fix: [GS] Do not try to pause or unpause crashed scripts [FS#5415] (r24929)
|
||||
- Fix: [Squirrel] Update line information before processing 'while' token of 'do'-'while' statement [FS#5408] (r24928)
|
||||
- Fix: Add a tooltip to the mapsize selection mentioning possible deviations [FS#5395] (r24925)
|
||||
- Fix: When an object built on a river is removed, restore the river [FS#5441] (r24923)
|
||||
- Fix: Upgrading bridges could steal road types [FS#5389] (r24912)
|
||||
- Fix: [GS] Allow GSs to pass negative integer string parameters (r24908)
|
||||
- Fix: 'Train loads/unloads cargo' station animation triggers on individual platform (r24904)
|
||||
- Fix: Cached station animation triggers were only set when removing parts of a station (r24903)
|
||||
- Fix: The station build window did not update when the station spread changed [FS#5434] (r24899)
|
||||
- Fix: Do not unpause the game when closing the highscore window if it was already paused before the highscore screen was shown (r24898)
|
||||
- Fix: Improvements and fixes for the base translation [FS#5411, FS#5420, FS#5421, FS#5422, FS#5427] (r24896, r24875, r24872, r24869)
|
||||
- Fix: Allow downgrade of road bridges in the scenario editor [FS#5436] (r24895)
|
||||
- Fix: Invalidate station selection window when station spread changes [FS#5434] (r24894)
|
||||
- Fix: Distribute GS compat_<version>.nut with OpenTTD (r24890)
|
||||
- Fix: Pass proper UTF-16 strings instead of UCS-2 to ICU in order to preserve characters outside the BMP (r24885)
|
||||
- Fix: A completely emptied vehicle could trigger an assert (r24883)
|
||||
- Fix: Desync when NewGRF changes the stats related to acceleration (power, weight, tractive effort, etc) during service or 32 day triggers (r24882)
|
||||
- Fix: Incorrect Romanian own name (r24874)
|
||||
- Fix: Make invalid sprite references to mapgen sprites behave the same as invalid references between recolour and real sprites [FS#5404] (r24858)
|
||||
- Fix: Do not let UFOs and coal mines clear water (r24857)
|
||||
- Fix: Do not let UFOs and coal mines destroy depots [FS#5406] (r24856)
|
||||
- Fix: Do not send aircraft to depots that are out of range of the next destination [FS#5405] (r24855)
|
||||
- Fix: Only consider vehicles available in the climate for purchase/depot cell size (r24854)
|
||||
- Fix: Extend widget data member to 32 bits so that sprite IDs >= 2^16 can be used (r24853)
|
||||
|
||||
|
||||
1.3.0-beta1 (2012-12-24)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: Advanced settings to disable certain sound effects (r24846)
|
||||
@@ -171,8 +85,8 @@
|
||||
- Change: [NewGRF] Make bounding boxes of road vehicles change according to the vehicle length to make alignment easier [FS#5204] (r24331)
|
||||
- Fix: [NewGRF] Consider regearing-like cargos as no-cargo in cargo filters [FS#5386] (r24848)
|
||||
- Fix: [NewGRF] Draw NewGRF railtypes in NewGRF station previews (r24840)
|
||||
- Fix: Do not consider blocked rail station tiles that display wires as non-reachable for masking out unnecessary catenary wires (r24837)
|
||||
- Fix: The autorefit dropdown in the order GUI was not always updated when modifying vehicle consists [FS#5396] (r24834)
|
||||
- Fix: Don't consider blocked rail station tiles that display wires as non-reachable for masking out unnecessary catenary wires (r24837)
|
||||
- Fix: The autorefit dropdown in the order GUI wasn't always updated when modifying vehicle consists [FS#5396] (r24834)
|
||||
- Fix: [NewGRF] Incorrect values are better than a crash when a NewGRF queries vehicle variable 4C before vehicle initialisation is completed [FS#5398] (r24831)
|
||||
- Fix: determineversion.vbs could hang in a git checkout (r24826)
|
||||
- Fix: Close pending preview windows when the engine is introduced to everyone (r24812)
|
||||
@@ -412,7 +326,7 @@
|
||||
- Fix: [SDL] Handle the SDL_VIDEOEXPOSE event to solve issues with SDL 1.3 (r23910)
|
||||
- Fix: [SDL] Fix keyboard-related segfault when compiling against SDL 1.3 (r23909)
|
||||
- Fix: [Makefile] Make sure bin/baseset/openttd.32.bmp is removed on make clean (r23908)
|
||||
- Fix: [Makefile] Let 'make clean --dry-run' not delete Makefiles (r23907)
|
||||
- Fix: [Makefile] Let "make clean --dry-run" not delete Makefiles (r23907)
|
||||
- Fix: [Windows installer] OpenMSX got downloaded to and extracted in the wrong (non-existent) folder [FS#5045] (r23905)
|
||||
- Fix: Memory leak everytime one clicked a savegame in the load GUI (r23901)
|
||||
- Fix: [NewGRF] It was not possible to import sounds from a NewGRF later in the load order (r23883)
|
||||
|
||||
+8
-11
@@ -57,8 +57,8 @@ set_default() {
|
||||
enable_translator="0"
|
||||
enable_unicode="1"
|
||||
enable_console="1";
|
||||
enable_assert="0"
|
||||
enable_strip="1"
|
||||
enable_assert="1"
|
||||
enable_strip="0"
|
||||
enable_universal="0"
|
||||
enable_osx_g5="0"
|
||||
enable_cocoa_quartz="1"
|
||||
@@ -3169,9 +3169,9 @@ detect_grfcodec() {
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "949" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "949" ]; then
|
||||
log 1 "checking grfcodec... needs at least version 6.0.2 (r949), disabled"
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "913" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "913" ]; then
|
||||
log 1 "checking grfcodec... needs at least version 5.1.4 (r913), disabled"
|
||||
else
|
||||
log 1 "checking grfcodec... not found"
|
||||
fi
|
||||
@@ -3211,9 +3211,9 @@ detect_nforenum() {
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "949" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "949" ]; then
|
||||
log 1 "checking nforenum... needs at least version 6.0.2 (r949), disabled"
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "913" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "913" ]; then
|
||||
log 1 "checking nforenum... needs at least version 5.1.4 (r913), disabled"
|
||||
else
|
||||
log 1 "checking nforenum... not found"
|
||||
fi
|
||||
@@ -3648,9 +3648,6 @@ showhelp() {
|
||||
echo " LDFLAGS linker flags, e.g. -L<lib dir> if you"
|
||||
echo " have libraries in a nonstandard"
|
||||
echo " directory <lib dir>"
|
||||
echo " CFLAGS_BUILD C compiler flags for build time tool generation"
|
||||
echo " CXXFLAGS_BUILD C++ compiler flags for build time tool generation"
|
||||
echo " LDFLAGS_BUILD linker flags for build time tool generation"
|
||||
echo ""
|
||||
echo "Use these variables to override the choices made by 'configure' or to help"
|
||||
echo "it to find libraries and programs with nonstandard names/locations."
|
||||
|
||||
+32
-8
@@ -1,13 +1,14 @@
|
||||
OpenTTD's known bugs
|
||||
Last updated: 2013-04-01
|
||||
Release version: 1.3.0
|
||||
Last updated: 2012-06-01
|
||||
Release version: 1.2.1
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) About
|
||||
2.0) Known bugs
|
||||
2.0) Known bugs in this release
|
||||
* 2.1) Known bugs that will not be solved
|
||||
|
||||
|
||||
1.0) About
|
||||
@@ -16,13 +17,36 @@ All bugs listed below are marked as known. Please do not submit any bugs
|
||||
that are the same as these. If you do, do not act surprised, because
|
||||
we WILL flame you!!
|
||||
|
||||
The current list of known bugs that we intend to fix can be found in our
|
||||
bug tracking system at: http://bugs.openttd.org
|
||||
Also check the closed bugs when searching for your bug in this system as
|
||||
we might have fixed the bug in the mean time.
|
||||
Of course if you have more knowledge about any of these bugs, have more
|
||||
specifics, we welcome you to report them. React to the given bug indicated
|
||||
by the number below on http://bugs.openttd.org.
|
||||
|
||||
|
||||
2.0) Known bugs
|
||||
2.0) Known bugs in this release
|
||||
---- --------------------------
|
||||
The following bugs are known to exist in this release and we intend to
|
||||
fix them. Some bugs are known but are not fixable or fixing them would
|
||||
cause further problems. Those bugs can be found in the "Known bugs that
|
||||
will not be solved" section.
|
||||
|
||||
The bugs in this section all refer to a ticket in our bug tracking system
|
||||
that you can find at: http://bugs.openttd.org
|
||||
If the bugs are closed but still listed here it means that the bug is fixed
|
||||
and that the nightlies and next major release will not have that bug.
|
||||
|
||||
Issues prefixed with [OSX] are required to be fixed before we consider
|
||||
officially supporting Mac OS X again. For now it remains unsupported and
|
||||
we only apply bug fixes provided by the community but we are unable to fix
|
||||
these bugs ourselves.
|
||||
|
||||
- 4857 [OSX] No support for detecting mono space font
|
||||
- 4847 [OSX] No support for bootstrap downloading of base graphics
|
||||
- 4744 [OSX] Crash when switching to full screen with OS X Lion
|
||||
- 4689 [OSX] Crash when hiding window after coming from full screen
|
||||
- 4420 [OSX] OS' mouse pointer still shows
|
||||
- 2484 [OSX] Cannot enter CJK characters
|
||||
|
||||
2.1) Known bugs that will not be solved
|
||||
---- ----------------------------------
|
||||
This section lists all known bugs that we do not intend to fix and the
|
||||
reasons why we think that fixing them is infeasible. We might make some
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
// 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 "OpenTTD GUI graphics"
|
||||
-1 * 3 05 15 \b 168 // OPENTTD_SPRITE_COUNT
|
||||
-1 * 3 05 15 A8
|
||||
-1 sprites/openttdgui.png 8bpp 66 8 64 31 -31 7 normal
|
||||
-1 sprites/openttdgui.png 8bpp 146 8 64 31 -31 7 normal
|
||||
-1 sprites/openttdgui.png 8bpp 226 8 64 31 -31 7 normal
|
||||
|
||||
+47
-77
@@ -1,308 +1,278 @@
|
||||
openttd (1.3.0-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 01 Apr 2013 00:00:00 +0200
|
||||
|
||||
openttd (1.3.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-RC3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 18 Mar 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Tue, 05 Mar 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Tue, 19 Feb 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-beta2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 07 Feb 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~beta1) unstable; urgency=low
|
||||
openttd (1.3.0-beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-beta1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 24 Dec 2012 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 24 Dec 2012 00:00:00 +0100
|
||||
|
||||
openttd (1.2.3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 01 Nov 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 01 Nov 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.3~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.3-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 17 Oct 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 17 Oct 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 16 Aug 2012 20:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 16 Aug 2012 20:00:00 +0200
|
||||
|
||||
openttd (1.2.2~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.2-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 01 Aug 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Aug 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 01 Jun 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 01 Jun 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.1~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.1-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 16 Apr 2012 22:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 16 Apr 2012 22:00:00 +0200
|
||||
|
||||
openttd (1.2.0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 15 Apr 2012 14:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 15 Apr 2012 14:00:00 +0200
|
||||
|
||||
openttd (1.2.0~RC4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 01 Apr 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 01 Apr 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 18 Mar 2012 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 18 Mar 2012 18:00:00 +0100
|
||||
|
||||
openttd (1.2.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 04 Mar 2012 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 04 Mar 2012 18:00:00 +0100
|
||||
|
||||
openttd (1.2.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 19 Feb 2012 23:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 19 Feb 2012 23:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 04 Feb 2012 16:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 04 Feb 2012 16:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 21 Jan 2012 16:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 21 Jan 2012 16:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 07 Jan 2012 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 07 Jan 2012 00:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 24 Dec 2011 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 24 Dec 2011 00:00:00 +0100
|
||||
|
||||
openttd (1.1.4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 05 Dec 2011 00:00:00 +0400
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 05 Dec 2011 00:00:00 +0400
|
||||
|
||||
openttd (1.1.4-RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.4-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 20 Nov 2011 17:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 20 Nov 2011 17:00:00 +0100
|
||||
|
||||
openttd (1.1.3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 15 Sep 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 15 Sep 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.3-RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.3-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 04 Sep 2011 17:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 04 Sep 2011 17:00:00 +0200
|
||||
|
||||
openttd (1.1.2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 14 Aug 2011 17:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 14 Aug 2011 17:00:00 +0200
|
||||
|
||||
openttd (1.1.2~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.2-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 30 Jul 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 30 Jul 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.2~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.2-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 24 Jul 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 24 Jul 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 01 Jun 2011 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Jun 2011 00:00:00 +0200
|
||||
|
||||
openttd (1.1.1~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.1-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 15 May 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 15 May 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 01 Apr 2011 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 01 Apr 2011 00:00:00 +0100
|
||||
|
||||
openttd (1.1.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-RC3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 18 Mar 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 18 Mar 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 04 Mar 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 04 Mar 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 18 Feb 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 18 Feb 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta5) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta5
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 04 Feb 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 04 Feb 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 21 Jan 2011 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 21 Jan 2011 00:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 09 Jan 2011 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 09 Jan 2011 18:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 31 Dec 2010 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 31 Dec 2010 18:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 24 Dec 2010 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 24 Dec 2010 00:00:00 +0100
|
||||
|
||||
openttd (1.0.5-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.5
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 20 Nov 2010 21:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 20 Nov 2010 21:00:00 +0000
|
||||
|
||||
openttd (1.0.5~rc2-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.5~rc2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 14 Nov 2010 15:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 14 Nov 2010 15:00:00 +0000
|
||||
|
||||
openttd (1.0.5~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.5-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 31 Oct 2010 15:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 31 Oct 2010 15:00:00 +0000
|
||||
|
||||
openttd (1.0.4-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Tue, 14 Sep 2010 20:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 14 Sep 2010 20:00:00 +0000
|
||||
|
||||
openttd (1.0.4~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.4-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 30 Aug 2010 20:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 30 Aug 2010 20:00:00 +0000
|
||||
|
||||
openttd (1.0.3-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 01 Aug 2010 00:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 01 Aug 2010 00:00:00 +0000
|
||||
|
||||
openttd (1.0.3~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.3-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 05 Jul 2010 17:37:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 05 Jul 2010 17:37:21 +0000
|
||||
|
||||
openttd (1.0.2-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 19 Jun 2010 18:36:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 19 Jun 2010 18:36:21 +0000
|
||||
|
||||
openttd (1.0.2~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.2-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 05 Jun 2010 23:36:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 05 Jun 2010 23:36:21 +0000
|
||||
|
||||
openttd (1.0.1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 01 May 2010 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 01 May 2010 00:00:00 +0200
|
||||
|
||||
openttd (1.0.1~rc2-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.1-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 21 Apr 2010 21:36:21 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 21 Apr 2010 21:36:21 +0200
|
||||
|
||||
openttd (1.0.1~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.1-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 17 Apr 2010 23:36:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 17 Apr 2010 23:36:21 +0000
|
||||
|
||||
openttd (1.0.0-1) unstable; urgency=low
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@echo off
|
||||
|
||||
set OPENTTD_VERSION=1.3.0
|
||||
set OPENTTD_VERSION=1.3.0-beta1
|
||||
set OPENSFX_VERSION=0.8.0
|
||||
set NOSOUND_VERSION=0.8.0
|
||||
set OPENGFX_VERSION=1.2.0
|
||||
|
||||
+2
-4
@@ -17,9 +17,9 @@
|
||||
#
|
||||
|
||||
Name: openttd
|
||||
Version: 1.3.beta2
|
||||
Version: 1.3.beta1
|
||||
Release: 0
|
||||
%define srcver 1.3.0-beta2
|
||||
%define srcver 1.3.0-beta1
|
||||
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
|
||||
License: GPL-2.0
|
||||
Group: Amusements/Games/Strategy/Other
|
||||
@@ -227,13 +227,11 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
||||
%dir %{_datadir}/%{name}/baseset
|
||||
%dir %{_datadir}/%{name}/scripts
|
||||
%dir %{_datadir}/%{name}/ai
|
||||
%dir %{_datadir}/%{name}/game
|
||||
%{_datadir}/doc/%{name}/*
|
||||
%{_datadir}/%{name}/lang/*
|
||||
%{_datadir}/%{name}/baseset/*
|
||||
%{_datadir}/%{name}/scripts/*
|
||||
%{_datadir}/%{name}/ai/*
|
||||
%{_datadir}/%{name}/game/*
|
||||
%doc %{_mandir}/man6/%{name}.6.*
|
||||
|
||||
%files gui
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
!define APPV_MAJOR 1
|
||||
!define APPV_MINOR 3
|
||||
!define APPV_MAINT 0
|
||||
!define APPV_BUILD 5
|
||||
!define APPV_EXTRA ""
|
||||
!define APPV_BUILD 0
|
||||
!define APPV_EXTRA "-beta1"
|
||||
|
||||
!define APPNAME "OpenTTD" ; Define application name
|
||||
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version
|
||||
@@ -124,10 +124,6 @@ Section "!OpenTTD" Section1
|
||||
SetOutPath "$INSTDIR\ai\"
|
||||
File ${PATH_ROOT}bin\ai\compat_*.nut
|
||||
|
||||
; Copy Game Script files
|
||||
SetOutPath "$INSTDIR\game\"
|
||||
File ${PATH_ROOT}bin\game\compat_*.nut
|
||||
|
||||
; Copy data files
|
||||
SetOutPath "$INSTDIR\baseset\"
|
||||
File ${PATH_ROOT}bin\baseset\*.grf
|
||||
@@ -402,9 +398,6 @@ Section "Uninstall"
|
||||
; AI files
|
||||
Delete "$INSTDIR\ai\compat_*.nut"
|
||||
|
||||
; Game Script files
|
||||
Delete "$INSTDIR\game\compat_*.nut"
|
||||
|
||||
; Baseset files
|
||||
Delete "$INSTDIR\baseset\opntitle.dat"
|
||||
Delete "$INSTDIR\baseset\openttd.grf"
|
||||
@@ -476,7 +469,6 @@ Section "Uninstall"
|
||||
RMDir "$SMPROGRAMS\$SHORTCUTS\Docs\"
|
||||
RMDir "$SMPROGRAMS\$SHORTCUTS"
|
||||
RMDir "$INSTDIR\ai"
|
||||
RMDir "$INSTDIR\game"
|
||||
RMDir "$INSTDIR\data"
|
||||
RMDir "$INSTDIR\baseset"
|
||||
RMDir "$INSTDIR\gm"
|
||||
|
||||
@@ -59,12 +59,6 @@
|
||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\lang\arabic_egypt.lng;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\basque.txt">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating basque language file</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"</Command>
|
||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\lang\basque.lng;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\belarusian.txt">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating belarusian language file</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"</Command>
|
||||
|
||||
@@ -13,9 +13,6 @@
|
||||
<CustomBuild Include="..\src\lang\arabic_egypt.txt">
|
||||
<Filter>Translations</Filter>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\basque.txt">
|
||||
<Filter>Translations</Filter>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\belarusian.txt">
|
||||
<Filter>Translations</Filter>
|
||||
</CustomBuild>
|
||||
|
||||
@@ -93,21 +93,6 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\basque.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating basque language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
exit 0
"
|
||||
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
|
||||
Outputs="..\bin\lang\basque.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\belarusian.txt"
|
||||
>
|
||||
|
||||
@@ -94,21 +94,6 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\basque.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating basque language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
exit 0
"
|
||||
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
|
||||
Outputs="..\bin\lang\basque.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\belarusian.txt"
|
||||
>
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@@ -204,7 +204,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@@ -204,7 +204,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -257,7 +257,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -257,7 +257,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -255,7 +255,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -255,7 +255,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
|
||||
+4
-3
@@ -1,6 +1,6 @@
|
||||
OpenTTD readme
|
||||
Last updated: 2013-04-01
|
||||
Release version: 1.3.0
|
||||
Last updated: 2012-12-24
|
||||
Release version: 1.3.0-beta1
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -670,7 +670,7 @@ Retired Developers:
|
||||
|
||||
Thanks to:
|
||||
Josef Drexler - For his great work on TTDPatch.
|
||||
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and track foundations
|
||||
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and graphics (signals and track foundations)
|
||||
Petr Baudiš (pasky) - Many patches, newgrf support, etc.
|
||||
Simon Sasburg (HackyKid) - For the many bugfixes he has blessed us with
|
||||
Stefan Meißner (sign_de) - For his work on the console
|
||||
@@ -684,6 +684,7 @@ Thanks to:
|
||||
George - Canal graphics
|
||||
Andrew Parkhouse (andythenorth) - River graphics
|
||||
David Dallaston (Pikka) - Tram tracks
|
||||
Marcin Grzegorczyk - Foundations for tracks on slopes,
|
||||
All Translators - For their support to make OpenTTD a truly international game
|
||||
Bug Reporters - Thanks for all bug reports
|
||||
Chris Sawyer - For an amazing game!
|
||||
|
||||
@@ -917,7 +917,6 @@ public:
|
||||
_last_stacksize = _fs->GetStackSize();
|
||||
Statement();
|
||||
CleanStack(stacksize);
|
||||
_fs->AddLineInfos(_lex._currentline, _lineinfo, true);
|
||||
Expect(TK_WHILE);
|
||||
SQInteger continuetrg = _fs->GetCurrentPos();
|
||||
Expect(_SC('(')); CommaExpr(); Expect(_SC(')'));
|
||||
|
||||
+1
-1
@@ -1190,7 +1190,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
|
||||
throw;
|
||||
}
|
||||
|
||||
_callsstacksize = cstksize;
|
||||
assert(cstksize == _callsstacksize);
|
||||
|
||||
_nnativecalls--;
|
||||
suspend = false;
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ typedef std::map<const char *, class ScriptInfo *, StringCompare> ScriptInfoList
|
||||
class AI {
|
||||
public:
|
||||
/**
|
||||
* The default months AIs start after each other.
|
||||
* The default months AIs start after eachother.
|
||||
*/
|
||||
enum StartNext {
|
||||
START_NEXT_EASY = DAYS_IN_YEAR * 2,
|
||||
|
||||
+1
-1
@@ -197,7 +197,7 @@
|
||||
|
||||
/* static */ void AI::ResetConfig()
|
||||
{
|
||||
/* Check for both newgame as current game if we can reload the AIInfo inside
|
||||
/* Check for both newgame as current game if we can reload the AIInfo insde
|
||||
* the AIConfig. If not, remove the AI from the list (which will assign
|
||||
* a random new AI on reload). */
|
||||
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
|
||||
|
||||
+110
-115
@@ -987,56 +987,6 @@ struct AIDebugWindow : public Window {
|
||||
return (ScriptLog::LogData *)Company::Get(ai_debug_company)->ai_instance->GetLogPointer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the currently selected AI/GS is dead.
|
||||
* @return true if dead.
|
||||
*/
|
||||
bool IsDead() const
|
||||
{
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
GameInstance *game = Game::GetInstance();
|
||||
return game == NULL || game->IsDead();
|
||||
}
|
||||
return !Company::IsValidAiID(ai_debug_company) || Company::Get(ai_debug_company)->ai_instance->IsDead();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a company is a valid AI company or GS.
|
||||
* @param company Company to check for validity.
|
||||
* @return true if company is valid for debugging.
|
||||
*/
|
||||
bool IsValidDebugCompany(CompanyID company) const
|
||||
{
|
||||
switch (company) {
|
||||
case INVALID_COMPANY: return false;
|
||||
case OWNER_DEITY: return Game::GetInstance() != NULL;
|
||||
default: return Company::IsValidAiID(company);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that \c ai_debug_company refers to a valid AI company or GS, or is set to #INVALID_COMPANY.
|
||||
* If no valid company is selected, it selects the first valid AI or GS if any.
|
||||
*/
|
||||
void SelectValidDebugCompany()
|
||||
{
|
||||
/* Check if the currently selected company is still active. */
|
||||
if (this->IsValidDebugCompany(ai_debug_company)) return;
|
||||
|
||||
ai_debug_company = INVALID_COMPANY;
|
||||
|
||||
const Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
if (c->is_ai) {
|
||||
ChangeToAI(c->index);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* If no AI is available, see if there is a game script. */
|
||||
if (Game::GetInstance() != NULL) ChangeToAI(OWNER_DEITY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for the window.
|
||||
* @param desc The description of the window.
|
||||
@@ -1051,6 +1001,14 @@ struct AIDebugWindow : public Window {
|
||||
this->FinishInitNested(desc, number);
|
||||
|
||||
if (!this->show_break_box) break_check_enabled = false;
|
||||
/* Disable the companies who are not active or not an AI */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
this->SetWidgetDisabledState(i + WID_AID_COMPANY_BUTTON_START, !Company::IsValidAiID(i));
|
||||
}
|
||||
this->EnableWidget(WID_AID_SCRIPT_GAME);
|
||||
this->DisableWidget(WID_AID_RELOAD_TOGGLE);
|
||||
this->DisableWidget(WID_AID_SETTINGS);
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
|
||||
this->last_vscroll_pos = 0;
|
||||
this->autoscroll = true;
|
||||
@@ -1061,8 +1019,17 @@ struct AIDebugWindow : public Window {
|
||||
/* Restore the break string value from static variable */
|
||||
this->break_editbox.text.Assign(this->break_string);
|
||||
|
||||
this->SelectValidDebugCompany();
|
||||
this->InvalidateData(-1);
|
||||
/* Restore button state from static class variables */
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !Game::IsPaused());
|
||||
} else if (ai_debug_company != INVALID_COMPANY) {
|
||||
this->LowerWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !AI::IsPaused(ai_debug_company));
|
||||
}
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
|
||||
}
|
||||
|
||||
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
|
||||
@@ -1075,31 +1042,67 @@ struct AIDebugWindow : public Window {
|
||||
|
||||
virtual void OnPaint()
|
||||
{
|
||||
this->SelectValidDebugCompany();
|
||||
/* Check if the currently selected company is still active. */
|
||||
if (ai_debug_company == INVALID_COMPANY || (ai_debug_company != OWNER_DEITY && !Company::IsValidAiID(ai_debug_company))) {
|
||||
if (ai_debug_company != INVALID_COMPANY) {
|
||||
/* Raise the widget for the previous selection. */
|
||||
this->RaiseWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
|
||||
ai_debug_company = INVALID_COMPANY;
|
||||
}
|
||||
|
||||
const Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
if (c->is_ai) {
|
||||
/* Lower the widget corresponding to this company. */
|
||||
this->LowerWidget(c->index + WID_AID_COMPANY_BUTTON_START);
|
||||
|
||||
ai_debug_company = c->index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If no AI is available, see if there is a game script. */
|
||||
if (ai_debug_company == INVALID_COMPANY && Game::GetInstance() != NULL) {
|
||||
/* Lower the widget corresponding to the game script. */
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
|
||||
ai_debug_company = OWNER_DEITY;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update "Reload AI" and "AI settings" buttons */
|
||||
this->SetWidgetDisabledState(WID_AID_SETTINGS, ai_debug_company == INVALID_COMPANY);
|
||||
this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == OWNER_DEITY);
|
||||
this->SetWidgetDisabledState(WID_AID_SCRIPT_GAME, Game::GetGameInstance() == NULL);
|
||||
|
||||
/* Draw standard stuff */
|
||||
this->DrawWidgets();
|
||||
|
||||
if (this->IsShaded()) return; // Don't draw anything when the window is shaded.
|
||||
|
||||
bool dirty = false;
|
||||
|
||||
/* Paint the company icons */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
NWidgetCore *button = this->GetWidget<NWidgetCore>(i + WID_AID_COMPANY_BUTTON_START);
|
||||
bool dirty = false;
|
||||
|
||||
bool valid = Company::IsValidAiID(i);
|
||||
|
||||
/* Check whether the validity of the company changed */
|
||||
dirty |= (button->IsDisabled() == valid);
|
||||
bool disabled = !valid;
|
||||
if (button->IsDisabled() != disabled) {
|
||||
/* Invalid/non-AI companies have button disabled */
|
||||
button->SetDisabled(disabled);
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
/* Mark dead/paused AIs by setting the background colour. */
|
||||
bool dead = valid && Company::Get(i)->ai_instance->IsDead();
|
||||
bool paused = valid && Company::Get(i)->ai_instance->IsPaused();
|
||||
/* Re-paint if the button was updated.
|
||||
* (note that it is intentional that SetScriptButtonColour is always called) */
|
||||
dirty |= SetScriptButtonColour(*button, dead, paused);
|
||||
dirty = SetScriptButtonColour(*button, dead, paused) || dirty;
|
||||
|
||||
/* Do we need a repaint? */
|
||||
if (dirty) this->SetDirty();
|
||||
/* Draw company icon only for valid AI companies */
|
||||
if (!valid) continue;
|
||||
|
||||
@@ -1109,14 +1112,13 @@ struct AIDebugWindow : public Window {
|
||||
|
||||
/* Set button colour for Game Script. */
|
||||
GameInstance *game = Game::GetInstance();
|
||||
bool valid = game != NULL;
|
||||
bool dead = valid && game->IsDead();
|
||||
bool paused = valid && game->IsPaused();
|
||||
|
||||
bool dead = game != NULL && game->IsDead();
|
||||
bool paused = game != NULL && game->IsPaused();
|
||||
NWidgetCore *button = this->GetWidget<NWidgetCore>(WID_AID_SCRIPT_GAME);
|
||||
dirty |= (button->IsDisabled() == valid) || SetScriptButtonColour(*button, dead, paused);
|
||||
|
||||
if (dirty) this->InvalidateData(-1);
|
||||
if (SetScriptButtonColour(*button, dead, paused)) {
|
||||
/* Re-paint if the button was updated. */
|
||||
this->SetWidgetDirty(WID_AID_SCRIPT_GAME);
|
||||
}
|
||||
|
||||
/* If there are no active companies, don't display anything else. */
|
||||
if (ai_debug_company == INVALID_COMPANY) return;
|
||||
@@ -1218,19 +1220,30 @@ struct AIDebugWindow : public Window {
|
||||
*/
|
||||
void ChangeToAI(CompanyID show_ai)
|
||||
{
|
||||
if (!this->IsValidDebugCompany(show_ai)) return;
|
||||
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->RaiseWidget(WID_AID_SCRIPT_GAME);
|
||||
} else {
|
||||
this->RaiseWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
}
|
||||
ai_debug_company = show_ai;
|
||||
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
this->vscroll->SetCount((log == NULL) ? 0 : log->used);
|
||||
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !Game::IsPaused());
|
||||
} else {
|
||||
this->LowerWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !AI::IsPaused(ai_debug_company));
|
||||
}
|
||||
|
||||
this->highlight_row = -1; // The highlight of one AI make little sense for another AI.
|
||||
|
||||
/* Close AI settings window to prevent confusion */
|
||||
DeleteWindowByClass(WC_AI_SETTINGS);
|
||||
|
||||
this->InvalidateData(-1);
|
||||
|
||||
this->autoscroll = true;
|
||||
this->last_vscroll_pos = this->vscroll->GetPosition();
|
||||
this->SetDirty();
|
||||
/* Close AI settings window to prevent confusion */
|
||||
DeleteWindowByClass(WC_AI_SETTINGS);
|
||||
}
|
||||
|
||||
virtual void OnClick(Point pt, int widget, int click_count)
|
||||
@@ -1261,22 +1274,24 @@ struct AIDebugWindow : public Window {
|
||||
|
||||
case WID_AID_BREAK_STR_ON_OFF_BTN:
|
||||
this->break_check_enabled = !this->break_check_enabled;
|
||||
this->InvalidateData(-1);
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetDirty(WID_AID_BREAK_STR_ON_OFF_BTN);
|
||||
break;
|
||||
|
||||
case WID_AID_MATCH_CASE_BTN:
|
||||
this->case_sensitive_break_check = !this->case_sensitive_break_check;
|
||||
this->InvalidateData(-1);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
this->SetWidgetDirty(WID_AID_MATCH_CASE_BTN);
|
||||
break;
|
||||
|
||||
case WID_AID_CONTINUE_BTN:
|
||||
/* Unpause current AI / game script and mark the corresponding script button dirty. */
|
||||
if (!this->IsDead()) {
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Unpause();
|
||||
} else {
|
||||
AI::Unpause(ai_debug_company);
|
||||
}
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Unpause();
|
||||
this->SetWidgetDirty(WID_AID_SCRIPT_GAME);
|
||||
} else {
|
||||
AI::Unpause(ai_debug_company);
|
||||
this->SetWidgetDirty(WID_AID_COMPANY_BUTTON_START + ai_debug_company);
|
||||
}
|
||||
|
||||
/* If the last AI/Game Script is unpaused, unpause the game too. */
|
||||
@@ -1298,7 +1313,8 @@ struct AIDebugWindow : public Window {
|
||||
}
|
||||
|
||||
this->highlight_row = -1;
|
||||
this->InvalidateData(-1);
|
||||
this->SetWidgetDirty(WID_AID_LOG_PANEL);
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1332,14 +1348,15 @@ struct AIDebugWindow : public Window {
|
||||
/**
|
||||
* Some data on this window has become invalid.
|
||||
* @param data Information about the changed data.
|
||||
* This is the company ID of the AI/GS which wrote a new log message, or -1 in other cases.
|
||||
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
|
||||
*/
|
||||
virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
|
||||
{
|
||||
if (data == -1 || ai_debug_company == data) this->SetDirty();
|
||||
|
||||
/* If the log message is related to the active company tab, check the break string.
|
||||
* This needs to be done in gameloop-scope, so the AI is suspended immediately. */
|
||||
if (!gui_scope && data == ai_debug_company && this->IsValidDebugCompany(ai_debug_company) && this->break_check_enabled && !this->break_string_filter.IsEmpty()) {
|
||||
if (!gui_scope && data == ai_debug_company && this->break_check_enabled && !this->break_string_filter.IsEmpty()) {
|
||||
/* Get the log instance of the active company */
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
|
||||
@@ -1348,12 +1365,10 @@ struct AIDebugWindow : public Window {
|
||||
this->break_string_filter.AddLine(log->lines[log->pos]);
|
||||
if (this->break_string_filter.GetState()) {
|
||||
/* Pause execution of script. */
|
||||
if (!this->IsDead()) {
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Pause();
|
||||
} else {
|
||||
AI::Pause(ai_debug_company);
|
||||
}
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Pause();
|
||||
} else {
|
||||
AI::Pause(ai_debug_company);
|
||||
}
|
||||
|
||||
/* Pause the game. */
|
||||
@@ -1361,35 +1376,15 @@ struct AIDebugWindow : public Window {
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
}
|
||||
|
||||
/* Make it possible to click on the continue button */
|
||||
this->EnableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_CONTINUE_BTN);
|
||||
|
||||
/* Highlight row that matched */
|
||||
this->highlight_row = log->pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!gui_scope) return;
|
||||
|
||||
this->SelectValidDebugCompany();
|
||||
|
||||
ScriptLog::LogData *log = ai_debug_company != INVALID_COMPANY ? this->GetLogPointer() : NULL;
|
||||
this->vscroll->SetCount((log == NULL) ? 0 : log->used);
|
||||
|
||||
/* Update company buttons */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
this->SetWidgetDisabledState(i + WID_AID_COMPANY_BUTTON_START, !Company::IsValidAiID(i));
|
||||
this->SetWidgetLoweredState(i + WID_AID_COMPANY_BUTTON_START, ai_debug_company == i);
|
||||
}
|
||||
|
||||
this->SetWidgetDisabledState(WID_AID_SCRIPT_GAME, Game::GetGameInstance() == NULL);
|
||||
this->SetWidgetLoweredState(WID_AID_SCRIPT_GAME, ai_debug_company == OWNER_DEITY);
|
||||
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
|
||||
this->SetWidgetDisabledState(WID_AID_SETTINGS, ai_debug_company == INVALID_COMPANY);
|
||||
this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == OWNER_DEITY);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, ai_debug_company == INVALID_COMPANY ||
|
||||
(ai_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(ai_debug_company)));
|
||||
}
|
||||
|
||||
virtual void OnResize()
|
||||
|
||||
@@ -30,7 +30,7 @@ public:
|
||||
/**
|
||||
* Check if we have an AI by name and version available in our list.
|
||||
* @param nameParam The name of the AI.
|
||||
* @param versionParam The version of the AI, or -1 if you want the latest.
|
||||
* @param versionParam The versionof the AI, or -1 if you want the latest.
|
||||
* @param force_exact_match Only match name+version, never latest.
|
||||
* @return NULL if no match found, otherwise the AI that matched.
|
||||
*/
|
||||
|
||||
+5
-11
@@ -136,11 +136,6 @@ static StationID FindNearestHangar(const Aircraft *v)
|
||||
|
||||
/* v->tile can't be used here, when aircraft is flying v->tile is set to 0 */
|
||||
uint distance = DistanceSquare(vtile, st->airport.tile);
|
||||
if (v->acache.cached_max_range_sqr != 0) {
|
||||
/* Check if our current destination can be reached from the depot airport. */
|
||||
const Station *cur_dest = GetTargetAirportIfValid(v);
|
||||
if (cur_dest != NULL && DistanceSquare(st->airport.tile, cur_dest->airport.tile) > v->acache.cached_max_range_sqr) continue;
|
||||
}
|
||||
if (distance < best || index == INVALID_STATION) {
|
||||
best = distance;
|
||||
index = st->index;
|
||||
@@ -302,7 +297,7 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
|
||||
v->targetairport = GetStationIndex(tile);
|
||||
v->SetNext(u);
|
||||
|
||||
v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_aircraft);
|
||||
v->service_interval = Company::Get(_current_company)->settings.vehicle.servint_aircraft;
|
||||
|
||||
v->date_of_last_service = _date;
|
||||
v->build_year = u->build_year = _cur_year;
|
||||
@@ -314,7 +309,6 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
|
||||
|
||||
v->vehicle_flags = 0;
|
||||
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
|
||||
v->SetServiceIntervalIsPercent(Company::Get(_current_company)->settings.vehicle.servint_ispercent);
|
||||
|
||||
v->InvalidateNewGRFCacheOfChain();
|
||||
|
||||
@@ -636,7 +630,7 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
|
||||
/* Adjust distance moved by plane speed setting */
|
||||
if (_settings_game.vehicle.plane_speed > 1) spd /= _settings_game.vehicle.plane_speed;
|
||||
|
||||
/* Convert direction-independent speed into direction-dependent speed. (old movement method) */
|
||||
/* Convert direction-indepenent speed into direction-dependent speed. (old movement method) */
|
||||
spd = v->GetOldAdvanceSpeed(spd);
|
||||
|
||||
spd += v->progress;
|
||||
@@ -661,7 +655,7 @@ int GetAircraftFlyingAltitude(const Aircraft *v)
|
||||
int base_altitude = PLANE_HOLDING_ALTITUDE;
|
||||
|
||||
/* Make sure eastbound and westbound planes do not "crash" into each
|
||||
* other by providing them with vertical separation
|
||||
* other by providing them with vertical seperation
|
||||
*/
|
||||
switch (v->direction) {
|
||||
case DIR_N:
|
||||
@@ -1381,7 +1375,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
|
||||
* and get serviced at the same time - setting */
|
||||
if (_settings_game.order.serviceathelipad) {
|
||||
if (v->subtype == AIR_HELICOPTER && apc->num_helipads > 0) {
|
||||
/* an excerpt of ServiceAircraft, without the invisibility stuff */
|
||||
/* an exerpt of ServiceAircraft, without the invisibility stuff */
|
||||
v->date_of_last_service = _date;
|
||||
v->breakdowns_since_last_service = 0;
|
||||
v->reliability = v->GetEngine()->reliability;
|
||||
@@ -1403,7 +1397,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
|
||||
switch (v->current_order.GetType()) {
|
||||
case OT_GOTO_STATION: // ready to fly to another airport
|
||||
break;
|
||||
case OT_GOTO_DEPOT: // visit hangar for servicing, sale, etc.
|
||||
case OT_GOTO_DEPOT: // visit hangar for serivicing, sale, etc.
|
||||
go_to_hangar = v->current_order.GetDestination() == v->targetairport;
|
||||
break;
|
||||
case OT_CONDITIONAL:
|
||||
|
||||
+2
-2
@@ -22,7 +22,7 @@
|
||||
* @param terminals The terminals.
|
||||
* @param num_helipads Number of heli pads.
|
||||
* @param flags Information about the class of FTA.
|
||||
* @param delta_z Height of the airport above the land.
|
||||
* @param delta_z Height of the arport above the land.
|
||||
*/
|
||||
#define AIRPORT_GENERIC(name, terminals, num_helipads, flags, delta_z) \
|
||||
static AirportFTAClass _airportfta_ ## name(_airport_moving_data_ ## name, terminals, \
|
||||
@@ -41,7 +41,7 @@
|
||||
* Define a heliport.
|
||||
* @param name Suffix of the names of the helipad data.
|
||||
* @param num_helipads Number of heli pads.
|
||||
* @param delta_z Height of the airport above the land.
|
||||
* @param delta_z Height of the arport above the land.
|
||||
*/
|
||||
#define HELIPORT(name, num_helipads, delta_z) \
|
||||
AIRPORT_GENERIC(name, NULL, num_helipads, AirportFTAClass::HELICOPTERS, delta_z)
|
||||
|
||||
@@ -68,7 +68,7 @@ bool IsArticulatedEngine(EngineID engine_type)
|
||||
* Count the number of articulated parts of an engine.
|
||||
* @param engine_type The engine to get the number of parts of.
|
||||
* @param purchase_window Whether we are in the scope of the purchase window or not, i.e. whether we cannot allocate vehicles.
|
||||
* @return The number of parts.
|
||||
* @return The nmumber of parts.
|
||||
*/
|
||||
uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
|
||||
{
|
||||
@@ -98,7 +98,7 @@ uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
|
||||
|
||||
/**
|
||||
* Returns the default (non-refitted) capacity of a specific EngineID.
|
||||
* @param engine the EngineID of interest
|
||||
* @param engine the EngineID of iterest
|
||||
* @param cargo_type returns the default cargo type, if needed
|
||||
* @return capacity
|
||||
*/
|
||||
@@ -113,7 +113,7 @@ static inline uint16 GetVehicleDefaultCapacity(EngineID engine, CargoID *cargo_t
|
||||
|
||||
/**
|
||||
* Returns all cargoes a vehicle can carry.
|
||||
* @param engine the EngineID of interest
|
||||
* @param engine the EngineID of iterest
|
||||
* @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask
|
||||
* @return bit set of CargoIDs
|
||||
*/
|
||||
|
||||
+1
-4
@@ -87,10 +87,7 @@ CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, Engi
|
||||
/* Check if the old vehicle is already in the list */
|
||||
EngineRenew *er = GetEngineReplacement(*erl, old_engine, group);
|
||||
if (er != NULL) {
|
||||
if (flags & DC_EXEC) {
|
||||
er->to = new_engine;
|
||||
er->replace_when_old = replace_when_old;
|
||||
}
|
||||
if (flags & DC_EXEC) er->to = new_engine;
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
|
||||
@@ -66,18 +66,18 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company)
|
||||
/* make sure the railtypes are compatible */
|
||||
if ((GetRailTypeInfo(e_from->u.rail.railtype)->compatible_railtypes & GetRailTypeInfo(e_to->u.rail.railtype)->compatible_railtypes) == 0) return false;
|
||||
|
||||
/* make sure we do not replace wagons with engines or vice versa */
|
||||
/* make sure we do not replace wagons with engines or vise versa */
|
||||
if ((e_from->u.rail.railveh_type == RAILVEH_WAGON) != (e_to->u.rail.railveh_type == RAILVEH_WAGON)) return false;
|
||||
break;
|
||||
}
|
||||
|
||||
case VEH_ROAD:
|
||||
/* make sure that we do not replace a tram with a normal road vehicles or vice versa */
|
||||
/* make sure that we do not replace a tram with a normal road vehicles or vise versa */
|
||||
if (HasBit(e_from->info.misc_flags, EF_ROAD_TRAM) != HasBit(e_to->info.misc_flags, EF_ROAD_TRAM)) return false;
|
||||
break;
|
||||
|
||||
case VEH_AIRCRAFT:
|
||||
/* make sure that we do not replace a plane with a helicopter or vice versa */
|
||||
/* make sure that we do not replace a plane with a helicopter or vise versa */
|
||||
if ((e_from->u.air.subtype & AIR_CTOL) != (e_to->u.air.subtype & AIR_CTOL)) return false;
|
||||
break;
|
||||
|
||||
@@ -263,7 +263,7 @@ static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, bool alw
|
||||
* Builds and refits a replacement vehicle
|
||||
* Important: The old vehicle is still in the original vehicle chain (used for determining the cargo when the old vehicle did not carry anything, but the new one does)
|
||||
* @param old_veh A single (articulated/multiheaded) vehicle that shall be replaced.
|
||||
* @param new_vehicle Returns the newly build and refitted vehicle
|
||||
* @param new_vehicle Returns the newly build and refittet vehicle
|
||||
* @param part_of_chain The vehicle is part of a train
|
||||
* @return cost or error
|
||||
*/
|
||||
@@ -766,7 +766,7 @@ CommandCost CmdSetAutoReplace(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
GroupStatistics::UpdateAutoreplace(_current_company);
|
||||
if (IsLocalCompany()) SetWindowDirty(WC_REPLACE_VEHICLE, Engine::Get(old_engine_type)->type);
|
||||
SetWindowClassesDirty(GetWindowClassForVehicleType(Engine::Get(old_engine_type)->type));
|
||||
}
|
||||
if ((flags & DC_EXEC) && IsLocalCompany()) InvalidateAutoreplaceWindow(old_engine_type, id_g);
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
|
||||
* @param id_g The group the engine belongs to
|
||||
* Note: this function only works if it is called either
|
||||
* - when a new vehicle is build, but before it's counted in num_engines
|
||||
* - when a vehicle is deleted and after it's subtracted from num_engines
|
||||
* - when a vehicle is deleted and after it's substracted from num_engines
|
||||
* - when not changing the count (used when changing replace orders)
|
||||
*/
|
||||
void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
|
||||
@@ -186,6 +186,7 @@ class ReplaceVehicleWindow : public Window {
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
EngineID veh_to = this->sel_engine[1];
|
||||
DoCommandP(0, (replace_when_old ? 1 : 0) | (this->sel_group << 16), veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -454,6 +455,7 @@ public:
|
||||
case WID_RV_STOP_REPLACE: { // Stop replacing
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
DoCommandP(0, this->sel_group << 16, veh_from + (INVALID_ENGINE << 16), CMD_SET_AUTOREPLACE);
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -24,12 +24,12 @@ struct BaseConsist {
|
||||
int32 lateness_counter; ///< How many ticks late (or early if negative) this vehicle is.
|
||||
Date timetable_start; ///< When the vehicle is supposed to start the timetable.
|
||||
|
||||
uint16 service_interval; ///< The interval for (automatic) servicing; either in days or %.
|
||||
Date service_interval; ///< The interval for (automatic) servicing; either in days or %.
|
||||
|
||||
VehicleOrderID cur_real_order_index;///< The index to the current real (non-implicit) order
|
||||
VehicleOrderID cur_implicit_order_index;///< The index to the current implicit order
|
||||
|
||||
uint16 vehicle_flags; ///< Used for gradual loading and other miscellaneous things (@see VehicleFlags enum)
|
||||
byte vehicle_flags; ///< Used for gradual loading and other miscellaneous things (@see VehicleFlags enum)
|
||||
|
||||
BaseConsist() : name(NULL) {}
|
||||
virtual ~BaseConsist();
|
||||
|
||||
+4
-10
@@ -137,16 +137,12 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
|
||||
switch (T::CheckMD5(file, BASESET_DIR)) {
|
||||
case MD5File::CR_MATCH:
|
||||
this->valid_files++;
|
||||
this->found_files++;
|
||||
break;
|
||||
|
||||
/* FALL THROUGH */
|
||||
case MD5File::CR_MISMATCH:
|
||||
DEBUG(grf, 1, "MD5 checksum mismatch for: %s (in %s)", filename, full_filename);
|
||||
this->found_files++;
|
||||
break;
|
||||
|
||||
case MD5File::CR_NO_FILE:
|
||||
DEBUG(grf, 1, "The file %s specified in %s is missing", filename, full_filename);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -184,8 +180,7 @@ bool BaseMedia<Tbase_set>::AddFile(const char *filename, size_t basepath_length,
|
||||
/* The more complete set takes precedence over the version number. */
|
||||
if ((duplicate->valid_files == set->valid_files && duplicate->version >= set->version) ||
|
||||
duplicate->valid_files > set->valid_files) {
|
||||
DEBUG(grf, 1, "Not adding %s (%i) as base " SET_TYPE " set (duplicate, %s)", set->name, set->version,
|
||||
duplicate->valid_files > set->valid_files ? "less valid files" : "lower version");
|
||||
DEBUG(grf, 1, "Not adding %s (%i) as base " SET_TYPE " set (duplicate)", set->name, set->version);
|
||||
set->next = BaseMedia<Tbase_set>::duplicate_sets;
|
||||
BaseMedia<Tbase_set>::duplicate_sets = set;
|
||||
} else {
|
||||
@@ -200,8 +195,7 @@ bool BaseMedia<Tbase_set>::AddFile(const char *filename, size_t basepath_length,
|
||||
* version number until a new game is started which isn't a big problem */
|
||||
if (BaseMedia<Tbase_set>::used_set == duplicate) BaseMedia<Tbase_set>::used_set = set;
|
||||
|
||||
DEBUG(grf, 1, "Removing %s (%i) as base " SET_TYPE " set (duplicate, %s)", duplicate->name, duplicate->version,
|
||||
duplicate->valid_files < set->valid_files ? "less valid files" : "lower version");
|
||||
DEBUG(grf, 1, "Removing %s (%i) as base " SET_TYPE " set (duplicate)", duplicate->name, duplicate->version);
|
||||
duplicate->next = BaseMedia<Tbase_set>::duplicate_sets;
|
||||
BaseMedia<Tbase_set>::duplicate_sets = duplicate;
|
||||
ret = true;
|
||||
@@ -269,7 +263,7 @@ template <class Tbase_set>
|
||||
if (missing == 0) {
|
||||
p += seprintf(p, last, " (%i corrupt file%s)\n", invalid, invalid == 1 ? "" : "s");
|
||||
} else {
|
||||
p += seprintf(p, last, " (unusable: %i missing file%s)\n", missing, missing == 1 ? "" : "s");
|
||||
p += seprintf(p, last, " (unuseable: %i missing file%s)\n", missing, missing == 1 ? "" : "s");
|
||||
}
|
||||
} else {
|
||||
p += seprintf(p, last, "\n");
|
||||
|
||||
@@ -71,7 +71,6 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
|
||||
uint16 random_bits; ///< Random bits assigned to this station
|
||||
byte waiting_triggers; ///< Waiting triggers (NewGRF) for this station
|
||||
uint8 cached_anim_triggers; ///< NOSAVE: Combined animation trigger bitmask, used to determine if trigger processing should happen.
|
||||
uint32 cached_cargo_triggers; ///< NOSAVE: Combined cargo trigger bitmask
|
||||
|
||||
TileArea train_station; ///< Tile area the train 'station' part covers
|
||||
StationRect rect; ///< NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions
|
||||
|
||||
@@ -107,7 +107,7 @@ void Blitter_32bppBase::ScrollBuffer(void *video, int &left, int &top, int &widt
|
||||
dst = (uint32 *)video + left + top * _screen.pitch;
|
||||
src = dst - scroll_y * _screen.pitch;
|
||||
|
||||
/* Decrease height. (scroll_y is <=0). */
|
||||
/* Decrese height. (scroll_y is <=0). */
|
||||
height += scroll_y;
|
||||
assert(height > 0);
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ void Blitter_8bppBase::ScrollBuffer(void *video, int &left, int &top, int &width
|
||||
dst = (uint8 *)video + left + top * _screen.pitch;
|
||||
src = dst - scroll_y * _screen.pitch;
|
||||
|
||||
/* Decrease height. (scroll_y is <=0). */
|
||||
/* Decrese height. (scroll_y is <=0). */
|
||||
height += scroll_y;
|
||||
assert(height > 0);
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ public:
|
||||
|
||||
/**
|
||||
* Copy from a buffer to the screen.
|
||||
* @param video The destination pointer (video-buffer).
|
||||
* @param video The destionation pointer (video-buffer).
|
||||
* @param src The buffer from which the data will be read.
|
||||
* @param width The width of the buffer.
|
||||
* @param height The height of the buffer.
|
||||
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
/* virtual */ int GetBytesPerPixel() { return 0; }
|
||||
};
|
||||
|
||||
/** Factory for the blitter that does nothing. */
|
||||
/** Factory for the blitter that doesn nothing. */
|
||||
class FBlitter_Null: public BlitterFactory<FBlitter_Null> {
|
||||
public:
|
||||
/* virtual */ const char *GetName() { return "null"; }
|
||||
|
||||
@@ -205,7 +205,7 @@ public:
|
||||
#endif /* defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) */
|
||||
|
||||
/**
|
||||
* Handle all procedures for bootstrapping OpenTTD without a base graphics set.
|
||||
* Handle all procedures for bootstrapping OpenTTD without a base grapics set.
|
||||
* This requires all kinds of trickery that is needed to avoid the use of
|
||||
* sprites from the base graphics set which are pretty interwoven.
|
||||
* @return True if a base set exists, otherwise false.
|
||||
|
||||
+1
-1
@@ -381,7 +381,7 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
|
||||
/* The bridge length without ramps. */
|
||||
const uint bridge_len = GetTunnelBridgeLength(start, end);
|
||||
|
||||
/* If Ctrl is being pressed, check whether the last bridge built is available
|
||||
/* If Ctrl is being pressed, check wether the last bridge built is available
|
||||
* If so, return this bridge type. Otherwise continue normally.
|
||||
* We store bridge types for each transport type, so we have to check for
|
||||
* the transport type beforehand.
|
||||
|
||||
+4
-6
@@ -41,7 +41,7 @@ static inline bool IsBridgeTile(TileIndex t)
|
||||
* checks for the possibility that a bridge may be on this tile
|
||||
* These are in fact all the tile types on which a bridge can be found
|
||||
* @param t The tile to analyze
|
||||
* @return true if a bridge might be present
|
||||
* @return true if a bridge migh be present
|
||||
*/
|
||||
static inline bool MayHaveBridgeAbove(TileIndex t)
|
||||
{
|
||||
@@ -161,17 +161,15 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
|
||||
* Make a bridge ramp for roads.
|
||||
* @param t the tile to make a bridge ramp
|
||||
* @param o the new owner of the bridge ramp
|
||||
* @param owner_road the new owner of the road on the bridge
|
||||
* @param owner_tram the new owner of the tram on the bridge
|
||||
* @param bridgetype the type of bridge this bridge ramp belongs to
|
||||
* @param d the direction this ramp must be facing
|
||||
* @param r the road type of the bridge
|
||||
*/
|
||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Owner owner_tram, BridgeType bridgetype, DiagDirection d, RoadTypes r)
|
||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, RoadTypes r)
|
||||
{
|
||||
MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD, 0);
|
||||
SetRoadOwner(t, ROADTYPE_ROAD, owner_road);
|
||||
if (owner_tram != OWNER_TOWN) SetRoadOwner(t, ROADTYPE_TRAM, owner_tram);
|
||||
SetRoadOwner(t, ROADTYPE_ROAD, o);
|
||||
if (o != OWNER_TOWN) SetRoadOwner(t, ROADTYPE_TRAM, o);
|
||||
SetRoadTypes(t, r);
|
||||
}
|
||||
|
||||
|
||||
@@ -272,7 +272,7 @@ static int CDECL EnginePowerVsRunningCostSorter(const EngineID *a, const EngineI
|
||||
* we will actually calculate cunning cost/power (to make it more than 1).
|
||||
* Because of this, the return value have to be reversed as well and we return b - a instead of a - b.
|
||||
* Another thing is that both power and running costs should be doubled for multiheaded engines.
|
||||
* Since it would be multiplying with 2 in both numerator and denominator, it will even themselves out and we skip checking for multiheaded. */
|
||||
* Since it would be multipling with 2 in both numerator and denumerator, it will even themselves out and we skip checking for multiheaded. */
|
||||
Money va = (e_a->GetRunningCost()) / max(1U, (uint)e_a->GetPower());
|
||||
Money vb = (e_b->GetRunningCost()) / max(1U, (uint)e_b->GetPower());
|
||||
int r = ClampToI32(vb - va);
|
||||
@@ -967,7 +967,7 @@ struct BuildVehicleWindow : Window {
|
||||
this->vscroll = this->GetScrollbar(WID_BV_SCROLLBAR);
|
||||
|
||||
/* If we are just viewing the list of vehicles, we do not need the Build button.
|
||||
* So we just hide it, and enlarge the Rename button by the now vacant place. */
|
||||
* So we just hide it, and enlarge the Rename buton by the now vacant place. */
|
||||
if (this->listview_mode) this->GetWidget<NWidgetStacked>(WID_BV_BUILD_SEL)->SetDisplayedPlane(SZSP_NONE);
|
||||
|
||||
NWidgetCore *widget = this->GetWidget<NWidgetCore>(WID_BV_LIST);
|
||||
|
||||
+7
-39
@@ -16,54 +16,22 @@
|
||||
CargoMonitorMap _cargo_pickups; ///< Map of monitored pick-ups to the amount since last query/activation.
|
||||
CargoMonitorMap _cargo_deliveries; ///< Map of monitored deliveries to the amount since last query/activation.
|
||||
|
||||
/**
|
||||
* Helper method for ClearCargoPickupMonitoring and ClearCargoDeliveryMonitoring.
|
||||
* Clears all monitors that belong to the specified company or all if INVALID_OWNER
|
||||
* is specified as company.
|
||||
* @param cargo_monitor_map reference to the cargo monitor map to operate on.
|
||||
* @param company company to clear cargo monitors for or INVALID_OWNER if all cargo monitors should be cleared.
|
||||
*/
|
||||
static void ClearCargoMonitoring(CargoMonitorMap &cargo_monitor_map, CompanyID company = INVALID_OWNER)
|
||||
/** Clear all pick-up cargo monitors. */
|
||||
void ClearCargoPickupMonitoring()
|
||||
{
|
||||
if (company == INVALID_OWNER) {
|
||||
cargo_monitor_map.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
CargoMonitorMap::iterator next;
|
||||
for (CargoMonitorMap::iterator it = cargo_monitor_map.begin(); it != cargo_monitor_map.end(); it = next) {
|
||||
next = it;
|
||||
next++;
|
||||
if (DecodeMonitorCompany(it->first) == company) {
|
||||
cargo_monitor_map.erase(it);
|
||||
}
|
||||
}
|
||||
_cargo_pickups.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all pick-up cargo monitors.
|
||||
* @param company clear all pick-up monitors for this company or if INVALID_OWNER
|
||||
* is passed, all pick-up monitors are cleared regardless of company.
|
||||
*/
|
||||
void ClearCargoPickupMonitoring(CompanyID company)
|
||||
/** Clear all delivery cargo monitors. */
|
||||
void ClearCargoDeliveryMonitoring()
|
||||
{
|
||||
ClearCargoMonitoring(_cargo_pickups, company);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all delivery cargo monitors.
|
||||
* @param company clear all delivery monitors for this company or if INVALID_OWNER
|
||||
* is passed, all delivery monitors are cleared regardless of company.
|
||||
*/
|
||||
void ClearCargoDeliveryMonitoring(CompanyID company)
|
||||
{
|
||||
ClearCargoMonitoring(_cargo_deliveries, company);
|
||||
_cargo_deliveries.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get and reset the amount associated with a cargo monitor.
|
||||
* @param[in,out] monitor_map Monitoring map to search (and reset for the queried entry).
|
||||
* @param monitor Cargo monitor to query/reset.
|
||||
* @oaram monitor Cargo monitor to query/reset.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount collected since last query/activation for the monitored combination.
|
||||
*/
|
||||
|
||||
+2
-2
@@ -139,8 +139,8 @@ static inline TownID DecodeMonitorTown(CargoMonitorID num)
|
||||
return GB(num, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH);
|
||||
}
|
||||
|
||||
void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER);
|
||||
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
|
||||
void ClearCargoPickupMonitoring();
|
||||
void ClearCargoDeliveryMonitoring();
|
||||
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st);
|
||||
|
||||
+1
-1
@@ -161,7 +161,7 @@ public:
|
||||
|
||||
/**
|
||||
* Simple collection class for a list of cargo packets.
|
||||
* @tparam Tinst Actual instantiation of this cargo list.
|
||||
* @tparam Tinst Actual instantation of this cargo list.
|
||||
*/
|
||||
template <class Tinst>
|
||||
class CargoList {
|
||||
|
||||
+3
-3
@@ -46,7 +46,7 @@ enum CargoClass {
|
||||
CC_LIQUID = 1 << 6, ///< Liquids (Oil, Water, Rubber)
|
||||
CC_REFRIGERATED = 1 << 7, ///< Refrigerated cargo (Food, Fruit)
|
||||
CC_HAZARDOUS = 1 << 8, ///< Hazardous cargo (Nuclear Fuel, Explosives, etc.)
|
||||
CC_COVERED = 1 << 9, ///< Covered/Sheltered Freight (Transportation in Box Vans, Silo Wagons, etc.)
|
||||
CC_COVERED = 1 << 9, ///< Covered/Sheltered Freight (Transporation in Box Vans, Silo Wagons, etc.)
|
||||
CC_SPECIAL = 1 << 15, ///< Special bit used for livery refit tricks instead of normal cargoes.
|
||||
};
|
||||
|
||||
@@ -163,13 +163,13 @@ static inline bool IsCargoInClass(CargoID c, CargoClass cc)
|
||||
* @param var Reference getting the cargospec.
|
||||
* @see CargoSpec
|
||||
*/
|
||||
#define FOR_ALL_SORTED_CARGOSPECS(var) for (uint8 index = 0; index < _sorted_cargo_specs_size && (var = _sorted_cargo_specs[index], true) ; index++)
|
||||
#define FOR_ALL_SORTED_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_cargo_specs_size; index++)
|
||||
|
||||
/**
|
||||
* Loop header for iterating over 'real' cargoes, sorted by name. Phony cargoes like regearing cargoes are skipped.
|
||||
* @param var Reference getting the cargospec.
|
||||
* @see CargoSpec
|
||||
*/
|
||||
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; index < _sorted_standard_cargo_specs_size && (var = _sorted_cargo_specs[index], true); index++)
|
||||
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_standard_cargo_specs_size; index++)
|
||||
|
||||
#endif /* CARGOTYPE_H */
|
||||
|
||||
+1
-1
@@ -75,7 +75,7 @@ static int32 ClickChangeCompanyCheat(int32 p1, int32 p2)
|
||||
* Allow (or disallow) changing production of all industries.
|
||||
* @param p1 new value
|
||||
* @param p2 unused
|
||||
* @return New value allowing change of industry production.
|
||||
* @return New value allwing change of industry production.
|
||||
*/
|
||||
static int32 ClickSetProdCheat(int32 p1, int32 p2)
|
||||
{
|
||||
|
||||
+3
-3
@@ -190,12 +190,12 @@ static void TileLoopClearAlps(TileIndex tile)
|
||||
}
|
||||
}
|
||||
/* Update snow density. */
|
||||
uint current_density = GetClearDensity(tile);
|
||||
uint curent_density = GetClearDensity(tile);
|
||||
uint req_density = (k < 0) ? 0u : min((uint)k, 3);
|
||||
|
||||
if (current_density < req_density) {
|
||||
if (curent_density < req_density) {
|
||||
AddClearDensity(tile, 1);
|
||||
} else if (current_density > req_density) {
|
||||
} else if (curent_density > req_density) {
|
||||
AddClearDensity(tile, -1);
|
||||
} else {
|
||||
/* Density at the required level. */
|
||||
|
||||
+1
-1
@@ -331,7 +331,7 @@ static const Command _command_proc_table[] = {
|
||||
/*!
|
||||
* This function range-checks a cmd, and checks if the cmd is not NULL
|
||||
*
|
||||
* @param cmd The integer value of a command
|
||||
* @param cmd The integervalue of a command
|
||||
* @return true if the command is valid (and got a CommandProc function)
|
||||
*/
|
||||
bool IsValidCommand(uint32 cmd)
|
||||
|
||||
+1
-1
@@ -277,7 +277,7 @@ enum Commands {
|
||||
|
||||
CMD_GIVE_MONEY, ///< give money to another company
|
||||
CMD_CHANGE_SETTING, ///< change a setting
|
||||
CMD_CHANGE_COMPANY_SETTING, ///< change a company setting
|
||||
CMD_CHANGE_COMPANY_SETTING, ///< change a company etting
|
||||
|
||||
CMD_SET_AUTOREPLACE, ///< set an autoreplace entry
|
||||
|
||||
|
||||
@@ -1170,21 +1170,3 @@ CommandCost CmdRenamePresident(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
||||
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the service interval for the given company and vehicle type.
|
||||
* @param c The company, or NULL for client-default settings.
|
||||
* @param type The vehicle type to get the interval for.
|
||||
* @return The service interval.
|
||||
*/
|
||||
int CompanyServiceInterval(const Company *c, VehicleType type)
|
||||
{
|
||||
const VehicleDefaultSettings *vds = (c == NULL) ? &_settings_client.company.vehicle : &c->settings.vehicle;
|
||||
switch (type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_TRAIN: return vds->servint_trains;
|
||||
case VEH_ROAD: return vds->servint_roadveh;
|
||||
case VEH_AIRCRAFT: return vds->servint_aircraft;
|
||||
case VEH_SHIP: return vds->servint_ships;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include "command_type.h"
|
||||
#include "company_type.h"
|
||||
#include "gfx_type.h"
|
||||
#include "vehicle_type.h"
|
||||
|
||||
bool MayCompanyTakeOver(CompanyID cbig, CompanyID small);
|
||||
void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner);
|
||||
@@ -57,6 +56,4 @@ static inline bool IsInteractiveCompany(CompanyID company)
|
||||
return company == _local_company;
|
||||
}
|
||||
|
||||
int CompanyServiceInterval(const Company *c, VehicleType type);
|
||||
|
||||
#endif /* COMPANY_FUNC_H */
|
||||
|
||||
+19
-31
@@ -1987,7 +1987,6 @@ struct CompanyWindow : Window
|
||||
{
|
||||
this->InitNested(desc, window_number);
|
||||
this->owner = (Owner)this->window_number;
|
||||
this->OnInvalidateData();
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
@@ -2056,6 +2055,25 @@ struct CompanyWindow : Window
|
||||
}
|
||||
}
|
||||
|
||||
if (!local) {
|
||||
if (_settings_game.economy.allow_shares) { // Shares are allowed
|
||||
/* If all shares are owned by someone (none by nobody), disable buy button */
|
||||
this->SetWidgetDisabledState(WID_C_BUY_SHARE, GetAmountOwnedBy(c, INVALID_OWNER) == 0 ||
|
||||
/* Only 25% left to buy. If the company is human, disable buying it up.. TODO issues! */
|
||||
(GetAmountOwnedBy(c, INVALID_OWNER) == 1 && !c->is_ai) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
|
||||
/* If the company doesn't own any shares, disable sell button */
|
||||
this->SetWidgetDisabledState(WID_C_SELL_SHARE, (GetAmountOwnedBy(c, _local_company) == 0) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
} else { // Shares are not allowed, disable buy/sell buttons
|
||||
this->DisableWidget(WID_C_BUY_SHARE);
|
||||
this->DisableWidget(WID_C_SELL_SHARE);
|
||||
}
|
||||
}
|
||||
|
||||
this->DrawWidgets();
|
||||
}
|
||||
|
||||
@@ -2378,36 +2396,6 @@ struct CompanyWindow : Window
|
||||
#endif /* ENABLE_NETWORK */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Some data on this window has become invalid.
|
||||
* @param data Information about the changed data.
|
||||
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
|
||||
*/
|
||||
virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
|
||||
{
|
||||
if (this->window_number == _local_company) return;
|
||||
|
||||
if (_settings_game.economy.allow_shares) { // Shares are allowed
|
||||
const Company *c = Company::Get(this->window_number);
|
||||
|
||||
/* If all shares are owned by someone (none by nobody), disable buy button */
|
||||
this->SetWidgetDisabledState(WID_C_BUY_SHARE, GetAmountOwnedBy(c, INVALID_OWNER) == 0 ||
|
||||
/* Only 25% left to buy. If the company is human, disable buying it up.. TODO issues! */
|
||||
(GetAmountOwnedBy(c, INVALID_OWNER) == 1 && !c->is_ai) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
|
||||
/* If the company doesn't own any shares, disable sell button */
|
||||
this->SetWidgetDisabledState(WID_C_SELL_SHARE, (GetAmountOwnedBy(c, _local_company) == 0) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
} else { // Shares are not allowed, disable buy/sell buttons
|
||||
this->DisableWidget(WID_C_BUY_SHARE);
|
||||
this->DisableWidget(WID_C_SELL_SHARE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static const WindowDesc _company_desc(
|
||||
|
||||
@@ -120,7 +120,7 @@ static inline void SetCompanyManagerFaceBits(CompanyManagerFace &cmf, CompanyMan
|
||||
/**
|
||||
* Increase/Decrease the company manager's face variable by the given amount.
|
||||
* If the new value greater than the max value for this variable it will be set to 0.
|
||||
* Or is it negative (< 0) it will be set to max value.
|
||||
* Or is it negativ (< 0) it will be set to max value.
|
||||
*
|
||||
* @param cmf the company manager face to write the bits to
|
||||
* @param cmfv the company manager face variable to write the data of
|
||||
|
||||
+5
-5
@@ -355,7 +355,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char
|
||||
aliasstream[astream_i++] = '"';
|
||||
break;
|
||||
|
||||
case ';': // Cmd separator, start new command
|
||||
case ';': // Cmd seperator, start new command
|
||||
aliasstream[astream_i] = '\0';
|
||||
aliases[++a_index] = &aliasstream[++astream_i];
|
||||
cmdptr++;
|
||||
@@ -364,7 +364,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char
|
||||
case '%': // Some or all parameters
|
||||
cmdptr++;
|
||||
switch (*cmdptr) {
|
||||
case '+': { // All parameters separated: "[param 1]" "[param 2]"
|
||||
case '+': { // All parameters seperated: "[param 1]" "[param 2]"
|
||||
for (i = 0; i != tokencount; i++) {
|
||||
aliasstream[astream_i++] = '"';
|
||||
astream_i += IConsoleCopyInParams(&aliasstream[astream_i], tokens[i], astream_i);
|
||||
@@ -412,7 +412,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char
|
||||
|
||||
/**
|
||||
* Execute a given command passed to us. First chop it up into
|
||||
* individual tokens (separated by spaces), then execute it if possible
|
||||
* individual tokens (seperated by spaces), then execute it if possible
|
||||
* @param cmdstr string to be parsed and executed
|
||||
*/
|
||||
void IConsoleCmdExec(const char *cmdstr)
|
||||
@@ -439,14 +439,14 @@ void IConsoleCmdExec(const char *cmdstr)
|
||||
memset(&tokens, 0, sizeof(tokens));
|
||||
memset(&tokenstream, 0, sizeof(tokenstream));
|
||||
|
||||
/* 1. Split up commandline into tokens, separated by spaces, commands
|
||||
/* 1. Split up commandline into tokens, seperated by spaces, commands
|
||||
* enclosed in "" are taken as one token. We can only go as far as the amount
|
||||
* of characters in our stream or the max amount of tokens we can handle */
|
||||
for (cmdptr = cmdstr, t_index = 0, tstream_i = 0; *cmdptr != '\0'; cmdptr++) {
|
||||
if (t_index >= lengthof(tokens) || tstream_i >= lengthof(tokenstream)) break;
|
||||
|
||||
switch (*cmdptr) {
|
||||
case ' ': // Token separator
|
||||
case ' ': // Token seperator
|
||||
if (!foundtoken) break;
|
||||
|
||||
if (longtoken) {
|
||||
|
||||
@@ -1066,7 +1066,7 @@ DEF_CONSOLE_CMD(ConRestart)
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a text buffer line by line to the console. Lines are separated by '\n'.
|
||||
* Print a text buffer line by line to the console. Lines are seperated by '\n'.
|
||||
* @param buf The buffer to print.
|
||||
* @note All newlines are replace by '\0' characters.
|
||||
*/
|
||||
|
||||
@@ -28,7 +28,7 @@ enum ConsoleHookResult {
|
||||
* --Commands--
|
||||
* Commands are commands, or functions. They get executed once and any
|
||||
* effect they produce are carried out. The arguments to the commands
|
||||
* are given to them, each input word separated by a double-quote (") is an argument
|
||||
* are given to them, each input word seperated by a double-quote (") is an argument
|
||||
* If you want to handle multiple words as one, enclose them in double-quotes
|
||||
* eg. 'say "hello sexy boy"'
|
||||
*/
|
||||
@@ -50,7 +50,7 @@ struct IConsoleCmd {
|
||||
* (eg. 'ng' for 'load %A; unpause; debug_level 5'). Aliases can parse the arguments
|
||||
* given to them in the command line.
|
||||
* - "%A - %Z" substitute arguments 1 t/m 26
|
||||
* - "%+" lists all parameters keeping them separated
|
||||
* - "%+" lists all parameters keeping them seperated
|
||||
* - "%!" also lists all parameters but presenting them to the aliased command as one argument
|
||||
* - ";" allows for combining commands (see example 'ng')
|
||||
*/
|
||||
|
||||
@@ -27,7 +27,7 @@ const uint8 _ffb_64[64] = {
|
||||
* Search the first set bit in a 32 bit variable.
|
||||
*
|
||||
* This algorithm is a static implementation of a log
|
||||
* congruence search algorithm. It checks the first half
|
||||
* conguence search algorithm. It checks the first half
|
||||
* if there is a bit set search there further. And this
|
||||
* way further. If no bit is set return 0.
|
||||
*
|
||||
@@ -55,7 +55,7 @@ uint8 FindFirstBit(uint32 x)
|
||||
* Search the last set bit in a 64 bit variable.
|
||||
*
|
||||
* This algorithm is a static implementation of a log
|
||||
* congruence search algorithm. It checks the second half
|
||||
* conguence search algorithm. It checks the second half
|
||||
* if there is a bit set search there further. And this
|
||||
* way further. If no bit is set return 0.
|
||||
*
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
* @param x The value to read some bits.
|
||||
* @param s The start position to read some bits.
|
||||
* @param n The number of bits to read.
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @pre s + n <= sizeof(T) * 8
|
||||
* @return The selected bits, aligned to a LSB.
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -52,8 +50,6 @@ static inline uint GB(const T x, const uint8 s, const uint8 n)
|
||||
* @param s The start position for the new bits
|
||||
* @param n The size/window for the new bits
|
||||
* @param d The actually new bits to save in the defined position.
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @pre s + n <= sizeof(T) * 8
|
||||
* @return The new value of \a x
|
||||
*/
|
||||
template <typename T, typename U>
|
||||
@@ -76,8 +72,6 @@ static inline T SB(T &x, const uint8 s, const uint8 n, const U d)
|
||||
* @param x The variable to add some bits at some position
|
||||
* @param s The start position of the addition
|
||||
* @param n The size/window for the addition
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @pre s + n <= sizeof(T) * 8
|
||||
* @param i The value to add at the given start position in the given window.
|
||||
* @return The new value of \a x
|
||||
*/
|
||||
@@ -98,7 +92,6 @@ static inline T AB(T &x, const uint8 s, const uint8 n, const U i)
|
||||
*
|
||||
* @param x The value to check
|
||||
* @param y The position of the bit to check, started from the LSB
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return True if the bit is set, false else.
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -116,7 +109,6 @@ static inline bool HasBit(const T x, const uint8 y)
|
||||
*
|
||||
* @param x The variable to set a bit
|
||||
* @param y The bit position to set
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return The new value of the old value with the bit set
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -146,7 +138,6 @@ static inline T SetBit(T &x, const uint8 y)
|
||||
*
|
||||
* @param x The variable to clear the bit
|
||||
* @param y The bit position to clear
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return The new value of the old value with the bit cleared
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -176,7 +167,6 @@ static inline T ClrBit(T &x, const uint8 y)
|
||||
*
|
||||
* @param x The variable to toggle the bit
|
||||
* @param y The bit position to toggle
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return The new value of the old value with the bit toggled
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -296,7 +286,6 @@ static inline bool HasAtMostOneBit(T value)
|
||||
* @note Assumes a byte has 8 bits
|
||||
* @param x The value which we want to rotate
|
||||
* @param n The number how many we want to rotate
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @return A bit rotated number
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -311,7 +300,6 @@ static inline T ROL(const T x, const uint8 n)
|
||||
* @note Assumes a byte has 8 bits
|
||||
* @param x The value which we want to rotate
|
||||
* @param n The number how many we want to rotate
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @return A bit rotated number
|
||||
*/
|
||||
template <typename T>
|
||||
|
||||
@@ -89,7 +89,7 @@ template <typename Tenum_t> struct TinyEnumT;
|
||||
template <typename Tenum_t>
|
||||
struct TinyEnumT {
|
||||
typedef Tenum_t enum_type; ///< expose our enumeration type (i.e. Trackdir) to outside
|
||||
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration properties
|
||||
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration propeties
|
||||
typedef typename Props::storage storage_type; ///< small storage type
|
||||
static const enum_type begin = Props::begin; ///< enum beginning (i.e. TRACKDIR_BEGIN)
|
||||
static const enum_type end = Props::end; ///< enum end (i.e. TRACKDIR_END)
|
||||
|
||||
@@ -108,7 +108,7 @@ DEFINE_POOL_METHOD(inline void *)::AllocateItem(size_t size, size_t index)
|
||||
item = (Titem *)this->alloc_cache;
|
||||
this->alloc_cache = this->alloc_cache->next;
|
||||
if (Tzero) {
|
||||
/* Explicitly casting to (void *) prevents a clang warning -
|
||||
/* Explicitly casting to (void *) prevets a clang warning -
|
||||
* we are actually memsetting a (not-yet-constructed) object */
|
||||
memset((void *)item, 0, sizeof(Titem));
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ struct PoolBase {
|
||||
static void Clean(PoolType);
|
||||
|
||||
/**
|
||||
* Constructor registers this object in the pool vector.
|
||||
* Contructor registers this object in the pool vector.
|
||||
* @param pt type of this pool.
|
||||
*/
|
||||
PoolBase(PoolType pt) : type(pt)
|
||||
@@ -278,7 +278,7 @@ struct Pool : PoolBase {
|
||||
};
|
||||
|
||||
private:
|
||||
static const size_t NO_FREE_ITEM = MAX_UVALUE(size_t); ///< Constant to indicate we can't allocate any more items
|
||||
static const size_t NO_FREE_ITEM = MAX_UVALUE(size_t); ///< Contant to indicate we can't allocate any more items
|
||||
|
||||
/**
|
||||
* Helper struct to cache 'freed' PoolItems so we
|
||||
|
||||
@@ -37,7 +37,7 @@ static inline void QSortT(T *base, uint num, int (CDECL *comparator)(const T*, c
|
||||
/**
|
||||
* Type safe Gnome Sort.
|
||||
*
|
||||
* This is a slightly modified Gnome search. The basic
|
||||
* This is a slightly modifyied Gnome search. The basic
|
||||
* Gnome search tries to sort already sorted list parts.
|
||||
* The modification skips these.
|
||||
*
|
||||
|
||||
+1
-1
@@ -72,7 +72,7 @@ protected:
|
||||
virtual char *LogRegisters(char *buffer, const char *last) const;
|
||||
|
||||
/**
|
||||
* Writes the dynamically linked libraries/modules to the buffer, if there
|
||||
* Writes the dynamically linked libaries/modules to the buffer, if there
|
||||
* is information about it available.
|
||||
* @param buffer The begin where to write at.
|
||||
* @param last The last position in the buffer to write to.
|
||||
|
||||
+3
-3
@@ -62,7 +62,7 @@ static const CurrencySpec origin_currency_specs[NUM_CURRENCY] = {
|
||||
CurrencySpec _currency_specs[NUM_CURRENCY];
|
||||
|
||||
/**
|
||||
* These enums are only declared in order to make sense
|
||||
* These enums are only declared in order to make sens
|
||||
* out of the TTDPatch_To_OTTDIndex array that will follow
|
||||
* Every currency used by Ottd is there, just in case TTDPatch will
|
||||
* add those missing in its code
|
||||
@@ -129,7 +129,7 @@ const byte TTDPatch_To_OTTDIndex[] =
|
||||
};
|
||||
|
||||
/**
|
||||
* Will return the ottd's index correspondence to
|
||||
* Will return the ottd's index correspondance to
|
||||
* the ttdpatch's id. If the id is bigger than the array,
|
||||
* it is a grf written for ottd, thus returning the same id.
|
||||
* Only called from newgrf.cpp
|
||||
@@ -180,7 +180,7 @@ void CheckSwitchToEuro()
|
||||
* Called only from newgrf.cpp and settings.cpp.
|
||||
* @param preserve_custom will not reset custom currency (the latest one on the list)
|
||||
* if ever it is flagged to true. In which case, the total size of the memory to move
|
||||
* will be one currency spec less, thus preserving the custom currency from been
|
||||
* will be one currency spec less, thus preserving the custom curreny from been
|
||||
* overwritten.
|
||||
*/
|
||||
void ResetCurrencies(bool preserve_custom)
|
||||
|
||||
+1
-1
@@ -138,7 +138,7 @@ void ConvertDateToYMD(Date date, YearMonthDay *ymd)
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a tuple of Year, Month and Day to a Date.
|
||||
* Converts a tupe of Year, Month and Day to a Date.
|
||||
* @param year is a number between 0..MAX_YEAR
|
||||
* @param month is a number between 0..11
|
||||
* @param day is a number between 1..31
|
||||
|
||||
+1
-1
@@ -83,7 +83,7 @@ uint64 ottd_rdtsc();
|
||||
*
|
||||
* for (int i = 0; i < 5; i++) {
|
||||
* TIC();
|
||||
* --Do your code--
|
||||
* --Do yuor code--
|
||||
* TOC("A name", 5);
|
||||
* }
|
||||
*
|
||||
|
||||
+3
-4
@@ -169,8 +169,6 @@ static void InitBlocksizeForVehicles(VehicleType type, EngineImageType image_typ
|
||||
|
||||
const Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, type) {
|
||||
if (!e->IsEnabled()) continue;
|
||||
|
||||
EngineID eid = e->index;
|
||||
uint x, y;
|
||||
int x_offs, y_offs;
|
||||
@@ -744,7 +742,7 @@ struct DepotWindow : Window {
|
||||
}
|
||||
|
||||
case WID_D_SELL_ALL:
|
||||
/* Only open the confirmation window if there are anything to sell */
|
||||
/* Only open the confimation window if there are anything to sell */
|
||||
if (this->vehicle_list.Length() != 0 || this->wagon_list.Length() != 0) {
|
||||
TileIndex tile = this->window_number;
|
||||
byte vehtype = this->type;
|
||||
@@ -842,7 +840,8 @@ struct DepotWindow : Window {
|
||||
*/
|
||||
virtual bool OnVehicleSelect(const Vehicle *v)
|
||||
{
|
||||
if (DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle)) {
|
||||
/* Suppress the vehicle GUI when share-cloning. There is no point to it, starting vehicles can also be done via the depot GUI. */
|
||||
if (DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), _ctrl_pressed ? NULL : CcCloneVehicle)) {
|
||||
ResetObjectToPlace();
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -93,7 +93,7 @@ static inline DiagDirection ReverseDiagDir(DiagDirection d)
|
||||
* the new DiagDirection.
|
||||
*
|
||||
* @param d The DiagDirection
|
||||
* @param delta The difference to apply on
|
||||
* @param delta The difference to applie on
|
||||
* @return The new direction which was calculated
|
||||
*/
|
||||
static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
|
||||
@@ -207,7 +207,7 @@ static inline DiagDirection XYNSToDiagDir(Axis xy, uint ns)
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an integer value is a valid DiagDirection
|
||||
* Checks if an interger value is a valid DiagDirection
|
||||
*
|
||||
* @param d The value to check
|
||||
* @return True if the value belongs to a DiagDirection, else false
|
||||
|
||||
@@ -66,7 +66,7 @@ enum DirDiff {
|
||||
DIRDIFF_SAME = 0, ///< Both directions faces to the same direction
|
||||
DIRDIFF_45RIGHT = 1, ///< Angle of 45 degrees right
|
||||
DIRDIFF_90RIGHT = 2, ///< Angle of 90 degrees right
|
||||
DIRDIFF_REVERSE = 4, ///< One direction is the opposite of the other one
|
||||
DIRDIFF_REVERSE = 4, ///< One direction is the opposit of the other one
|
||||
DIRDIFF_90LEFT = 6, ///< Angle of 90 degrees left
|
||||
DIRDIFF_45LEFT = 7, ///< Angle of 45 degrees left
|
||||
};
|
||||
@@ -119,7 +119,7 @@ DECLARE_POSTFIX_INCREMENT(DiagDirDiff)
|
||||
/**
|
||||
* Enumeration for the two axis X and Y
|
||||
*
|
||||
* This enumeration represents the two axis X and Y in the game.
|
||||
* This enumeration represente the two axis X and Y in the game.
|
||||
* The X axis is the one which goes align the north-west edge
|
||||
* (and south-east edge). The Y axis must be so the one which goes
|
||||
* align the north-east edge (and south-west) edge.
|
||||
|
||||
@@ -76,7 +76,7 @@ static void DisasterClearSquare(TileIndex tile)
|
||||
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_RAILWAY:
|
||||
if (Company::IsHumanID(GetTileOwner(tile)) && !IsRailDepot(tile)) {
|
||||
if (Company::IsHumanID(GetTileOwner(tile))) {
|
||||
Backup<CompanyByte> cur_company(_current_company, OWNER_WATER, FILE_LINE);
|
||||
DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
|
||||
cur_company.Restore();
|
||||
@@ -382,7 +382,7 @@ static void DestructIndustry(Industry *i)
|
||||
|
||||
/**
|
||||
* Aircraft handling, v->current_order.dest states:
|
||||
* 0: Fly towards the targeted industry
|
||||
* 0: Fly towards the targetted industry
|
||||
* 1: If within 15 tiles, fire away rockets and destroy industry
|
||||
* 2: Industry explosions
|
||||
* 3: Fly out of the map
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = N
|
||||
return endtile;
|
||||
}
|
||||
|
||||
/** Toolbar window for constructing water infrastructure. */
|
||||
/** Toolbar window for constructing water infra structure. */
|
||||
struct BuildDocksToolbarWindow : Window {
|
||||
DockToolbarWidgets last_clicked_widget; ///< Contains the last widget that has been clicked on this toolbar.
|
||||
|
||||
|
||||
+27
-58
@@ -45,7 +45,6 @@
|
||||
#include "water.h"
|
||||
#include "game/game.hpp"
|
||||
#include "cargomonitor.h"
|
||||
#include "goal_base.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
#include "table/pricebase.h"
|
||||
@@ -292,7 +291,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
|
||||
#endif /* ENABLE_NETWORK */
|
||||
if (old_owner == _local_company) {
|
||||
/* Single player cheated to AI company.
|
||||
* There are no spectators in single player, so we must pick some other company. */
|
||||
* There are no specatators in single player, so we must pick some other company. */
|
||||
assert(!_networking);
|
||||
Backup<CompanyByte> cur_company(_current_company, FILE_LINE);
|
||||
Company *c;
|
||||
@@ -462,7 +461,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
|
||||
if (new_owner != INVALID_OWNER) {
|
||||
/* Update all signals because there can be new segment that was owned by two companies
|
||||
* and signals were not propagated
|
||||
* Similar with crossings - it is needed to bar crossings that weren't before
|
||||
* Similiar with crossings - it is needed to bar crossings that weren't before
|
||||
* because of different owner of crossing and approaching train */
|
||||
tile = 0;
|
||||
|
||||
@@ -509,15 +508,6 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
|
||||
if (si->owner == old_owner) si->owner = new_owner == INVALID_OWNER ? OWNER_NONE : new_owner;
|
||||
}
|
||||
|
||||
/* Remove Game Script created Goals and CargoMonitors. */
|
||||
Goal *g;
|
||||
FOR_ALL_GOALS(g) {
|
||||
if (g->company == old_owner) delete g;
|
||||
}
|
||||
|
||||
ClearCargoPickupMonitoring(old_owner);
|
||||
ClearCargoDeliveryMonitoring(old_owner);
|
||||
|
||||
/* Change colour of existing windows */
|
||||
if (new_owner != INVALID_OWNER) ChangeWindowOwner(old_owner, new_owner);
|
||||
|
||||
@@ -555,7 +545,7 @@ static void CompanyCheckBankrupt(Company *c)
|
||||
case 9:
|
||||
break;
|
||||
|
||||
/* Warn about bankruptcy after 3 months */
|
||||
/* Warn about bancruptcy after 3 months */
|
||||
case 4: {
|
||||
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
|
||||
cni->FillData(c);
|
||||
@@ -570,19 +560,19 @@ static void CompanyCheckBankrupt(Company *c)
|
||||
|
||||
/* Offer company for sale after 6 months */
|
||||
case 7: {
|
||||
/* Don't consider the loan */
|
||||
/* Check if the company has any value. If not, declare it bankrupt
|
||||
* right now */
|
||||
Money val = CalculateCompanyValue(c, false);
|
||||
|
||||
c->bankrupt_value = val;
|
||||
c->bankrupt_asked = 1 << c->index; // Don't ask the owner
|
||||
c->bankrupt_timeout = 0;
|
||||
|
||||
/* The company assets should always have some value */
|
||||
assert(c->bankrupt_value > 0);
|
||||
break;
|
||||
if (val > 0) {
|
||||
c->bankrupt_value = val;
|
||||
c->bankrupt_asked = 1 << c->index; // Don't ask the owner
|
||||
c->bankrupt_timeout = 0;
|
||||
break;
|
||||
}
|
||||
/* FALL THROUGH to case 10 */
|
||||
}
|
||||
|
||||
/* Bankrupt company after 6 months (if the company has no value) or latest
|
||||
/* Bancrupt company after 6 months (if the company has no value) or latest
|
||||
* after 9 months (if it still had value after 6 months) */
|
||||
default:
|
||||
case 10: {
|
||||
@@ -706,7 +696,7 @@ bool AddInflation(bool check_year)
|
||||
/* Approximation for (100 + infl_amount)% ** (1 / 12) - 100%
|
||||
* scaled by 65536
|
||||
* 12 -> months per year
|
||||
* This is only a good approximation for small values
|
||||
* This is only a good approxiamtion for small values
|
||||
*/
|
||||
_economy.inflation_prices += (_economy.inflation_prices * _economy.infl_amount * 54) >> 16;
|
||||
_economy.inflation_payment += (_economy.inflation_payment * _economy.infl_amount_pr * 54) >> 16;
|
||||
@@ -876,7 +866,7 @@ void StartupIndustryDailyChanges(bool init_counter)
|
||||
* which stands for the days in a month.
|
||||
* Using just 31 will make it so that a monthly reset (based on the real number of days of that month)
|
||||
* would not be needed.
|
||||
* Since it is based on "fractional parts", the leftover days will not make much of a difference
|
||||
* Since it is based on "fractionnal parts", the leftover days will not make much of a difference
|
||||
* on the overall total number of changes performed */
|
||||
_economy.industry_daily_increment = (1 << map_size) / 31;
|
||||
|
||||
@@ -1261,8 +1251,7 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
|
||||
/* 'Reserve' this cargo for this vehicle, because we were first. */
|
||||
for (Vehicle *v = front; v != NULL; v = v->Next()) {
|
||||
int cap_left = v->cargo_cap;
|
||||
if (!HasBit(v->vehicle_flags, VF_CARGO_UNLOADING)) cap_left -= v->cargo.Count();
|
||||
int cap_left = v->cargo_cap - v->cargo.Count();
|
||||
if (cap_left > 0) cargo_left[v->cargo_type] -= cap_left;
|
||||
}
|
||||
}
|
||||
@@ -1295,12 +1284,11 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
bool dirty_station = false;
|
||||
|
||||
bool completely_emptied = true;
|
||||
bool anything_unloaded = false;
|
||||
bool anything_loaded = false;
|
||||
bool anything_unloaded = false;
|
||||
bool anything_loaded = false;
|
||||
uint32 full_load_amount = 0;
|
||||
uint32 cargo_not_full = 0;
|
||||
uint32 cargo_full = 0;
|
||||
uint32 reservation_left = 0;
|
||||
uint32 cargo_not_full = 0;
|
||||
uint32 cargo_full = 0;
|
||||
|
||||
front->cur_speed = 0;
|
||||
|
||||
@@ -1512,14 +1500,9 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
if (use_autorefit) {
|
||||
/* When using autorefit, reserve all cargo for this wagon to prevent other wagons
|
||||
* from feeling the need to refit. */
|
||||
uint total_cap_left = v->cargo_cap - v->cargo.Count();
|
||||
int total_cap_left = v->cargo_cap - v->cargo.Count();
|
||||
cargo_left[v->cargo_type] -= total_cap_left;
|
||||
consist_capleft[v->cargo_type] -= total_cap_left;
|
||||
if (total_cap_left > cap && count > cap) {
|
||||
/* Remember if there are reservations left so that we don't stop
|
||||
* loading before they're loaded. */
|
||||
SetBit(reservation_left, v->cargo_type);
|
||||
}
|
||||
} else {
|
||||
/* Update cargo left; but don't reserve everything yet, so other wagons
|
||||
* of the same consist load in parallel. */
|
||||
@@ -1552,7 +1535,6 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
st->last_vehicle_type = v->type;
|
||||
|
||||
if (ge->cargo.Empty()) {
|
||||
TriggerStationRandomisation(st, st->xy, SRT_CARGO_TAKEN, v->cargo_type);
|
||||
TriggerStationAnimation(st, st->xy, SAT_CARGO_TAKEN, v->cargo_type);
|
||||
AirportAnimationTrigger(st, AAT_STATION_CARGO_TAKEN, v->cargo_type);
|
||||
}
|
||||
@@ -1570,10 +1552,7 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
}
|
||||
|
||||
if (anything_loaded || anything_unloaded) {
|
||||
if (front->type == VEH_TRAIN) {
|
||||
TriggerStationRandomisation(st, front->tile, SRT_TRAIN_LOADS);
|
||||
TriggerStationAnimation(st, front->tile, SAT_TRAIN_LOADS);
|
||||
}
|
||||
if (front->type == VEH_TRAIN) TriggerStationAnimation(st, st->xy, SAT_TRAIN_LOADS);
|
||||
}
|
||||
|
||||
/* Only set completely_emptied, if we just unloaded all remaining cargo */
|
||||
@@ -1585,17 +1564,10 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
* If we use autorefit otoh, we only want to load/refit a vehicle if the other wagons cannot already hold the cargo,
|
||||
* to keep the option to still refit the vehicle when new cargo of different type shows up.
|
||||
*/
|
||||
if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
|
||||
if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD) && !use_autorefit) {
|
||||
/* Update left cargo */
|
||||
for (Vehicle *v = front; v != NULL; v = v->Next()) {
|
||||
int cap_left = v->cargo_cap;
|
||||
if (!HasBit(v->vehicle_flags, VF_CARGO_UNLOADING)) {
|
||||
if (use_autorefit) {
|
||||
continue;
|
||||
} else {
|
||||
cap_left -= v->cargo.Count();
|
||||
}
|
||||
}
|
||||
int cap_left = v->cargo_cap - v->cargo.Count();
|
||||
if (cap_left > 0) cargo_left[v->cargo_type] -= cap_left;
|
||||
}
|
||||
}
|
||||
@@ -1613,7 +1585,7 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
}
|
||||
/* We loaded less cargo than possible for all cargo types and it's not full
|
||||
* load and we're not supposed to wait any longer: stop loading. */
|
||||
if (!anything_unloaded && full_load_amount == 0 && reservation_left == 0 && !(front->current_order.GetLoadType() & OLFB_FULL_LOAD) &&
|
||||
if (!anything_unloaded && full_load_amount == 0 && !(front->current_order.GetLoadType() & OLFB_FULL_LOAD) &&
|
||||
front->current_order_time >= (uint)max(front->current_order.wait_time - front->lateness_counter, 0)) {
|
||||
SetBit(front->vehicle_flags, VF_STOP_LOADING);
|
||||
}
|
||||
@@ -1665,9 +1637,6 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
front->load_unload_ticks = max(1, unloading_time);
|
||||
|
||||
if (completely_emptied) {
|
||||
/* Make sure the vehicle is marked dirty, since we need to update the NewGRF
|
||||
* properties such as weight, power and TE whenever the trigger runs. */
|
||||
dirty_vehicle = true;
|
||||
TriggerVehicle(front, VEHICLE_TRIGGER_EMPTY);
|
||||
}
|
||||
|
||||
@@ -1828,7 +1797,7 @@ CommandCost CmdBuyShareInCompany(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
break;
|
||||
}
|
||||
}
|
||||
InvalidateWindowData(WC_COMPANY, target_company);
|
||||
SetWindowDirty(WC_COMPANY, target_company);
|
||||
CompanyAdminUpdate(c);
|
||||
}
|
||||
return cost;
|
||||
@@ -1866,7 +1835,7 @@ CommandCost CmdSellShareInCompany(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
OwnerByte *b = c->share_owners;
|
||||
while (*b != _current_company) b++; // share owners is guaranteed to contain company
|
||||
*b = COMPANY_SPECTATOR;
|
||||
InvalidateWindowData(WC_COMPANY, target_company);
|
||||
SetWindowDirty(WC_COMPANY, target_company);
|
||||
CompanyAdminUpdate(c);
|
||||
}
|
||||
return CommandCost(EXPENSES_OTHER, cost);
|
||||
|
||||
@@ -547,7 +547,7 @@ static EffectInitProc * const _effect_init_procs[] = {
|
||||
};
|
||||
assert_compile(lengthof(_effect_init_procs) == EV_END);
|
||||
|
||||
/** Functions for controlling effect vehicles at each tick. */
|
||||
/** Functions for controling effect vehicles at each tick. */
|
||||
static EffectTickProc * const _effect_tick_procs[] = {
|
||||
ChimneySmokeTick, // EV_CHIMNEY_SMOKE
|
||||
SteamSmokeTick, // EV_STEAM_SMOKE
|
||||
|
||||
+5
-5
@@ -25,7 +25,7 @@
|
||||
* Group 0: Tiles with both an even X coordinate and an even Y coordinate
|
||||
* Group 1: Tiles with an even X and an odd Y coordinate
|
||||
* Group 2: Tiles with an odd X and an even Y coordinate
|
||||
* Group 3: Tiles with both an odd X and Y coordinate.
|
||||
* Group 3: Tiles with both an odd X and Y coordnate.
|
||||
*
|
||||
* <h3>Pylon Points</h3>
|
||||
* <h4>Control Points</h4>
|
||||
@@ -39,7 +39,7 @@
|
||||
* other tile.
|
||||
*
|
||||
* Now on each edge there are two PCPs: One from each adjacent tile. Both PCPs
|
||||
* are merged using an OR operation (i. e. if one tile needs a PCP at the position
|
||||
* are merged using an OR operation (i. e. if one tile needs a PCP at the postion
|
||||
* in question, both tiles get it).
|
||||
*
|
||||
* <h4>Position Points</h4>
|
||||
@@ -127,7 +127,7 @@ static TrackBits MaskWireBits(TileIndex t, TrackBits tracks)
|
||||
|
||||
TrackdirBits neighbour_tdb = TRACKDIR_BIT_NONE;
|
||||
for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) {
|
||||
/* If the neighbour tile is either not electrified or has no tracks that can be reached
|
||||
/* If the neighbor tile is either not electrified or has no tracks that can be reached
|
||||
* from this tile, mark all trackdirs that can be reached from the neighbour tile
|
||||
* as needing no catenary. We make an exception for blocked station tiles with a matching
|
||||
* axis that still display wires to preserve visual continuity. */
|
||||
@@ -376,7 +376,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
|
||||
/* Station and road crossings are always "flat", so adjust the tileh accordingly */
|
||||
if (IsTileType(neighbour, MP_STATION) || IsTileType(neighbour, MP_ROAD)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
|
||||
|
||||
/* Read the foundations if they are present, and adjust the tileh */
|
||||
/* Read the foundataions if they are present, and adjust the tileh */
|
||||
if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
|
||||
if (IsBridgeTile(neighbour)) {
|
||||
foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetTunnelBridgeDirection(neighbour)));
|
||||
@@ -426,7 +426,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
|
||||
|
||||
/* Don't build the pylon if it would be outside the tile */
|
||||
if (!HasBit(OwnedPPPonPCP[i], temp)) {
|
||||
/* We have a neighbour that will draw it, bail out */
|
||||
/* We have a neighour that will draw it, bail out */
|
||||
if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE) break;
|
||||
continue; // No neighbour, go looking for a better position
|
||||
}
|
||||
|
||||
+2
-2
@@ -854,7 +854,7 @@ void EnginesDailyLoop()
|
||||
* Accept an engine prototype. XXX - it is possible that the top-company
|
||||
* changes while you are waiting to accept the offer? Then it becomes invalid
|
||||
* @param tile unused
|
||||
* @param flags operation to perform
|
||||
* @param flags operation to perfom
|
||||
* @param p1 engine-prototype offered
|
||||
* @param p2 unused
|
||||
* @param text unused
|
||||
@@ -1000,7 +1000,7 @@ static bool IsUniqueEngineName(const char *name)
|
||||
/**
|
||||
* Rename an engine.
|
||||
* @param tile unused
|
||||
* @param flags operation to perform
|
||||
* @param flags operation to perfom
|
||||
* @param p1 engine ID to rename
|
||||
* @param p2 unused
|
||||
* @param text the new name or an empty string when resetting to the default
|
||||
|
||||
+1
-1
@@ -72,7 +72,7 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> {
|
||||
* Usually a valid cargo is returned, even though the vehicle has zero capacity, and can therefore not carry anything. But the cargotype is still used
|
||||
* for livery selection etc..
|
||||
*
|
||||
* Vehicles with CT_INVALID as default cargo are usually not available, but it can appear as default cargo of articulated parts.
|
||||
* Vehicles with CT_INVALID as default cargo are usally not available, but it can appear as default cargo of articulated parts.
|
||||
*
|
||||
* @return The default cargo type.
|
||||
* @see CanCarryCargo
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@
|
||||
|
||||
/** Message severity/type */
|
||||
enum WarningLevel {
|
||||
WL_INFO, ///< Used for DoCommand-like (and some non-fatal AI GUI) errors/information
|
||||
WL_INFO, ///< Used for DoCommand-like (and some nonfatal AI GUI) errors/information
|
||||
WL_WARNING, ///< Other information
|
||||
WL_ERROR, ///< Errors (eg. saving/loading failed)
|
||||
WL_CRITICAL, ///< Critical errors, the MessageBox is shown in all cases
|
||||
|
||||
+1
-1
@@ -67,7 +67,7 @@ static const WindowDesc _errmsg_face_desc(
|
||||
);
|
||||
|
||||
/**
|
||||
* Copy the given data into our instance.
|
||||
* Copy the given data into our instace.
|
||||
* @param data The data to copy.
|
||||
*/
|
||||
ErrorMessageData::ErrorMessageData(const ErrorMessageData &data)
|
||||
|
||||
+4
-4
@@ -238,7 +238,7 @@ static void FioFreeHandle()
|
||||
* @param slot Index to assign.
|
||||
* @param filename Name of the file at the disk.
|
||||
* @param subdir The sub directory to search this file in.
|
||||
*/
|
||||
*/
|
||||
void FioOpenFile(int slot, const char *filename, Subdirectory subdir)
|
||||
{
|
||||
FILE *f;
|
||||
@@ -643,7 +643,7 @@ static void SimplifyFileName(char *name)
|
||||
/* Force lowercase */
|
||||
strtolower(name);
|
||||
|
||||
/* Tar-files always have '/' path-separator, but we want our PATHSEPCHAR */
|
||||
/* Tar-files always have '/' path-seperator, but we want our PATHSEPCHAR */
|
||||
#if (PATHSEPCHAR != '/')
|
||||
for (char *n = name; *n != '\0'; n++) if (*n == '/') *n = PATHSEPCHAR;
|
||||
#endif
|
||||
@@ -1364,7 +1364,7 @@ static uint ScanTar(FileScanner *fs, const char *extension, TarFileList::iterato
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan for files with the given extension in the given search path.
|
||||
* Scan for files with the given extention in the given search path.
|
||||
* @param extension the extension of files to search for.
|
||||
* @param sd the sub directory to search in.
|
||||
* @param tars whether to search in the tars too.
|
||||
@@ -1410,7 +1410,7 @@ uint FileScanner::Scan(const char *extension, Subdirectory sd, bool tars, bool r
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan for files with the given extension in the given search path.
|
||||
* Scan for files with the given extention in the given search path.
|
||||
* @param extension the extension of files to search for.
|
||||
* @param directory the sub directory to search in.
|
||||
* @param recursive whether to search recursively
|
||||
|
||||
+2
-2
@@ -88,9 +88,9 @@ enum FileSlots {
|
||||
CONFIG_SLOT = 0,
|
||||
/** Slot for the sound. */
|
||||
SOUND_SLOT = 1,
|
||||
/** First slot usable for (New)GRFs used during the game. */
|
||||
/** First slot useable for (New)GRFs used during the game. */
|
||||
FIRST_GRF_SLOT = 2,
|
||||
/** Last slot usable for (New)GRFs used during the game. */
|
||||
/** Last slot useable for (New)GRFs used during the game. */
|
||||
LAST_GRF_SLOT = 63,
|
||||
/** Maximum number of slots. */
|
||||
MAX_FILE_SLOTS = 64
|
||||
|
||||
@@ -266,6 +266,7 @@ public:
|
||||
|
||||
this->querystrings[WID_SL_SAVE_OSK_TITLE] = &this->filename_editbox;
|
||||
this->filename_editbox.ok_button = WID_SL_SAVE_GAME;
|
||||
this->filename_editbox.afilter = CS_ALPHANUMERAL;
|
||||
|
||||
this->CreateNestedTree(desc, true);
|
||||
if (mode == SLD_LOAD_GAME) this->GetWidget<NWidgetStacked>(WID_SL_CONTENT_DOWNLOAD_SEL)->SetDisplayedPlane(SZSP_HORIZONTAL);
|
||||
|
||||
+5
-5
@@ -160,8 +160,8 @@ static FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
|
||||
* - Batang & BatangChe & Gungsuh & GungsuhChe (TrueType)
|
||||
* We will strip the font-type '()' if any and work with the font name
|
||||
* itself, which must match exactly; if...
|
||||
* TTC files, font files which contain more than one font are separated
|
||||
* by '&'. Our best bet will be to do substr match for the fontname
|
||||
* TTC files, font files which contain more than one font are seperated
|
||||
* byt '&'. Our best bet will be to do substr match for the fontname
|
||||
* and then let FreeType figure out which index to load */
|
||||
s = _tcschr(vbuffer, _T('('));
|
||||
if (s != NULL) s[-1] = '\0';
|
||||
@@ -182,7 +182,7 @@ static FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
|
||||
* contain multiple fonts inside this single file. GetFontData however
|
||||
* returns the whole file, so we need to check each font inside to get the
|
||||
* proper font.
|
||||
* Also note that FreeType does not support UNICODE filenames! */
|
||||
* Also note that FreeType does not support UNICODE filesnames! */
|
||||
#if defined(UNICODE)
|
||||
/* We need a cast here back from wide because FreeType doesn't support
|
||||
* widechar filenames. Just use the buffer we allocated before for the
|
||||
@@ -570,7 +570,7 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i
|
||||
strecpy(buff, str, lastof(buff));
|
||||
str_validate(buff, lastof(buff), SVS_ALLOW_NEWLINE);
|
||||
|
||||
/* Extract a UniChar representation of the sample string. */
|
||||
/* Extract a UniChar represenation of the sample string. */
|
||||
CFStringRef cf_str = CFStringCreateWithCString(kCFAllocatorDefault, buff, kCFStringEncodingUTF8);
|
||||
if (cf_str == NULL) {
|
||||
/* Something went wrong. Corrupt/invalid sample string? */
|
||||
@@ -590,7 +590,7 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i
|
||||
ATSUCreateTextLayoutWithTextPtr(string, kATSUFromTextBeginning, kATSUToTextEnd, str_len, 1, &run_len, &style, &text_layout);
|
||||
|
||||
/* Try to match a font for the sample text. ATSUMatchFontsToText stops after
|
||||
* it finds the first continuous character run not renderable with the currently
|
||||
* it finds the first continous character run not renderable with the currently
|
||||
* selected font starting at offset. The matching needs to be repeated until
|
||||
* the end of the string is reached to make sure the fallback font matches for
|
||||
* all characters in the string and not only the first run. */
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
|
||||
/* static */ void Game::ResetConfig()
|
||||
{
|
||||
/* Check for both newgame as current game if we can reload the GameInfo inside
|
||||
/* Check for both newgame as current game if we can reload the GameInfo insde
|
||||
* the GameConfig. If not, remove the Game from the list. */
|
||||
if (_settings_game.game_config != NULL && _settings_game.game_config->HasScript()) {
|
||||
if (!_settings_game.game_config->ResetInfo(true)) {
|
||||
|
||||
@@ -21,7 +21,7 @@ public:
|
||||
/**
|
||||
* Check if we have a game by name and version available in our list.
|
||||
* @param nameParam The name of the game script.
|
||||
* @param versionParam The version of the game script, or -1 if you want the latest.
|
||||
* @param versionParam The versionof the game script, or -1 if you want the latest.
|
||||
* @param force_exact_match Only match name+version, never latest.
|
||||
* @return NULL if no match found, otherwise the game script that matched.
|
||||
*/
|
||||
|
||||
@@ -78,7 +78,7 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0),
|
||||
/* Left column with labels. */
|
||||
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
|
||||
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
|
||||
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_NULL), SetFill(1, 1),
|
||||
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_LAND_GENERATOR, STR_NULL), SetFill(1, 1),
|
||||
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1),
|
||||
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_NULL), SetFill(1, 1),
|
||||
@@ -92,9 +92,9 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = {
|
||||
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
|
||||
/* Mapsize X * Y. */
|
||||
NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
|
||||
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetPadding(1, 0, 0, 0), SetFill(1, 1),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
|
||||
EndContainer(),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_LANDSCAPE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
|
||||
@@ -320,7 +320,7 @@ struct GenerateLandscapeWindow : public Window {
|
||||
this->querystrings[WID_GL_RANDOM_EDITBOX] = &this->seed_editbox;
|
||||
this->seed_editbox.text.Print("%u", _settings_newgame.game_creation.generation_seed);
|
||||
this->seed_editbox.caption = STR_NULL;
|
||||
this->seed_editbox.text.afilter = CS_NUMERAL;
|
||||
this->seed_editbox.afilter = CS_NUMERAL;
|
||||
|
||||
this->mode = (GenenerateLandscapeWindowMode)this->window_number;
|
||||
|
||||
|
||||
+33
-36
@@ -297,11 +297,11 @@ static void SetColourRemap(TextColour colour)
|
||||
}
|
||||
|
||||
#if !defined(WITH_ICU)
|
||||
static WChar *HandleBiDiAndArabicShapes(WChar *text) { return text; }
|
||||
typedef WChar UChar;
|
||||
static UChar *HandleBiDiAndArabicShapes(UChar *text) { return text; }
|
||||
#else
|
||||
#include <unicode/ubidi.h>
|
||||
#include <unicode/ushape.h>
|
||||
#include <unicode/ustring.h>
|
||||
|
||||
/**
|
||||
* Function to be able to handle right-to-left text and Arabic chars properly.
|
||||
@@ -332,40 +332,37 @@ static WChar *HandleBiDiAndArabicShapes(WChar *text) { return text; }
|
||||
* @param lastof the end of the buffer
|
||||
* @return the buffer to draw from
|
||||
*/
|
||||
static WChar *HandleBiDiAndArabicShapes(WChar *buffer)
|
||||
static UChar *HandleBiDiAndArabicShapes(UChar *buffer)
|
||||
{
|
||||
UChar input[DRAW_STRING_BUFFER];
|
||||
static UChar input_output[DRAW_STRING_BUFFER];
|
||||
UChar intermediate[DRAW_STRING_BUFFER];
|
||||
static WChar output[DRAW_STRING_BUFFER];
|
||||
|
||||
/* Transform from UTF-32 to internal ICU format of UTF-16. */
|
||||
UChar *t = buffer;
|
||||
size_t length = 0;
|
||||
while (*t != '\0' && length < lengthof(input_output) - 1) {
|
||||
input_output[length++] = *t++;
|
||||
}
|
||||
input_output[length] = 0;
|
||||
|
||||
UErrorCode err = U_ZERO_ERROR;
|
||||
int32_t length = 0;
|
||||
u_strFromUTF32(input, lengthof(input), &length, (UChar32 *)buffer, -1, &err);
|
||||
if (U_FAILURE(err)) return buffer;
|
||||
|
||||
UBiDi *para = ubidi_openSized(length, 0, &err);
|
||||
UBiDi *para = ubidi_openSized((int32_t)length, 0, &err);
|
||||
if (para == NULL) return buffer;
|
||||
|
||||
ubidi_setPara(para, input, length, _current_text_dir == TD_RTL ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, NULL, &err);
|
||||
length = ubidi_writeReordered(para, intermediate, lengthof(intermediate), UBIDI_REMOVE_BIDI_CONTROLS, &err);
|
||||
length = u_shapeArabic(intermediate, length, input, lengthof(input), U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_LETTERS_SHAPE, &err);
|
||||
ubidi_setPara(para, input_output, (int32_t)length, _current_text_dir == TD_RTL ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, NULL, &err);
|
||||
ubidi_writeReordered(para, intermediate, (int32_t)length, UBIDI_REMOVE_BIDI_CONTROLS, &err);
|
||||
length = u_shapeArabic(intermediate, (int32_t)length, input_output, lengthof(input_output), U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_LETTERS_SHAPE, &err);
|
||||
ubidi_close(para);
|
||||
|
||||
if (U_FAILURE(err)) return buffer;
|
||||
|
||||
/* Transform back to UTF-32. */
|
||||
u_strToUTF32((UChar32 *)output, lengthof(output), NULL, input, length, &err);
|
||||
if (U_FAILURE(err)) return buffer;
|
||||
|
||||
/* u_strToUTF32 doesn't add a NUL charcter if the buffer is too small, be safe. */
|
||||
output[lengthof(output) - 1] = '\0';
|
||||
return output;
|
||||
input_output[length] = '\0';
|
||||
return input_output;
|
||||
}
|
||||
#endif /* WITH_ICU */
|
||||
|
||||
|
||||
/**
|
||||
* Truncate a given string to a maximum width if necessary.
|
||||
* Truncate a given string to a maximum width if neccessary.
|
||||
* If the string is truncated, add three dots ('...') to show this.
|
||||
* @param *str string that is checked and possibly truncated
|
||||
* @param maxw maximum width in pixels of the string
|
||||
@@ -423,7 +420,7 @@ static int TruncateString(char *str, int maxw, bool ignore_setxy, FontSize start
|
||||
return w;
|
||||
}
|
||||
|
||||
static int ReallyDoDrawString(const WChar *string, int x, int y, DrawStringParams ¶ms, bool parse_string_also_when_clipped = false);
|
||||
static int ReallyDoDrawString(const UChar *string, int x, int y, DrawStringParams ¶ms, bool parse_string_also_when_clipped = false);
|
||||
|
||||
/**
|
||||
* Get the real width of the string.
|
||||
@@ -431,7 +428,7 @@ static int ReallyDoDrawString(const WChar *string, int x, int y, DrawStringParam
|
||||
* @param start_fontsize Fontsize to start the text with
|
||||
* @return the width.
|
||||
*/
|
||||
static int GetStringWidth(const WChar *str, FontSize start_fontsize)
|
||||
static int GetStringWidth(const UChar *str, FontSize start_fontsize)
|
||||
{
|
||||
FontSize size = start_fontsize;
|
||||
int max_width;
|
||||
@@ -499,11 +496,11 @@ static int DrawString(int left, int right, int top, char *str, const char *last,
|
||||
* the string and draw the parts separated by SETX(Y).
|
||||
* So here we split
|
||||
*/
|
||||
static SmallVector<WChar *, 4> setx_offsets;
|
||||
static SmallVector<UChar *, 4> setx_offsets;
|
||||
setx_offsets.Clear();
|
||||
|
||||
WChar draw_buffer[DRAW_STRING_BUFFER];
|
||||
WChar *p = draw_buffer;
|
||||
UChar draw_buffer[DRAW_STRING_BUFFER];
|
||||
UChar *p = draw_buffer;
|
||||
|
||||
*setx_offsets.Append() = p;
|
||||
|
||||
@@ -562,8 +559,8 @@ static int DrawString(int left, int right, int top, char *str, const char *last,
|
||||
/* In case we have a RTL language we swap the alignment. */
|
||||
if (!(align & SA_FORCE) && _current_text_dir == TD_RTL && !(align & SA_STRIP) && (align & SA_HOR_MASK) != SA_HOR_CENTER) align ^= SA_RIGHT;
|
||||
|
||||
for (WChar **iter = setx_offsets.Begin(); iter != setx_offsets.End(); iter++) {
|
||||
WChar *to_draw = *iter;
|
||||
for (UChar **iter = setx_offsets.Begin(); iter != setx_offsets.End(); iter++) {
|
||||
UChar *to_draw = *iter;
|
||||
int offset = 0;
|
||||
|
||||
/* Skip the SETX(Y) and set the appropriate offsets. */
|
||||
@@ -754,7 +751,7 @@ uint32 FormatStringLinebreaks(char *str, const char *last, int maxw, FontSize si
|
||||
end_of_inner_loop:
|
||||
/* String didn't fit on line (or a '\n' was encountered), so 'dummy' terminate
|
||||
* and increase linecount. We use Utf8PrevChar() as also non 1 char long
|
||||
* whitespace separators are supported */
|
||||
* whitespace seperators are supported */
|
||||
num++;
|
||||
char *s = Utf8PrevChar(str);
|
||||
*s++ = '\0';
|
||||
@@ -1077,25 +1074,25 @@ void DrawCharCentered(WChar c, int x, int y, TextColour colour)
|
||||
/**
|
||||
* Draw a string at the given coordinates with the given colour.
|
||||
* While drawing the string, parse it in case some formatting is specified,
|
||||
* like new colour, new size or even positioning.
|
||||
* like new colour, new size or even positionning.
|
||||
* @param string The string to draw. This is already bidi reordered.
|
||||
* @param x Offset from left side of the screen
|
||||
* @param y Offset from top side of the screen
|
||||
* @param params Text drawing parameters
|
||||
* @param parse_string_also_when_clipped
|
||||
* By default, always test the available space where to draw the string.
|
||||
* When in multiline drawing, it would already be done,
|
||||
* When in multipline drawing, it would already be done,
|
||||
* so no need to re-perform the same kind (more or less) of verifications.
|
||||
* It's not only an optimisation, it's also a way to ensures the string will be parsed
|
||||
* (as there are certain side effects on global variables, which are important for the next line)
|
||||
* @return the x-coordinates where the drawing has finished.
|
||||
* If nothing is drawn, the originally passed x-coordinate is returned
|
||||
*/
|
||||
static int ReallyDoDrawString(const WChar *string, int x, int y, DrawStringParams ¶ms, bool parse_string_also_when_clipped)
|
||||
static int ReallyDoDrawString(const UChar *string, int x, int y, DrawStringParams ¶ms, bool parse_string_also_when_clipped)
|
||||
{
|
||||
DrawPixelInfo *dpi = _cur_dpi;
|
||||
bool draw_shadow = GetDrawGlyphShadow();
|
||||
WChar c;
|
||||
UChar c;
|
||||
int xo = x;
|
||||
|
||||
if (!parse_string_also_when_clipped) {
|
||||
@@ -1458,7 +1455,7 @@ void DoPaletteAnimations()
|
||||
}
|
||||
|
||||
Colour *palette_pos = &_cur_palette.palette[PALETTE_ANIM_START]; // Points to where animations are taking place on the palette
|
||||
/* Makes a copy of the current animation palette in old_val,
|
||||
/* Makes a copy of the current anmation palette in old_val,
|
||||
* so the work on the current palette could be compared, see if there has been any changes */
|
||||
memcpy(old_val, palette_pos, sizeof(old_val));
|
||||
|
||||
@@ -1840,7 +1837,7 @@ void DrawDirtyBlocks()
|
||||
* @param left The left edge of the rectangle
|
||||
* @param top The top edge of the rectangle
|
||||
* @param right The right edge of the rectangle
|
||||
* @param bottom The bottom edge of the rectangle
|
||||
* @param bottom The bottm edge of the rectangle
|
||||
* @see DrawDirtyBlocks
|
||||
*
|
||||
* @todo The name of the function should be called like @c AddDirtyBlock as
|
||||
|
||||
+2
-2
@@ -26,10 +26,10 @@
|
||||
* This whole mechanism is controlled by an rectangle defined in #_invalid_rect. This
|
||||
* rectangle defines the area on the screen which must be repaint. If a new object
|
||||
* needs to be repainted this rectangle is extended to 'catch' the object on the
|
||||
* screen. At some point (which is normally uninteresting for patch writers) this
|
||||
* screen. At some point (which is normaly uninteressted for patch writers) this
|
||||
* rectangle is send to the video drivers method
|
||||
* VideoDriver::MakeDirty and it is truncated back to an empty rectangle. At some
|
||||
* later point (which is uninteresting, too) the video driver
|
||||
* later point (which is uninteressted, too) the video driver
|
||||
* repaints all these saved rectangle instead of the whole screen and drop the
|
||||
* rectangle informations. Then a new round begins by marking objects "dirty".
|
||||
*
|
||||
|
||||
+1
-1
@@ -352,7 +352,7 @@ template <class Tbase_set>
|
||||
|
||||
const Tbase_set *best = NULL;
|
||||
for (const Tbase_set *c = BaseMedia<Tbase_set>::available_sets; c != NULL; c = c->next) {
|
||||
/* Skip unusable sets */
|
||||
/* Skip unuseable sets */
|
||||
if (c->GetNumMissing() != 0) continue;
|
||||
|
||||
if (best == NULL ||
|
||||
|
||||
+2
-2
@@ -285,7 +285,7 @@ protected:
|
||||
ValuesInterval interval; ///< Interval that contains all of the graph data.
|
||||
int x_axis_offset; ///< Distance from the top of the graph to the x axis.
|
||||
|
||||
/* the colours and cost array of GraphDrawer must accommodate
|
||||
/* the colours and cost array of GraphDrawer must accomodate
|
||||
* both values for cargo and companies. So if any are higher, quit */
|
||||
assert_compile(GRAPH_MAX_DATASETS >= (int)NUM_CARGO && GRAPH_MAX_DATASETS >= (int)MAX_COMPANIES);
|
||||
assert(this->num_vert_lines > 0);
|
||||
@@ -423,7 +423,7 @@ protected:
|
||||
if (datapoint != INVALID_DATAPOINT) {
|
||||
/*
|
||||
* Check whether we need to reduce the 'accuracy' of the
|
||||
* datapoint value and the highest value to split overflows.
|
||||
* datapoint value and the highest value to splut overflows.
|
||||
* And when 'drawing' 'one million' or 'one million and one'
|
||||
* there is no significant difference, so the least
|
||||
* significant bits can just be removed.
|
||||
|
||||
+3
-3
@@ -340,12 +340,12 @@ CommandCost CmdDeleteGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
static bool IsUniqueGroupNameForVehicleType(const char *name, VehicleType type)
|
||||
static bool IsUniqueGroupName(const char *name)
|
||||
{
|
||||
const Group *g;
|
||||
|
||||
FOR_ALL_GROUPS(g) {
|
||||
if (g->name != NULL && g->vehicle_type == type && strcmp(g->name, name) == 0) return false;
|
||||
if (g->name != NULL && strcmp(g->name, name) == 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -370,7 +370,7 @@ CommandCost CmdRenameGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
|
||||
if (!reset) {
|
||||
if (Utf8StringLength(text) >= MAX_LENGTH_GROUP_NAME_CHARS) return CMD_ERROR;
|
||||
if (!IsUniqueGroupNameForVehicleType(text, g->vehicle_type)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
|
||||
if (!IsUniqueGroupName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
|
||||
+2
-2
@@ -344,7 +344,7 @@ static void GrayscaleToMapHeights(uint img_width, uint img_height, byte *map)
|
||||
(col < col_pad) || (col >= (width - col_pad - (_settings_game.construction.freeform_edges ? 0 : 1)))) {
|
||||
SetTileHeight(tile, 0);
|
||||
} else {
|
||||
/* Use nearest neighbour resizing to scale map data.
|
||||
/* Use nearest neighbor resizing to scale map data.
|
||||
* We rotate the map 45 degrees (counter)clockwise */
|
||||
img_row = (((row - row_pad) * num_div) / img_scale);
|
||||
switch (_settings_game.game_creation.heightmap_rotation) {
|
||||
@@ -464,7 +464,7 @@ bool GetHeightmapDimensions(char *filename, uint *x, uint *y)
|
||||
* Load a heightmap from file and change the map in his current dimensions
|
||||
* to a landscape representing the heightmap.
|
||||
* It converts pixels to height. The brighter, the higher.
|
||||
* @param filename of the heightmap file to be imported
|
||||
* @param filename of the heighmap file to be imported
|
||||
*/
|
||||
void LoadHeightmap(char *filename)
|
||||
{
|
||||
|
||||
@@ -148,13 +148,10 @@ struct EndGameWindow : EndGameHighScoreBaseWindow {
|
||||
};
|
||||
|
||||
struct HighScoreWindow : EndGameHighScoreBaseWindow {
|
||||
bool game_paused_by_player; ///< True if the game was paused by the player when the highscore window was opened.
|
||||
|
||||
HighScoreWindow(const WindowDesc *desc, int difficulty, int8 ranking) : EndGameHighScoreBaseWindow(desc)
|
||||
{
|
||||
/* pause game to show the chart */
|
||||
this->game_paused_by_player = _pause_mode == PM_PAUSED_NORMAL;
|
||||
if (!_networking && !this->game_paused_by_player) DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
if (!_networking) DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
|
||||
/* Close all always on-top windows to get a clean screen */
|
||||
if (_game_mode != GM_MENU) HideVitalWindows();
|
||||
@@ -169,7 +166,7 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow {
|
||||
{
|
||||
if (_game_mode != GM_MENU) ShowVitalWindows();
|
||||
|
||||
if (!_networking && !this->game_paused_by_player) DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE); // unpause
|
||||
if (!_networking) DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE); // unpause
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
@@ -200,7 +197,7 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow {
|
||||
};
|
||||
|
||||
static const NWidgetPart _nested_highscore_widgets[] = {
|
||||
NWidget(WWT_PANEL, COLOUR_BROWN, WID_H_BACKGROUND), SetMinimalSize(641, 481), SetResize(1, 1), EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_END, WID_H_BACKGROUND), SetMinimalSize(641, 481), SetResize(1, 1), EndContainer(),
|
||||
};
|
||||
|
||||
static const WindowDesc _highscore_desc(
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user