diff --git a/Makefile.grf.in b/Makefile.grf.in
index 9206bc8547..aa81428358 100644
--- a/Makefile.grf.in
+++ b/Makefile.grf.in
@@ -1,4 +1,4 @@
-# $Id: Makefile.grf.in 25205 2013-04-24 20:30:02Z frosch $
+# $Id: Makefile.grf.in 26708 2014-07-30 17:21:42Z rubidium $
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -75,10 +75,10 @@ $(BIN_DIR)/%.obm: $(BASESET_DIR)/%.obm $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/
$(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $< >$@
# Compile extra grf
-$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites
+$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites $(GRF_DIR)/assemble_nfo.awk
$(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) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/openttd.nfo > $(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
diff --git a/Makefile.lang.in b/Makefile.lang.in
index 25ec7fb863..a470abad00 100644
--- a/Makefile.lang.in
+++ b/Makefile.lang.in
@@ -1,4 +1,4 @@
-# $Id: Makefile.lang.in 24365 2012-07-01 08:56:57Z rubidium $
+# $Id: Makefile.lang.in 26497 2014-04-24 18:09:10Z rubidium $
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -43,23 +43,23 @@ RES := $(shell mkdir -p $(BIN_DIR)/lang )
all: table/strings.h $(LANGS)
-strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h
+strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
-strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h
+strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
-string.o: $(SRC_DIR)/string.cpp endian_host.h
+string.o: $(SRC_DIR)/string.cpp endian_host.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
-alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
+alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
-getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h
+getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
diff --git a/Makefile.setting.in b/Makefile.setting.in
index 412c3ba4e0..a48b9df446 100644
--- a/Makefile.setting.in
+++ b/Makefile.setting.in
@@ -1,4 +1,4 @@
-# $Id: Makefile.setting.in 24365 2012-07-01 08:56:57Z rubidium $
+# $Id: Makefile.setting.in 26497 2014-04-24 18:09:10Z rubidium $
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -28,23 +28,23 @@ endif
all: table/settings.h
-settingsgen.o: $(SRC_DIR)/settingsgen/settingsgen.cpp $(SRC_DIR)/string_func.h $(SRC_DIR)/strings_type.h $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/ini_type.h $(SRC_DIR)/core/smallvec_type.hpp
+settingsgen.o: $(SRC_DIR)/settingsgen/settingsgen.cpp $(SRC_DIR)/string_func.h $(SRC_DIR)/strings_type.h $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/ini_type.h $(SRC_DIR)/core/smallvec_type.hpp $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
-alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
+alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
-getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h
+getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
-string.o: $(SRC_DIR)/string.cpp endian_host.h
+string.o: $(SRC_DIR)/string.cpp endian_host.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
-ini_load.o: $(SRC_DIR)/ini_load.cpp $(SRC_DIR)/core/alloc_func.hpp $(SRC_DIR)/core/mem_func.hpp $(SRC_DIR)/ini_type.h $(SRC_DIR)/string_func.h
+ini_load.o: $(SRC_DIR)/ini_load.cpp $(SRC_DIR)/core/alloc_func.hpp $(SRC_DIR)/core/mem_func.hpp $(SRC_DIR)/ini_type.h $(SRC_DIR)/string_func.h $(SRC_DIR)/safeguards.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
diff --git a/bin/ai/compat_0.7.nut b/bin/ai/compat_0.7.nut
index 5a7a441779..9b57ee42c7 100644
--- a/bin/ai/compat_0.7.nut
+++ b/bin/ai/compat_0.7.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_0.7.nut 24006 2012-03-04 16:40:06Z rubidium $ */
+/* $Id: compat_0.7.nut 26407 2014-03-17 20:05:38Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -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 .
*/
-AILog.Info("0.7 API compatability in effect:");
+AILog.Info("0.7 API compatibility in effect:");
AILog.Info(" - AITown::GetLastMonthProduction's behaviour has slightly changed.");
AILog.Info(" - AISubsidy::GetDestination returns STATION_INVALID for awarded subsidies.");
AILog.Info(" - AISubsidy::GetSource returns STATION_INVALID for awarded subsidies.");
diff --git a/bin/ai/compat_1.0.nut b/bin/ai/compat_1.0.nut
index 0d2d047cfa..5274854f07 100644
--- a/bin/ai/compat_1.0.nut
+++ b/bin/ai/compat_1.0.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.0.nut 24006 2012-03-04 16:40:06Z rubidium $ */
+/* $Id: compat_1.0.nut 26407 2014-03-17 20:05:38Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -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 .
*/
-AILog.Info("1.0 API compatability in effect.");
+AILog.Info("1.0 API compatibility in effect.");
AIRoad._BuildRoadStation <- AIRoad.BuildRoadStation;
AIRoad.BuildRoadStation <- function(tile, front, road_veh_type, station_id)
diff --git a/bin/ai/compat_1.1.nut b/bin/ai/compat_1.1.nut
index d0a2f12b3a..f10a968a42 100644
--- a/bin/ai/compat_1.1.nut
+++ b/bin/ai/compat_1.1.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.1.nut 24006 2012-03-04 16:40:06Z rubidium $ */
+/* $Id: compat_1.1.nut 26407 2014-03-17 20:05:38Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -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 .
*/
-AILog.Info("1.1 API compatability in effect.");
+AILog.Info("1.1 API compatibility in effect.");
AICompany.GetCompanyValue <- function(company)
{
diff --git a/bin/ai/compat_1.2.nut b/bin/ai/compat_1.2.nut
index 947366f79f..059133be75 100644
--- a/bin/ai/compat_1.2.nut
+++ b/bin/ai/compat_1.2.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.2.nut 23969 2012-02-19 19:14:17Z rubidium $ */
+/* $Id: compat_1.2.nut 26407 2014-03-17 20:05:38Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -7,4 +7,4 @@
* 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 .
*/
-AILog.Info("1.2 API compatability in effect.");
+AILog.Info("1.2 API compatibility in effect.");
diff --git a/bin/ai/compat_1.3.nut b/bin/ai/compat_1.3.nut
index 0eccd50900..8d24e62c1e 100644
--- a/bin/ai/compat_1.3.nut
+++ b/bin/ai/compat_1.3.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.3.nut 25001 2013-02-14 18:58:04Z rubidium $ */
+/* $Id: compat_1.3.nut 26407 2014-03-17 20:05:38Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -7,4 +7,4 @@
* 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 .
*/
-AILog.Info("1.3 API compatability in effect.");
+AILog.Info("1.3 API compatibility in effect.");
diff --git a/bin/ai/compat_1.4.nut b/bin/ai/compat_1.4.nut
index 820a7e5e4e..19e6796e64 100644
--- a/bin/ai/compat_1.4.nut
+++ b/bin/ai/compat_1.4.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.3.nut 23969 2012-02-19 19:14:17Z rubidium $ */
+/* $Id: compat_1.4.nut 26410 2014-03-17 20:28:48Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -6,3 +6,5 @@
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
*/
+
+AILog.Info("1.4 API compatibility in effect.");
diff --git a/bin/ai/regression/completeness.sh b/bin/ai/regression/completeness.sh
index 0f73894b43..18e4d1a92a 100755
--- a/bin/ai/regression/completeness.sh
+++ b/bin/ai/regression/completeness.sh
@@ -1,13 +1,13 @@
#!/bin/sh
-# $Id: completeness.sh 15062 2009-01-13 16:30:24Z smatz $
+# $Id: completeness.sh 26895 2014-09-21 16:41:03Z fonsinchen $
-if ! [ -f ai/regression/regression.nut ]; then
+if ! [ -f ai/regression/completeness.sh ]; then
echo "Make sure you are in the root of OpenTTD before starting this script."
exit 1
fi
-cat ai/regression/regression.nut | tr ';' '\n' | awk '
+cat ai/regression/tst_*/main.nut | tr ';' '\n' | awk '
/^function/ {
for (local in locals) {
delete locals[local]
@@ -61,7 +61,7 @@ cat ai/regression/regression.nut | tr ';' '\n' | awk '
}
' | sed 's/ //g' | sort | uniq > tmp.in_regression
-grep 'DefSQ.*Method' ../src/ai/api/*.hpp.sq | grep -v 'AIError::' | grep -v 'AIAbstractList::Valuate' | grep -v '::GetClassName' | sed 's/^[^,]*, &//g;s/,[^,]*//g' | sort > tmp.in_api
+grep 'DefSQ.*Method' ../src/script/api/ai/*.hpp.sq | grep -v 'AIError::' | grep -v 'AIAbstractList::Valuate' | grep -v '::GetClassName' | sed 's/^[^,]*, &//g;s/,[^,]*//g' | sort > tmp.in_api
diff -u tmp.in_regression tmp.in_api | grep -v '^+++' | grep '^+' | sed 's/^+//'
diff --git a/bin/ai/regression/regression_info.nut b/bin/ai/regression/regression_info.nut
index 289ba1b128..71352645f3 100644
--- a/bin/ai/regression/regression_info.nut
+++ b/bin/ai/regression/regression_info.nut
@@ -1,12 +1,12 @@
-/* $Id: regression_info.nut 23969 2012-02-19 19:14:17Z rubidium $ */
+/* $Id: regression_info.nut 26895 2014-09-21 16:41:03Z fonsinchen $ */
class Regression extends AIInfo {
function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
function GetName() { return "Regression"; }
function GetShortName() { return "REGR"; }
- function GetDescription() { return "This runs regression-tests on all commands. On the same map the result should always be the same."; }
+ function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; }
- function GetAPIVersion() { return "1.3"; }
+ function GetAPIVersion() { return "1.5"; }
function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "Regression"; }
}
diff --git a/bin/ai/regression/run.sh b/bin/ai/regression/run.sh
index 62e78eb3ca..d3f416e682 100755
--- a/bin/ai/regression/run.sh
+++ b/bin/ai/regression/run.sh
@@ -1,15 +1,12 @@
#!/bin/sh
-# $Id: run.sh 23959 2012-02-16 21:08:32Z rubidium $
+# $Id: run.sh 26898 2014-09-21 17:22:50Z rubidium $
-if ! [ -f ai/regression/regression.nut ]; then
+if ! [ -f ai/regression/run.sh ]; then
echo "Make sure you are in the root of OpenTTD before starting this script."
exit 1
fi
-cp ai/regression/regression.nut ai/regression/main.nut
-cp ai/regression/regression_info.nut ai/regression/info.nut
-
if [ -f scripts/game_start.scr ]; then
mv scripts/game_start.scr scripts/game_start.scr.regression
fi
@@ -22,27 +19,46 @@ fi
if [ "$1" = "-g" ]; then
gdb="gdb --ex run --args "
fi
-if [ -n "$gdb" ]; then
- $gdb ./openttd -x -c ai/regression/regression.cfg $params -g ai/regression/regression.sav
+
+if [ -d "ai/regression/tst_$1" ]; then
+ tests="ai/regression/tst_$1"
+elif [ -d "ai/regression/tst_$2" ]; then
+ tests="ai/regression/tst_$2"
else
- ./openttd -x -c ai/regression/regression.cfg $params -g ai/regression/regression.sav -d script=2 -d misc=9 2>&1 | awk '{ gsub("0x(\\(nil\\)|0+)(x0)?", "0x00000000", $0); gsub("^dbg: \\[script\\]", "", $0); gsub("^ ", "ERROR: ", $0); gsub("ERROR: \\[1\\] ", "", $0); gsub("\\[P\\] ", "", $0); print $0; }' | grep -v '^dbg: \[.*\]' > tmp.regression
+ tests=ai/regression/tst_*
fi
ret=0
-if [ -z "$gdb" ]; then
- res="`diff -ub ai/regression/regression.txt tmp.regression`"
- if [ -z "$res" ]; then
- echo "Regression test passed!"
- else
- echo "Regression test failed! Difference:"
- echo "$res"
- ret=1
- fi
- echo ""
- echo "Regression test done"
-fi
+for tst in $tests; do
+ echo -n "Running $tst... "
-rm -f ai/regression/main.nut ai/regression/info.nut
+ # Make sure that only one info.nut is present for each test run. Otherwise openttd gets confused.
+ cp ai/regression/regression_info.nut $tst/info.nut
+
+ sav=$tst/test.sav
+ if ! [ -f $sav ]; then
+ sav=ai/regression/empty.sav
+ fi
+
+ if [ -n "$gdb" ]; then
+ $gdb ./openttd -x -c ai/regression/regression.cfg $params -g $sav
+ else
+ ./openttd -x -c ai/regression/regression.cfg $params -g $sav -d script=2 -d misc=9 2>&1 | awk '{ gsub("0x(\\(nil\\)|0+)(x0)?", "0x00000000", $0); gsub("^dbg: \\[script\\]", "", $0); gsub("^ ", "ERROR: ", $0); gsub("ERROR: \\[1\\] ", "", $0); gsub("\\[P\\] ", "", $0); print $0; }' | grep -v '^dbg: \[.*\]' > tmp.regression
+ fi
+
+ if [ -z "$gdb" ]; then
+ res="`diff -ub $tst/result.txt tmp.regression`"
+ if [ -z "$res" ]; then
+ echo "passed!"
+ else
+ echo "failed! Difference:"
+ echo "$res"
+ ret=1
+ fi
+ fi
+
+ rm $tst/info.nut
+done
if [ -f scripts/game_start.scr.regression ]; then
mv scripts/game_start.scr.regression scripts/game_start.scr
diff --git a/bin/baseset/no_music.obm b/bin/baseset/no_music.obm
index c989b23ea4..0991661601 100644
--- a/bin/baseset/no_music.obm
+++ b/bin/baseset/no_music.obm
@@ -1,4 +1,4 @@
-; $Id: no_music.obm 26414 2014-03-18 19:51:54Z frosch $
+; $Id: no_music.obm 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents more or less nothingness
;
@@ -24,6 +24,7 @@ description.es_ES = Un conjunto de música vacío.
description.et_EE = Muusikakogu ilma muusikata.
description.fi_FI = Musiikkipaketti, jossa ei ole musiikkia.
description.fr_FR = Un pack de musiques sans musiques.
+description.ga_IE = Pacáiste ceoil gan aon cheol iarbhír ann.
description.gd_GB = Pacaid ciùil anns nach eil fonn sam bith.
description.gl_ES = Un conxunto de músicas sen ningunha música.
description.hr_HR = Muzički paket bez ikakve muzike.
@@ -33,6 +34,7 @@ description.is_IS = Tónlistarpakki sem er í raun án tónlistar.
description.it_IT = Un pacchetto musicale non contenente alcuna musica.
description.ja_JP = 空の音楽パック
description.ko_KR = 실제 음악이 없는 음악 목록입니다.
+description.la_VA = Sarcina musicae sine ulla musica.
description.lb_LU = E Musikpack ouni aktuell Musik.
description.lt_LT = Muzikos pakas be muzikos.
description.lv_LV = Mūzikas kopa bez mūzikas
diff --git a/bin/baseset/no_sound.obs b/bin/baseset/no_sound.obs
index b72f609b68..c7f2ed7f06 100644
--- a/bin/baseset/no_sound.obs
+++ b/bin/baseset/no_sound.obs
@@ -1,4 +1,4 @@
-; $Id: no_sound.obs 26414 2014-03-18 19:51:54Z frosch $
+; $Id: no_sound.obs 27103 2015-01-01 20:51:18Z rubidium $
;
; This represents more or less nothingness
;
@@ -22,8 +22,10 @@ description.en_AU = A sound pack without any sounds.
description.en_US = A sound pack without any sounds.
description.es_ES = Un conjunto de sonidos vacío.
description.et_EE = Helikogu ilma helideta.
+description.eu_ES = Soinurik gabeko soinu pakete bat
description.fi_FI = Äänipaketti, jossa ei ole ääniä.
description.fr_FR = Un pack de sons sans sons.
+description.ga_IE = Pacáiste fuaimeanna gan aon fhuaimeanna ann.
description.gd_GB = Pacaid fhuaimean anns nach eil fuaim sam bith.
description.gl_ES = Un conxunto de sons sen ningún son
description.hr_HR = Zvučni paket bez ikakvih zvukova.
@@ -33,7 +35,8 @@ description.is_IS = Hljóðpakki án hljóðs.
description.it_IT = Un pacchetto sonoro non contenente alcun suono.
description.ja_JP = 空の効果音パック
description.ko_KR = 아무런 효과음도 없는 효과음 팩입니다.
-description.lb_LU = En Soundpack mat all den Sounds.
+description.la_VA = Sarcina sonorum sine ullis sonis.
+description.lb_LU = E Soundpack ouni iergendee Sound.
description.lt_LT = Garsų pakas be jokių garsų.
description.nb_NO = En lydpakke uten noen lyder.
description.nl_NL = Een geluidset zonder geluid.
diff --git a/bin/baseset/openttd.grf b/bin/baseset/openttd.grf
index 5ee3115802..efe35ffd38 100644
Binary files a/bin/baseset/openttd.grf and b/bin/baseset/openttd.grf differ
diff --git a/bin/baseset/opntitle.dat b/bin/baseset/opntitle.dat
index e5b4cebb15..264aaff60b 100644
Binary files a/bin/baseset/opntitle.dat and b/bin/baseset/opntitle.dat differ
diff --git a/bin/baseset/orig_dos.obg b/bin/baseset/orig_dos.obg
index e8bdd98a06..4d2c1f2b13 100644
--- a/bin/baseset/orig_dos.obg
+++ b/bin/baseset/orig_dos.obg
@@ -1,4 +1,4 @@
-; $Id: orig_dos.obg 26414 2014-03-18 19:51:54Z frosch $
+; $Id: orig_dos.obg 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents the original graphics as on the non-German Transport
; Tycoon Deluxe DOS CD.
@@ -25,6 +25,7 @@ description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión DOS
description.et_EE = Algse Transport Tycoon Deluxe DOSi versiooni graafika.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen DOS-version grafiikat.
description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version DOS).
+description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán DOS.
description.gd_GB = Grafaigeachd aig an deasachadh DOS tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Graficos da edición orixinal de Transport Tycoon Deluxe para DOS.
description.hr_HR = Originalna grafika za Transport Tycoon Deluxe DOS izdanje.
@@ -34,6 +35,7 @@ description.is_IS = Upprunalega grafíkin úr Transport Tycoon Deluxe DOS útgá
description.it_IT = Grafica originale di Transport Tycoon Deluxe, edizione DOS.
description.ja_JP = Transport Tycoon Deluxe オリジナル版 グラフィック (DOS)
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 도스 에디션의 그래픽입니다.
+description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe DOS.
description.lb_LU = Original Transport Tycoon Deluxe DOS Editioun Grafik.
description.lt_LT = Originali Transport Tycoon Deluxe DOS leidimo grafika.
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for DOS.
@@ -70,7 +72,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
TRGC.GRF = ed446637e034104c5559b32c18afe78d
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
-OPENTTD.GRF = 75a93cea2ed455c2fd5dcbda39e53538
+OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc
[origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
diff --git a/bin/baseset/orig_dos.obs b/bin/baseset/orig_dos.obs
index 38fc5d830e..afcbcd513d 100644
--- a/bin/baseset/orig_dos.obs
+++ b/bin/baseset/orig_dos.obs
@@ -1,4 +1,4 @@
-; $Id: orig_dos.obs 26414 2014-03-18 19:51:54Z frosch $
+; $Id: orig_dos.obs 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents the original sounds as on the Transport
; Tycoon Deluxe DOS CD.
@@ -24,6 +24,7 @@ description.es_ES = Sonidos originales de Transport Tycoon Deluxe versión DOS.
description.et_EE = Algse Transport Tycoon Deluxe DOSi versiooni helid.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen DOS-version äänet.
description.fr_FR = Sons originaux de Transport Tycoon Deluxe (version DOS).
+description.ga_IE = Fuaimeanna bunaidh Transport Tycoon Deluxe, eagrán DOS.
description.gd_GB = Fuaimean aig an deasachadh DOS tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Sons da edición orixinal de Transport Tycoon Deluxe para DOS.
description.hr_HR = Originalni zvukovi za Transport Tycoon Deluxe DOS izdanje.
@@ -33,6 +34,7 @@ description.is_IS = Upprunalega hljóðið úr Transport Tycoon Deluxe DOS útg
description.it_IT = Suoni originali di Transport Tycoon Deluxe, edizione DOS.
description.ja_JP = Transport Tycoon Deluxe オリジナル版 効果音 (DOS)
description.ko_KR = 오리지널 트랜스포트 타이쿤 도스 에디션의 효과음입니다.
+description.la_VA = Soni ex editione originale Transport Tycoon Deluxe DOS.
description.lb_LU = Original Transport Tycoon Deluxe DOS Editioun Sound.
description.lt_LT = Originalūs Transport Tycoon Deluxe DOS leidimo garsai.
description.nb_NO = Originale lyder fra Transport Tycoon Deluxe for DOS.
diff --git a/bin/baseset/orig_dos_de.obg b/bin/baseset/orig_dos_de.obg
index d9741f0f70..1345ed5dad 100644
--- a/bin/baseset/orig_dos_de.obg
+++ b/bin/baseset/orig_dos_de.obg
@@ -1,4 +1,4 @@
-; $Id: orig_dos_de.obg 26414 2014-03-18 19:51:54Z frosch $
+; $Id: orig_dos_de.obg 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents the original graphics as on the German Transport
; Tycoon Deluxe DOS CD. It contains one broken sprite.
@@ -25,6 +25,7 @@ description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión DOS
description.et_EE = Algse Transport Tycoon Deluxe DOSi (Saksa) versiooni graafika.
description.fi_FI = Alkuperäiset Saksassa julkaistun Transport Tycoon Deluxen DOS-version grafiikat.
description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version DOS allemande).
+description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán DOS (Gearmánach).
description.gd_GB = Grafaigeachd aig an deasachadh DOS (Gearmailteach) tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Graficos da edición orixinal (alemá) de Transport Tycoon Deluxe para DOS.
description.hr_HR = Originalna grafika za Transport Tycoon Deluxe DOS (Njemački) izdanje.
@@ -34,6 +35,7 @@ description.is_IS = Upprunalega grafíkin úr Transport Tycoon Deluxe DOS (þýs
description.it_IT = Grafica originale di Transport Tycoon Deluxe (tedesco), edizione DOS.
description.ja_JP = Transport Tycoon Deluxe オリジナル版 グラフィック (DOS・ドイツ版)
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 도스 에디션(독일)의 그래픽입니다.
+description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe DOS (Germanica).
description.lb_LU = Original Transport Tycoon Deluxe DOS (Däitsch) Editioun Grafik.
description.lt_LT = Originali Transport Tycoon Deluxe DOS (Vokiečių) leidimo grafika.
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for DOS (tysk).
@@ -70,7 +72,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
TRGC.GRF = ed446637e034104c5559b32c18afe78d
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
-OPENTTD.GRF = 75a93cea2ed455c2fd5dcbda39e53538
+OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc
[origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
diff --git a/bin/baseset/orig_win.obg b/bin/baseset/orig_win.obg
index e1a7d22f54..62dccca98a 100644
--- a/bin/baseset/orig_win.obg
+++ b/bin/baseset/orig_win.obg
@@ -1,4 +1,4 @@
-; $Id: orig_win.obg 26414 2014-03-18 19:51:54Z frosch $
+; $Id: orig_win.obg 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents the original graphics as on the Transport
; Tycoon Deluxe for Windows CD.
@@ -25,6 +25,7 @@ description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión Win
description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni graafika.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen Windows-version grafiikat.
description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version Windows).
+description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán Windows.
description.gd_GB = Grafaigeachd aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Graficos da edición orixinal de Transport Tycoon Deluxe para Windows.
description.hr_HR = Originalna grafika za Transport Tycoon Deluxe Windows izdanje.
@@ -34,6 +35,7 @@ description.is_IS = Upprunalega grafíkin úr Transport Tycoon Deluxe Windows ú
description.it_IT = Grafica originale di Transport Tycoon Deluxe, edizione Windows.
description.ja_JP = Transport Tycoon Deluxe オリジナル版 グラフィック (Windows)
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 그래픽입니다.
+description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe Windows.
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Grafik.
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo grafika.
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for Windows.
@@ -70,7 +72,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
-OPENTTD.GRF = 75a93cea2ed455c2fd5dcbda39e53538
+OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc
[origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
diff --git a/bin/baseset/orig_win.obm b/bin/baseset/orig_win.obm
index 8af12d3816..9f52797129 100644
--- a/bin/baseset/orig_win.obm
+++ b/bin/baseset/orig_win.obm
@@ -1,4 +1,4 @@
-; $Id: orig_win.obm 26414 2014-03-18 19:51:54Z frosch $
+; $Id: orig_win.obm 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents the original music as on the Transport
; Tycoon Deluxe for Windows CD.
@@ -24,6 +24,7 @@ description.es_ES = Música original de Transport Tycoon Deluxe versión Windows
description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni muusika.
description.fi_FI = Alkuperäinen Transport Tycoon Deluxen Windows-version musiikki.
description.fr_FR = Musiques originales de Transport Tycoon Deluxe (version Windows).
+description.ga_IE = Ceol bunaidh Transport Tycoon Deluxe, eagrán Windows.
description.gd_GB = Ceòl aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Música da edición orixinal de Transport Tycoon Deluxe para Windows.
description.hr_HR = Originalna muzika za Transport Tycoon Deluxe Windows izdanje.
@@ -33,6 +34,7 @@ description.is_IS = Upprunalega tónlistin úr Transport Tycoon Deluxe Windows
description.it_IT = Musica originale di Transport Tycoon Deluxe, edizione Windows.
description.ja_JP = Transport Tycoon Deluxe オリジナル版 音楽 (Windows)
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 음악입니다.
+description.la_VA = Musica ex editione originale Transport Tycoon Deluxe Windows.
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Music.
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo muzika.
description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma mūzika.
diff --git a/bin/baseset/orig_win.obs b/bin/baseset/orig_win.obs
index d58037331c..985e6c49d8 100644
--- a/bin/baseset/orig_win.obs
+++ b/bin/baseset/orig_win.obs
@@ -1,4 +1,4 @@
-; $Id: orig_win.obs 26414 2014-03-18 19:51:54Z frosch $
+; $Id: orig_win.obs 27041 2014-10-25 12:35:48Z rubidium $
;
; This represents the original sounds as on the Transport
; Tycoon Deluxe for Windows CD.
@@ -24,6 +24,7 @@ description.es_ES = Sonidos originales de Transport Tycoon Deluxe versión Windo
description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni helid.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen Windows-version äänet.
description.fr_FR = Sons originaux de Transport Tycoon Deluxe (version Windows).
+description.ga_IE = Fuaimeanna bunaidh Transport Tycoon Deluxe, eagrán Windows.
description.gd_GB = Fuaimean aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Sons da edición orixinal de Transport Tycoon Deluxe para Windows.
description.hr_HR = Originalni zvukovi za Transport Tycoon Deluxe Windows izdanje.
@@ -33,6 +34,7 @@ description.is_IS = Upprunalega hljóðið úr Transport Tycoon Deluxe Windows
description.it_IT = Suoni originali di Transport Tycoon Deluxe, edizione Windows.
description.ja_JP = Transport Tycoon Deluxe オリジナル版 効果音 (Windows)
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 효과음입니다.
+description.la_VA = Soni ex editione originale Transport Tycoon Deluxe Windows.
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Sound.
description.lt_LT = Originalūs Transport Tycoon Deluxe Windows leidimo garsai.
description.nb_NO = Originale lyder fra Transport Tycoon Deluxe for Windows.
diff --git a/bin/game/compat_1.2.nut b/bin/game/compat_1.2.nut
index ab2e3cc0bc..73e3863aec 100644
--- a/bin/game/compat_1.2.nut
+++ b/bin/game/compat_1.2.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.2.nut 25967 2013-11-12 17:56:35Z frosch $ */
+/* $Id: compat_1.2.nut 27164 2015-02-22 17:25:29Z alberth $ */
/*
* This file is part of OpenTTD.
@@ -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 .
*/
-GSLog.Info("1.2 API compatability in effect.");
+GSLog.Info("1.2 API compatibility in effect.");
GSTown._SetGrowthRate <- GSTown.SetGrowthRate;
GSTown.SetGrowthRate <- function(town_id, days_between_town_growth)
@@ -16,3 +16,10 @@ GSTown.SetGrowthRate <- function(town_id, days_between_town_growth)
if (days_between_town_growth == 0) days_between_town_growth = GSTown.TOWN_GROWTH_NORMAL;
return GSTown._SetGrowthRate(town_id, days_between_town_growth);
}
+
+/* 1.5 adds a game element reference to the news. */
+GSNews._Create <- GSNews.Create;
+GSNews.Create <- function(type, text, company)
+{
+ return GSNews._Create(type, text, company, GSNews.NR_NONE, 0);
+}
diff --git a/bin/game/compat_1.3.nut b/bin/game/compat_1.3.nut
index 3c86ef016c..3222849502 100644
--- a/bin/game/compat_1.3.nut
+++ b/bin/game/compat_1.3.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.3.nut 25967 2013-11-12 17:56:35Z frosch $ */
+/* $Id: compat_1.3.nut 27164 2015-02-22 17:25:29Z alberth $ */
/*
* This file is part of OpenTTD.
@@ -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 .
*/
-GSLog.Info("1.3 API compatability in effect.");
+GSLog.Info("1.3 API compatibility in effect.");
GSTown._SetGrowthRate <- GSTown.SetGrowthRate;
GSTown.SetGrowthRate <- function(town_id, days_between_town_growth)
@@ -16,3 +16,10 @@ GSTown.SetGrowthRate <- function(town_id, days_between_town_growth)
if (days_between_town_growth == 0) days_between_town_growth = GSTown.TOWN_GROWTH_NORMAL;
return GSTown._SetGrowthRate(town_id, days_between_town_growth);
}
+
+/* 1.5 adds a game element reference to the news. */
+GSNews._Create <- GSNews.Create;
+GSNews.Create <- function(type, text, company)
+{
+ return GSNews._Create(type, text, company, GSNews.NR_NONE, 0);
+}
diff --git a/bin/game/compat_1.4.nut b/bin/game/compat_1.4.nut
index 4703a7c361..12ec11e0ca 100644
--- a/bin/game/compat_1.4.nut
+++ b/bin/game/compat_1.4.nut
@@ -1,4 +1,4 @@
-/* $Id: compat_1.3.nut 24469 2012-08-13 19:33:17Z yexo $ */
+/* $Id: compat_1.4.nut 27164 2015-02-22 17:25:29Z alberth $ */
/*
* This file is part of OpenTTD.
@@ -6,3 +6,12 @@
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
*/
+
+GSLog.Info("1.4 API compatibility in effect.");
+
+/* 1.5 adds a game element reference to the news. */
+GSNews._Create <- GSNews.Create;
+GSNews.Create <- function(type, text, company)
+{
+ return GSNews._Create(type, text, company, GSNews.NR_NONE, 0);
+}
diff --git a/changelog.txt b/changelog.txt
index 1da7d4d1b2..4fa211c9f9 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,202 @@
+1.5.0-beta2 (2015-02-24)
+------------------------------------------------------------------------
+- Feature: [NoGo] Game scripts can point to a location, station, industry, or town when publishing news. (r27164)
+- Feature: Allow changing max heightlevel in scenario editor. (r27151)
+- Feature: Make use of both rocky tile sets from the base graphics. (r27117)
+- Change: Scale (non-custom) default window sizes according to GUI zoom. (r27147)
+- Change: Make statusbar and chat-entry window use the same width as the toolbar. (r27146)
+- Change: The chatbox-width setting now uses percent of screen width instead of pixels. (r27144)
+- Change: [NewGRF] Interpret negative positions in industry layouts depending on GRF version. (r27138)
+- Fix: [SDL, Windows] Right-mouse-button scrolling scrolled/jumped too far, when OpenTTD lagged during mouse event processing. (r27167)
+- Fix: Toolbars were not invalidated when changing max-vehicles settings. [FS#6204] (r27163)
+- Fix: Tile selection was drawn outside of map in some cases. [FS#6208] (r27162)
+- Fix: Reimplement the viewport drawing algorithm. [FS#6156] [FS#6206] (r27161)
+- Fix: Issues with smallmap and viewport coordinates and transformations. (r27160, r27159, r27158)
+- Fix: Mark bridge middle tiles dirty when building/removing/changing bridges. (r27157)
+- Fix: Rounding and unit-conversion inconsistencies in calls to MarkAllViewportsDirty. (r27148)
+- Fix: Oilrig empty-tile checks were incorrect due to wrong TileIndexDiff->TileIndexDiffC conversion. (r27137)
+- Fix: Misalignment in generate world window in case of small fonts. (r27135)
+- Fix: Dragging of free wagons in depot failed with GUI zoom. (r27133)
+- Fix: Reduce memory footprint of map array by shuffling its members. [FS#6218] (r27132, r27126)
+- Fix: Dropdown- and tooltip-windows should not steal the focus. (r27131)
+- Fix: [NewGRF] Action 7/9 condition 0A failed for present, but disabled, NewGRF. (r27119)
+- Fix: Road vehicles could not reverse to be sent to depots when the following tile has the right type to run on, but could not be entered. [FS#6183] (r27107)
+- Fix: Use the actual max speed of the vehicle in front when determining if a RV can overtake. [FS#6176] (r27106)
+- Fix: grow_counter was not properly bounded by growth_rate, but by some other value used to calculate growth_rate. [FS#6195] (r27105)
+- Fix: [Script] Support 64 bits integers in ScriptLists. [FS#6194] (r27104)
+- Fix: [Script] Money values would end up wrong in strings when outside the bounds of a 32 bits integer. [FS#6194] (r27102)
+
+
+1.5.0-beta1 (2014-12-24)
+------------------------------------------------------------------------
+- Feature: Support .txt.gz and -txt.xz changelog, readme and license files in basesets, NewGRFs, etc (r27035, r27034)
+- Feature: More height levels [FS#4126] (r27010)
+- Feature: Latin translation (r26993)
+- Feature: Add option to choose normal, double or quad-size interface (r26990)
+- Feature: [Script] Swap method for script lists (r26894)
+- Feature: [Script] ScriptStationList_Cargo for sorting cargo by from and via (r26893)
+- Feature: [Script] API for retrieving planned flow (r26892)
+- Feature: [CargoDist] Predict links for station-autorefitting vehicles (r26889)
+- Feature: Setting for limiting the height of bridges (r26882)
+- Feature: Make aircraft ascend/descend when they are too close to the ground or too far away (r26866)
+- Feature: Allow hiding of non-interesting engines in the GUI (r26805, r26804)
+- Feature: Vehicle sorting in autoreplace GUI [FS#1640] (r26800)
+- Feature: [NewGRF] Advanced visual effects with multiple effect sprites independent of spawning model (r26988, r26747)
+- Feature: Warn about missing industries after generating a map (r26729)
+- Feature: Upgrade currently active NewGRFs to newest installed version (r26613)
+- Feature: Save and load grfid and md5sum of NewGRFs in config file (r26611)
+- Feature: Select an editable preset name for saving (r26610)
+- Feature: Cancel cargo delivery from industries/houses to stations after about 21 months of not having picked up any of the cargo (r26582)
+- Feature: Give a warning when a plane's orders tell it to use a runway which is too short for it [FS#6009] (r26566)
+- Feature: [Script] Extended API for CargoDist (r26557)
+- Feature: Show measured order times in timetable GUI also when not timetabled (r26550)
+- Feature: Prompt for confirmation when deleting a vehicle group (r26455)
+- Feature: Hierarchical vehicle subgroups (r26450)
+- Feature: Allow more sound sleep for dedicated servers when there's nothing to do and nobody paying attention (r26449)
+- Feature: [NewGRF] Add vehicle modflag 1 (unloading in progress) (r26430)
+- Change: Improvements to the man page (r27091, r27012)
+- Change: Allow to set the granularity of the tooltip hover time in milliseconds instead of seconds. New default value is 250ms (r26815)
+- Change: Follow SI recommendation about spaces between numbers and units [FS#6086] (r26733)
+- Change: [CargoDist] Save locations instead of distances in link graphs to reduce size (r26646)
+- Change: [Squirrel] Make the internal integer for scripts always 64 bits, so scripts behave the same on 32 and 64 bit architectures and money can be represented properly (r26585, r26584)
+- Change: Reshuffle advanced settings tree (r26614, r26536)
+- Change: Add backend-independent config-file setting to disable 8bpp video modes, and disable 8bpp by default (r26522)
+- Fix: [OS/2] Compile again [FS#6186] (r27092)
+- Fix: Compilation with freetype2 version 2.5.4 and newer [FS#6185] (r27079)
+- Fix: Variable 47 used the carge translation table of the wrong GRF in case of callback 1D [FS#6182] (r27075)
+- Fix: Some lists did not use natural string sorting [FS#6172] (r27063)
+- Fix: Mercurial version detection failed if personal presets were configured (r27059)
+- Fix: [OSX] Don't require double-press from non-dead console hotkeys [FS#5812] (r27046)
+- Fix: Crash when having the vehicle list opened from a buoy or oil rig when the buoy/oil rig is removed (r27030)
+- Fix: Unit number was not always fully shown in depots [FS#6102] (r27014)
+- Fix: [CargoDist] Reserve cargo only after unloading finished or if the vehicle has the desired cargo already [FS#6110] (r26918)
+- Fix: [Squirrel] Loading a value saved as boolean caused it to be of type integer instead of boolean (r26785)
+- Fix: [Squirrel] Harden string handling (r26777)
+- Fix: [OSX] Implement more of the text editing API to prevent crashes and improve IME support [FS#5972] (r26758)
+- Fix: Incorrect saving of order backups [FS#6066] (r26700)
+- Fix: Ordering a vehicle to a competitor's rail waypoint displayed an error message. Ignore the click as is done for the other order types to competitor's stuff [FS#6059] (r26692)
+- Fix: [Script] Loading/parsing of info .nuts was done in the same VM, causing e.g. constants to break the loading of info of other scripts [FS#5973] (r26617)
+- Fix: [CargoDist] Improve estimation of link capacitites (r26549)
+- Remove: A bunch of archaic settings from the GUI (r26528, r26526, r26525)
+
+
+1.4.4 (2014-10-21)
+------------------------------------------------------------------------
+(None)
+
+
+1.4.4-RC1 (2014-10-08)
+------------------------------------------------------------------------
+- Fix: Image widgets stored 32bit SpriteID in uint16 (r26971)
+- Fix: Owner of road depot road types were not properly changed upon bankruptcy [FS#6126] (r26955)
+- Fix: Compilation on HAIKU (r26922)
+- Fix: Crash when enabling 'Full animation' if multiplayer chat text is on screen [FS#6096] (r26919)
+- Fix: Height computation of game script text in town GUI did not consider margins [FS#6119] (r26859)
+- Fix: [Squirrel] Debian lintian issues (r26853)
+- Fix: Compilation of strgen on various platforms like Solaris (r26850)
+- Fix: Better display of refit information for articulated vehicles [FS#6113] (r26849, r26848)
+- Fix: Do not assign a next hop when returning cargo [FS#6110] (r26847)
+- Fix: The ok-button in the OSK for the signs list should just close the OSK [FS#6116] (r26827)
+
+
+1.4.3 (2014-09-23)
+------------------------------------------------------------------------
+(None)
+
+
+1.4.3-RC2 (2014-09-14)
+------------------------------------------------------------------------
+- Fix: Crashes on joining a server with pending order backups [FS#6112] (r26819)
+- Fix: Crashes on start due to dereferencing the -1 index of the file names array of music files (r26809)
+
+
+1.4.3-RC1 (2014-09-07)
+------------------------------------------------------------------------
+- Fix: TC_NO_SHADE did not work for 32bpp text rendering (r26792)
+- Fix: Loading a game with order backups leaked Orders and left unreachable items in the pool (r26787)
+- Fix: Buffer overrun in SQCompiler::Error (r26764)
+- Fix: Desync due to not always properly restoring game state from the savegame (r26753)
+- Fix: [Script] Crashes and infinite loops when using lists in item-descending order [FS#6085] (r26744)
+- Fix: Incorrect CFLAGS when enabling gprof profiling (r26737, r26735)
+- Fix: Do not reset the last selected airport or layout, unless it is really necessary [FS#6083] (r26732)
+- Fix: Use the normal search path to look for xdg-open at Unix [FS#6077] (r26724)
+- Fix: Properly check for cargo acceptance of houses [FS#5997] (r26723)
+
+
+1.4.2 (2014-08-16)
+------------------------------------------------------------------------
+(None)
+
+
+1.4.2-RC2 (2014-08-03)
+------------------------------------------------------------------------
+- Change: Use awk instead of trying to convince cpp to preprocess nfo files (r26708)
+- Fix: CMD_CLEAR_ORDER_BACKUP should not be suppressed by pause modes (r26716)
+- Fix: [NewGRF] Parameters to SCC_NEWGRF_PUSH_WORD and SCC_NEWGRF_UNPRINT were not skipped during drawing (r26713)
+- Fix: [OSX] Compilation fails with some lzo2 versions, if __LP64__ is defined to 0 instead of checking whether it is defined [FS#6069] (r26709)
+- Fix: Wrong breakdown sound was played for ships [FS#6015] (r26706)
+- Fix: Integer overflows in acceleration code causing either too low acceleration or too high acceleration [FS#6067] (r26702)
+- Fix: Discard incorrectly saved order backups when clients join [FS#6066] (r26700)
+- Fix: Do not crash when trying to show an error about vehicle in a NewGRF and the NewGRF was not loaded at all (r26699)
+- Fix: Slovak uses space as group separator in numbers [FS#6064] (r26695)
+- Fix: Tighten parameter bound checks on GSCargoMonitor functions, and return -1 on out-of-bound parameters (r26685)
+
+
+1.4.2-RC1 (2014-07-03)
+------------------------------------------------------------------------
+- Fix: CargoPacket::SourceStation() returns a StationID (r26660)
+- Fix: Days in dates are not represented by ordinal numbers in all languages [FS#6047] (r26657)
+- Fix: Production cheat cannot be allowed to be active in multiplayer for desync reasons, even when activated in singleplayer previously [FS#6044] (r26656)
+- Fix: Make sure an 'abs' is used that supports int64 when using 'abs' on those variables (r26651)
+- Fix: Support save/load chunk lengths of up to (1 << 32) - 1 [FS#6041] (r26650)
+- Fix: Incorrect usage of string commands in the base language [FS#6037] (r26642, r26640, r26639, r26632)
+- Fix: Segmentation fault when encountering a .obg/.obs/.obm with empty string/zero length MD5 checksums [FS#6038] (r26637)
+- Fix: The 'Load' button was not properly enabled/disabled for old savegames without NewGRF information (r26634)
+- Fix: If the video driver fails to supply a list of resolutions, display an error message [FS#6012] (r26629)
+
+
+1.4.1 (2014-06-02)
+------------------------------------------------------------------------
+- Fix: First send packages about new company, then clients joining it to admin port [FS#6025] (r26616)
+
+
+1.4.1-RC2 (2014-05-18)
+------------------------------------------------------------------------
+- Fix: Save/load issues on big endian machines (r26593, r26590, r26589)
+- Fix: Consider multiheaded trains in station refits [FS#5995] (r26586)
+- Fix: Game script could be changed in game by double clicking [FS#5974] (r26583)
+- Fix: Transfer stations also should have a cargo rating [FS#5989] (r26581, r26580)
+- Fix: [Network] AIs would not reset certain network state information upon creation of their company [FS#6003] (r26578, r26576)
+- Fix: [Network] Client of non-dedicated server was not correctly put into the first company for all state variables [FS#6001] (r26577)
+
+
+1.4.1-RC1 (2014-05-04)
+------------------------------------------------------------------------
+- Change: Remove demand calculation based on tiles (r26484)
+- Change: Use pkg-config for libpng as well (r26435, r26433, r26432)
+- Change: Use better distance metric for link graph [FS#5941] (r26411)
+- Fix: [Windows] Crash when the operating system performs the "paint" callback during window creation [FS#5994] (r26539, r26538)
+- Fix: OpenBSD compilation [FS#5992] (r26523)
+- Fix: prevent from ever reading huge (or negative) amounts of data in strgen (r26521)
+- Fix: Severity rating of dedicated server messages during world generation (r26518)
+- Fix: Buffer overruns in handling of symbolic links inside tars (r26514)
+- Fix: Incorrect usage of strecpy (r26505, r26485)
+- Fix: Reading console input on dedicated server relied on unspecified behaviour (r26496)
+- Fix: Allow single-vehicle consists to station-refit in a meaningful way (r26483)
+- Fix: Prevent comparing to NULL when strndup could not allocate memory (r26476)
+- Fix: Potentially undefined shifts in NewGRF code (r26475)
+- Fix: Make sure there is no uninitialised sprite data (r26473)
+- Fix: Draw text shadow for ellipses (r26467)
+- Fix: Add special handling for PALETTE_CRASH to work for non-8bpp-mapped sprites (r26463)
+- Fix: Avoid division by 0 when scaling flow values [FS#5970] (r26448)
+- Fix: Draw links to match _settings_game.vehicle.road_side [FS#5961] (r26445)
+- Fix: Load button for heightmap list was missing [FS#5953] (r26428)
+- Fix: Do not crash when supplying an invalid filename without extension to cmd parameter -q (r26423)
+- Fix: Some road constructions used the rail sound effect [FS#5946] (r26422)
+- Fix: Goal GUI failed to shade [FS#5948] (r26420)
+- Fix: Shares button state was not appropriately updated when switching setting or company [FS#5947] (r26416)
+
+
1.4.0 (2014-04-01)
------------------------------------------------------------------------
(None)
diff --git a/config.lib b/config.lib
index 13507f3c42..56f0ccc4eb 100644
--- a/config.lib
+++ b/config.lib
@@ -1,4 +1,4 @@
-# $Id: config.lib 26440 2014-04-01 18:33:16Z frosch $
+# $Id: config.lib 27059 2014-11-09 16:37:07Z planetmaker $
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -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"
@@ -862,7 +862,7 @@ check_params() {
endian="PREPROCESSOR"
fi
- log 1 "checking endianess... $endian"
+ log 1 "checking endianness... $endian"
# Suppress language errors when there is a version defined, indicating a release
# It just isn't pretty if any release produces warnings in the languages.
@@ -1037,7 +1037,7 @@ check_params() {
log 1 "checking revision... svn detection (tag)"
elif [ -d "$ROOT_DIR/.git" ] && [ -n "`git help 2>/dev/null`" ]; then
log 1 "checking revision... git detection"
- elif [ -d "$ROOT_DIR/.hg" ] && [ -n "`hg help 2>/dev/null`" ]; then
+ elif [ -d "$ROOT_DIR/.hg" ] && [ -n "`HGPLAIN= hg help 2>/dev/null`" ]; then
log 1 "checking revision... hg detection"
elif [ -f "$ROOT_DIR/.ottdrev" ]; then
log 1 "checking revision... source tarball"
@@ -1441,6 +1441,7 @@ make_cflags_and_ldflags() {
make_compiler_cflags "$cc_host" "CFLAGS" "CXXFLAGS" "LDFLAGS" "FEATURES"
CFLAGS="$CFLAGS -D$os"
+ CFLAGS_BUILD="$CFLAGS_BUILD -D$os"
if [ "$enable_debug" = "0" ]; then
# No debug, add default stuff
@@ -1450,7 +1451,11 @@ make_cflags_and_ldflags() {
LDFLAGS="$LDFLAGS -noixemul"
fi
- CFLAGS="-O2 -fomit-frame-pointer $CFLAGS"
+ if [ "$enable_profiling" = "0" ]; then
+ # -fomit-frame-pointer and -pg do not go well together (gcc errors they are incompatible)
+ CFLAGS="-fomit-frame-pointer $CFLAGS"
+ fi
+ CFLAGS="-O2 $CFLAGS"
else
OBJS_SUBDIR="debug"
@@ -1494,7 +1499,7 @@ make_cflags_and_ldflags() {
fi
if [ "$enable_profiling" != "0" ]; then
- CFLAGS="$CFLAGS -p"
+ CFLAGS="$CFLAGS -pg"
LDFLAGS="$LDFLAGS -pg"
fi
@@ -1700,17 +1705,18 @@ make_cflags_and_ldflags() {
if [ -n "$png_config" ]; then
CFLAGS="$CFLAGS -DWITH_PNG"
- CFLAGS="$CFLAGS `$png_config --cppflags --I_opts | tr '\n\r' ' '`"
+ CFLAGS="$CFLAGS `$png_config --cflags | tr '\n\r' ' '`"
- # The extra flags are unneeded for latest libpng-config, but some versions are so broken...
if [ "$enable_static" != "0" ]; then
if [ "$os" = "OSX" ]; then
- LIBS="$LIBS `$png_config --prefix`/lib/libpng.a"
+ # fontconfig_config goes via pkg-config on all systems, which doesn't know --prefix
+ # Also, despite the reason we link to the .a file ourself (because we can't use -static), we do need to ask pkg-config about possible other deps
+ LIBS="$LIBS `$png_config --variable=prefix`/lib/libpng.a `$png_config --libs --static | sed s@-lpng[0-9]*@@`"
else
- LIBS="$LIBS `$png_config --static --ldflags | tr '\n\r' ' '`"
+ LIBS="$LIBS `$png_config --libs --static | tr '\n\r' ' '`"
fi
else
- LIBS="$LIBS `$png_config --ldflags | tr '\n\r' ' '`"
+ LIBS="$LIBS `$png_config --libs | tr '\n\r' ' '`"
fi
fi
@@ -2715,80 +2721,64 @@ detect_libtimidity() {
detect_library "$with_libtimidity" "libtimidity" "libtimidity.a" "" "timidity.h"
}
-detect_lzma() {
- # 0 means no, 1 is auto-detect, 2 is force
- if [ "$with_lzma" = "0" ]; then
- log 1 "checking liblzma... disabled"
+detect_pkg_config() {
+ # $1 - config-param ($with_lzma value)
+ # $2 - package name ('liblzma')
+ # $3 - config name ('lzma_config', sets $lzma_config)
+ # $4 - minimum module version ('2.3')
- lzma_config=""
+ # 0 means no, 1 is auto-detect, 2 is force
+ if [ "$1" = "0" ]; then
+ log 1 "checking $2... disabled"
+
+ eval "$3=\"\""
return 0
fi
- if [ "$with_lzma" = "1" ] || [ "$with_lzma" = "" ] || [ "$with_lzma" = "2" ]; then
- lzma_config="pkg-config liblzma"
+ log 2 "detecting $2"
+
+ if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then
+ pkg_config_call="pkg-config $2"
else
- lzma_config="$with_lzma"
+ pkg_config_call="$1"
fi
- version=`$lzma_config --modversion 2>/dev/null`
+ version=`$pkg_config_call --modversion 2>/dev/null`
ret=$?
- log 2 "executing $lzma_config --modversion"
+ check_version "$4" "$version"
+ version_ok=$?
+ log 2 "executing $pkg_config_call --modversion"
log 2 " returned $version"
log 2 " exit code $ret"
- if [ -z "$version" ] || [ "$ret" != "0" ]; then
- log 1 "checking liblzma... not found"
+ if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
+ if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
+ log 1 "checking $2... needs at least version $4, $2 NOT enabled"
+ else
+ log 1 "checking $2... not found"
+ fi
# It was forced, so it should be found.
- if [ "$with_lzma" != "1" ]; then
- log 1 "configure: error: pkg-config liblzma couldn't be found"
- log 1 "configure: error: you supplied '$with_lzma', but it seems invalid"
+ if [ "$1" != "1" ]; then
+ log 1 "configure: error: pkg-config $2 couldn't be found"
+ log 1 "configure: error: you supplied '$1', but it seems invalid"
exit 1
fi
- lzma_config=""
+ eval "$3=\"\""
return 0
fi
- log 1 "checking liblzma... found"
+ eval "$3=\"$pkg_config_call\""
+ log 1 "checking $2... found"
+}
+
+detect_lzma() {
+ detect_pkg_config "$with_lzma" "liblzma" "lzma_config" "5.0"
}
detect_xdg_basedir() {
- # 0 means no, 1 is auto-detect, 2 is force
- if [ "$with_xdg_basedir" = "0" ]; then
- log 1 "checking libxdg_basedir... disabled"
-
- xdg_basedir_config=""
- return 0
- fi
-
- if [ "$with_xdg_basedir" = "1" ] || [ "$with_xdg_basedir" = "" ] || [ "$with_xdg_basedir" = "2" ]; then
- xdg_basedir_config="pkg-config libxdg-basedir"
- else
- xdg_basedir_config="$with_xdg_basedir"
- fi
-
- version=`$xdg_basedir_config --modversion 2>/dev/null`
- ret=$?
- log 2 "executing $xdg_basedir_config --modversion"
- log 2 " returned $version"
- log 2 " exit code $ret"
-
- if [ -z "$version" ] || [ "$ret" != "0" ]; then
- log 1 "checking libxdg_basedir... not found"
-
- # It was forced, so it should be found.
- if [ "$with_xdg_basedir" != "1" ]; then
- log 1 "configure: error: pkg-config libxdg_basedir couldn't be found"
- log 1 "configure: error: you supplied '$with_xdg_basedir', but it seems invalid"
- exit 1
- fi
-
- xdg_basedir_config=""
- return 0
- fi
-
- log 1 "checking libxdg_basedir... found"
+ detect_pkg_config "$with_xdg_basedir" "libxdg-basedir" "xdg_basedir_config" "1.2"
}
detect_png() {
@@ -2815,33 +2805,7 @@ detect_png() {
return 0
fi
- if [ "$with_png" = "1" ] || [ "$with_png" = "" ] || [ "$with_png" = "2" ]; then
- png_config="libpng-config"
- else
- png_config="$with_png"
- fi
-
- version=`$png_config --version 2>/dev/null`
- ret=$?
- log 2 "executing $png_config --version"
- log 2 " returned $version"
- log 2 " exit code $ret"
-
- if [ -z "$version" ] || [ "$ret" != "0" ]; then
- log 1 "checking libpng... not found"
-
- # It was forced, so it should be found.
- if [ "$with_png" != "1" ]; then
- log 1 "configure: error: libpng-config couldn't be found"
- log 1 "configure: error: you supplied '$with_png', but it seems invalid"
- exit 1
- fi
-
- png_config=""
- return 0
- fi
-
- log 1 "checking libpng... found"
+ detect_pkg_config "$with_png" "libpng" "png_config" "1.2"
}
detect_freetype() {
@@ -2936,39 +2900,7 @@ detect_fontconfig() {
return 0
fi
- if [ "$with_fontconfig" = "1" ] || [ "$with_fontconfig" = "" ] || [ "$with_fontconfig" = "2" ]; then
- fontconfig_config="pkg-config fontconfig"
- else
- fontconfig_config="$with_fontconfig"
- fi
-
- version=`$fontconfig_config --modversion 2>/dev/null`
- ret=$?
- check_version '2.3' "$version"
- version_ok=$?
- log 2 "executing $fontconfig_config --modversion"
- log 2 " returned $version"
- log 2 " exit code $ret"
-
- if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
- if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
- log 1 "checking libfontconfig... needs at least version 2.3.0, fontconfig NOT enabled"
- else
- log 1 "checking libfontconfig... not found"
- fi
-
- # It was forced, so it should be found.
- if [ "$with_fontconfig" != "1" ]; then
- log 1 "configure: error: fontconfig-config couldn't be found"
- log 1 "configure: error: you supplied '$with_fontconfig', but it seems invalid"
- exit 1
- fi
-
- fontconfig_config=""
- return 0
- fi
-
- log 1 "checking libfontconfig... found"
+ detect_pkg_config "$with_fontconfig" "fontconfig" "fontconfig_config" "2.3"
}
detect_icu() {
@@ -3251,9 +3183,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 "985" ]; then
+ if [ -n "$version" ] && [ "$version" -lt "985" ]; then
+ log 1 "checking grfcodec... needs at least version 6.0.5 (r985), disabled"
else
log 1 "checking grfcodec... not found"
fi
@@ -3293,9 +3225,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 "985" ]; then
+ if [ -n "$version" ] && [ "$version" -lt "985" ]; then
+ log 1 "checking nforenum... needs at least version 6.0.5 (r985), disabled"
else
log 1 "checking nforenum... not found"
fi
diff --git a/docs/desync.txt b/docs/desync.txt
index 8163027814..b0b6bd7d47 100644
--- a/docs/desync.txt
+++ b/docs/desync.txt
@@ -106,7 +106,7 @@ Table of contents
The important thing here is: The detection of the Desync is
only an ultimate failure detection. It does not give any
indication on when the Desync happened. The Desync may after
- all have occured long ago, and just did not affect the checksum
+ all have occurred long ago, and just did not affect the checksum
up to now. The checksum may have matched 10 times or more
since the Desync happend, and only now the Desync has spiraled
enough to finally affect the checksum. (There was once a desync
@@ -194,6 +194,7 @@ Table of contents
- Get the same version of OpenTTD as the original server was running.
- Uncomment/enable the define 'DEBUG_DUMP_COMMANDS' in
'src/network/network_func.h'.
+ (DEBUG_FAILED_DUMP_COMMANDS is explained later)
- Put the 'commands-out.log' into the root save folder, and rename
it to 'commands.log'.
- Run 'openttd -D -d desync=3 -g startsavegame.sav'.
@@ -217,6 +218,11 @@ Table of contents
the last dmp_cmds that reproduces the replay and the first one
that fails.
+ If the replay does not succeed without mismatch, you can check the logs
+ whether there were failed commands. Then you may try to replay with
+ DEBUG_FAILED_DUMP_COMMANDS enabled. If the replay then fails, the
+ command test-run of the failed command modified the game state.
+
If you have the original 'dmp_cmds_*.sav', you can also compare those
savegames with your own ones from the replay. You can also comment/disable
the 'NOT_REACHED' mentioned above, to get another 'dmp_cmds_*.sav' from
diff --git a/docs/landscape.html b/docs/landscape.html
index abf01c9d8b..f60e859fc3 100644
--- a/docs/landscape.html
+++ b/docs/landscape.html
@@ -15,20 +15,60 @@
For a graphical representation of the tile-layout have a look at
Landscape grid page.
- Eight attributes (counting "type_height") hold the informations about a tile.
+
Nine attributes (counting "type" and
+ "height") hold the informations about a tile.
These attributes are referred to as
- "type_height",
+ "type",
+ "height",
"m1", "m2",
"m3", "m4",
"m5", "m6"
and "m7".
The most important value is the class of a tile, stored in the upper 4 bits
- of the type_height attribute. The lower 4 bits are used to encode the height and
- slope data.
+ of the type attribute.
Frequently repeating patterns:
+ - type
+
+ -
+
+ Bits 7..4:
+
+ | The tile type. |
+ | 00 | Ground |
+ | 01 | Railway tracks |
+ | 02 | Roads |
+ | 03 | Town building |
+ | 04 | Trees |
+ | 05 | Station tiles |
+ | 06 | Water |
+ | 07 | Void |
+ | 08 | Industries |
+ | 09 | Tunnel / bridge |
+ | 0A | Objects |
+
+
+ Bits 3..2:
+
+ | Presence and direction of bridge above. |
+ | 00 | no bridge |
+ | 01 | Axis X (North-East) |
+ | 02 | Axis Y (South-West) |
+
+ -
+
+ Bits 1..0:
+
+ | Only meaningfull in tropic climate. It contains the definition of the available zones |
+ | 00 | normal |
+ | 01 | desert |
+ | 02 | rain forest |
+
+ In any other climate these 2 bits are theoretically free of use, however using them does not seem useful.
+
+
- m1
- - m6
-
- -
-
- Bits 7..6:
-
- | Presence and direction of bridge above, for tiles that support this. |
- | 00 | no bridge |
- | 01 | Axis X (North-East) |
- | 02 | Axis Y (South-West) |
-
- Some tiles, such as houses do not support bridges over them and use these bits for other purposes.
-
- -
-
- Bits 1..0:
-
- | Only meaningfull in tropic climate. It contains the definition of the available zones |
- | 00 | normal |
- | 01 | desert |
- | 02 | rain forest |
-
- In any other climate these 2 bits are theoretically free of use, however using them does not seem useful.
-
-
-
- m7:
Animation frame/state. Used for houses, industries, objects and stations.
@@ -196,9 +210,7 @@
- - m6 bits 7..6 : Possibility of a bridge above, in the direction specified
- m6 bits 4..2: type of hedge on NW border of the tile
- - m6 bits 1..0 : Tropic zone definition
@@ -510,8 +522,6 @@
m5 bit 4: pbs reservation state
- m6 bits 7..6 : Possibility of a bridge above, in the direction specified
- m6 bits 1..0 : Tropic zone definition
@@ -539,6 +549,7 @@
+ m3 bits 7..4: owner of road type 1 (tram); OWNER_NONE (10) is stored as OWNER_TOWN (0F)
m5 bits 7 clear: road or level-crossing
- m6 bits 5..3:
@@ -573,7 +584,6 @@
- - m3 bits 7..4: owner of road type 1 (tram); OWNER_NONE (10) is stored as OWNER_TOWN (0F)
- m5 bit 6 clear: road
- m1 bits 4..0: owner of the road type 0 (normal road)
@@ -663,10 +673,9 @@
+ - m7 bits 4..0: owner of the road type 0 (normal road)
- m6 bits 7..6 : Possibility of a bridge above, in the direction specified
- m6 bits 1..0 : Tropic zone definition
@@ -713,7 +722,6 @@
bits 7..2 : lift position (for houses type 04 and 05)
- bits 1..0 : tropic zone specifier
m7 :
@@ -835,7 +843,6 @@
- m6 bits 1..0 : Tropic zone definition
@@ -969,7 +976,6 @@
m6 bits 5..3: the station type (rail, airport, truck, bus, oilrig, dock, buoy, waypoint)
m6 bit 2: pbs reservation state for railway stations/waypoints
- m6 bits 1..0 : Tropic zone definition
m7 bits 4..0: owner of road (road stops)
m7 bits 7..6: present road types (road stops)
m7: animation frame (railway stations/waypoints, airports)
@@ -1082,8 +1088,6 @@
- m6 bits 7..6 : Possibility of a bridge above, in the direction specified
- m6 bits 1..0 : Tropic zone definition
@@ -1101,7 +1105,7 @@
| 8 |
- Industry tile |
+ Industries |
| |
@@ -1425,7 +1429,6 @@
m6 bits 5..3: random triggers (NewGRF)
m6 bit 2: bit 8 of type (see m5)
- m6 bits 1..0 : Tropic zone definition
m7: animation frame
@@ -1576,8 +1579,6 @@
- m6 bits 7..6 : Possibility of a bridge above, in the direction specified
- m6 bits 1..0 : Tropic zone definition
m7 bits 4..0: owner of road
m7 bit 5 set = on snow or desert
m7 bits 7..6: present road types for road
@@ -1598,8 +1599,6 @@
m2: index into the array of objects, bits 0 to 15 (upper bits in m5)
m3: random bits
m5: index into the array of objects, bits 16 to 23 (lower bits in m2)
- m6 bits 7..6 : Possibility of a bridge above, in the direction specified
- m6 bits 1..0 : Tropic zone definition
m7: animation counter
diff --git a/docs/landscape_grid.html b/docs/landscape_grid.html
index e2f3c1f977..98351fcdcc 100644
--- a/docs/landscape_grid.html
+++ b/docs/landscape_grid.html
@@ -28,13 +28,14 @@ the array so you can quickly see what is used and what is not.
- - type_height - 8 bits in size, stores tile height (lower 4 bits) and tile class (upper 4 bits)
+ - type - 8 bits in size, tile class (bits 4..7), bridge (bits 2..3) tropic zone (bits 0..1, only valid in tropic climate)
+ - height - 8 bits in size, stores tile height
- m1 - 8 bits in size, used to identify the owner of that tile (eg piece of rail, bridge, etc.)
- m2 - 16 bits in size, used to identify the index of the given tile (object) in the (object-)array
- m3 - 8 bits in size, is used for general storage
- m4 - 8 bits in size, is used for general storage
- m5 - 8 bits in size, is used for general storage
- - m6 - 8 bits in size, special meaning : lower 2 bits only valid in tropic climate, upper 2 bits for bridges
+ - m6 - 8 bits in size, is used for general storage
- m7 - 8 bits in size, is used for general storage
@@ -42,7 +43,8 @@ the array so you can quickly see what is used and what is not.
| class |
- type_height (8) |
+ type (8) |
+ height (8) |
m1 (8) |
m2 (16) |
m3 (8) |
@@ -55,6 +57,7 @@ the array so you can quickly see what is used and what is not.
bits |
7654 3210 |
7654 3210 |
+ 7654 3210 |
FEDC BA98 7654 3210 |
7654 3210 |
7654 3210 |
@@ -66,69 +69,75 @@ the array so you can quickly see what is used and what is not.
0 |
ground |
XXXX XXXX |
+ XXXX XXXX |
OOO~ ~~~~ |
OOOO OOOO OOOO OOOO |
XXXX OOOO |
XXXX XXOO |
XXXX XXXX |
- XXOX XXXX |
+ OOOX XXOO |
OOOO OOOO |
| farmland |
-inherit- |
-inherit- |
+ -inherit- |
XXXX XXXX XXXX XXXX |
XXXX XXXX |
-inherit- |
-inherit- |
- XXOX XXXX |
+ OOOX XXOO |
OOOO OOOO |
| 1 |
rail |
XXXX XXXX |
+ XXXX XXXX |
OOOX XXXX |
OOOO XXXX OOOO OOOO |
OOOO XXXX |
OOOO XXXX |
XXXX XXXX |
- XXOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| rail with signals |
-inherit- |
-inherit- |
+ -inherit- |
OOOO XXXX XXXX XXXX |
XXXX XXXX |
XXXX XXXX |
-inherit- |
- XXOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| depot |
-inherit- |
-inherit- |
+ -inherit- |
XXXX XXXX XXXX XXXX |
OOOO XXXX |
OOOO XXXX |
XXOX OOXX |
- XXOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| 2 |
road |
XXXX XXXX |
+ XXXX XXXX |
OOOX XXXX |
XXXX XXXX XXXX XXXX |
XXXX XXXX |
OOOO OOOO |
XXXX XXXX |
- XXXX XOXX |
+ OOXX XOOO |
XXXO XXXX |
@@ -136,10 +145,11 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
+ -inherit- |
XXXX XXXX |
-inherit- |
XXXX OOOX |
- XXXX XOXX |
+ OOXX XOOO |
XXXX XXXX |
@@ -147,46 +157,50 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
- OOOO OOOO |
+ -inherit- |
+ XXXX OOOO |
OOOO OOOO |
XXOO OOXX |
- XXOO OOXX |
- XXXO OOOO |
+ OOOO OOOO |
+ XXXO XXXX |
| 3 |
house |
XXXX XXXX |
XXXX XXXX |
+ XXXX XXXX |
XXXX XXXX XXXX XXXX |
XXO~ ~~XX |
XXXX XXXX |
XXXX XXXX |
- XXXX XXXX |
+ XXXX XXOO |
XXXX XXXX |
| 4 |
trees |
XXXX XXXX |
+ XXXX XXXX |
OOO~ ~~~~ |
OOOO OOOX XXXX XXXX |
~~XX XXXX |
OOOO OOOO |
XXOO OXXX |
- OOOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| 5 |
rail station |
XXXX XXXX |
+ XXXX XXXX |
OXXX XXXX |
XXXX XXXX XXXX XXXX |
XXXX XXXX |
XXXX XXXX |
XXXX XXXX |
- OOXX XXXX |
+ OOXX XXOO |
XXXX XXXX |
@@ -199,16 +213,18 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
+ -inherit- |
| road stop |
-inherit- |
-inherit- |
-inherit- |
+ -inherit- |
XXXX OOOO |
OOOO OOOO |
~~~~ ~XXX |
- OOXX XOXX |
+ OOXX XOOO |
XXOX XXXX |
@@ -216,10 +232,11 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
+ -inherit- |
OOOO OOOO |
OOOO OOOO |
~~~~ ~XXX |
- OOXX XOXX |
+ OOXX XOOO |
OOOO OOOO |
@@ -227,10 +244,11 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
+ -inherit- |
XXXX OOOO |
OOOO OOOO |
XXXX XXXX |
- OOXX XOXX |
+ OOXX XOOO |
XXXX XXXX |
@@ -238,10 +256,11 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
+ -inherit- |
OOOO OOOO |
OOOO OOOO |
~~~~ ~~~~ |
- OOXX XOXX |
+ OOXX XOOO |
OOOO OOOO |
@@ -249,68 +268,74 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
+ -inherit- |
OOOO OOOO |
OOOO OOOO |
~~~~ ~~~~ |
- OOXX XOXX |
+ OOXX XOOO |
OOOO OOOO |
| 6 |
sea, shore |
XXXX XXXX |
+ XXXX XXXX |
OXXX XXXX |
OOOO OOOO OOOO OOOO |
OOOO OOOO |
OOOO OOOO |
X~~X XXXX |
- XXOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| canal, river |
-inherit- |
-inherit- |
+ -inherit- |
OOOO OOOO OOOO OOOO |
OOOO OOOO |
XXXX XXXX |
-inherit- |
- XXOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| shipdepot |
-inherit- |
-inherit- |
+ -inherit- |
XXXX XXXX XXXX XXXX |
OOOO OOOO |
OOOO OOOO |
-inherit- |
- XXOO OOXX |
+ OOOO OOOO |
OOOO OOOO |
| 8 |
industry |
XXXX XXXX |
+ XXXX XXXX |
XXXO XXXX |
XXXX XXXX XXXX XXXX |
XXXX XXXX |
XXXX XXXX |
XXXX XXXX |
- OOXX XXXX |
+ OOXX XXOO |
XXXX XXXX |
| 9 |
tunnel entrance |
XXXX XXXX |
+ XXXX XXXX |
OOOX XXXX |
OOOO OOOO OOOO OOOO |
XXXX XXXX |
OOOO OOOO |
XOOX XXXX |
- XXOO OOXX |
+ OOOO OOOO |
XXXX XXXX |
@@ -321,19 +346,21 @@ the array so you can quickly see what is used and what is not.
| -inherit- |
-inherit- |
-inherit- |
- XXXX XXXX |
+ -inherit- |
+ OOXX XXOO |
-inherit- |
| A |
objects |
XXXX XXXX |
+ XXXX XXXX |
OXXX XXXX |
XXXX XXXX XXXX XXXX |
XXXX XXXX |
OOOO OOOO |
XXXX XXXX |
- XXOO OOXX |
+ OOOO OOOO |
XXXX XXXX |
diff --git a/docs/openttd.6 b/docs/openttd.6
index 0382306d7e..4e04be32c1 100644
--- a/docs/openttd.6
+++ b/docs/openttd.6
@@ -1,112 +1,152 @@
.\" Hey, EMACS: -*- nroff -*-
.\" Please adjust this date whenever revising the manpage.
-.Dd May 31, 2011
+.Dd October 13, 2014
.Dt OPENTTD 6
+.Os
.Sh NAME
.Nm openttd
-.Nd An open source clone of the Microprose game "Transport Tycoon Deluxe"
+.Nd open source clone of the Microprose game \(lqTransport Tycoon Deluxe\(rq
.Sh SYNOPSIS
.Nm
.Op Fl efhx
.Op Fl b Ar blitter
.Op Fl c Ar config_file
-.Op Fl d Ar [level | cat=lvl[,...]]
-.Op Fl D Ar [host][:port]
-.Op Fl g Ar [savegame]
+.Op Fl d Op Ar level | Ar cat Ns = Ns Ar lvl Ns Op , Ns Ar ...
+.Op Fl D Oo Ar host Oc Ns Op : Ns Ar port
+.Op Fl g Op Ar savegame
.Op Fl G Ar seed
.Op Fl I Ar graphicsset
-.Op Fl l Ar host[:port]
+.Op Fl l Ar host Ns Op : Ns Ar port
.Op Fl m Ar driver
.Op Fl M Ar musicset
-.Op Fl n Ar host[:port][#player]
+.Op Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar player
.Op Fl p Ar password
.Op Fl P Ar password
.Op Fl q Ar savegame
-.Op Fl r Ar widthxheight
+.Op Fl r Ar width Ns x Ns Ar height
.Op Fl s Ar driver
.Op Fl S Ar soundset
.Op Fl t Ar year
.Op Fl v Ar driver
.Sh OPTIONS
-.Bl -tag -width ".Fl n Ar host[:port][#player]"
+.Bl -tag -width "-n host[:port][#player]"
.It Fl b Ar blitter
-Set the blitter, see
+Select the blitter
+.Ar blitter ;
+see
.Fl h
-for a full list
+for a full list.
.It Fl c Ar config_file
-Use 'config_file' instead of 'openttd.cfg'
+Use
+.Ar config_file
+instead of
+.Pa openttd.cfg .
.It Fl d Ar [level]
Set debug verbosity for all categories to
-.Ar level
-or 1 if omitted
-.It Fl d Ar cat=level[,...]
-Set debug verbosity for a specific category
-.It Fl D Ar [host][:port]
-Start a dedicated server. Sets network debug level to 6. If you want to change this, use
+.Ar level ,
+or 1 if omitted.
+.It Fl d Ar cat Ns = Ns Ar lvl Ns Op , Ns Ar ...
+Set debug verbosity to
+.Ar lvl
+for a specific category
+.Ar cat .
+.It Fl D Oo Ar host Oc Ns Op : Ns Ar port
+Start a dedicated server.
+.Pp
+Network debug level will be set to 6.
+If you want to change this, set
.Fl d
-after
-.Fl D
-.It Fl G Ar seed
-Seed the pseudo random number generator
+after setting
+.Fl D .
.It Fl e
-Start in world editor mode
+Start in world editor mode.
.It Fl f
Fork into background (dedicated server only, see
-.Fl D )
-.It Fl g Ar [savegame]
+.Fl D ) .
+.It Fl g Op Ar savegame
Load
.Ar savegame
-at start or start a new game if omitted. The
+at start or start a new game if omitted.
.Ar savegame
-must be either absolute or relative to the current path or one of the search paths.
+must be either an absolute path or one relative to the current path or one of
+the search paths.
+.It Fl G Ar seed
+Seed the pseudo random number generator with
+.Ar seed .
.It Fl h
-Display a summary of all options and lists all the available AIs, blitters, sound, music and video drivers, graphics sets and sound sets.
+Display a summary of all options and list all the available AIs, blitters,
+sound, music and video drivers, graphics sets and sound sets.
.It Fl I Ar graphicsset
-Set the graphics set, see
+Select the graphics set
+.Ar graphicsset ;
+see
.Fl h
-for a full list
-.It Fl l Ar host[:port]
-Redirect DEBUG(), See
-.Fl D
+for a full list.
+.It Fl l Ar host Ns Op : Ns Ar port
+Redirect
+.Fn DEBUG
+output; see
+.Fl D .
.It Fl m Ar driver
-Set the music driver, see
+Select the music driver
+.Ar driver ;
+see
.Fl h
-for a full list
+for a full list.
.It Fl M Ar musicset
-Set the music set, see
+Select the music set
+.Ar musicset ;
+see
.Fl h
-for a full list
-.It Fl n Ar host[:port][#player]
-Join a network game, optionally specify a port to connect to and player to play as
+for a full list.
+.It Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar player
+Join a network game, optionally specifying a port to connect to and player to
+play as.
.It Fl p Ar password
-Password used to join server. Only useful with
-.Fl n
+Password used to join server.
+Only useful with
+.Fl n .
.It Fl P Ar password
-Password used to join company. Only useful with
-.Fl n
+Password used to join company.
+Only useful with
+.Fl n .
.It Fl q Ar savegame
-Write some information about the savegame and exit
-.It Fl r Ar widthxheight
-Set the resolution
+Write some information about the specified savegame and exit.
+.It Fl r Ar width Ns x Ns Ar height
+Set the resolution to
+.Ar width
+\(mu
+.Ar height
+pixels.
.It Fl s Ar driver
-Set the sound driver, see
+Select the sound driver
+.Ar driver ;
+see
.Fl h
-for a full list
+for a full list.
.It Fl S Ar soundset
-Set the sound set, see
+Select the sound set
+.Ar soundset ;
+see
.Fl h
-for a full list
+for a full list.
.It Fl t Ar year
-Set the starting year
+Set the starting year to
+.Ar year .
.It Fl v Ar driver
-Set the video driver, see
+Select the video driver
+.Ar driver ;
+see
.Fl h
-for a full list
+for a full list.
.It Fl x
-Do not automatically save to config file on exit
+Do not automatically save to config file on exit.
.El
.Sh SEE ALSO
-http://wiki.openttd.org/, http://www.openttd.org
+.Lk https://wiki.openttd.org "Wiki"
+(includes community maintained manual),
+.Lk https://forum.openttd.org "Forum",
+.Lk https://www.openttd.org "News"
.Sh HISTORY
Transport Tycoon Deluxe was written by Chris Sawyer and published by Microprose.
.Nm
diff --git a/findversion.sh b/findversion.sh
index 465e654d4d..6d74d862f9 100755
--- a/findversion.sh
+++ b/findversion.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-# $Id: findversion.sh 25107 2013-03-18 06:18:06Z rubidium $
+# $Id: findversion.sh 27079 2014-12-11 12:25:53Z planetmaker $
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -106,21 +106,21 @@ elif [ -d "$ROOT_DIR/.git" ]; then
fi
elif [ -d "$ROOT_DIR/.hg" ]; then
# We are a hg checkout
- if [ -n "`hg status | grep -v '^?'`" ]; then
+ if [ -n "`HGPLAIN= hg status | grep -v '^?'`" ]; then
MODIFIED="2"
fi
- HASH=`LC_ALL=C hg id -i | cut -c1-12`
+ HASH=`LC_ALL=C HGPLAIN= hg id -i | cut -c1-12`
REV="h`echo $HASH | cut -c1-8`"
- BRANCH="`hg branch | sed 's@^default$@@'`"
- TAG="`hg id -t | grep -v 'tip$'`"
+ BRANCH="`HGPLAIN= hg branch | sed 's@^default$@@'`"
+ TAG="`HGPLAIN= hg id -t | grep -v 'tip$'`"
if [ -n "$TAG" ]; then
BRANCH=""
REV="$TAG"
fi
- REV_NR=`LC_ALL=C hg log -f -k "(svn r" -l 1 --template "{desc|firstline}\n" | grep "^(svn r[0-9]*)" | sed "s@.*(svn r\([0-9]*\)).*@\1@"`
+ REV_NR=`LC_ALL=C HGPLAIN= hg log -f -k "(svn r" -l 1 --template "{desc|firstline}\n" | grep "^(svn r[0-9]*)" | sed "s@.*(svn r\([0-9]*\)).*@\1@"`
if [ -z "$REV_NR" ]; then
# No rev? Maybe it is a custom hgsubversion clone
- REV_NR=`LC_ALL=C hg parent --template="{svnrev}"`
+ REV_NR=`LC_ALL=C HGPLAIN= hg parent --template="{svnrev}"`
fi
elif [ -f "$ROOT_DIR/.ottdrev" ]; then
# We are an exported source bundle
diff --git a/known-bugs.txt b/known-bugs.txt
index 0a884cb738..34aca33002 100644
--- a/known-bugs.txt
+++ b/known-bugs.txt
@@ -1,6 +1,6 @@
OpenTTD's known bugs
-Last updated: 2014-04-01
-Release version: 1.4.0
+Last updated: 2015-02-24
+Release version: 1.5.0-beta2
------------------------------------------------------------------------
@@ -33,12 +33,13 @@ No suitable AI can be found
If you have no AIs and an AI is started the so-called 'dummy' AI will
be loaded. This AI does nothing but writing a message on the AI debug
window and showing a red warning. There are basically two solutions
- for this problem: you must change the settings so no AI is started,
- this is done in the difficulty settings window. The other solution is
- acquiring (downloading) some AI. The easiest way to do this is via
- the "Check Online Content" button in the main (intro) menu or via
- "AI Settings" -> "Select AI" -> "Check Online Content" which is also
- accessed via the main menu.
+ for this problem: Either you set the number of AI players to 0 so that
+ no AI is started. You find that setting at the top of the window in the
+ "AI / Game Scripts Settings" window.
+ The other solution is acquiring (downloading) some AI. The easiest way
+ to do this is via the "Check Online Content" button in the main (intro)
+ menu or directly in the "AI / Game Scripts Settings" dialogue via the
+ "Check Online Content" button.
After a while of playing, colours get corrupted
In Windows 7 the background slideshow corrupts the colour mapping of
diff --git a/media/extra_grf/openttd.nfo b/media/extra_grf/openttd.nfo
index 5e4f2db523..74eadb41ef 100644
--- a/media/extra_grf/openttd.nfo
+++ b/media/extra_grf/openttd.nfo
@@ -2,7 +2,7 @@
// (Info version 32)
// Format: spritenum imagefile depth xpos ypos xsize ysize xrel yrel zoom flags
//
-// $Id: openttd.nfo 23993 2012-02-26 08:23:32Z rubidium $
+// $Id: openttd.nfo 26869 2014-09-21 07:57:45Z rubidium $
//
// This file is part of OpenTTD.
// OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -104,3 +104,4 @@
#include "rivers/tropic.nfo"
#include "rivers/toyland.nfo"
#include "tunnel_portals.nfo"
+#include "palette.nfo"
diff --git a/os/debian/changelog b/os/debian/changelog
index 1ff0deed6c..d56400af01 100644
--- a/os/debian/changelog
+++ b/os/debian/changelog
@@ -1,3 +1,81 @@
+openttd (1.5.0~beta2-0) unstable; urgency=low
+
+ * New upstream release 1.5.0-beta2
+
+ -- OpenTTD Tue, 24 Feb 2015 21:00:00 +0100
+
+openttd (1.5.0~beta1-0) unstable; urgency=low
+
+ * New upstream release 1.5.0-beta1
+
+ -- OpenTTD Wed, 24 Dec 2014 21:00:00 +0100
+
+openttd (1.4.4-0) unstable; urgency=low
+
+ * New upstream release 1.4.4
+
+ -- OpenTTD Tue, 21 Oct 2014 21:00:00 +0200
+
+openttd (1.4.4~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.4.4-RC1
+
+ -- OpenTTD Wed, 08 Oct 2014 19:00:00 +0200
+
+openttd (1.4.3-0) unstable; urgency=low
+
+ * New upstream release 1.4.3
+
+ -- OpenTTD Tue, 23 Sep 2014 21:00:00 +0200
+
+openttd (1.4.3~RC2-0) unstable; urgency=low
+
+ * New upstream release 1.4.3-RC2
+
+ -- OpenTTD Sun, 14 Sep 2014 19:00:00 +0200
+
+openttd (1.4.3~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.4.3-RC1
+
+ -- OpenTTD Sun, 07 Sep 2014 19:00:00 +0200
+
+openttd (1.4.2-0) unstable; urgency=low
+
+ * New upstream release 1.4.2
+
+ -- OpenTTD Sat, 16 Aug 2014 21:00:00 +0200
+
+openttd (1.4.2~RC2-0) unstable; urgency=low
+
+ * New upstream release 1.4.2-RC2
+
+ -- OpenTTD Sun, 03 Aug 2014 18:00:00 +0200
+
+openttd (1.4.2~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.4.2-RC1
+
+ -- OpenTTD Thu, 03 Jul 2014 21:00:00 +0200
+
+openttd (1.4.1-0) unstable; urgency=low
+
+ * New upstream release 1.4.1
+
+ -- OpenTTD Mon, 02 Jun 2014 21:00:00 +0200
+
+openttd (1.4.1~RC2-0) unstable; urgency=low
+
+ * New upstream release 1.4.1-RC2
+
+ -- OpenTTD Sun, 18 May 2014 21:00:00 +0200
+
+openttd (1.4.1~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.4.1-RC1
+
+ -- OpenTTD Sun, 04 May 2014 21:00:00 +0200
+
openttd (1.4.0-0) unstable; urgency=low
* New upstream release 1.4.0
diff --git a/os/os2/installer/make_installer.cmd b/os/os2/installer/make_installer.cmd
index 1aa4c8456d..289b6ea54a 100644
--- a/os/os2/installer/make_installer.cmd
+++ b/os/os2/installer/make_installer.cmd
@@ -1,6 +1,6 @@
@echo off
-set OPENTTD_VERSION=1.4.0
+set OPENTTD_VERSION=1.5.0
set OPENSFX_VERSION=0.8.0
set NOSOUND_VERSION=0.8.0
set OPENGFX_VERSION=1.2.0
diff --git a/os/rpm/openttd.spec b/os/rpm/openttd.spec
index 91ffc8dfdc..cd19fd9219 100644
--- a/os/rpm/openttd.spec
+++ b/os/rpm/openttd.spec
@@ -17,9 +17,9 @@
#
Name: openttd
-Version: 1.3.beta2
+Version: 1.5.beta1
Release: 0
-%define srcver 1.3.0-beta2
+%define srcver 1.5.0-beta1
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
License: GPL-2.0
Group: Amusements/Games/Strategy/Other
diff --git a/os/windows/installer/install.nsi b/os/windows/installer/install.nsi
index 30fbc653ec..bc1e422fba 100644
--- a/os/windows/installer/install.nsi
+++ b/os/windows/installer/install.nsi
@@ -1,9 +1,9 @@
# Version numbers to update
!define APPV_MAJOR 1
-!define APPV_MINOR 4
+!define APPV_MINOR 5
!define APPV_MAINT 0
-!define APPV_BUILD 6
-!define APPV_EXTRA ""
+!define APPV_BUILD 1
+!define APPV_EXTRA "-beta2"
!define APPNAME "OpenTTD" ; Define application name
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version
diff --git a/projects/generate b/projects/generate
index 869f7ad6f6..269d018630 100755
--- a/projects/generate
+++ b/projects/generate
@@ -1,6 +1,6 @@
#!/bin/bash
-# $Id: generate 23409 2011-12-03 22:34:15Z glx $
+# $Id: generate 27152 2015-02-15 14:56:21Z frosch $
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
@@ -77,7 +77,7 @@ safety_check() {
done
}
-grep '\.h' "$ROOT_DIR/source.list" | grep -v '../objs/langs/table/strings.h\|../objs/settings/table/settings.h' | sed 's/ //' | sort > tmp.headers.source.list
+grep '\.h' "$ROOT_DIR/source.list" | grep -v '../objs/langs/table/strings.h\|../objs/settings/table/settings.h' | sed 's/ //g' | sort > tmp.headers.source.list
find "$ROOT_DIR/src" \( -iname "*.h" -or -iname "*.hpp" \) -and -not -ipath "*/.svn/*" | sed "s~$ROOT_DIR/src/~~" | sort > tmp.headers.src
if [ -n "`diff tmp.headers.source.list tmp.headers.src`" ]; then
echo "The following headers are missing in source.list and not in /src/ or vice versa."
diff --git a/projects/langs_vs100.vcxproj b/projects/langs_vs100.vcxproj
index be9e0c6227..078a7b374a 100644
--- a/projects/langs_vs100.vcxproj
+++ b/projects/langs_vs100.vcxproj
@@ -227,6 +227,12 @@
..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
..\bin\lang\korean.lng;%(Outputs)
+
+ Generating latin language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\latin.lng;%(Outputs)
+
Generating latvian language file
..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
diff --git a/projects/langs_vs100.vcxproj.filters b/projects/langs_vs100.vcxproj.filters
index 64221319e2..fb16aa64e0 100644
--- a/projects/langs_vs100.vcxproj.filters
+++ b/projects/langs_vs100.vcxproj.filters
@@ -97,6 +97,9 @@
Translations
+
+ Translations
+
Translations
diff --git a/projects/langs_vs80.vcproj b/projects/langs_vs80.vcproj
index 6cea19753f..1413a80d27 100644
--- a/projects/langs_vs80.vcproj
+++ b/projects/langs_vs80.vcproj
@@ -513,6 +513,21 @@
/>
+
+
+
+
+
diff --git a/projects/langs_vs90.vcproj b/projects/langs_vs90.vcproj
index 5fe8dca8d8..db6fef1a43 100644
--- a/projects/langs_vs90.vcproj
+++ b/projects/langs_vs90.vcproj
@@ -514,6 +514,21 @@
/>
+
+
+
+
+
diff --git a/projects/openttd_vs100.vcxproj b/projects/openttd_vs100.vcxproj
index b13d3ea931..cfff536145 100644
--- a/projects/openttd_vs100.vcxproj
+++ b/projects/openttd_vs100.vcxproj
@@ -102,7 +102,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;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_SSE;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)
true
Sync
MultiThreaded
@@ -204,7 +204,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WITH_SSE;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_SSE;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)
true
Sync
MultiThreaded
@@ -311,6 +311,7 @@
+
@@ -437,6 +438,7 @@
+
@@ -568,6 +570,7 @@
+
@@ -804,7 +807,6 @@
-
@@ -881,6 +883,7 @@
+
@@ -950,13 +953,8 @@
-
-
-
-
-
diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters
index 82b64ff76b..b5dcdfc5a5 100644
--- a/projects/openttd_vs100.vcxproj.filters
+++ b/projects/openttd_vs100.vcxproj.filters
@@ -162,6 +162,9 @@
Source Files
+
+ Source Files
+
Source Files
@@ -540,6 +543,9 @@
Header Files
+
+ Header Files
+
Header Files
@@ -933,6 +939,9 @@
Header Files
+
+ Header Files
+
Header Files
@@ -1641,9 +1650,6 @@
Command handlers
-
- Command handlers
-
Command handlers
@@ -1872,6 +1878,9 @@
Tables
+
+ Tables
+
Tables
@@ -2079,27 +2088,12 @@
Squirrel headers
-
- Squirrel headers
-
-
- Squirrel headers
-
-
- Squirrel headers
-
Squirrel headers
-
- Squirrel headers
-
Squirrel headers
-
- Squirrel headers
-
Squirrel headers
diff --git a/projects/openttd_vs100.vcxproj.in b/projects/openttd_vs100.vcxproj.in
index 51703af54f..7a4f0bce81 100644
--- a/projects/openttd_vs100.vcxproj.in
+++ b/projects/openttd_vs100.vcxproj.in
@@ -102,7 +102,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;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_SSE;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)
true
Sync
MultiThreaded
@@ -204,7 +204,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WITH_SSE;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_SSE;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)
true
Sync
MultiThreaded
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index e625483bd0..17c2d8d4f1 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -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_SSE;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_SSE;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_SSE;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_SSE;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"
@@ -514,6 +514,10 @@
RelativePath=".\..\src\depot.cpp"
>
+
+
@@ -1022,6 +1026,10 @@
RelativePath=".\..\src\direction_type.h"
>
+
+
@@ -1546,6 +1554,10 @@
RelativePath=".\..\src\roadveh.h"
>
+
+
@@ -2506,10 +2518,6 @@
RelativePath=".\..\src\depot_cmd.cpp"
>
-
-
@@ -2822,6 +2830,10 @@
RelativePath=".\..\src\table\genland.h"
>
+
+
@@ -3114,34 +3126,14 @@
RelativePath=".\..\src\3rdparty\squirrel\include\sqstdaux.h"
>
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/openttd_vs80.vcproj.in b/projects/openttd_vs80.vcproj.in
index 8992c9da2c..57938f9e91 100644
--- a/projects/openttd_vs80.vcproj.in
+++ b/projects/openttd_vs80.vcproj.in
@@ -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_SSE;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_SSE;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_SSE;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_SSE;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"
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index d0d8bb327c..666760ce78 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -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_SSE;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_SSE;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_SSE;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_SSE;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"
@@ -511,6 +511,10 @@
RelativePath=".\..\src\depot.cpp"
>
+
+
@@ -1019,6 +1023,10 @@
RelativePath=".\..\src\direction_type.h"
>
+
+
@@ -1543,6 +1551,10 @@
RelativePath=".\..\src\roadveh.h"
>
+
+
@@ -2503,10 +2515,6 @@
RelativePath=".\..\src\depot_cmd.cpp"
>
-
-
@@ -2819,6 +2827,10 @@
RelativePath=".\..\src\table\genland.h"
>
+
+
@@ -3111,34 +3123,14 @@
RelativePath=".\..\src\3rdparty\squirrel\include\sqstdaux.h"
>
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/openttd_vs90.vcproj.in b/projects/openttd_vs90.vcproj.in
index 56fa1c01e9..2793927bdb 100644
--- a/projects/openttd_vs90.vcproj.in
+++ b/projects/openttd_vs90.vcproj.in
@@ -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_SSE;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_SSE;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_SSE;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_SSE;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"
diff --git a/readme.txt b/readme.txt
index 8a6ae58ac6..79420b978d 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
-Last updated: 2014-04-01
-Release version: 1.4.0
+Last updated: 2015-02-24
+Release version: 1.5.0-beta2
------------------------------------------------------------------------
@@ -661,6 +661,12 @@ The md5 implementation in src/3rdparty/md5 is licensed under the Zlib
license. See the comments in the source files in src/3rdparty/md5 for
the complete license text.
+The implementations of Posix getaddrinfo and getnameinfo for OS/2 in
+src/3rdparty/os2 are distributed partly under the GNU Lesser General Public
+License 2.1, and partly under the (3-clause) BSD license. The exact licensing
+terms can be found in src/3rdparty/os2/getaddrinfo.c resp.
+src/3rdparty/os2/getnameinfo.c.
+
The exe2coff implementation in os/dos/exe2coff is available under the
GPL, with a number of additional terms. See os/dos/exe2coff/copying and
os/dos/exe2coff/copying.dj for the exact licensing terms.
@@ -674,46 +680,47 @@ http://homer.rice.edu/~sandmann/cwsdpmi/csdpmi5s.zip
X.X) Credits
---- -------
The OpenTTD team (in alphabetical order):
- Albert Hofkamp (Alberth) - GUI expert
- Jean-François Claeys (Belugas) - GUI, newindustries and more
- Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework
- Ulf Hermann (fonsinchen) - Cargo Distribution
- Christoph Elsenhans (frosch) - General coding
- Loïc Guilloux (glx) - Windows Expert
- Michael Lutz (michi_cc) - Path based signals
- Owen Rudge (orudge) - Forum host, OS/2 port
- Peter Nelson (peter1138) - Spiritual descendant from newGRF gods
- Ingo von Borstel (planetmaker) - Support
- Remko Bijker (Rubidium) - Lead coder and way more
- Zdeněk Sojka (SmatZ) - Bug finder and fixer
- José Soler (Terkhen) - General coding
- Thijs Marinussen (Yexo) - AI Framework
- Leif Linse (Zuu) - AI/Game Script
+ Albert Hofkamp (Alberth) - GUI expert (since 0.7)
+ Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)
+ Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)
+ Christoph Elsenhans (frosch) - General coding (since 0.6)
+ Loïc Guilloux (glx) - Windows Expert (since 0.4.5)
+ Michael Lutz (michi_cc) - Path based signals (since 0.7)
+ Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
+ Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
+ Ingo von Borstel (planetmaker) - General coding, Support (since 1.1)
+ Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)
+ José Soler (Terkhen) - General coding (since 1.0)
+ Leif Linse (Zuu) - AI/Game Script (since 1.2)
Inactive Developers:
- Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles
- Victor Fischer (Celestar) - Programming everywhere you need him to
- Tamás Faragó (Darkvater) - Ex-Lead coder
- Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
- Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
- Attila Bán (MiHaMiX) - WebTranslator 1 and 2
- Christoph Mallon (Tron) - Programmer, code correctness police
+ Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0)
+ Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7)
+ Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)
+ Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)
+ Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)
+ Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5)
+ Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)
+ Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)
+ Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
+ Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)
Retired Developers:
- Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3)
- Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3)
- Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3.0 - 0.3.6)
- Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
- Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
+ Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5)
+ Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)
+ Emil Djupfeld (egladil) - MacOSX port (0.4 - 0.6)
+ Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5)
+ Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)
+ Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)
+ Petr Baudiš (pasky) - Many patches, newgrf support, etc. (0.3 - 0.3)
+ Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)
+ Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)
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
- 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
Mike Ragsdale - OpenTTD installer
- Cian Duffy (MYOB) - BeOS port / manual writing
Christian Rosentreter (tokai) - MorphOS / AmigaOS port
Richard Kempton (RichK67) - Additional airports, initial TGP implementation
Alberto Demichelis - Squirrel scripting language
@@ -722,7 +729,6 @@ Thanks to:
George - Canal graphics
Andrew Parkhouse (andythenorth) - River graphics
David Dallaston (Pikka) - Tram tracks
- Fleashosio - Titlegame
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!
diff --git a/source.list b/source.list
index 17b937fb43..3b66ab9fca 100644
--- a/source.list
+++ b/source.list
@@ -19,6 +19,7 @@ date.cpp
debug.cpp
dedicated.cpp
depot.cpp
+disaster_vehicle.cpp
driver.cpp
economy.cpp
effectvehicle.cpp
@@ -98,6 +99,10 @@ townname.cpp
#else
#if OS2
os/os2/os2.cpp
+ 3rdparty/os2/getaddrinfo.c
+ 3rdparty/os2/getaddrinfo.h
+ 3rdparty/os2/getnameinfo.c
+ 3rdparty/os2/getnameinfo.h
#else
#if OSX
os/macosx/crashlog_osx.cpp
@@ -172,6 +177,7 @@ depot_map.h
depot_type.h
direction_func.h
direction_type.h
+disaster_vehicle.h
music/dmusic.h
driver.h
economy_base.h
@@ -303,6 +309,7 @@ road_internal.h
road_type.h
roadstop_base.h
roadveh.h
+safeguards.h
screenshot.h
sdl.h
sound/sdl_s.h
@@ -562,7 +569,6 @@ autoreplace_cmd.cpp
clear_cmd.cpp
company_cmd.cpp
depot_cmd.cpp
-disaster_cmd.cpp
group_cmd.cpp
industry_cmd.cpp
misc_cmd.cpp
@@ -643,6 +649,7 @@ table/control_codes.h
table/elrail_data.h
table/engines.h
table/genland.h
+table/heightmap_colours.h
table/industry_land.h
table/landscape_sprite.h
table/newgrf_debug_data.h
@@ -720,13 +727,8 @@ script/squirrel_std.hpp
3rdparty/squirrel/squirrel/sqpcheader.h
3rdparty/squirrel/squirrel/sqstate.h
3rdparty/squirrel/include/sqstdaux.h
-3rdparty/squirrel/include/sqstdblob.h
-3rdparty/squirrel/sqstdlib/sqstdblobimpl.h
-3rdparty/squirrel/include/sqstdio.h
3rdparty/squirrel/include/sqstdmath.h
-3rdparty/squirrel/sqstdlib/sqstdstream.h
3rdparty/squirrel/include/sqstdstring.h
-3rdparty/squirrel/include/sqstdsystem.h
3rdparty/squirrel/squirrel/sqstring.h
3rdparty/squirrel/squirrel/sqtable.h
3rdparty/squirrel/include/squirrel.h
@@ -1108,7 +1110,10 @@ music/null_m.cpp
#else
#if DOS
#else
- music/extmidi.cpp
+ #if MORPHOS
+ #else
+ music/extmidi.cpp
+ #end
#end
#end
#end
diff --git a/src/3rdparty/md5/md5.cpp b/src/3rdparty/md5/md5.cpp
index 0a39510925..fbd2bebfed 100644
--- a/src/3rdparty/md5/md5.cpp
+++ b/src/3rdparty/md5/md5.cpp
@@ -1,4 +1,4 @@
-/* $Id: md5.cpp 17883 2009-10-26 23:03:03Z smatz $ */
+/* $Id: md5.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/** @file md5.cpp Creating MD5 checksums of files. */
@@ -60,6 +60,8 @@
#include "../../core/endian_func.hpp"
#include "md5.h"
+#include "../../safeguards.h"
+
#define T_MASK ((uint32)~0)
#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
diff --git a/src/3rdparty/squirrel/include/sqstdaux.h b/src/3rdparty/squirrel/include/sqstdaux.h
index c16b04373b..ded3c12e8a 100644
--- a/src/3rdparty/squirrel/include/sqstdaux.h
+++ b/src/3rdparty/squirrel/include/sqstdaux.h
@@ -2,15 +2,7 @@
#ifndef _SQSTD_AUXLIB_H_
#define _SQSTD_AUXLIB_H_
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-SQUIRREL_API void sqstd_seterrorhandlers(HSQUIRRELVM v);
-SQUIRREL_API void sqstd_printcallstack(HSQUIRRELVM v);
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
+void sqstd_seterrorhandlers(HSQUIRRELVM v);
+void sqstd_printcallstack(HSQUIRRELVM v);
#endif /* _SQSTD_AUXLIB_H_ */
diff --git a/src/3rdparty/squirrel/include/sqstdmath.h b/src/3rdparty/squirrel/include/sqstdmath.h
index 65de6fd72d..269a7e40d8 100644
--- a/src/3rdparty/squirrel/include/sqstdmath.h
+++ b/src/3rdparty/squirrel/include/sqstdmath.h
@@ -2,14 +2,6 @@
#ifndef _SQSTD_MATH_H_
#define _SQSTD_MATH_H_
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-SQUIRREL_API SQRESULT sqstd_register_mathlib(HSQUIRRELVM v);
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
+SQRESULT sqstd_register_mathlib(HSQUIRRELVM v);
#endif /*_SQSTD_MATH_H_*/
diff --git a/src/3rdparty/squirrel/include/sqstdstring.h b/src/3rdparty/squirrel/include/sqstdstring.h
index 3c3bce826f..856c33f791 100644
--- a/src/3rdparty/squirrel/include/sqstdstring.h
+++ b/src/3rdparty/squirrel/include/sqstdstring.h
@@ -2,10 +2,6 @@
#ifndef _SQSTD_STRING_H_
#define _SQSTD_STRING_H_
-#ifdef __cplusplus
-extern "C" {
-#endif
-
typedef unsigned int SQRexBool;
typedef struct SQRex SQRex;
@@ -14,20 +10,16 @@ typedef struct {
SQInteger len;
} SQRexMatch;
-SQUIRREL_API SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error);
-SQUIRREL_API void sqstd_rex_free(SQRex *exp);
-SQUIRREL_API SQBool sqstd_rex_match(SQRex* exp,const SQChar* text);
-SQUIRREL_API SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end);
-SQUIRREL_API SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end);
-SQUIRREL_API SQInteger sqstd_rex_getsubexpcount(SQRex* exp);
-SQUIRREL_API SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp);
+SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error);
+void sqstd_rex_free(SQRex *exp);
+SQBool sqstd_rex_match(SQRex* exp,const SQChar* text);
+SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end);
+SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end);
+SQInteger sqstd_rex_getsubexpcount(SQRex* exp);
+SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp);
-SQUIRREL_API SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output);
+SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output);
-SQUIRREL_API SQRESULT sqstd_register_stringlib(HSQUIRRELVM v);
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
+SQRESULT sqstd_register_stringlib(HSQUIRRELVM v);
#endif /*_SQSTD_STRING_H_*/
diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h
index 1fe023dfff..87e0ac0d69 100644
--- a/src/3rdparty/squirrel/include/squirrel.h
+++ b/src/3rdparty/squirrel/include/squirrel.h
@@ -1,81 +1,41 @@
/*
-Copyright (c) 2003-2011 Alberto Demichelis
-
-This software is provided 'as-is', without any
-express or implied warranty. In no event will the
-authors be held liable for any damages arising from
-the use of this software.
-
-Permission is granted to anyone to use this software
-for any purpose, including commercial applications,
-and to alter it and redistribute it freely, subject
-to the following restrictions:
-
- 1. The origin of this software must not be
- misrepresented; you must not claim that
- you wrote the original software. If you
- use this software in a product, an
- acknowledgment in the product
- documentation would be appreciated but is
- not required.
-
- 2. Altered source versions must be plainly
- marked as such, and must not be
- misrepresented as being the original
- software.
-
- 3. This notice may not be removed or
- altered from any source distribution.
-
-*/
+ * Copyright (c) 2003-2011 Alberto Demichelis
+ *
+ * This software is provided 'as-is', without any
+ * express or implied warranty. In no event will the
+ * authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software
+ * for any purpose, including commercial applications,
+ * and to alter it and redistribute it freely, subject
+ * to the following restrictions:
+ *
+ * 1. The origin of this software must not be
+ * misrepresented; you must not claim that
+ * you wrote the original software. If you
+ * use this software in a product, an
+ * acknowledgment in the product
+ * documentation would be appreciated but is
+ * not required.
+ *
+ * 2. Altered source versions must be plainly
+ * marked as such, and must not be
+ * misrepresented as being the original
+ * software.
+ *
+ * 3. This notice may not be removed or
+ * altered from any source distribution.
+ */
#ifndef _SQUIRREL_H_
#define _SQUIRREL_H_
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include "../../../string_type.h"
-#if defined(_MSC_VER)
-# define inline __forceinline
-#endif /* _MSC_VER */
-
-#if defined(_MSC_VER) && _MSC_VER >= 1400 // MSVC 2005 safety checks
-# pragma warning(disable: 4996) // '_wfopen' was declared deprecated
-# define _CRT_SECURE_NO_DEPRECATE // all deprecated 'unsafe string functions
-# define _CRT_NON_CONFORMING_SWPRINTFS // another deprecated stuff
-#endif /* _MSC_VER >= 1400 */
-
-#ifndef SQUIRREL_API
-#define SQUIRREL_API extern
-#endif
-
-#if (defined(_WIN64) || defined(_LP64))
-#ifndef _SQ64
-#define _SQ64
-#endif
-#endif
-
-#ifdef _SQ64
-#ifdef _MSC_VER
typedef __int64 SQInteger;
typedef unsigned __int64 SQUnsignedInteger;
typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
-#elif defined(_WIN32)
-typedef long long SQInteger;
-typedef unsigned long long SQUnsignedInteger;
-typedef unsigned long long SQHash; /*should be the same size of a pointer*/
-#else
-typedef long SQInteger;
-typedef unsigned long SQUnsignedInteger;
-typedef unsigned long SQHash; /*should be the same size of a pointer*/
-#endif
typedef int SQInt32;
-#else
-typedef int SQInteger;
-typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
-typedef unsigned int SQUnsignedInteger;
-typedef unsigned int SQHash; /*should be the same size of a pointer*/
-#endif
#ifdef SQUSEDOUBLE
@@ -84,17 +44,8 @@ typedef double SQFloat;
typedef float SQFloat;
#endif
-#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64)
-#ifdef _MSC_VER
typedef __int64 SQRawObjectVal; //must be 64bits
-#else
-typedef long long SQRawObjectVal; //must be 64bits
-#endif
#define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
-#else
-typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
-#define SQ_OBJECT_RAWINIT()
-#endif
typedef void* SQUserPointer;
typedef SQUnsignedInteger SQBool;
@@ -117,78 +68,12 @@ struct SQClass;
struct SQInstance;
struct SQDelegable;
-#ifdef _UNICODE
-#define SQUNICODE
-#endif
-
-#ifdef SQUNICODE
-#if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
-
-#ifndef _WCHAR_T_DEFINED //this is if the compiler considers wchar_t as native type
-typedef unsigned short wchar_t;
-#endif
-#endif
-
-typedef wchar_t SQChar;
-#define _SC(a) L##a
-#define scstrcmp wcscmp
-#define scsprintf swprintf
-#define scsnprintf _snwprintf
-#define scstrlen wcslen
-#define scstrtod wcstod
-#define scstrtol wcstol
-#define scatoi _wtoi
-#define scstrtoul wcstoul
-#define scvsprintf vswprintf
-#define scstrstr wcsstr
-#define scisspace iswspace
-#define scisdigit iswdigit
-#define scisxdigit iswxdigit
-#define scisalpha iswalpha
-#define sciscntrl iswcntrl
-#define scisalnum iswalnum
-#define scprintf wprintf
-#define scfprintf fwprintf
-#define scvprintf vwprintf
-#define scvfprintf vfwprintf
-#define scvsnprintf _vsnwprintf
-#define scstrdup _wcsdup
-#define scstrrchr wcsrchr
-#define scstrcat wcscat
-#define MAX_CHAR 0xFFFF
-#else
typedef char SQChar;
-#define _SC(a) a
-#define scstrcmp strcmp
-#define scsprintf sprintf
-#define scsnprintf snprintf
-#define scstrlen strlen
-#define scstrtod strtod
-#define scstrtol strtol
-#define scatoi atoi
-#define scstrtoul strtoul
-#define scvsprintf vsprintf
-#define scstrstr strstr
-#define scisspace isspace
-#define scisdigit isdigit
-#define scisxdigit isxdigit
-#define sciscntrl iscntrl
-#define scisalpha isalpha
-#define scisalnum isalnum
-#define scprintf printf
-#define scfprintf fprintf
-#define scvprintf vprintf
-#define scvfprintf vfprintf
-#define scvsnprintf vsnprintf
-#define scstrdup strdup
-#define scstrrchr strrchr
-#define scstrcat strcat
#define MAX_CHAR 0xFFFF
-#endif
-#define SQUIRREL_VERSION _SC("Squirrel 2.2.5 stable - With custom OpenTTD modifications")
-#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2010 Alberto Demichelis")
-#define SQUIRREL_AUTHOR _SC("Alberto Demichelis")
+#define SQUIRREL_VERSION "Squirrel 2.2.5 stable - With custom OpenTTD modifications"
+#define SQUIRREL_COPYRIGHT "Copyright (C) 2003-2010 Alberto Demichelis"
+#define SQUIRREL_AUTHOR "Alberto Demichelis"
#define SQUIRREL_VERSION_NUMBER 225
#define SQ_VMSTATE_IDLE 0
@@ -294,7 +179,7 @@ typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
-typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
+typedef WChar (*SQLEXREADFUNC)(SQUserPointer);
typedef struct tagSQRegFunction{
const SQChar *name;
@@ -311,147 +196,147 @@ typedef struct tagSQFunctionInfo {
/*vm*/
-SQUIRREL_API bool sq_can_suspend(HSQUIRRELVM v);
-SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
-SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
-SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
-SQUIRREL_API void sq_close(HSQUIRRELVM v);
-SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
-SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
-SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
-SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
-SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
-SQUIRREL_API bool sq_resumecatch(HSQUIRRELVM v, int suspend = -1);
-SQUIRREL_API bool sq_resumeerror(HSQUIRRELVM v);
-SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
-SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
-SQUIRREL_API void sq_decreaseops(HSQUIRRELVM v, int amount);
+bool sq_can_suspend(HSQUIRRELVM v);
+HSQUIRRELVM sq_open(SQInteger initialstacksize);
+HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
+void sq_seterrorhandler(HSQUIRRELVM v);
+void sq_close(HSQUIRRELVM v);
+void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
+SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
+void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
+SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
+SQRESULT sq_suspendvm(HSQUIRRELVM v);
+bool sq_resumecatch(HSQUIRRELVM v, int suspend = -1);
+bool sq_resumeerror(HSQUIRRELVM v);
+SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
+SQInteger sq_getvmstate(HSQUIRRELVM v);
+void sq_decreaseops(HSQUIRRELVM v, int amount);
/*compiler*/
-SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
-SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
-SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
-SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
-SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
+SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
+SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
+void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
+void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
+void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
/*stack operations*/
-SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
-SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
-SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
-SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
-SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
-SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
-SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
+void sq_push(HSQUIRRELVM v,SQInteger idx);
+void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
+void sq_poptop(HSQUIRRELVM v);
+void sq_remove(HSQUIRRELVM v,SQInteger idx);
+SQInteger sq_gettop(HSQUIRRELVM v);
+void sq_settop(HSQUIRRELVM v,SQInteger newtop);
+void sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
+SQInteger sq_cmp(HSQUIRRELVM v);
+void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
/*object creation handling*/
-SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
-SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
-SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
-SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
-SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
-SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
-SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
-SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
-SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
-SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
-SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
-SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v);
-SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
-SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
-SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
-SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
-SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
-SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
-SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
-SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
-SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
-SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
-SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
-SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
-SQUIRREL_API SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger idx,SQFunctionInfo *fi);
-SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
-SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
-SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
-SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
-SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
-SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
-SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
+SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
+void sq_newtable(HSQUIRRELVM v);
+void sq_newarray(HSQUIRRELVM v,SQInteger size);
+void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
+SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
+SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
+void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
+void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
+void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
+void sq_pushbool(HSQUIRRELVM v,SQBool b);
+void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
+void sq_pushnull(HSQUIRRELVM v);
+SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
+SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
+SQBool sq_instanceof(HSQUIRRELVM v);
+void sq_tostring(HSQUIRRELVM v,SQInteger idx);
+void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
+SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
+SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
+SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
+SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
+SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
+SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
+SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
+SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
+SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
+void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
+SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
+SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger idx,SQFunctionInfo *fi);
+SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
+SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
+SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
+SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
+SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
+SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
+SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
+void sq_weakref(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
/*object manipulation*/
-SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
-SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
-SQUIRREL_API void sq_pushconsttable(HSQUIRRELVM v);
-SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
-SQUIRREL_API SQRESULT sq_setconsttable(HSQUIRRELVM v);
-SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
-SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
-SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
-SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
-SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
-SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
-SQUIRREL_API SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
-SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
-SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
-SQUIRREL_API SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
+void sq_pushroottable(HSQUIRRELVM v);
+void sq_pushregistrytable(HSQUIRRELVM v);
+void sq_pushconsttable(HSQUIRRELVM v);
+SQRESULT sq_setroottable(HSQUIRRELVM v);
+SQRESULT sq_setconsttable(HSQUIRRELVM v);
+SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
+SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
+SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
+SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
+SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
+SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
+SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
+SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
+SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
+SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
/*calls*/
-SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror, int suspend = -1);
-SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
-SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
-SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
-SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
-SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
-SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
+SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror, int suspend = -1);
+SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
+const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
+const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
+SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
+void sq_reseterror(HSQUIRRELVM v);
+void sq_getlasterror(HSQUIRRELVM v);
/*raw object handling*/
-SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
-SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
-SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
-SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
-SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
-SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o);
-SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o);
-SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o);
-SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o);
-SQUIRREL_API SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag);
+SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
+void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
+void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
+SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
+void sq_resetobject(HSQOBJECT *po);
+const SQChar *sq_objtostring(HSQOBJECT *o);
+SQBool sq_objtobool(HSQOBJECT *o);
+SQInteger sq_objtointeger(HSQOBJECT *o);
+SQFloat sq_objtofloat(HSQOBJECT *o);
+SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag);
/*GC*/
-SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
+SQInteger sq_collectgarbage(HSQUIRRELVM v);
/*serialization*/
-SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
-SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
+SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
+SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
/*mem allocation*/
-SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
-SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
-SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
+void *sq_malloc(SQUnsignedInteger size);
+void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
+void sq_free(void *p,SQUnsignedInteger size);
/*debug*/
-SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
-SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
+SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
+void sq_setdebughook(HSQUIRRELVM v);
/*UTILITY MACRO*/
#define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
@@ -483,8 +368,4 @@ SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
#define SQ_FAILED(res) (res<0)
#define SQ_SUCCEEDED(res) (res>=0)
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
-
#endif /*_SQUIRREL_H_*/
diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp
index 78b8a9c603..67b299bcec 100644
--- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp
+++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp
@@ -1,8 +1,11 @@
/* see copyright notice in squirrel.h */
+
+#include "../../../stdafx.h"
+
#include
#include
-#include
-#include
+
+#include "../../../safeguards.h"
void sqstd_printcallstack(HSQUIRRELVM v)
{
@@ -16,30 +19,30 @@ void sqstd_printcallstack(HSQUIRRELVM v)
SQInteger level=1; //1 is to skip this function that is level 0
const SQChar *name=0;
SQInteger seq=0;
- pf(v,_SC("\nCALLSTACK\n"));
+ pf(v,"\nCALLSTACK\n");
while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
{
- const SQChar *fn=_SC("unknown");
- const SQChar *src=_SC("unknown");
+ const SQChar *fn="unknown";
+ const SQChar *src="unknown";
if(si.funcname)fn=si.funcname;
if(si.source) {
/* We don't want to bother users with absolute paths to all AI files.
* Since the path only reaches NoAI code in a formatted string we have
* to strip it here. Let's hope nobody installs openttd in a subdirectory
* of a directory named /ai/. */
- src = scstrstr(si.source, _SC("\\ai\\"));
- if (!src) src = scstrstr(si.source, _SC("/ai/"));
+ src = strstr(si.source, "\\ai\\");
+ if (!src) src = strstr(si.source, "/ai/");
if (src) {
src += 4;
} else {
src = si.source;
}
}
- pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
+ pf(v,"*FUNCTION [%s()] %s line [%d]\n",fn,src,si.line);
level++;
}
level=0;
- pf(v,_SC("\nLOCALS\n"));
+ pf(v,"\nLOCALS\n");
for(level=0;level<10;level++){
seq=0;
@@ -49,56 +52,56 @@ void sqstd_printcallstack(HSQUIRRELVM v)
switch(sq_gettype(v,-1))
{
case OT_NULL:
- pf(v,_SC("[%s] NULL\n"),name);
+ pf(v,"[%s] NULL\n",name);
break;
case OT_INTEGER:
sq_getinteger(v,-1,&i);
- pf(v,_SC("[%s] %d\n"),name,i);
+ pf(v,"[%s] %d\n",name,i);
break;
case OT_FLOAT:
sq_getfloat(v,-1,&f);
- pf(v,_SC("[%s] %.14g\n"),name,f);
+ pf(v,"[%s] %.14g\n",name,f);
break;
case OT_USERPOINTER:
- pf(v,_SC("[%s] USERPOINTER\n"),name);
+ pf(v,"[%s] USERPOINTER\n",name);
break;
case OT_STRING:
sq_getstring(v,-1,&s);
- pf(v,_SC("[%s] \"%s\"\n"),name,s);
+ pf(v,"[%s] \"%s\"\n",name,s);
break;
case OT_TABLE:
- pf(v,_SC("[%s] TABLE\n"),name);
+ pf(v,"[%s] TABLE\n",name);
break;
case OT_ARRAY:
- pf(v,_SC("[%s] ARRAY\n"),name);
+ pf(v,"[%s] ARRAY\n",name);
break;
case OT_CLOSURE:
- pf(v,_SC("[%s] CLOSURE\n"),name);
+ pf(v,"[%s] CLOSURE\n",name);
break;
case OT_NATIVECLOSURE:
- pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
+ pf(v,"[%s] NATIVECLOSURE\n",name);
break;
case OT_GENERATOR:
- pf(v,_SC("[%s] GENERATOR\n"),name);
+ pf(v,"[%s] GENERATOR\n",name);
break;
case OT_USERDATA:
- pf(v,_SC("[%s] USERDATA\n"),name);
+ pf(v,"[%s] USERDATA\n",name);
break;
case OT_THREAD:
- pf(v,_SC("[%s] THREAD\n"),name);
+ pf(v,"[%s] THREAD\n",name);
break;
case OT_CLASS:
- pf(v,_SC("[%s] CLASS\n"),name);
+ pf(v,"[%s] CLASS\n",name);
break;
case OT_INSTANCE:
- pf(v,_SC("[%s] INSTANCE\n"),name);
+ pf(v,"[%s] INSTANCE\n",name);
break;
case OT_WEAKREF:
- pf(v,_SC("[%s] WEAKREF\n"),name);
+ pf(v,"[%s] WEAKREF\n",name);
break;
case OT_BOOL:{
sq_getbool(v,-1,&b);
- pf(v,_SC("[%s] %s\n"),name,b?_SC("true"):_SC("false"));
+ pf(v,"[%s] %s\n",name,b?"true":"false");
}
break;
default: assert(0); break;
@@ -116,10 +119,10 @@ static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
const SQChar *sErr = 0;
if(sq_gettop(v)>=1) {
if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
- pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
+ pf(v,"\nAN ERROR HAS OCCURED [%s]\n",sErr);
}
else{
- pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
+ pf(v,"\nAN ERROR HAS OCCURED [unknown]\n");
}
sqstd_printcallstack(v);
}
@@ -131,7 +134,7 @@ void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSourc
{
SQPRINTFUNCTION pf = sq_getprintfunc(v);
if(pf) {
- pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
+ pf(v,"%s line = (%d) column = (%d) : error %s\n",sSource,line,column,sErr);
}
}
diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp
index 132f341f22..0ff0090209 100644
--- a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp
+++ b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp
@@ -1,9 +1,13 @@
/* see copyright notice in squirrel.h */
+
+#include "../../../stdafx.h"
+
#include
#include
-#include
#include
+#include "../../../safeguards.h"
+
#define SINGLE_ARG_FUNC(_funcname, num_ops) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
SQFloat f; \
sq_decreaseops(v,num_ops); \
@@ -26,7 +30,7 @@ static SQInteger math_srand(HSQUIRRELVM v)
{
SQInteger i;
if(SQ_FAILED(sq_getinteger(v,2,&i)))
- return sq_throwerror(v,_SC("invalid param"));
+ return sq_throwerror(v,"invalid param");
srand((unsigned int)i);
return 0;
}
@@ -62,28 +66,28 @@ SINGLE_ARG_FUNC(floor, 1)
SINGLE_ARG_FUNC(ceil, 1)
SINGLE_ARG_FUNC(exp, 100)
-#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck}
+#define _DECL_FUNC(name,nparams,tycheck) {#name,math_##name,nparams,tycheck}
static SQRegFunction mathlib_funcs[] = {
- _DECL_FUNC(sqrt,2,_SC(".n")),
- _DECL_FUNC(sin,2,_SC(".n")),
- _DECL_FUNC(cos,2,_SC(".n")),
- _DECL_FUNC(asin,2,_SC(".n")),
- _DECL_FUNC(acos,2,_SC(".n")),
- _DECL_FUNC(log,2,_SC(".n")),
- _DECL_FUNC(log10,2,_SC(".n")),
- _DECL_FUNC(tan,2,_SC(".n")),
- _DECL_FUNC(atan,2,_SC(".n")),
- _DECL_FUNC(atan2,3,_SC(".nn")),
- _DECL_FUNC(pow,3,_SC(".nn")),
- _DECL_FUNC(floor,2,_SC(".n")),
- _DECL_FUNC(ceil,2,_SC(".n")),
- _DECL_FUNC(exp,2,_SC(".n")),
+ _DECL_FUNC(sqrt,2,".n"),
+ _DECL_FUNC(sin,2,".n"),
+ _DECL_FUNC(cos,2,".n"),
+ _DECL_FUNC(asin,2,".n"),
+ _DECL_FUNC(acos,2,".n"),
+ _DECL_FUNC(log,2,".n"),
+ _DECL_FUNC(log10,2,".n"),
+ _DECL_FUNC(tan,2,".n"),
+ _DECL_FUNC(atan,2,".n"),
+ _DECL_FUNC(atan2,3,".nn"),
+ _DECL_FUNC(pow,3,".nn"),
+ _DECL_FUNC(floor,2,".n"),
+ _DECL_FUNC(ceil,2,".n"),
+ _DECL_FUNC(exp,2,".n"),
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
- _DECL_FUNC(srand,2,_SC(".n")),
+ _DECL_FUNC(srand,2,".n"),
_DECL_FUNC(rand,1,NULL),
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
- _DECL_FUNC(fabs,2,_SC(".n")),
- _DECL_FUNC(abs,2,_SC(".n")),
+ _DECL_FUNC(fabs,2,".n"),
+ _DECL_FUNC(abs,2,".n"),
{0,0,0,0},
};
@@ -103,11 +107,11 @@ SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
i++;
}
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
- sq_pushstring(v,_SC("RAND_MAX"),-1);
+ sq_pushstring(v,"RAND_MAX",-1);
sq_pushinteger(v,RAND_MAX);
sq_createslot(v,-3);
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
- sq_pushstring(v,_SC("PI"),-1);
+ sq_pushstring(v,"PI",-1);
sq_pushfloat(v,(SQFloat)M_PI);
sq_createslot(v,-3);
return SQ_OK;
diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp
index 90d980e104..2bc3684a5e 100644
--- a/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp
+++ b/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp
@@ -1,7 +1,5 @@
/* see copyright notice in squirrel.h */
#include
-#include
-#include
#include
#include "sqstdstring.h"
@@ -12,14 +10,13 @@
#endif
#ifdef _DEBUG
-#include
static const SQChar *g_nnames[] =
{
- _SC("NONE"),_SC("OP_GREEDY"), _SC("OP_OR"),
- _SC("OP_EXPR"),_SC("OP_NOCAPEXPR"),_SC("OP_DOT"), _SC("OP_CLASS"),
- _SC("OP_CCLASS"),_SC("OP_NCLASS"),_SC("OP_RANGE"),_SC("OP_CHAR"),
- _SC("OP_EOL"),_SC("OP_BOL"),_SC("OP_WB")
+ "NONE","OP_GREEDY", "OP_OR",
+ "OP_EXPR","OP_NOCAPEXPR","OP_DOT", "OP_CLASS",
+ "OP_CCLASS","OP_NCLASS","OP_RANGE","OP_CHAR",
+ "OP_EOL","OP_BOL","OP_WB"
};
#endif
@@ -99,7 +96,7 @@ static void sqstd_rex_error(SQRex *exp,const SQChar *error)
static void sqstd_rex_expect(SQRex *exp, SQChar n){
if((*exp->_p) != n)
- sqstd_rex_error(exp, _SC("expected paren"));
+ sqstd_rex_error(exp, "expected paren");
exp->_p++;
}
@@ -115,7 +112,7 @@ static SQChar sqstd_rex_escapechar(SQRex *exp)
case 'f': exp->_p++; return '\f';
default: return (*exp->_p++);
}
- } else if(!scisprint(*exp->_p)) sqstd_rex_error(exp,_SC("letter expected"));
+ } else if(!scisprint(*exp->_p)) sqstd_rex_error(exp,"letter expected");
return (*exp->_p++);
}
@@ -159,7 +156,7 @@ static SQInteger sqstd_rex_charnode(SQRex *exp,SQBool isclass)
}
else if(!scisprint(*exp->_p)) {
- sqstd_rex_error(exp,_SC("letter expected"));
+ sqstd_rex_error(exp,"letter expected");
}
t = *exp->_p; exp->_p++;
return sqstd_rex_newnode(exp,t);
@@ -173,15 +170,15 @@ static SQInteger sqstd_rex_class(SQRex *exp)
exp->_p++;
}else ret = sqstd_rex_newnode(exp,OP_CLASS);
- if(*exp->_p == ']') sqstd_rex_error(exp,_SC("empty class"));
+ if(*exp->_p == ']') sqstd_rex_error(exp,"empty class");
chain = ret;
while(*exp->_p != ']' && exp->_p != exp->_eol) {
if(*exp->_p == '-' && first != -1){
SQInteger r;
- if(*exp->_p++ == ']') sqstd_rex_error(exp,_SC("unfinished range"));
+ if(*exp->_p++ == ']') sqstd_rex_error(exp,"unfinished range");
r = sqstd_rex_newnode(exp,OP_RANGE);
- if(exp->_nodes[first].type>*exp->_p) sqstd_rex_error(exp,_SC("invalid range"));
- if(exp->_nodes[first].type == OP_CCLASS) sqstd_rex_error(exp,_SC("cannot use character classes in ranges"));
+ if(exp->_nodes[first].type>*exp->_p) sqstd_rex_error(exp,"invalid range");
+ if(exp->_nodes[first].type == OP_CCLASS) sqstd_rex_error(exp,"cannot use character classes in ranges");
exp->_nodes[r].left = exp->_nodes[first].type;
SQInteger t = sqstd_rex_escapechar(exp);
exp->_nodes[r].right = t;
@@ -220,7 +217,7 @@ static SQInteger sqstd_rex_parsenumber(SQRex *exp)
exp->_p++;
while(isdigit(*exp->_p)) {
ret = ret*10+(*exp->_p++-'0');
- if(positions==1000000000) sqstd_rex_error(exp,_SC("overflow in numeric constant"));
+ if(positions==1000000000) sqstd_rex_error(exp,"overflow in numeric constant");
positions *= 10;
};
return ret;
@@ -238,7 +235,7 @@ static SQInteger sqstd_rex_element(SQRex *exp)
if(*exp->_p =='?') {
exp->_p++;
- sqstd_rex_expect(exp,_SC(':'));
+ sqstd_rex_expect(exp,':');
expr = sqstd_rex_newnode(exp,OP_NOCAPEXPR);
}
else
@@ -246,13 +243,13 @@ static SQInteger sqstd_rex_element(SQRex *exp)
SQInteger newn = sqstd_rex_list(exp);
exp->_nodes[expr].left = newn;
ret = expr;
- sqstd_rex_expect(exp,_SC(')'));
+ sqstd_rex_expect(exp,')');
}
break;
case '[':
exp->_p++;
ret = sqstd_rex_class(exp);
- sqstd_rex_expect(exp,_SC(']'));
+ sqstd_rex_expect(exp,']');
break;
case SQREX_SYMBOL_END_OF_STRING: exp->_p++; ret = sqstd_rex_newnode(exp,OP_EOL);break;
case SQREX_SYMBOL_ANY_CHAR: exp->_p++; ret = sqstd_rex_newnode(exp,OP_DOT);break;
@@ -271,7 +268,7 @@ static SQInteger sqstd_rex_element(SQRex *exp)
case SQREX_SYMBOL_GREEDY_ZERO_OR_ONE: p0 = 0; p1 = 1; exp->_p++; isgreedy = SQTrue; break;
case '{':
exp->_p++;
- if(!isdigit(*exp->_p)) sqstd_rex_error(exp,_SC("number expected"));
+ if(!isdigit(*exp->_p)) sqstd_rex_error(exp,"number expected");
p0 = (unsigned short)sqstd_rex_parsenumber(exp);
/*******************************/
switch(*exp->_p) {
@@ -284,10 +281,10 @@ static SQInteger sqstd_rex_element(SQRex *exp)
if(isdigit(*exp->_p)){
p1 = (unsigned short)sqstd_rex_parsenumber(exp);
}
- sqstd_rex_expect(exp,_SC('}'));
+ sqstd_rex_expect(exp,'}');
break;
default:
- sqstd_rex_error(exp,_SC(", or } expected"));
+ sqstd_rex_error(exp,", or } expected");
}
/*******************************/
isgreedy = SQTrue;
@@ -526,7 +523,7 @@ SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error)
SQRex *exp = (SQRex *)sq_malloc(sizeof(SQRex));
exp->_eol = exp->_bol = NULL;
exp->_p = pattern;
- exp->_nallocated = (SQInteger)scstrlen(pattern) * sizeof(SQChar);
+ exp->_nallocated = (SQInteger)strlen(pattern) * sizeof(SQChar);
exp->_nodes = (SQRexNode *)sq_malloc(exp->_nallocated * sizeof(SQRexNode));
exp->_nsize = 0;
exp->_matches = 0;
@@ -537,23 +534,23 @@ SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error)
SQInteger res = sqstd_rex_list(exp);
exp->_nodes[exp->_first].left = res;
if(*exp->_p!='\0')
- sqstd_rex_error(exp,_SC("unexpected character"));
+ sqstd_rex_error(exp,"unexpected character");
#ifdef _DEBUG
{
SQInteger nsize,i;
SQRexNode *t;
nsize = exp->_nsize;
t = &exp->_nodes[0];
- scprintf(_SC("\n"));
+ printf("\n");
/* XXX -- The (int) casts are needed to silent warnings on 64bit systems (SQInteger is 64bit, %d assumes 32bit, (int) is 32bit) */
for(i = 0;i < nsize; i++) {
if(exp->_nodes[i].type>MAX_CHAR)
- scprintf(_SC("[%02d] %10s "),(int)i,g_nnames[exp->_nodes[i].type-MAX_CHAR]);
+ printf("[%02d] %10s ",(int)i,g_nnames[exp->_nodes[i].type-MAX_CHAR]);
else
- scprintf(_SC("[%02d] %10c "),(int)i,exp->_nodes[i].type);
- scprintf(_SC("left %02d right %02d next %02d\n"),(int)exp->_nodes[i].left,(int)exp->_nodes[i].right,(int)exp->_nodes[i].next);
+ printf("[%02d] %10c ",(int)i,exp->_nodes[i].type);
+ printf("left %02d right %02d next %02d\n",(int)exp->_nodes[i].left,(int)exp->_nodes[i].right,(int)exp->_nodes[i].next);
}
- scprintf(_SC("\n"));
+ printf("\n");
}
#endif
exp->_matches = (SQRexMatch *) sq_malloc(exp->_nsubexpr * sizeof(SQRexMatch));
@@ -579,7 +576,7 @@ SQBool sqstd_rex_match(SQRex* exp,const SQChar* text)
{
const SQChar* res = NULL;
exp->_bol = text;
- exp->_eol = text + scstrlen(text);
+ exp->_eol = text + strlen(text);
exp->_currsubexp = 0;
res = sqstd_rex_matchnode(exp,exp->_nodes,text,NULL);
if(res == NULL || res != exp->_eol)
@@ -618,7 +615,7 @@ SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* t
SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end)
{
- return sqstd_rex_searchrange(exp,text,text + scstrlen(text),out_begin,out_end);
+ return sqstd_rex_searchrange(exp,text,text + strlen(text),out_begin,out_end);
}
SQInteger sqstd_rex_getsubexpcount(SQRex* exp)
diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp
index 681029aa70..8639b6456a 100644
--- a/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp
+++ b/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp
@@ -1,22 +1,11 @@
/* see copyright notice in squirrel.h */
#include
#include
-#include
-#include
-#include
-#include
-#include
#include
-#ifdef SQUNICODE
-#define scstrchr wcschr
-#define scatoi _wtoi
-#define scstrtok wcstok
-#else
#define scstrchr strchr
#define scatoi atoi
#define scstrtok strtok
-#endif
#define MAX_FORMAT_LEN 20
#define MAX_WFORMAT_LEN 3
#define ADDITIONAL_FORMAT_SPACE (100*sizeof(SQChar))
@@ -27,17 +16,17 @@ static SQInteger validate_format(HSQUIRRELVM v, SQChar *fmt, const SQChar *src,
SQInteger wc = 0;
SQInteger start = n;
fmt[0] = '%';
- while (scstrchr(_SC("-+ #0"), src[n])) n++;
- while (scisdigit(src[n])) {
+ while (scstrchr("-+ #0", src[n])) n++;
+ while (isdigit(src[n])) {
swidth[wc] = src[n];
n++;
wc++;
if(wc>=MAX_WFORMAT_LEN)
- return sq_throwerror(v,_SC("width format too long"));
+ return sq_throwerror(v,"width format too long");
}
swidth[wc] = '\0';
if(wc > 0) {
- width = scatoi(swidth);
+ width = atoi(swidth);
}
else
width = 0;
@@ -45,20 +34,20 @@ static SQInteger validate_format(HSQUIRRELVM v, SQChar *fmt, const SQChar *src,
n++;
wc = 0;
- while (scisdigit(src[n])) {
+ while (isdigit(src[n])) {
swidth[wc] = src[n];
n++;
wc++;
if(wc>=MAX_WFORMAT_LEN)
- return sq_throwerror(v,_SC("precision format too long"));
+ return sq_throwerror(v,"precision format too long");
}
swidth[wc] = '\0';
if(wc > 0) {
- width += scatoi(swidth);
+ width += atoi(swidth);
}
}
if (n-start > MAX_FORMAT_LEN )
- return sq_throwerror(v,_SC("format too long"));
+ return sq_throwerror(v,"format too long");
memcpy(&fmt[1],&src[start],((n-start)+1)*sizeof(SQChar));
fmt[(n-start)+2] = '\0';
return n;
@@ -75,7 +64,7 @@ static void _append_string(SQInteger &i, SQChar *dest, SQInteger allocated, cons
{
va_list va;
va_start(va, fmt);
- i += scvsnprintf(&dest[i],allocated-i,fmt,va);
+ i += vsnprintf(&dest[i],allocated-i,fmt,va);
va_end(va);
}
@@ -102,7 +91,7 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
else {
n++;
if( nparam > sq_gettop(v) )
- return sq_throwerror(v,_SC("not enough paramters for the given format string"));
+ return sq_throwerror(v,"not enough paramters for the given format string");
n = validate_format(v,fmt,format,n,w);
if(n < 0) return -1;
SQInteger addlen = 0;
@@ -113,24 +102,24 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
switch(format[n]) {
case 's':
if(SQ_FAILED(sq_getstring(v,nparam,&ts)))
- return sq_throwerror(v,_SC("string expected for the specified format"));
+ return sq_throwerror(v,"string expected for the specified format");
addlen = (sq_getsize(v,nparam)*sizeof(SQChar))+((w+1)*sizeof(SQChar));
valtype = 's';
break;
case 'i': case 'd': case 'c':case 'o': case 'u': case 'x': case 'X':
if(SQ_FAILED(sq_getinteger(v,nparam,&ti)))
- return sq_throwerror(v,_SC("integer expected for the specified format"));
+ return sq_throwerror(v,"integer expected for the specified format");
addlen = (ADDITIONAL_FORMAT_SPACE)+((w+1)*sizeof(SQChar));
valtype = 'i';
break;
case 'f': case 'g': case 'G': case 'e': case 'E':
if(SQ_FAILED(sq_getfloat(v,nparam,&tf)))
- return sq_throwerror(v,_SC("float expected for the specified format"));
+ return sq_throwerror(v,"float expected for the specified format");
addlen = (ADDITIONAL_FORMAT_SPACE)+((w+1)*sizeof(SQChar));
valtype = 'f';
break;
default:
- return sq_throwerror(v,_SC("invalid format"));
+ return sq_throwerror(v,"invalid format");
}
n++;
allocated += addlen + sizeof(SQChar);
@@ -162,7 +151,7 @@ static SQInteger _string_format(HSQUIRRELVM v)
static void __strip_l(const SQChar *str,const SQChar **start)
{
const SQChar *t = str;
- while(((*t) != '\0') && scisspace(*t)){ t++; }
+ while(((*t) != '\0') && isspace(*t)){ t++; }
*start = t;
}
@@ -173,7 +162,7 @@ static void __strip_r(const SQChar *str,SQInteger len,const SQChar **end)
return;
}
const SQChar *t = &str[len-1];
- while(t != str && scisspace(*t)) { t--; }
+ while(t != str && isspace(*t)) { t--; }
*end = t+1;
}
@@ -213,7 +202,7 @@ static SQInteger _string_split(HSQUIRRELVM v)
SQChar *stemp,*tok;
sq_getstring(v,2,&str);
sq_getstring(v,3,&seps);
- if(sq_getsize(v,3) == 0) return sq_throwerror(v,_SC("empty separators string"));
+ if(sq_getsize(v,3) == 0) return sq_throwerror(v,"empty separators string");
SQInteger memsize = (sq_getsize(v,2)+1)*sizeof(SQChar);
stemp = sq_getscratchpad(v,memsize);
memcpy(stemp,str,memsize);
@@ -255,10 +244,10 @@ static SQInteger _regexp_match(HSQUIRRELVM v)
static void _addrexmatch(HSQUIRRELVM v,const SQChar *str,const SQChar *begin,const SQChar *end)
{
sq_newtable(v);
- sq_pushstring(v,_SC("begin"),-1);
+ sq_pushstring(v,"begin",-1);
sq_pushinteger(v,begin - str);
sq_rawset(v,-3);
- sq_pushstring(v,_SC("end"),-1);
+ sq_pushstring(v,"end",-1);
sq_pushinteger(v,end - str);
sq_rawset(v,-3);
}
@@ -321,35 +310,35 @@ static SQInteger _regexp_constructor(HSQUIRRELVM v)
static SQInteger _regexp__typeof(HSQUIRRELVM v)
{
- sq_pushstring(v,_SC("regexp"),-1);
+ sq_pushstring(v,"regexp",-1);
return 1;
}
-#define _DECL_REX_FUNC(name,nparams,pmask) {_SC(#name),_regexp_##name,nparams,pmask}
+#define _DECL_REX_FUNC(name,nparams,pmask) {#name,_regexp_##name,nparams,pmask}
static SQRegFunction rexobj_funcs[]={
- _DECL_REX_FUNC(constructor,2,_SC(".s")),
- _DECL_REX_FUNC(search,-2,_SC("xsn")),
- _DECL_REX_FUNC(match,2,_SC("xs")),
- _DECL_REX_FUNC(capture,-2,_SC("xsn")),
- _DECL_REX_FUNC(subexpcount,1,_SC("x")),
- _DECL_REX_FUNC(_typeof,1,_SC("x")),
+ _DECL_REX_FUNC(constructor,2,".s"),
+ _DECL_REX_FUNC(search,-2,"xsn"),
+ _DECL_REX_FUNC(match,2,"xs"),
+ _DECL_REX_FUNC(capture,-2,"xsn"),
+ _DECL_REX_FUNC(subexpcount,1,"x"),
+ _DECL_REX_FUNC(_typeof,1,"x"),
{0,0,0,0}
};
-#define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_string_##name,nparams,pmask}
+#define _DECL_FUNC(name,nparams,pmask) {#name,_string_##name,nparams,pmask}
static SQRegFunction stringlib_funcs[]={
- _DECL_FUNC(format,-2,_SC(".s")),
- _DECL_FUNC(strip,2,_SC(".s")),
- _DECL_FUNC(lstrip,2,_SC(".s")),
- _DECL_FUNC(rstrip,2,_SC(".s")),
- _DECL_FUNC(split,3,_SC(".ss")),
+ _DECL_FUNC(format,-2,".s"),
+ _DECL_FUNC(strip,2,".s"),
+ _DECL_FUNC(lstrip,2,".s"),
+ _DECL_FUNC(rstrip,2,".s"),
+ _DECL_FUNC(split,3,".ss"),
{0,0,0,0}
};
SQInteger sqstd_register_stringlib(HSQUIRRELVM v)
{
- sq_pushstring(v,_SC("regexp"),-1);
+ sq_pushstring(v,"regexp",-1);
sq_newclass(v,SQFalse);
SQInteger i = 0;
while(rexobj_funcs[i].name != 0) {
diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp
index 3447e57626..8374f7f315 100644
--- a/src/3rdparty/squirrel/squirrel/sqapi.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp
@@ -1,6 +1,9 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include
#include "sqpcheader.h"
#include "sqvm.h"
@@ -14,12 +17,16 @@
#include "sqfuncstate.h"
#include "sqclass.h"
+#include "../../../string_func.h"
+
+#include "../../../safeguards.h"
+
bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o)
{
*o = &stack_get(v,idx);
if(type(**o) != type){
SQObjectPtr oval = v->PrintObjVal(**o);
- v->Raise_Error(_SC("wrong argument type, expected '%s' got '%.50s'"),IdType2Name(type),_stringval(oval));
+ v->Raise_Error("wrong argument type, expected '%s' got '%.50s'",IdType2Name(type),_stringval(oval));
return false;
}
return true;
@@ -29,7 +36,7 @@ bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPt
#define sq_aux_paramscheck(v,count) \
{ \
- if(sq_gettop(v) < count){ v->Raise_Error(_SC("not enough params in the stack")); return SQ_ERROR; }\
+ if(sq_gettop(v) < count){ v->Raise_Error("not enough params in the stack"); return SQ_ERROR; }\
}
SQInteger sq_aux_throwobject(HSQUIRRELVM v,SQObjectPtr &e)
@@ -40,8 +47,9 @@ SQInteger sq_aux_throwobject(HSQUIRRELVM v,SQObjectPtr &e)
SQInteger sq_aux_invalidtype(HSQUIRRELVM v,SQObjectType type)
{
- scsprintf(_ss(v)->GetScratchPad(100), _SC("unexpected type %s"), IdType2Name(type));
- return sq_throwerror(v, _ss(v)->GetScratchPad(-1));
+ char buf[100];
+ seprintf(buf, lastof(buf), "unexpected type %s", IdType2Name(type));
+ return sq_throwerror(v, buf);
}
HSQUIRRELVM sq_open(SQInteger initialstacksize)
@@ -49,7 +57,6 @@ HSQUIRRELVM sq_open(SQInteger initialstacksize)
SQSharedState *ss;
SQVM *v;
sq_new(ss, SQSharedState);
- ss->Init();
v = (SQVM *)SQ_MALLOC(sizeof(SQVM));
new (v) SQVM(ss);
ss->_root_vm = v;
@@ -253,7 +260,7 @@ SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase)
if(hasbase) {
SQObjectPtr &base = stack_get(v,-1);
if(type(base) != OT_CLASS)
- return sq_throwerror(v,_SC("invalid base type"));
+ return sq_throwerror(v,"invalid base type");
baseclass = _class(base);
}
SQClass *newclass = SQClass::Create(_ss(v), baseclass);
@@ -267,7 +274,7 @@ SQBool sq_instanceof(HSQUIRRELVM v)
SQObjectPtr &inst = stack_get(v,-1);
SQObjectPtr &cl = stack_get(v,-2);
if(type(inst) != OT_INSTANCE || type(cl) != OT_CLASS)
- return sq_throwerror(v,_SC("invalid param type"));
+ return sq_throwerror(v,"invalid param type");
return _instance(inst)->InstanceOf(_class(cl))?SQTrue:SQFalse;
}
@@ -291,7 +298,7 @@ SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval)
_array(*arr)->Pop();
return SQ_OK;
}
- return sq_throwerror(v, _SC("empty array"));
+ return sq_throwerror(v, "empty array");
}
SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize)
@@ -303,7 +310,7 @@ SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize)
_array(*arr)->Resize(newsize);
return SQ_OK;
}
- return sq_throwerror(v,_SC("negative size"));
+ return sq_throwerror(v,"negative size");
}
@@ -332,7 +339,7 @@ SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx)
sq_aux_paramscheck(v, 1);
SQObjectPtr *arr;
_GETSAFE_OBJ(v, idx, OT_ARRAY,arr);
- return _array(*arr)->Remove(itemidx) ? SQ_OK : sq_throwerror(v,_SC("index out of range"));
+ return _array(*arr)->Remove(itemidx) ? SQ_OK : sq_throwerror(v,"index out of range");
}
SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
@@ -340,7 +347,7 @@ SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
sq_aux_paramscheck(v, 1);
SQObjectPtr *arr;
_GETSAFE_OBJ(v, idx, OT_ARRAY,arr);
- SQRESULT ret = _array(*arr)->Insert(destpos, v->GetUp(-1)) ? SQ_OK : sq_throwerror(v,_SC("index out of range"));
+ SQRESULT ret = _array(*arr)->Insert(destpos, v->GetUp(-1)) ? SQ_OK : sq_throwerror(v,"index out of range");
v->Pop();
return ret;
}
@@ -349,7 +356,6 @@ SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars)
{
SQNativeClosure *nc = SQNativeClosure::Create(_ss(v), func);
- nc->_nparamscheck = 0;
for(SQUnsignedInteger i = 0; i < nfreevars; i++) {
nc->_outervalues.push_back(v->Top());
v->Pop();
@@ -367,7 +373,7 @@ SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparam
*nfreevars = (SQUnsignedInteger)c->_outervalues.size();
return SQ_OK;
}
- return sq_throwerror(v,_SC("the object is not a closure"));
+ return sq_throwerror(v,"the object is not a closure");
}
SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name)
@@ -378,20 +384,20 @@ SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name)
nc->_name = SQString::Create(_ss(v),name);
return SQ_OK;
}
- return sq_throwerror(v,_SC("the object is not a nativeclosure"));
+ return sq_throwerror(v,"the object is not a nativeclosure");
}
SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask)
{
SQObject o = stack_get(v, -1);
if(!sq_isnativeclosure(o))
- return sq_throwerror(v, _SC("native closure expected"));
+ return sq_throwerror(v, "native closure expected");
SQNativeClosure *nc = _nativeclosure(o);
nc->_nparamscheck = nparamscheck;
if(typemask) {
SQIntVec res;
if(!CompileTypemask(res, typemask))
- return sq_throwerror(v, _SC("invalid typemask"));
+ return sq_throwerror(v, "invalid typemask");
nc->_typecheck.copy(res);
}
else {
@@ -408,12 +414,12 @@ SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx)
SQObjectPtr &o = stack_get(v,idx);
if(!sq_isnativeclosure(o) &&
!sq_isclosure(o))
- return sq_throwerror(v,_SC("the target is not a closure"));
+ return sq_throwerror(v,"the target is not a closure");
SQObjectPtr &env = stack_get(v,-1);
if(!sq_istable(env) &&
!sq_isclass(env) &&
!sq_isinstance(env))
- return sq_throwerror(v,_SC("invalid environment"));
+ return sq_throwerror(v,"invalid environment");
SQObjectPtr w = _refcounted(env)->GetWeakRef(type(env));
SQObjectPtr ret;
if(sq_isclosure(o)) {
@@ -438,7 +444,7 @@ SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx)
case OT_TABLE: _table(o)->Clear(); break;
case OT_ARRAY: _array(o)->Resize(0); break;
default:
- return sq_throwerror(v, _SC("clear only works on table and array"));
+ return sq_throwerror(v, "clear only works on table and array");
break;
}
@@ -468,7 +474,7 @@ SQRESULT sq_setroottable(HSQUIRRELVM v)
v->Pop();
return SQ_OK;
}
- return sq_throwerror(v, _SC("ivalid type"));
+ return sq_throwerror(v, "ivalid type");
}
SQRESULT sq_setconsttable(HSQUIRRELVM v)
@@ -479,7 +485,7 @@ SQRESULT sq_setconsttable(HSQUIRRELVM v)
v->Pop();
return SQ_OK;
}
- return sq_throwerror(v, _SC("ivalid type, expected table"));
+ return sq_throwerror(v, "ivalid type, expected table");
}
void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p)
@@ -605,7 +611,7 @@ SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag)
switch(type(o)) {
case OT_USERDATA: _userdata(o)->_typetag = typetag; break;
case OT_CLASS: _class(o)->_typetag = typetag; break;
- default: return sq_throwerror(v,_SC("invalid object type"));
+ default: return sq_throwerror(v,"invalid object type");
}
return SQ_OK;
}
@@ -625,7 +631,7 @@ SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag)
{
SQObjectPtr &o = stack_get(v,idx);
if(SQ_FAILED(sq_getobjtypetag(&o,typetag)))
- return sq_throwerror(v,_SC("invalid object type"));
+ return sq_throwerror(v,"invalid object type");
return SQ_OK;
}
@@ -640,7 +646,7 @@ SQRESULT sq_getuserpointer(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p)
SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p)
{
SQObjectPtr &o = stack_get(v,idx);
- if(type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance"));
+ if(type(o) != OT_INSTANCE) return sq_throwerror(v,"the object is not a class instance");
_instance(o)->_userpointer = p;
return SQ_OK;
}
@@ -648,8 +654,8 @@ SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p)
SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize)
{
SQObjectPtr &o = stack_get(v,idx);
- if(type(o) != OT_CLASS) return sq_throwerror(v,_SC("the object is not a class"));
- if(_class(o)->_locked) return sq_throwerror(v,_SC("the class is locked"));
+ if(type(o) != OT_CLASS) return sq_throwerror(v,"the object is not a class");
+ if(_class(o)->_locked) return sq_throwerror(v,"the class is locked");
_class(o)->_udsize = udsize;
return SQ_OK;
}
@@ -658,7 +664,7 @@ SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize)
SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag)
{
SQObjectPtr &o = stack_get(v,idx);
- if(type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance"));
+ if(type(o) != OT_INSTANCE) return sq_throwerror(v,"the object is not a class instance");
(*p) = _instance(o)->_userpointer;
if(typetag != 0) {
SQClass *cl = _instance(o)->_class;
@@ -667,7 +673,7 @@ SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserP
return SQ_OK;
cl = cl->_base;
}while(cl != NULL);
- return sq_throwerror(v,_SC("invalid type tag"));
+ return sq_throwerror(v,"invalid type tag");
}
return SQ_OK;
}
@@ -717,7 +723,7 @@ SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic)
SQObjectPtr &self = stack_get(v, idx);
if(type(self) == OT_TABLE || type(self) == OT_CLASS) {
SQObjectPtr &key = v->GetUp(-2);
- if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key"));
+ if(type(key) == OT_NULL) return sq_throwerror(v, "null is not a valid key");
v->NewSlot(self, key, v->GetUp(-1),bstatic?true:false);
v->Pop(2);
}
@@ -730,7 +736,7 @@ SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval)
SQObjectPtr *self;
_GETSAFE_OBJ(v, idx, OT_TABLE,self);
SQObjectPtr &key = v->GetUp(-1);
- if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key"));
+ if(type(key) == OT_NULL) return sq_throwerror(v, "null is not a valid key");
SQObjectPtr res;
if(!v->DeleteSlot(*self, key, res)){
return SQ_ERROR;
@@ -753,7 +759,7 @@ SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr &self = stack_get(v, idx);
- if(type(v->GetUp(-2)) == OT_NULL) return sq_throwerror(v, _SC("null key"));
+ if(type(v->GetUp(-2)) == OT_NULL) return sq_throwerror(v, "null key");
switch(type(self)) {
case OT_TABLE:
_table(self)->NewSlot(v->GetUp(-2), v->GetUp(-1));
@@ -779,7 +785,7 @@ SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx)
break;
default:
v->Pop(2);
- return sq_throwerror(v, _SC("rawset works only on array/table/class and instance"));
+ return sq_throwerror(v, "rawset works only on array/table/class and instance");
}
v->Raise_IdxError(v->GetUp(-2));return SQ_ERROR;
}
@@ -792,7 +798,7 @@ SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx)
switch(type) {
case OT_TABLE:
if(type(mt) == OT_TABLE) {
- if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, _SC("delagate cycle")); v->Pop();}
+ if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle"); v->Pop();}
else if(type(mt)==OT_NULL) {
_table(self)->SetDelegate(NULL); v->Pop(); }
else return sq_aux_invalidtype(v,type);
@@ -841,7 +847,7 @@ SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx)
}
v->Push(SQObjectPtr(_delegable(self)->_delegate));
break;
- default: return sq_throwerror(v,_SC("wrong type")); break;
+ default: return sq_throwerror(v,"wrong type"); break;
}
return SQ_OK;
@@ -853,7 +859,7 @@ SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx)
if(v->Get(self,v->GetUp(-1),v->GetUp(-1),false,false))
return SQ_OK;
v->Pop(1);
- return sq_throwerror(v,_SC("the index doesn't exist"));
+ return sq_throwerror(v,"the index doesn't exist");
}
SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx)
@@ -878,10 +884,10 @@ SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx)
break;
default:
v->Pop(1);
- return sq_throwerror(v,_SC("rawget works only on array/table/instance and class"));
+ return sq_throwerror(v,"rawget works only on array/table/instance and class");
}
v->Pop(1);
- return sq_throwerror(v,_SC("the index doesn't exist"));
+ return sq_throwerror(v,"the index doesn't exist");
}
SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po)
@@ -959,7 +965,7 @@ SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror)
v->Pop();
return SQ_OK;
}
- return sq_throwerror(v,_SC("only generators can be resumed"));
+ return sq_throwerror(v,"only generators can be resumed");
}
SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror, int suspend)
@@ -981,9 +987,6 @@ SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror,
v->Pop(params);
return SQ_ERROR;
}
- if(!v->_suspended)
- v->Pop(params);
- return sq_throwerror(v,_SC("call failed"));
}
SQRESULT sq_suspendvm(HSQUIRRELVM v)
@@ -995,7 +998,7 @@ SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool wakeupret,SQBool retval,SQBool raiseer
{
SQObjectPtr ret;
if(!v->_suspended)
- return sq_throwerror(v,_SC("cannot resume a vm that is not running any code"));
+ return sq_throwerror(v,"cannot resume a vm that is not running any code");
if(wakeupret) {
v->GetAt(v->_stackbase+v->_suspended_target)=v->GetUp(-1); //retval
v->Pop();
@@ -1051,7 +1054,7 @@ SQRESULT sq_writeclosure(HSQUIRRELVM v,SQWRITEFUNC w,SQUserPointer up)
_GETSAFE_OBJ(v, -1, OT_CLOSURE,o);
unsigned short tag = SQ_BYTECODE_STREAM_TAG;
if(w(up,&tag,2) != 2)
- return sq_throwerror(v,_SC("io error"));
+ return sq_throwerror(v,"io error");
if(!_closure(*o)->Save(v,up,w))
return SQ_ERROR;
return SQ_OK;
@@ -1063,9 +1066,9 @@ SQRESULT sq_readclosure(HSQUIRRELVM v,SQREADFUNC r,SQUserPointer up)
unsigned short tag;
if(r(up,&tag,2) != 2)
- return sq_throwerror(v,_SC("io error"));
+ return sq_throwerror(v,"io error");
if(tag != SQ_BYTECODE_STREAM_TAG)
- return sq_throwerror(v,_SC("invalid stream"));
+ return sq_throwerror(v,"invalid stream");
if(!SQClosure::Load(v,up,r,closure))
return SQ_ERROR;
v->Push(closure);
@@ -1110,13 +1113,13 @@ SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval)
if(_closure(self)->_outervalues.size()>nval){
_closure(self)->_outervalues[nval]=stack_get(v,-1);
}
- else return sq_throwerror(v,_SC("invalid free var index"));
+ else return sq_throwerror(v,"invalid free var index");
break;
case OT_NATIVECLOSURE:
if(_nativeclosure(self)->_outervalues.size()>nval){
_nativeclosure(self)->_outervalues[nval]=stack_get(v,-1);
}
- else return sq_throwerror(v,_SC("invalid free var index"));
+ else return sq_throwerror(v,"invalid free var index");
break;
default:
return sq_aux_invalidtype(v,type(self));
@@ -1144,7 +1147,7 @@ SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx)
v->Push(attrs);
return SQ_OK;
}
- return sq_throwerror(v,_SC("wrong index"));
+ return sq_throwerror(v,"wrong index");
}
SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx)
@@ -1164,7 +1167,7 @@ SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx)
v->Push(attrs);
return SQ_OK;
}
- return sq_throwerror(v,_SC("wrong index"));
+ return sq_throwerror(v,"wrong index");
}
SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx)
@@ -1208,7 +1211,7 @@ SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr &o = stack_get(v,idx);
if(type(o) != OT_WEAKREF) {
- return sq_throwerror(v,_SC("the object must be a weakref"));
+ return sq_throwerror(v,"the object must be a weakref");
}
v->Push(_weakref(o)->_obj);
return SQ_OK;
@@ -1228,7 +1231,7 @@ SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t)
case OT_CLASS: v->Push(ss->_class_default_delegate); break;
case OT_INSTANCE: v->Push(ss->_instance_default_delegate); break;
case OT_WEAKREF: v->Push(ss->_weakref_default_delegate); break;
- default: return sq_throwerror(v,_SC("the type doesn't have a default delegate"));
+ default: return sq_throwerror(v,"the type doesn't have a default delegate");
}
return SQ_OK;
}
@@ -1237,7 +1240,7 @@ SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr o=stack_get(v,idx),&refpos = stack_get(v,-1),realkey,val;
if(type(o) == OT_GENERATOR) {
- return sq_throwerror(v,_SC("cannot iterate a generator"));
+ return sq_throwerror(v,"cannot iterate a generator");
}
int faketojump;
if(!v->FOREACH_OP(o,realkey,val,refpos,0,666,faketojump))
@@ -1256,7 +1259,7 @@ struct BufState{
SQInteger size;
};
-SQInteger buf_lexfeed(SQUserPointer file)
+WChar buf_lexfeed(SQUserPointer file)
{
BufState *buf=(BufState*)file;
if(buf->size<(buf->ptr+1))
diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp
index 66a81edb4b..86a1b11858 100644
--- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp
@@ -1,8 +1,13 @@
/*
- see copyright notice in squirrel.h
-*/
-/* Needs to be first due to a squirrel header defining type() and type()
- * being used in some versions of the headers included by algorithm. */
+ * see copyright notice in squirrel.h
+ */
+/*
+ * Needs to be first due to a squirrel header defining type() and type()
+ * being used in some versions of the headers included by algorithm.
+ */
+
+#include "../../../stdafx.h"
+
#include
#include "sqpcheader.h"
#include "sqvm.h"
@@ -12,21 +17,22 @@
#include "sqfuncproto.h"
#include "sqclosure.h"
#include "sqclass.h"
-#include
#include
#include
+#include "../../../safeguards.h"
+
bool str2num(const SQChar *s,SQObjectPtr &res)
{
SQChar *end;
- if(scstrstr(s,_SC("."))){
- SQFloat r = SQFloat(scstrtod(s,&end));
+ if(strstr(s,".")){
+ SQFloat r = SQFloat(strtod(s,&end));
if(s == end) return false;
res = r;
return true;
}
else{
- SQInteger r = SQInteger(scstrtol(s,&end,10));
+ SQInteger r = SQInteger(strtol(s,&end,10));
if(s == end) return false;
res = r;
return true;
@@ -104,21 +110,21 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v)
sq_getinteger(v, -1, &level);
if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si)))
{
- const SQChar *fn = _SC("unknown");
- const SQChar *src = _SC("unknown");
+ const SQChar *fn = "unknown";
+ const SQChar *src = "unknown";
if(si.funcname)fn = si.funcname;
if(si.source)src = si.source;
sq_newtable(v);
- sq_pushstring(v, _SC("func"), -1);
+ sq_pushstring(v, "func", -1);
sq_pushstring(v, fn, -1);
sq_createslot(v, -3);
- sq_pushstring(v, _SC("src"), -1);
+ sq_pushstring(v, "src", -1);
sq_pushstring(v, src, -1);
sq_createslot(v, -3);
- sq_pushstring(v, _SC("line"), -1);
+ sq_pushstring(v, "line", -1);
sq_pushinteger(v, si.line);
sq_createslot(v, -3);
- sq_pushstring(v, _SC("locals"), -1);
+ sq_pushstring(v, "locals", -1);
sq_newtable(v);
seq=0;
while ((name = sq_getlocal(v, level, seq))) {
@@ -139,7 +145,7 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v)
static SQInteger base_assert(HSQUIRRELVM v)
{
if(v->IsFalse(stack_get(v,2))){
- return sq_throwerror(v,_SC("assertion failed"));
+ return sq_throwerror(v,"assertion failed");
}
return 0;
}
@@ -171,7 +177,7 @@ static SQInteger base_print(HSQUIRRELVM v)
const SQChar *str;
sq_tostring(v,2);
sq_getstring(v,-1,&str);
- if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,_SC("%s"),str);
+ if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,"%s",str);
return 0;
}
@@ -179,7 +185,7 @@ static SQInteger base_print(HSQUIRRELVM v)
static SQInteger base_compilestring(HSQUIRRELVM v)
{
SQInteger nargs=sq_gettop(v);
- const SQChar *src=NULL,*name=_SC("unnamedbuffer");
+ const SQChar *src=NULL,*name="unnamedbuffer";
SQInteger size;
sq_getstring(v,2,&src);
size=sq_getsize(v,2);
@@ -213,7 +219,7 @@ static SQInteger base_array(HSQUIRRELVM v)
SQInteger nInitialSize = tointeger(stack_get(v,2));
SQInteger ret = 1;
if (nInitialSize < 0) {
- v->Raise_Error(_SC("can't create/resize array with/to size %d"), nInitialSize);
+ v->Raise_Error("can't create/resize array with/to size %d", nInitialSize);
nInitialSize = 0;
ret = -1;
}
@@ -238,28 +244,28 @@ static SQInteger base_type(HSQUIRRELVM v)
static SQRegFunction base_funcs[]={
//generic
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
- {_SC("seterrorhandler"),base_seterrorhandler,2, NULL},
- {_SC("setdebughook"),base_setdebughook,2, NULL},
- {_SC("enabledebuginfo"),base_enabledebuginfo,2, NULL},
- {_SC("getstackinfos"),base_getstackinfos,2, _SC(".n")},
- {_SC("getroottable"),base_getroottable,1, NULL},
- {_SC("setroottable"),base_setroottable,2, NULL},
- {_SC("getconsttable"),base_getconsttable,1, NULL},
- {_SC("setconsttable"),base_setconsttable,2, NULL},
+ {"seterrorhandler",base_seterrorhandler,2, NULL},
+ {"setdebughook",base_setdebughook,2, NULL},
+ {"enabledebuginfo",base_enabledebuginfo,2, NULL},
+ {"getstackinfos",base_getstackinfos,2, ".n"},
+ {"getroottable",base_getroottable,1, NULL},
+ {"setroottable",base_setroottable,2, NULL},
+ {"getconsttable",base_getconsttable,1, NULL},
+ {"setconsttable",base_setconsttable,2, NULL},
#endif
- {_SC("assert"),base_assert,2, NULL},
- {_SC("print"),base_print,2, NULL},
+ {"assert",base_assert,2, NULL},
+ {"print",base_print,2, NULL},
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
- {_SC("compilestring"),base_compilestring,-2, _SC(".ss")},
- {_SC("newthread"),base_newthread,2, _SC(".c")},
- {_SC("suspend"),base_suspend,-1, NULL},
+ {"compilestring",base_compilestring,-2, ".ss"},
+ {"newthread",base_newthread,2, ".c"},
+ {"suspend",base_suspend,-1, NULL},
#endif
- {_SC("array"),base_array,-2, _SC(".n")},
- {_SC("type"),base_type,2, NULL},
+ {"array",base_array,-2, ".n"},
+ {"type",base_type,2, NULL},
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
- {_SC("dummy"),base_dummy,0,NULL},
+ {"dummy",base_dummy,0,NULL},
#ifndef NO_GARBAGE_COLLECTOR
- {_SC("collectgarbage"),base_collectgarbage,1, _SC("t")},
+ {"collectgarbage",base_collectgarbage,1, "t"},
#endif
#endif
{0,0,0,0}
@@ -277,16 +283,16 @@ void sq_base_register(HSQUIRRELVM v)
sq_createslot(v,-3);
i++;
}
- sq_pushstring(v,_SC("_version_"),-1);
+ sq_pushstring(v,"_version_",-1);
sq_pushstring(v,SQUIRREL_VERSION,-1);
sq_createslot(v,-3);
- sq_pushstring(v,_SC("_charsize_"),-1);
+ sq_pushstring(v,"_charsize_",-1);
sq_pushinteger(v,sizeof(SQChar));
sq_createslot(v,-3);
- sq_pushstring(v,_SC("_intsize_"),-1);
+ sq_pushstring(v,"_intsize_",-1);
sq_pushinteger(v,sizeof(SQInteger));
sq_createslot(v,-3);
- sq_pushstring(v,_SC("_floatsize_"),-1);
+ sq_pushstring(v,"_floatsize_",-1);
sq_pushinteger(v,sizeof(SQFloat));
sq_createslot(v,-3);
sq_pop(v,1);
@@ -308,7 +314,7 @@ static SQInteger default_delegate_tofloat(HSQUIRRELVM v)
v->Push(SQObjectPtr(tofloat(res)));
break;
}}
- return sq_throwerror(v, _SC("cannot convert the string"));
+ return sq_throwerror(v, "cannot convert the string");
break;
case OT_INTEGER:case OT_FLOAT:
v->Push(SQObjectPtr(tofloat(o)));
@@ -333,7 +339,7 @@ static SQInteger default_delegate_tointeger(HSQUIRRELVM v)
v->Push(SQObjectPtr(tointeger(res)));
break;
}}
- return sq_throwerror(v, _SC("cannot convert the string"));
+ return sq_throwerror(v, "cannot convert the string");
break;
case OT_INTEGER:case OT_FLOAT:
v->Push(SQObjectPtr(tointeger(o)));
@@ -409,14 +415,14 @@ static SQInteger table_rawget(HSQUIRRELVM v)
SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
- {_SC("len"),default_delegate_len,1, _SC("t")},
- {_SC("rawget"),table_rawget,2, _SC("t")},
- {_SC("rawset"),table_rawset,3, _SC("t")},
- {_SC("rawdelete"),table_rawdelete,2, _SC("t")},
- {_SC("rawin"),container_rawexists,2, _SC("t")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
- {_SC("clear"),obj_clear,1, _SC(".")},
+ {"len",default_delegate_len,1, "t"},
+ {"rawget",table_rawget,2, "t"},
+ {"rawset",table_rawset,3, "t"},
+ {"rawdelete",table_rawdelete,2, "t"},
+ {"rawin",container_rawexists,2, "t"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
+ {"clear",obj_clear,1, "."},
{0,0,0,0}
};
@@ -450,7 +456,7 @@ static SQInteger array_top(HSQUIRRELVM v)
v->Push(_array(o)->Top());
return 1;
}
- else return sq_throwerror(v,_SC("top() on a empty array"));
+ else return sq_throwerror(v,"top() on a empty array");
}
static SQInteger array_insert(HSQUIRRELVM v)
@@ -459,7 +465,7 @@ static SQInteger array_insert(HSQUIRRELVM v)
SQObject &idx=stack_get(v,2);
SQObject &val=stack_get(v,3);
if(!_array(o)->Insert(tointeger(idx),val))
- return sq_throwerror(v,_SC("index out of range"));
+ return sq_throwerror(v,"index out of range");
return 0;
}
@@ -467,14 +473,14 @@ static SQInteger array_remove(HSQUIRRELVM v)
{
SQObject &o = stack_get(v, 1);
SQObject &idx = stack_get(v, 2);
- if(!sq_isnumeric(idx)) return sq_throwerror(v, _SC("wrong type"));
+ if(!sq_isnumeric(idx)) return sq_throwerror(v, "wrong type");
SQObjectPtr val;
if(_array(o)->Get(tointeger(idx), val)) {
_array(o)->Remove(tointeger(idx));
v->Push(val);
return 1;
}
- return sq_throwerror(v, _SC("idx out of range"));
+ return sq_throwerror(v, "idx out of range");
}
static SQInteger array_resize(HSQUIRRELVM v)
@@ -488,7 +494,7 @@ static SQInteger array_resize(HSQUIRRELVM v)
_array(o)->Resize(tointeger(nsize),fill);
return 0;
}
- return sq_throwerror(v, _SC("size must be a number"));
+ return sq_throwerror(v, "size must be a number");
}
@@ -505,11 +511,11 @@ bool _sort_compare(HSQUIRRELVM v,SQObjectPtr &a,SQObjectPtr &b,SQInteger func,SQ
v->Push(b);
if(SQ_FAILED(sq_call(v, 3, SQTrue, SQFalse))) {
if(!sq_isstring( v->_lasterror))
- v->Raise_Error(_SC("compare func failed"));
+ v->Raise_Error("compare func failed");
return false;
}
if(SQ_FAILED(sq_getinteger(v, -1, &ret))) {
- v->Raise_Error(_SC("numeric value expected as return value of the compare function"));
+ v->Raise_Error("numeric value expected as return value of the compare function");
return false;
}
sq_settop(v, top);
@@ -545,7 +551,7 @@ bool _hsort_sift_down(HSQUIRRELVM v,SQArray *arr, SQInteger root, SQInteger bott
return false;
if (ret < 0) {
if (root == maxChild) {
- v->Raise_Error(_SC("inconsistent compare function"));
+ v->Raise_Error("inconsistent compare function");
return false; // We'd be swapping ourselve. The compare function is incorrect
}
_Swap(arr->_values[root],arr->_values[maxChild]);
@@ -596,8 +602,8 @@ static SQInteger array_slice(HSQUIRRELVM v)
SQInteger alen = _array(o)->Size();
if(sidx < 0)sidx = alen + sidx;
if(eidx < 0)eidx = alen + eidx;
- if(eidx < sidx)return sq_throwerror(v,_SC("wrong indexes"));
- if(eidx > alen)return sq_throwerror(v,_SC("slice out of range"));
+ if(eidx < sidx)return sq_throwerror(v,"wrong indexes");
+ if(eidx > alen)return sq_throwerror(v,"slice out of range");
SQArray *arr=SQArray::Create(_ss(v),eidx-sidx);
SQObjectPtr t;
SQInteger count=0;
@@ -611,21 +617,21 @@ static SQInteger array_slice(HSQUIRRELVM v)
}
SQRegFunction SQSharedState::_array_default_delegate_funcz[]={
- {_SC("len"),default_delegate_len,1, _SC("a")},
- {_SC("append"),array_append,2, _SC("a")},
- {_SC("extend"),array_extend,2, _SC("aa")},
- {_SC("push"),array_append,2, _SC("a")},
- {_SC("pop"),array_pop,1, _SC("a")},
- {_SC("top"),array_top,1, _SC("a")},
- {_SC("insert"),array_insert,3, _SC("an")},
- {_SC("remove"),array_remove,2, _SC("an")},
- {_SC("resize"),array_resize,-2, _SC("an")},
- {_SC("reverse"),array_reverse,1, _SC("a")},
- {_SC("sort"),array_sort,-1, _SC("ac")},
- {_SC("slice"),array_slice,-1, _SC("ann")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
- {_SC("clear"),obj_clear,1, _SC(".")},
+ {"len",default_delegate_len,1, "a"},
+ {"append",array_append,2, "a"},
+ {"extend",array_extend,2, "aa"},
+ {"push",array_append,2, "a"},
+ {"pop",array_pop,1, "a"},
+ {"top",array_top,1, "a"},
+ {"insert",array_insert,3, "an"},
+ {"remove",array_remove,2, "an"},
+ {"resize",array_resize,-2, "an"},
+ {"reverse",array_reverse,1, "a"},
+ {"sort",array_sort,-1, "ac"},
+ {"slice",array_slice,-1, "ann"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
+ {"clear",obj_clear,1, "."},
{0,0,0,0}
};
@@ -638,8 +644,8 @@ static SQInteger string_slice(HSQUIRRELVM v)
SQInteger slen = _string(o)->_len;
if(sidx < 0)sidx = slen + sidx;
if(eidx < 0)eidx = slen + eidx;
- if(eidx < sidx) return sq_throwerror(v,_SC("wrong indexes"));
- if(eidx > slen) return sq_throwerror(v,_SC("slice out of range"));
+ if(eidx < sidx) return sq_throwerror(v,"wrong indexes");
+ if(eidx > slen) return sq_throwerror(v,"slice out of range");
v->Push(SQString::Create(_ss(v),&_stringval(o)[sidx],eidx-sidx));
return 1;
}
@@ -651,7 +657,7 @@ static SQInteger string_find(HSQUIRRELVM v)
if(((top=sq_gettop(v))>1) && SQ_SUCCEEDED(sq_getstring(v,1,&str)) && SQ_SUCCEEDED(sq_getstring(v,2,&substr))){
if(top>2)sq_getinteger(v,3,&start_idx);
if((sq_getsize(v,1)>start_idx) && (start_idx>=0)){
- ret=scstrstr(&str[start_idx],substr);
+ ret=strstr(&str[start_idx],substr);
if(ret){
sq_pushinteger(v,(SQInteger)(ret-str));
return 1;
@@ -659,7 +665,7 @@ static SQInteger string_find(HSQUIRRELVM v)
}
return 0;
}
- return sq_throwerror(v,_SC("invalid param"));
+ return sq_throwerror(v,"invalid param");
}
#define STRING_TOFUNCZ(func) static SQInteger string_##func(HSQUIRRELVM v) \
@@ -667,7 +673,7 @@ static SQInteger string_find(HSQUIRRELVM v)
SQObject str=stack_get(v,1); \
SQInteger len=_string(str)->_len; \
const SQChar *sThis=_stringval(str); \
- SQChar *sNew=(_ss(v)->GetScratchPad(rsl(len))); \
+ SQChar *sNew=(_ss(v)->GetScratchPad(len)); \
for(SQInteger i=0;iPush(SQString::Create(_ss(v),sNew,len)); \
return 1; \
@@ -678,25 +684,25 @@ STRING_TOFUNCZ(tolower)
STRING_TOFUNCZ(toupper)
SQRegFunction SQSharedState::_string_default_delegate_funcz[]={
- {_SC("len"),default_delegate_len,1, _SC("s")},
- {_SC("tointeger"),default_delegate_tointeger,1, _SC("s")},
- {_SC("tofloat"),default_delegate_tofloat,1, _SC("s")},
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
- {_SC("slice"),string_slice,-1, _SC(" s n n")},
- {_SC("find"),string_find,-2, _SC("s s n ")},
- {_SC("tolower"),string_tolower,1, _SC("s")},
- {_SC("toupper"),string_toupper,1, _SC("s")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
+ {"len",default_delegate_len,1, "s"},
+ {"tointeger",default_delegate_tointeger,1, "s"},
+ {"tofloat",default_delegate_tofloat,1, "s"},
+ {"tostring",default_delegate_tostring,1, "."},
+ {"slice",string_slice,-1, " s n n"},
+ {"find",string_find,-2, "s s n "},
+ {"tolower",string_tolower,1, "s"},
+ {"toupper",string_toupper,1, "s"},
+ {"weakref",obj_delegate_weakref,1, NULL },
{0,0,0,0}
};
//INTEGER DEFAULT DELEGATE//////////////////////////
SQRegFunction SQSharedState::_number_default_delegate_funcz[]={
- {_SC("tointeger"),default_delegate_tointeger,1, _SC("n|b")},
- {_SC("tofloat"),default_delegate_tofloat,1, _SC("n|b")},
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
- {_SC("tochar"),number_delegate_tochar,1, _SC("n|b")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
+ {"tointeger",default_delegate_tointeger,1, "n|b"},
+ {"tofloat",default_delegate_tofloat,1, "n|b"},
+ {"tostring",default_delegate_tostring,1, "."},
+ {"tochar",number_delegate_tochar,1, "n|b"},
+ {"weakref",obj_delegate_weakref,1, NULL },
{0,0,0,0}
};
@@ -748,19 +754,19 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
_array(params)->Set((SQInteger)n,f->_parameters[n]);
}
if(f->_varparams) {
- _array(params)->Set(nparams-1,SQString::Create(_ss(v),_SC("..."),-1));
+ _array(params)->Set(nparams-1,SQString::Create(_ss(v),"...",-1));
}
- res->NewSlot(SQString::Create(_ss(v),_SC("native"),-1),false);
- res->NewSlot(SQString::Create(_ss(v),_SC("name"),-1),f->_name);
- res->NewSlot(SQString::Create(_ss(v),_SC("src"),-1),f->_sourcename);
- res->NewSlot(SQString::Create(_ss(v),_SC("parameters"),-1),params);
- res->NewSlot(SQString::Create(_ss(v),_SC("varargs"),-1),f->_varparams);
+ res->NewSlot(SQString::Create(_ss(v),"native",-1),false);
+ res->NewSlot(SQString::Create(_ss(v),"name",-1),f->_name);
+ res->NewSlot(SQString::Create(_ss(v),"src",-1),f->_sourcename);
+ res->NewSlot(SQString::Create(_ss(v),"parameters",-1),params);
+ res->NewSlot(SQString::Create(_ss(v),"varargs",-1),f->_varparams);
}
else { //OT_NATIVECLOSURE
SQNativeClosure *nc = _nativeclosure(o);
- res->NewSlot(SQString::Create(_ss(v),_SC("native"),-1),true);
- res->NewSlot(SQString::Create(_ss(v),_SC("name"),-1),nc->_name);
- res->NewSlot(SQString::Create(_ss(v),_SC("paramscheck"),-1),nc->_nparamscheck);
+ res->NewSlot(SQString::Create(_ss(v),"native",-1),true);
+ res->NewSlot(SQString::Create(_ss(v),"name",-1),nc->_name);
+ res->NewSlot(SQString::Create(_ss(v),"paramscheck",-1),nc->_nparamscheck);
SQObjectPtr typecheck;
if(nc->_typecheck.size() > 0) {
typecheck =
@@ -769,7 +775,7 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
_array(typecheck)->Set((SQInteger)n,nc->_typecheck[n]);
}
}
- res->NewSlot(SQString::Create(_ss(v),_SC("typecheck"),-1),typecheck);
+ res->NewSlot(SQString::Create(_ss(v),"typecheck",-1),typecheck);
}
v->Push(res);
return 1;
@@ -777,14 +783,14 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
SQRegFunction SQSharedState::_closure_default_delegate_funcz[]={
- {_SC("call"),closure_call,-1, _SC("c")},
- {_SC("pcall"),closure_pcall,-1, _SC("c")},
- {_SC("acall"),closure_acall,2, _SC("ca")},
- {_SC("pacall"),closure_pacall,2, _SC("ca")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
- {_SC("bindenv"),closure_bindenv,2, _SC("c x|y|t")},
- {_SC("getinfos"),closure_getinfos,1, _SC("c")},
+ {"call",closure_call,-1, "c"},
+ {"pcall",closure_pcall,-1, "c"},
+ {"acall",closure_acall,2, "ca"},
+ {"pacall",closure_pacall,2, "ca"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
+ {"bindenv",closure_bindenv,2, "c x|y|t"},
+ {"getinfos",closure_getinfos,1, "c"},
{0,0,0,0}
};
@@ -793,17 +799,17 @@ static SQInteger generator_getstatus(HSQUIRRELVM v)
{
SQObject &o=stack_get(v,1);
switch(_generator(o)->_state){
- case SQGenerator::eSuspended:v->Push(SQString::Create(_ss(v),_SC("suspended")));break;
- case SQGenerator::eRunning:v->Push(SQString::Create(_ss(v),_SC("running")));break;
- case SQGenerator::eDead:v->Push(SQString::Create(_ss(v),_SC("dead")));break;
+ case SQGenerator::eSuspended:v->Push(SQString::Create(_ss(v),"suspended"));break;
+ case SQGenerator::eRunning:v->Push(SQString::Create(_ss(v),"running"));break;
+ case SQGenerator::eDead:v->Push(SQString::Create(_ss(v),"dead"));break;
}
return 1;
}
SQRegFunction SQSharedState::_generator_default_delegate_funcz[]={
- {_SC("getstatus"),generator_getstatus,1, _SC("g")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
+ {"getstatus",generator_getstatus,1, "g"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
{0,0,0,0}
};
@@ -826,7 +832,7 @@ static SQInteger thread_call(HSQUIRRELVM v)
v->_lasterror = _thread(o)->_lasterror;
return SQ_ERROR;
}
- return sq_throwerror(v,_SC("wrong parameter"));
+ return sq_throwerror(v,"wrong parameter");
}
static SQInteger thread_wakeup(HSQUIRRELVM v)
@@ -838,10 +844,10 @@ static SQInteger thread_wakeup(HSQUIRRELVM v)
if(state != SQ_VMSTATE_SUSPENDED) {
switch(state) {
case SQ_VMSTATE_IDLE:
- return sq_throwerror(v,_SC("cannot wakeup a idle thread"));
+ return sq_throwerror(v,"cannot wakeup a idle thread");
break;
case SQ_VMSTATE_RUNNING:
- return sq_throwerror(v,_SC("cannot wakeup a running thread"));
+ return sq_throwerror(v,"cannot wakeup a running thread");
break;
}
}
@@ -862,7 +868,7 @@ static SQInteger thread_wakeup(HSQUIRRELVM v)
v->_lasterror = thread->_lasterror;
return SQ_ERROR;
}
- return sq_throwerror(v,_SC("wrong parameter"));
+ return sq_throwerror(v,"wrong parameter");
}
static SQInteger thread_getstatus(HSQUIRRELVM v)
@@ -870,26 +876,26 @@ static SQInteger thread_getstatus(HSQUIRRELVM v)
SQObjectPtr &o = stack_get(v,1);
switch(sq_getvmstate(_thread(o))) {
case SQ_VMSTATE_IDLE:
- sq_pushstring(v,_SC("idle"),-1);
+ sq_pushstring(v,"idle",-1);
break;
case SQ_VMSTATE_RUNNING:
- sq_pushstring(v,_SC("running"),-1);
+ sq_pushstring(v,"running",-1);
break;
case SQ_VMSTATE_SUSPENDED:
- sq_pushstring(v,_SC("suspended"),-1);
+ sq_pushstring(v,"suspended",-1);
break;
default:
- return sq_throwerror(v,_SC("internal VM error"));
+ return sq_throwerror(v,"internal VM error");
}
return 1;
}
SQRegFunction SQSharedState::_thread_default_delegate_funcz[] = {
- {_SC("call"), thread_call, -1, _SC("v")},
- {_SC("wakeup"), thread_wakeup, -1, _SC("v")},
- {_SC("getstatus"), thread_getstatus, 1, _SC("v")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
+ {"call", thread_call, -1, "v"},
+ {"wakeup", thread_wakeup, -1, "v"},
+ {"getstatus", thread_getstatus, 1, "v"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
{0,0,0,0},
};
@@ -915,12 +921,12 @@ static SQInteger class_instance(HSQUIRRELVM v)
}
SQRegFunction SQSharedState::_class_default_delegate_funcz[] = {
- {_SC("getattributes"), class_getattributes, 2, _SC("y.")},
- {_SC("setattributes"), class_setattributes, 3, _SC("y..")},
- {_SC("rawin"),container_rawexists,2, _SC("y")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
- {_SC("instance"),class_instance,1, _SC("y")},
+ {"getattributes", class_getattributes, 2, "y."},
+ {"setattributes", class_setattributes, 3, "y.."},
+ {"rawin",container_rawexists,2, "y"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
+ {"instance",class_instance,1, "y"},
{0,0,0,0}
};
@@ -932,10 +938,10 @@ static SQInteger instance_getclass(HSQUIRRELVM v)
}
SQRegFunction SQSharedState::_instance_default_delegate_funcz[] = {
- {_SC("getclass"), instance_getclass, 1, _SC("x")},
- {_SC("rawin"),container_rawexists,2, _SC("x")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
+ {"getclass", instance_getclass, 1, "x"},
+ {"rawin",container_rawexists,2, "x"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
{0,0,0,0}
};
@@ -947,9 +953,9 @@ static SQInteger weakref_ref(HSQUIRRELVM v)
}
SQRegFunction SQSharedState::_weakref_default_delegate_funcz[] = {
- {_SC("ref"),weakref_ref,1, _SC("r")},
- {_SC("weakref"),obj_delegate_weakref,1, NULL },
- {_SC("tostring"),default_delegate_tostring,1, _SC(".")},
+ {"ref",weakref_ref,1, "r"},
+ {"weakref",obj_delegate_weakref,1, NULL },
+ {"tostring",default_delegate_tostring,1, "."},
{0,0,0,0}
};
diff --git a/src/3rdparty/squirrel/squirrel/sqclass.cpp b/src/3rdparty/squirrel/squirrel/sqclass.cpp
index 73c8848b5b..aa1bca0443 100644
--- a/src/3rdparty/squirrel/squirrel/sqclass.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqclass.cpp
@@ -1,12 +1,17 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include "sqpcheader.h"
#include "sqvm.h"
#include "sqtable.h"
#include "sqclass.h"
#include "sqclosure.h"
+#include "../../../safeguards.h"
+
SQClass::SQClass(SQSharedState *ss,SQClass *base)
{
_base = base;
diff --git a/src/3rdparty/squirrel/squirrel/sqclosure.h b/src/3rdparty/squirrel/squirrel/sqclosure.h
index f872f2b8d3..a42dcd575a 100644
--- a/src/3rdparty/squirrel/squirrel/sqclosure.h
+++ b/src/3rdparty/squirrel/squirrel/sqclosure.h
@@ -80,7 +80,7 @@ public:
struct SQNativeClosure : public CHAINABLE_OBJ
{
private:
- SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
+ SQNativeClosure(SQSharedState *ss,SQFUNCTION func) : _nparamscheck(0) {_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
public:
static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
{
diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp
index b9eace1c63..2cc5f3d344 100644
--- a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp
@@ -1,6 +1,9 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include
#include "sqpcheader.h"
#include
@@ -13,6 +16,10 @@
#include "sqvm.h"
#include "sqtable.h"
+#include "../../../string_func.h"
+
+#include "../../../safeguards.h"
+
#define DEREF_NO_DEREF -1
#define DEREF_FIELD -2
@@ -50,23 +57,22 @@ typedef sqvector ExpStateVec;
class SQCompiler
{
public:
- SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo)
+ SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo) : _lex(_ss(v), rg, up,ThrowError,this)
{
_vm=v;
- _lex.Init(_ss(v), rg, up,ThrowError,this);
_sourcename = SQString::Create(_ss(v), sourcename);
_lineinfo = lineinfo;_raiseerror = raiseerror;
}
- static void ThrowError(void *ud, const SQChar *s) {
+ NORETURN static void ThrowError(void *ud, const SQChar *s) {
SQCompiler *c = (SQCompiler *)ud;
c->Error(s);
}
- void Error(const SQChar *s, ...)
+ NORETURN void Error(const SQChar *s, ...)
{
static SQChar temp[256];
va_list vl;
va_start(vl, s);
- scvsprintf(temp, s, vl);
+ vseprintf(temp, lastof(temp), s, vl);
va_end(vl);
throw temp;
}
@@ -75,7 +81,7 @@ public:
bool IsDerefToken(SQInteger tok)
{
switch(tok){
- case _SC('='): case _SC('('): case TK_NEWSLOT:
+ case '=': case '(': case TK_NEWSLOT:
case TK_MODEQ: case TK_MULEQ: case TK_DIVEQ: case TK_MINUSEQ: case TK_PLUSEQ: case TK_PLUSPLUS: case TK_MINUSMINUS: return true;
}
return false;
@@ -91,7 +97,7 @@ public:
if(_token != tok) {
if(_token == TK_CONSTRUCTOR && tok == TK_IDENTIFIER) {
- //ret = SQString::Create(_ss(_vm),_SC("constructor"));
+ //ret = SQString::Create(_ss(_vm),"constructor");
//do nothing
}
else {
@@ -100,23 +106,23 @@ public:
switch(tok)
{
case TK_IDENTIFIER:
- etypename = _SC("IDENTIFIER");
+ etypename = "IDENTIFIER";
break;
case TK_STRING_LITERAL:
- etypename = _SC("STRING_LITERAL");
+ etypename = "STRING_LITERAL";
break;
case TK_INTEGER:
- etypename = _SC("INTEGER");
+ etypename = "INTEGER";
break;
case TK_FLOAT:
- etypename = _SC("FLOAT");
+ etypename = "FLOAT";
break;
default:
etypename = _lex.Tok2Str(tok);
}
- Error(_SC("expected '%s'"), etypename);
+ Error("expected '%s'", etypename);
}
- Error(_SC("expected '%c'"), tok);
+ Error("expected '%c'", tok);
}
}
SQObjectPtr ret;
@@ -138,12 +144,12 @@ public:
Lex();
return ret;
}
- bool IsEndOfStatement() { return ((_lex._prevtoken == _SC('\n')) || (_token == SQUIRREL_EOB) || (_token == _SC('}')) || (_token == _SC(';'))); }
+ bool IsEndOfStatement() { return ((_lex._prevtoken == '\n') || (_token == SQUIRREL_EOB) || (_token == '}') || (_token == ';')); }
void OptionalSemicolon()
{
- if(_token == _SC(';')) { Lex(); return; }
+ if(_token == ';') { Lex(); return; }
if(!IsEndOfStatement()) {
- Error(_SC("end of statement expected (; or lf)"));
+ Error("end of statement expected (; or lf)");
}
}
void MoveIfCurrentTargetIsLocal() {
@@ -159,16 +165,16 @@ public:
_debugop = 0;
SQFuncState funcstate(_ss(_vm), NULL,ThrowError,this);
- funcstate._name = SQString::Create(_ss(_vm), _SC("main"));
+ funcstate._name = SQString::Create(_ss(_vm), "main");
_fs = &funcstate;
- _fs->AddParameter(_fs->CreateString(_SC("this")));
+ _fs->AddParameter(_fs->CreateString("this"));
_fs->_sourcename = _sourcename;
SQInteger stacksize = _fs->GetStackSize();
try {
Lex();
while(_token > 0){
Statement();
- if(_lex._prevtoken != _SC('}')) OptionalSemicolon();
+ if(_lex._prevtoken != '}') OptionalSemicolon();
}
CleanStack(stacksize);
_fs->AddLineInfos(_lex._currentline, _lineinfo, true);
@@ -182,7 +188,7 @@ public:
}
catch (SQChar *compilererror) {
if(_raiseerror && _ss(_vm)->_compilererrorhandler) {
- _ss(_vm)->_compilererrorhandler(_vm, compilererror, type(_sourcename) == OT_STRING?_stringval(_sourcename):_SC("unknown"),
+ _ss(_vm)->_compilererrorhandler(_vm, compilererror, type(_sourcename) == OT_STRING?_stringval(_sourcename):"unknown",
_lex._currentline, _lex._currentcolumn);
}
_vm->_lasterror = SQString::Create(_ss(_vm), compilererror, -1);
@@ -191,16 +197,16 @@ public:
}
void Statements()
{
- while(_token != _SC('}') && _token != TK_DEFAULT && _token != TK_CASE) {
+ while(_token != '}' && _token != TK_DEFAULT && _token != TK_CASE) {
Statement();
- if(_lex._prevtoken != _SC('}') && _lex._prevtoken != _SC(';')) OptionalSemicolon();
+ if(_lex._prevtoken != '}' && _lex._prevtoken != ';') OptionalSemicolon();
}
}
void Statement()
{
_fs->AddLineInfos(_lex._currentline, _lineinfo);
switch(_token){
- case _SC(';'): Lex(); break;
+ case ';': Lex(); break;
case TK_IF: IfStatement(); break;
case TK_WHILE: WhileStatement(); break;
case TK_DO: DoWhileStatement(); break;
@@ -236,7 +242,7 @@ public:
}
break;}
case TK_BREAK:
- if(_fs->_breaktargets.size() <= 0)Error(_SC("'break' has to be in a loop block"));
+ if(_fs->_breaktargets.size() <= 0)Error("'break' has to be in a loop block");
if(_fs->_breaktargets.top() > 0){
_fs->AddInstruction(_OP_POPTRAP, _fs->_breaktargets.top(), 0);
}
@@ -246,7 +252,7 @@ public:
Lex();
break;
case TK_CONTINUE:
- if(_fs->_continuetargets.size() <= 0)Error(_SC("'continue' has to be in a loop block"));
+ if(_fs->_continuetargets.size() <= 0)Error("'continue' has to be in a loop block");
if(_fs->_continuetargets.top() > 0) {
_fs->AddInstruction(_OP_POPTRAP, _fs->_continuetargets.top(), 0);
}
@@ -264,11 +270,11 @@ public:
case TK_ENUM:
EnumStatement();
break;
- case _SC('{'):{
+ case '{':{
SQInteger stacksize = _fs->GetStackSize();
Lex();
Statements();
- Expect(_SC('}'));
+ Expect('}');
_fs->AddInstruction(_OP_SCOPE_END, stacksize, _fs->GetStackSize());
_fs->SetStackSize(stacksize);
}
@@ -348,7 +354,7 @@ public:
_exst._funcarg = funcarg;
LogicalOrExp();
switch(_token) {
- case _SC('='):
+ case '=':
case TK_NEWSLOT:
case TK_MINUSEQ:
case TK_PLUSEQ:
@@ -359,19 +365,19 @@ public:
SQInteger op = _token;
SQInteger ds = _exst._deref;
bool freevar = _exst._freevar;
- if(ds == DEREF_NO_DEREF) Error(_SC("can't assign expression"));
+ if(ds == DEREF_NO_DEREF) Error("can't assign expression");
Lex(); Expression();
switch(op){
case TK_NEWSLOT:
- if(freevar) Error(_SC("free variables cannot be modified"));
+ if(freevar) Error("free variables cannot be modified");
if(ds == DEREF_FIELD)
EmitDerefOp(_OP_NEWSLOT);
else //if _derefstate != DEREF_NO_DEREF && DEREF_FIELD so is the index of a local
- Error(_SC("can't 'create' a local slot"));
+ Error("can't 'create' a local slot");
break;
- case _SC('='): //ASSIGN
- if(freevar) Error(_SC("free variables cannot be modified"));
+ case '=': //ASSIGN
+ if(freevar) Error("free variables cannot be modified");
if(ds == DEREF_FIELD)
EmitDerefOp(_OP_SET);
else {//if _derefstate != DEREF_NO_DEREF && DEREF_FIELD so is the index of a local
@@ -390,7 +396,7 @@ public:
}
}
break;
- case _SC('?'): {
+ case '?': {
Lex();
_fs->AddInstruction(_OP_JZ, _fs->PopTarget());
SQInteger jzpos = _fs->GetCurrentPos();
@@ -400,7 +406,7 @@ public:
if(trg != first_exp) _fs->AddInstruction(_OP_MOVE, trg, first_exp);
SQInteger endfirstexp = _fs->GetCurrentPos();
_fs->AddInstruction(_OP_JMP, 0, 0);
- Expect(_SC(':'));
+ Expect(':');
SQInteger jmppos = _fs->GetCurrentPos();
Expression();
SQInteger second_exp = _fs->PopTarget();
@@ -422,7 +428,7 @@ public:
void LogicalOrExp()
{
LogicalAndExp();
- for(;;) if(_token == TK_OR) {
+ if(_token == TK_OR) {
SQInteger first_exp = _fs->PopTarget();
SQInteger trg = _fs->PushTarget();
_fs->AddInstruction(_OP_OR, trg, 0, first_exp, 0);
@@ -434,8 +440,7 @@ public:
if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp);
_fs->SnoozeOpt();
_fs->SetIntructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos));
- break;
- }else return;
+ }
}
void LogicalAndExp()
{
@@ -464,21 +469,21 @@ public:
void BitwiseOrExp()
{
BitwiseXorExp();
- for(;;) if(_token == _SC('|'))
+ for(;;) if(_token == '|')
{BIN_EXP(_OP_BITW, &SQCompiler::BitwiseXorExp,BW_OR);
}else return;
}
void BitwiseXorExp()
{
BitwiseAndExp();
- for(;;) if(_token == _SC('^'))
+ for(;;) if(_token == '^')
{BIN_EXP(_OP_BITW, &SQCompiler::BitwiseAndExp,BW_XOR);
}else return;
}
void BitwiseAndExp()
{
CompExp();
- for(;;) if(_token == _SC('&'))
+ for(;;) if(_token == '&')
{BIN_EXP(_OP_BITW, &SQCompiler::CompExp,BW_AND);
}else return;
}
@@ -487,8 +492,8 @@ public:
ShiftExp();
for(;;) switch(_token) {
case TK_EQ: BIN_EXP(_OP_EQ, &SQCompiler::ShiftExp); break;
- case _SC('>'): BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_G); break;
- case _SC('<'): BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_L); break;
+ case '>': BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_G); break;
+ case '<': BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_L); break;
case TK_GE: BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_GE); break;
case TK_LE: BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_LE); break;
case TK_NE: BIN_EXP(_OP_NE, &SQCompiler::ShiftExp); break;
@@ -509,7 +514,7 @@ public:
{
MultExp();
for(;;) switch(_token) {
- case _SC('+'): case _SC('-'):
+ case '+': case '-':
BIN_EXP(_OP_ARITH, &SQCompiler::MultExp,_token); break;
default: return;
}
@@ -519,7 +524,7 @@ public:
{
PrefixedExpr();
for(;;) switch(_token) {
- case _SC('*'): case _SC('/'): case _SC('%'):
+ case '*': case '/': case '%':
BIN_EXP(_OP_ARITH, &SQCompiler::PrefixedExpr,_token); break;
default: return;
}
@@ -531,13 +536,13 @@ public:
for(;;) {
switch(_token) {
- case _SC('.'): {
+ case '.': {
pos = -1;
Lex();
if(_token == TK_PARENT) {
Lex();
if(!NeedGet())
- Error(_SC("parent cannot be set"));
+ Error("parent cannot be set");
SQInteger src = _fs->PopTarget();
_fs->AddInstruction(_OP_GETPARENT, _fs->PushTarget(), src);
}
@@ -549,9 +554,9 @@ public:
_exst._freevar = false;
}
break;
- case _SC('['):
- if(_lex._prevtoken == _SC('\n')) Error(_SC("cannot brake deref/or comma needed after [exp]=exp slot declaration"));
- Lex(); Expression(); Expect(_SC(']'));
+ case '[':
+ if(_lex._prevtoken == '\n') Error("cannot brake deref/or comma needed after [exp]=exp slot declaration");
+ Lex(); Expression(); Expect(']');
pos = -1;
if(NeedGet()) Emit2ArgsOP(_OP_GET);
_exst._deref = DEREF_FIELD;
@@ -571,7 +576,7 @@ public:
}
return;
break;
- case _SC('('):
+ case '(':
{
if(_exst._deref != DEREF_NO_DEREF) {
if(pos<0) {
@@ -609,9 +614,9 @@ public:
break;
case TK_VARGC: Lex(); _fs->AddInstruction(_OP_VARGC, _fs->PushTarget()); break;
case TK_VARGV: { Lex();
- Expect(_SC('['));
+ Expect('[');
Expression();
- Expect(_SC(']'));
+ Expect(']');
SQInteger src = _fs->PopTarget();
_fs->AddInstruction(_OP_GETVARGV, _fs->PushTarget(), src);
}
@@ -624,8 +629,8 @@ public:
SQObject constant;
switch(_token) {
case TK_IDENTIFIER: id = _fs->CreateString(_lex._svalue); break;
- case TK_THIS: id = _fs->CreateString(_SC("this")); break;
- case TK_CONSTRUCTOR: id = _fs->CreateString(_SC("constructor")); break;
+ case TK_THIS: id = _fs->CreateString("this"); break;
+ case TK_CONSTRUCTOR: id = _fs->CreateString("constructor"); break;
}
SQInteger pos = -1;
Lex();
@@ -643,7 +648,7 @@ public:
Expect('.'); constid = Expect(TK_IDENTIFIER);
if(!_table(constant)->Get(constid,constval)) {
constval.Null();
- Error(_SC("invalid constant [%s.%s]"), _stringval(id),_stringval(constid));
+ Error("invalid constant [%s.%s]", _stringval(id),_stringval(constid));
}
}
else {
@@ -683,7 +688,7 @@ public:
case TK_DOUBLE_COLON: // "::"
_fs->AddInstruction(_OP_LOADROOTTABLE, _fs->PushTarget());
_exst._deref = DEREF_FIELD;
- _token = _SC('.'); //hack
+ _token = '.'; //hack
return -1;
break;
case TK_NULL:
@@ -713,13 +718,13 @@ public:
_fs->AddInstruction(_OP_LOADBOOL, _fs->PushTarget(),_token == TK_TRUE?1:0);
Lex();
break;
- case _SC('['): {
+ case '[': {
_fs->AddInstruction(_OP_NEWARRAY, _fs->PushTarget());
SQInteger apos = _fs->GetCurrentPos(),key = 0;
Lex();
- while(_token != _SC(']')) {
+ while(_token != ']') {
Expression();
- if(_token == _SC(',')) Lex();
+ if(_token == ',') Lex();
SQInteger val = _fs->PopTarget();
SQInteger array = _fs->TopTarget();
_fs->AddInstruction(_OP_APPENDARRAY, array, val);
@@ -729,16 +734,16 @@ public:
Lex();
}
break;
- case _SC('{'):{
+ case '{':{
_fs->AddInstruction(_OP_NEWTABLE, _fs->PushTarget());
- Lex();ParseTableOrClass(_SC(','));
+ Lex();ParseTableOrClass(',');
}
break;
case TK_FUNCTION: FunctionExp(_token);break;
case TK_CLASS: Lex(); ClassExp();break;
- case _SC('-'): UnaryOP(_OP_NEG); break;
- case _SC('!'): UnaryOP(_OP_NOT); break;
- case _SC('~'): UnaryOP(_OP_BWNOT); break;
+ case '-': UnaryOP(_OP_NEG); break;
+ case '!': UnaryOP(_OP_NOT); break;
+ case '~': UnaryOP(_OP_BWNOT); break;
case TK_TYPEOF : UnaryOP(_OP_TYPEOF); break;
case TK_RESUME : UnaryOP(_OP_RESUME); break;
case TK_CLONE : UnaryOP(_OP_CLONE); break;
@@ -746,9 +751,9 @@ public:
case TK_PLUSPLUS :PrefixIncDec(_token); break;
case TK_DELETE : DeleteExpr(); break;
case TK_DELEGATE : DelegateExpr(); break;
- case _SC('('): Lex(); CommaExpr(); Expect(_SC(')'));
+ case '(': Lex(); CommaExpr(); Expect(')');
break;
- default: Error(_SC("expression expected"));
+ default: Error("expression expected");
}
return -1;
}
@@ -761,23 +766,23 @@ public:
bool NeedGet()
{
switch(_token) {
- case _SC('='): case _SC('('): case TK_NEWSLOT: case TK_PLUSPLUS: case TK_MINUSMINUS:
+ case '=': case '(': case TK_NEWSLOT: case TK_PLUSPLUS: case TK_MINUSMINUS:
case TK_PLUSEQ: case TK_MINUSEQ: case TK_MULEQ: case TK_DIVEQ: case TK_MODEQ:
return false;
}
- return (!_exst._class_or_delete) || (_exst._class_or_delete && (_token == _SC('.') || _token == _SC('[')));
+ return (!_exst._class_or_delete) || (_exst._class_or_delete && (_token == '.' || _token == '['));
}
void FunctionCallArgs()
{
SQInteger nargs = 1;//this
- while(_token != _SC(')')) {
+ while(_token != ')') {
Expression(true);
MoveIfCurrentTargetIsLocal();
nargs++;
- if(_token == _SC(',')){
+ if(_token == ','){
Lex();
- if(_token == ')') Error(_SC("expression expected, found ')'"));
+ if(_token == ')') Error("expression expected, found ')'");
}
}
Lex();
@@ -810,20 +815,20 @@ public:
case TK_CONSTRUCTOR:{
SQInteger tk = _token;
Lex();
- SQObject id = tk == TK_FUNCTION ? Expect(TK_IDENTIFIER) : _fs->CreateString(_SC("constructor"));
- Expect(_SC('('));
+ SQObject id = tk == TK_FUNCTION ? Expect(TK_IDENTIFIER) : _fs->CreateString("constructor");
+ Expect('(');
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id));
CreateFunction(id);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0);
}
break;
- case _SC('['):
- Lex(); CommaExpr(); Expect(_SC(']'));
- Expect(_SC('=')); Expression();
+ case '[':
+ Lex(); CommaExpr(); Expect(']');
+ Expect('='); Expression();
break;
default :
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(Expect(TK_IDENTIFIER)));
- Expect(_SC('=')); Expression();
+ Expect('='); Expression();
}
if(_token == separator) Lex();//optional comma/semicolon
@@ -837,7 +842,7 @@ public:
_fs->AddInstruction(_OP_NEWSLOTA, flags, table, key, val);
//_fs->PopTarget();
}
- if(separator == _SC(',')) //hack recognizes a table from the separator
+ if(separator == ',') //hack recognizes a table from the separator
_fs->SetIntructionParam(tpos, 1, nkeys);
Lex();
}
@@ -846,7 +851,7 @@ public:
SQObject varname;
do {
Lex(); varname = Expect(TK_IDENTIFIER);
- if(_token == _SC('=')) {
+ if(_token == '=') {
Lex(); Expression();
SQInteger src = _fs->PopTarget();
SQInteger dest = _fs->PushTarget();
@@ -858,20 +863,20 @@ public:
_fs->PopTarget();
_fs->PushLocalVariable(varname);
- } while(_token == _SC(','));
+ } while(_token == ',');
}
void IfStatement()
{
SQInteger jmppos;
bool haselse = false;
- Lex(); Expect(_SC('(')); CommaExpr(); Expect(_SC(')'));
+ Lex(); Expect('('); CommaExpr(); Expect(')');
_fs->AddInstruction(_OP_JZ, _fs->PopTarget());
SQInteger jnepos = _fs->GetCurrentPos();
SQInteger stacksize = _fs->GetStackSize();
Statement();
//
- if(_token != _SC('}') && _token != TK_ELSE) OptionalSemicolon();
+ if(_token != '}' && _token != TK_ELSE) OptionalSemicolon();
CleanStack(stacksize);
SQInteger endifblock = _fs->GetCurrentPos();
@@ -892,7 +897,7 @@ public:
SQInteger jzpos, jmppos;
SQInteger stacksize = _fs->GetStackSize();
jmppos = _fs->GetCurrentPos();
- Lex(); Expect(_SC('(')); CommaExpr(); Expect(_SC(')'));
+ Lex(); Expect('('); CommaExpr(); Expect(')');
BEGIN_BREAKBLE_BLOCK();
_fs->AddInstruction(_OP_JZ, _fs->PopTarget());
@@ -920,7 +925,7 @@ public:
_fs->AddLineInfos(_lex._currentline, _lineinfo, true);
Expect(TK_WHILE);
SQInteger continuetrg = _fs->GetCurrentPos();
- Expect(_SC('(')); CommaExpr(); Expect(_SC(')'));
+ Expect('('); CommaExpr(); Expect(')');
_fs->AddInstruction(_OP_JNZ, _fs->PopTarget(), jzpos - _fs->GetCurrentPos() - 1);
END_BREAKBLE_BLOCK(continuetrg);
}
@@ -928,25 +933,25 @@ public:
{
Lex();
SQInteger stacksize = _fs->GetStackSize();
- Expect(_SC('('));
+ Expect('(');
if(_token == TK_LOCAL) LocalDeclStatement();
- else if(_token != _SC(';')){
+ else if(_token != ';'){
CommaExpr();
_fs->PopTarget();
}
- Expect(_SC(';'));
+ Expect(';');
_fs->SnoozeOpt();
SQInteger jmppos = _fs->GetCurrentPos();
SQInteger jzpos = -1;
- if(_token != _SC(';')) { CommaExpr(); _fs->AddInstruction(_OP_JZ, _fs->PopTarget()); jzpos = _fs->GetCurrentPos(); }
- Expect(_SC(';'));
+ if(_token != ';') { CommaExpr(); _fs->AddInstruction(_OP_JZ, _fs->PopTarget()); jzpos = _fs->GetCurrentPos(); }
+ Expect(';');
_fs->SnoozeOpt();
SQInteger expstart = _fs->GetCurrentPos() + 1;
- if(_token != _SC(')')) {
+ if(_token != ')') {
CommaExpr();
_fs->PopTarget();
}
- Expect(_SC(')'));
+ Expect(')');
_fs->SnoozeOpt();
SQInteger expend = _fs->GetCurrentPos();
SQInteger expsize = (expend - expstart) + 1;
@@ -973,20 +978,20 @@ public:
void ForEachStatement()
{
SQObject idxname, valname;
- Lex(); Expect(_SC('(')); valname = Expect(TK_IDENTIFIER);
- if(_token == _SC(',')) {
+ Lex(); Expect('('); valname = Expect(TK_IDENTIFIER);
+ if(_token == ',') {
idxname = valname;
Lex(); valname = Expect(TK_IDENTIFIER);
}
else{
- idxname = _fs->CreateString(_SC("@INDEX@"));
+ idxname = _fs->CreateString("@INDEX@");
}
Expect(TK_IN);
//save the stack size
SQInteger stacksize = _fs->GetStackSize();
//put the table in the stack(evaluate the table expression)
- Expression(); Expect(_SC(')'));
+ Expression(); Expect(')');
SQInteger container = _fs->TopTarget();
//push the index local var
SQInteger indexpos = _fs->PushLocalVariable(idxname);
@@ -995,7 +1000,7 @@ public:
SQInteger valuepos = _fs->PushLocalVariable(valname);
_fs->AddInstruction(_OP_LOADNULLS, valuepos,1);
//push reference index
- SQInteger itrpos = _fs->PushLocalVariable(_fs->CreateString(_SC("@ITERATOR@"))); //use invalid id to make it inaccessible
+ SQInteger itrpos = _fs->PushLocalVariable(_fs->CreateString("@ITERATOR@")); //use invalid id to make it inaccessible
_fs->AddInstruction(_OP_LOADNULLS, itrpos,1);
SQInteger jmppos = _fs->GetCurrentPos();
_fs->AddInstruction(_OP_FOREACH, container, 0, indexpos);
@@ -1014,8 +1019,8 @@ public:
}
void SwitchStatement()
{
- Lex(); Expect(_SC('(')); CommaExpr(); Expect(_SC(')'));
- Expect(_SC('{'));
+ Lex(); Expect('('); CommaExpr(); Expect(')');
+ Expect('{');
SQInteger expr = _fs->TopTarget();
bool bfirst = true;
SQInteger tonextcondjmp = -1;
@@ -1030,7 +1035,7 @@ public:
_fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp);
}
//condition
- Lex(); Expression(); Expect(_SC(':'));
+ Lex(); Expression(); Expect(':');
SQInteger trg = _fs->PopTarget();
_fs->AddInstruction(_OP_EQ, trg, trg, expr);
_fs->AddInstruction(_OP_JZ, trg, 0);
@@ -1049,13 +1054,13 @@ public:
_fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp);
if(_token == TK_DEFAULT) {
// _fs->AddLineInfos(_lex._currentline, _lineinfo);
- Lex(); Expect(_SC(':'));
+ Lex(); Expect(':');
SQInteger stacksize = _fs->GetStackSize();
_last_stacksize = _fs->GetStackSize();
Statements();
_fs->SetStackSize(stacksize);
}
- Expect(_SC('}'));
+ Expect('}');
_fs->PopTarget();
__nbreaks__ = _fs->_unresolvedbreaks.size() - __nbreaks__;
if(__nbreaks__ > 0)ResolveBreaks(_fs, __nbreaks__);
@@ -1076,7 +1081,7 @@ public:
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id));
if(_token == TK_DOUBLE_COLON) Emit2ArgsOP(_OP_GET);
}
- Expect(_SC('('));
+ Expect('(');
CreateFunction(id);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0);
EmitDerefOp(_OP_NEWSLOT);
@@ -1090,13 +1095,13 @@ public:
_exst._funcarg = false;
PrefixedExpr();
es = PopExpState();
- if(es._deref == DEREF_NO_DEREF) Error(_SC("invalid class name"));
+ if(es._deref == DEREF_NO_DEREF) Error("invalid class name");
if(es._deref == DEREF_FIELD) {
ClassExp();
EmitDerefOp(_OP_NEWSLOT);
_fs->PopTarget();
}
- else Error(_SC("cannot create a class in a local with the syntax(class )"));
+ else Error("cannot create a class in a local with the syntax(class )");
}
SQObject ExpectScalar()
{
@@ -1126,12 +1131,12 @@ public:
val._unVal.fFloat = -_lex._fvalue;
break;
default:
- Error(_SC("scalar expected : integer,float"));
+ Error("scalar expected : integer,float");
val._type = OT_NULL; // Silent compile-warning
}
break;
default:
- Error(_SC("scalar expected : integer,float or string"));
+ Error("scalar expected : integer,float or string");
val._type = OT_NULL; // Silent compile-warning
}
Lex();
@@ -1142,14 +1147,14 @@ public:
Lex();
SQObject id = Expect(TK_IDENTIFIER);
- Expect(_SC('{'));
+ Expect('{');
SQObject table = _fs->CreateTable();
SQInteger nval = 0;
- while(_token != _SC('}')) {
+ while(_token != '}') {
SQObject key = Expect(TK_IDENTIFIER);
SQObject val;
- if(_token == _SC('=')) {
+ if(_token == '=') {
Lex();
val = ExpectScalar();
}
@@ -1165,7 +1170,7 @@ public:
/*SQObjectPtr dummy;
if(enums->Get(strongid,dummy)) {
dummy.Null(); strongid.Null();
- Error(_SC("enumeration already exists"));
+ Error("enumeration already exists");
}*/
enums->NewSlot(SQObjectPtr(strongid),SQObjectPtr(table));
strongid.Null();
@@ -1189,7 +1194,7 @@ public:
_fs->AddInstruction(_OP_JMP, 0, 0);
SQInteger jmppos = _fs->GetCurrentPos();
_fs->SetIntructionParam(trappos, 1, (_fs->GetCurrentPos() - trappos));
- Expect(TK_CATCH); Expect(_SC('(')); exid = Expect(TK_IDENTIFIER); Expect(_SC(')'));
+ Expect(TK_CATCH); Expect('('); exid = Expect(TK_IDENTIFIER); Expect(')');
SQInteger stacksize = _fs->GetStackSize();
SQInteger ex_target = _fs->PushLocalVariable(exid);
_fs->SetIntructionParam(trappos, 0, ex_target);
@@ -1199,7 +1204,7 @@ public:
}
void FunctionExp(SQInteger ftype)
{
- Lex(); Expect(_SC('('));
+ Lex(); Expect('(');
CreateFunction(_null_);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, ftype == TK_FUNCTION?0:1);
}
@@ -1214,19 +1219,19 @@ public:
if(_token == TK_ATTR_OPEN) {
Lex();
_fs->AddInstruction(_OP_NEWTABLE, _fs->PushTarget());
- ParseTableOrClass(_SC(','),TK_ATTR_CLOSE);
+ ParseTableOrClass(',',TK_ATTR_CLOSE);
attrs = _fs->TopTarget();
}
- Expect(_SC('{'));
+ Expect('{');
if(attrs != -1) _fs->PopTarget();
if(base != -1) _fs->PopTarget();
_fs->AddInstruction(_OP_CLASS, _fs->PushTarget(), base, attrs);
- ParseTableOrClass(_SC(';'));
+ ParseTableOrClass(';');
}
void DelegateExpr()
{
Lex(); CommaExpr();
- Expect(_SC(':'));
+ Expect(':');
CommaExpr();
SQInteger table = _fs->PopTarget(), delegate = _fs->PopTarget();
_fs->AddInstruction(_OP_DELEGATE, _fs->PushTarget(), table, delegate);
@@ -1239,9 +1244,9 @@ public:
_exst._funcarg = false;
PrefixedExpr();
es = PopExpState();
- if(es._deref == DEREF_NO_DEREF) Error(_SC("can't delete an expression"));
+ if(es._deref == DEREF_NO_DEREF) Error("can't delete an expression");
if(es._deref == DEREF_FIELD) Emit2ArgsOP(_OP_DELETE);
- else Error(_SC("cannot delete a local"));
+ else Error("cannot delete a local");
}
void PrefixIncDec(SQInteger token)
{
@@ -1263,46 +1268,46 @@ public:
SQFuncState *funcstate = _fs->PushChildState(_ss(_vm));
funcstate->_name = name;
SQObject paramname;
- funcstate->AddParameter(_fs->CreateString(_SC("this")));
+ funcstate->AddParameter(_fs->CreateString("this"));
funcstate->_sourcename = _sourcename;
SQInteger defparams = 0;
- while(_token!=_SC(')')) {
+ while(_token!=')') {
if(_token == TK_VARPARAMS) {
- if(defparams > 0) Error(_SC("function with default parameters cannot have variable number of parameters"));
+ if(defparams > 0) Error("function with default parameters cannot have variable number of parameters");
funcstate->_varparams = true;
Lex();
- if(_token != _SC(')')) Error(_SC("expected ')'"));
+ if(_token != ')') Error("expected ')'");
break;
}
else {
paramname = Expect(TK_IDENTIFIER);
funcstate->AddParameter(paramname);
- if(_token == _SC('=')) {
+ if(_token == '=') {
Lex();
Expression();
funcstate->AddDefaultParam(_fs->TopTarget());
defparams++;
}
else {
- if(defparams > 0) Error(_SC("expected '='"));
+ if(defparams > 0) Error("expected '='");
}
- if(_token == _SC(',')) Lex();
- else if(_token != _SC(')')) Error(_SC("expected ')' or ','"));
+ if(_token == ',') Lex();
+ else if(_token != ')') Error("expected ')' or ','");
}
}
- Expect(_SC(')'));
+ Expect(')');
for(SQInteger n = 0; n < defparams; n++) {
_fs->PopTarget();
}
//outer values
- if(_token == _SC(':')) {
- Lex(); Expect(_SC('('));
- while(_token != _SC(')')) {
+ if(_token == ':') {
+ Lex(); Expect('(');
+ while(_token != ')') {
paramname = Expect(TK_IDENTIFIER);
//outers are treated as implicit local variables
funcstate->AddOuterValue(paramname);
- if(_token == _SC(',')) Lex();
- else if(_token != _SC(')')) Error(_SC("expected ')' or ','"));
+ if(_token == ',') Lex();
+ else if(_token != ')') Error("expected ')' or ','");
}
Lex();
}
@@ -1310,7 +1315,7 @@ public:
SQFuncState *currchunk = _fs;
_fs = funcstate;
Statement();
- funcstate->AddLineInfos(_lex._prevtoken == _SC('\n')?_lex._lasttokenline:_lex._currentline, _lineinfo, true);
+ funcstate->AddLineInfos(_lex._prevtoken == '\n'?_lex._lasttokenline:_lex._currentline, _lineinfo, true);
funcstate->AddInstruction(_OP_RETURN, -1);
funcstate->SetStackSize(0);
//_fs->->_stacksize = _fs->_stacksize;
diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.h b/src/3rdparty/squirrel/squirrel/sqcompiler.h
index dd55888b6e..b29917390b 100644
--- a/src/3rdparty/squirrel/squirrel/sqcompiler.h
+++ b/src/3rdparty/squirrel/squirrel/sqcompiler.h
@@ -71,7 +71,12 @@ struct SQVM;
#define TK_ENUM 323
#define TK_CONST 324
-
+/* MSVC doesn't like NORETURN for function prototypes, but we kinda need it for GCC. */
+#if defined(_MSC_VER)
typedef void(*CompilerErrorFunc)(void *ud, const SQChar *s);
+#else
+typedef NORETURN void(*CompilerErrorFunc)(void *ud, const SQChar *s);
+#endif
+
bool Compile(SQVM *vm, SQLEXREADFUNC rg, SQUserPointer up, const SQChar *sourcename, SQObjectPtr &out, bool raiseerror, bool lineinfo);
#endif //_SQCOMPILER_H_
diff --git a/src/3rdparty/squirrel/squirrel/sqdebug.cpp b/src/3rdparty/squirrel/squirrel/sqdebug.cpp
index c683697d7c..74272e432a 100644
--- a/src/3rdparty/squirrel/squirrel/sqdebug.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqdebug.cpp
@@ -1,14 +1,21 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include
#include "sqpcheader.h"
-#include
#include "sqvm.h"
#include "sqfuncproto.h"
#include "sqclosure.h"
#include "sqstring.h"
+#include "../../../core/alloc_func.hpp"
+#include "../../../string_func.h"
+
+#include "../../../safeguards.h"
+
SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi)
{
SQInteger cssize = v->_callsstacksize;
@@ -18,12 +25,12 @@ SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi)
SQClosure *c = _closure(ci._closure);
SQFunctionProto *proto = _funcproto(c->_function);
fi->funcid = proto;
- fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown");
- fi->source = type(proto->_name) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown");
+ fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):"unknown";
+ fi->source = type(proto->_name) == OT_STRING?_stringval(proto->_sourcename):"unknown";
return SQ_OK;
}
}
- return sq_throwerror(v,_SC("the object is not a closure"));
+ return sq_throwerror(v,"the object is not a closure");
}
SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si)
@@ -43,8 +50,8 @@ SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si)
}
break;
case OT_NATIVECLOSURE:
- si->source = _SC("NATIVE");
- si->funcname = _SC("unknown");
+ si->source = "NATIVE";
+ si->funcname = "unknown";
if(type(_nativeclosure(ci._closure)->_name) == OT_STRING)
si->funcname = _stringval(_nativeclosure(ci._closure)->_name);
si->line = -1;
@@ -60,9 +67,12 @@ void SQVM::Raise_Error(const SQChar *s, ...)
{
va_list vl;
va_start(vl, s);
- scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);
+ size_t len = strlen(s)+(NUMBER_MAX_CHAR*2);
+ char *buffer = MallocT(len + 1);
+ vseprintf(buffer, buffer + len, s, vl);
va_end(vl);
- _lasterror = SQString::Create(_ss(this),_spval,-1);
+ _lasterror = SQString::Create(_ss(this),buffer,-1);
+ free(buffer);
}
void SQVM::Raise_Error(SQObjectPtr &desc)
@@ -72,20 +82,15 @@ void SQVM::Raise_Error(SQObjectPtr &desc)
SQString *SQVM::PrintObjVal(const SQObject &o)
{
+ char buf[NUMBER_MAX_CHAR+1];
switch(type(o)) {
case OT_STRING: return _string(o);
case OT_INTEGER:
-#if defined(_SQ64)
- scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%ld"), _integer(o));
-#else
- scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%d"), _integer(o));
-#endif
- return SQString::Create(_ss(this), _spval);
- break;
+ seprintf(buf, lastof(buf), OTTD_PRINTF64, _integer(o));
+ return SQString::Create(_ss(this), buf);
case OT_FLOAT:
- scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o));
- return SQString::Create(_ss(this), _spval);
- break;
+ seprintf(buf, lastof(buf), "%.14g", _float(o));
+ return SQString::Create(_ss(this), buf);
default:
return SQString::Create(_ss(this), GetTypeName(o));
}
@@ -94,28 +99,28 @@ SQString *SQVM::PrintObjVal(const SQObject &o)
void SQVM::Raise_IdxError(const SQObject &o)
{
SQObjectPtr oval = PrintObjVal(o);
- Raise_Error(_SC("the index '%.50s' does not exist"), _stringval(oval));
+ Raise_Error("the index '%.50s' does not exist", _stringval(oval));
}
void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
{
SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2);
- Raise_Error(_SC("comparsion between '%.50s' and '%.50s'"), _stringval(oval1), _stringval(oval2));
+ Raise_Error("comparsion between '%.50s' and '%.50s'", _stringval(oval1), _stringval(oval2));
}
void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type)
{
- SQObjectPtr exptypes = SQString::Create(_ss(this), _SC(""), -1);
+ SQObjectPtr exptypes = SQString::Create(_ss(this), "", -1);
SQInteger found = 0;
for(SQInteger i=0; i<16; i++)
{
SQInteger mask = 0x00000001 << i;
if(typemask & (mask)) {
- if(found>0) StringCat(exptypes,SQString::Create(_ss(this), _SC("|"), -1), exptypes);
+ if(found>0) StringCat(exptypes,SQString::Create(_ss(this), "|", -1), exptypes);
found ++;
StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes);
}
}
- Raise_Error(_SC("parameter %d has an invalid type '%s' ; expected: '%s'"), nparam, IdType2Name((SQObjectType)type), _stringval(exptypes));
+ Raise_Error("parameter %d has an invalid type '%s' ; expected: '%s'", nparam, IdType2Name((SQObjectType)type), _stringval(exptypes));
}
diff --git a/src/3rdparty/squirrel/squirrel/sqfuncproto.h b/src/3rdparty/squirrel/squirrel/sqfuncproto.h
index faac9e925a..e58ccd2994 100644
--- a/src/3rdparty/squirrel/squirrel/sqfuncproto.h
+++ b/src/3rdparty/squirrel/squirrel/sqfuncproto.h
@@ -7,13 +7,13 @@
enum SQOuterType {
otLOCAL = 0,
otSYMBOL = 1,
- otOUTER = 2
+ otOUTER = 2,
};
struct SQOuterVar
{
- SQOuterVar(){}
+ SQOuterVar() : _type(otLOCAL) {}
SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
{
_name = name;
@@ -33,7 +33,7 @@ struct SQOuterVar
struct SQLocalVarInfo
{
- SQLocalVarInfo():_start_op(0),_end_op(0){}
+ SQLocalVarInfo():_start_op(0),_end_op(0), _pos(0){}
SQLocalVarInfo(const SQLocalVarInfo &lvi)
{
_name=lvi._name;
@@ -73,9 +73,37 @@ typedef sqvector SQLineInfoVec;
struct SQFunctionProto : public SQRefCounted
{
private:
- SQFunctionProto(){
- _stacksize=0;
- _bgenerator=false;}
+ SQFunctionProto(SQInteger ninstructions,
+ SQInteger nliterals,SQInteger nparameters,
+ SQInteger nfunctions,SQInteger noutervalues,
+ SQInteger nlineinfos,SQInteger nlocalvarinfos,SQInteger ndefaultparams)
+ {
+ _stacksize=0;
+ _bgenerator=false;
+ _varparams = false;
+ _ninstructions = ninstructions;
+ _literals = (SQObjectPtr*)&_instructions[ninstructions];
+ _nliterals = nliterals;
+ _parameters = (SQObjectPtr*)&_literals[nliterals];
+ _nparameters = nparameters;
+ _functions = (SQObjectPtr*)&_parameters[nparameters];
+ _nfunctions = nfunctions;
+ _outervalues = (SQOuterVar*)&_functions[nfunctions];
+ _noutervalues = noutervalues;
+ _lineinfos = (SQLineInfo *)&_outervalues[noutervalues];
+ _nlineinfos = nlineinfos;
+ _localvarinfos = (SQLocalVarInfo *)&_lineinfos[nlineinfos];
+ _nlocalvarinfos = nlocalvarinfos;
+ _defaultparams = (SQInteger *)&_localvarinfos[nlocalvarinfos];
+ _ndefaultparams = ndefaultparams;
+
+ _CONSTRUCT_VECTOR(SQObjectPtr,_nliterals,_literals);
+ _CONSTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters);
+ _CONSTRUCT_VECTOR(SQObjectPtr,_nfunctions,_functions);
+ _CONSTRUCT_VECTOR(SQOuterVar,_noutervalues,_outervalues);
+ //_CONSTRUCT_VECTOR(SQLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
+ _CONSTRUCT_VECTOR(SQLocalVarInfo,_nlocalvarinfos,_localvarinfos);
+ }
public:
static SQFunctionProto *Create(SQInteger ninstructions,
SQInteger nliterals,SQInteger nparameters,
@@ -85,29 +113,7 @@ public:
SQFunctionProto *f;
//I compact the whole class and members in a single memory allocation
f = (SQFunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
- new (f) SQFunctionProto;
- f->_ninstructions = ninstructions;
- f->_literals = (SQObjectPtr*)&f->_instructions[ninstructions];
- f->_nliterals = nliterals;
- f->_parameters = (SQObjectPtr*)&f->_literals[nliterals];
- f->_nparameters = nparameters;
- f->_functions = (SQObjectPtr*)&f->_parameters[nparameters];
- f->_nfunctions = nfunctions;
- f->_outervalues = (SQOuterVar*)&f->_functions[nfunctions];
- f->_noutervalues = noutervalues;
- f->_lineinfos = (SQLineInfo *)&f->_outervalues[noutervalues];
- f->_nlineinfos = nlineinfos;
- f->_localvarinfos = (SQLocalVarInfo *)&f->_lineinfos[nlineinfos];
- f->_nlocalvarinfos = nlocalvarinfos;
- f->_defaultparams = (SQInteger *)&f->_localvarinfos[nlocalvarinfos];
- f->_ndefaultparams = ndefaultparams;
-
- _CONSTRUCT_VECTOR(SQObjectPtr,f->_nliterals,f->_literals);
- _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters);
- _CONSTRUCT_VECTOR(SQObjectPtr,f->_nfunctions,f->_functions);
- _CONSTRUCT_VECTOR(SQOuterVar,f->_noutervalues,f->_outervalues);
- //_CONSTRUCT_VECTOR(SQLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers
- _CONSTRUCT_VECTOR(SQLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
+ new (f) SQFunctionProto(ninstructions, nliterals, nparameters, nfunctions, noutervalues, nlineinfos, nlocalvarinfos, ndefaultparams);
return f;
}
void Release(){
diff --git a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp
index b4f3541731..5415b566e8 100644
--- a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp
@@ -1,6 +1,9 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include "sqpcheader.h"
#include "sqcompiler.h"
#include "sqfuncproto.h"
@@ -9,84 +12,82 @@
#include "sqopcodes.h"
#include "sqfuncstate.h"
+#include "../../../safeguards.h"
+
#ifdef _DEBUG_DUMP
SQInstructionDesc g_InstrDesc[]={
- {_SC("_OP_LINE")},
- {_SC("_OP_LOAD")},
- {_SC("_OP_LOADINT")},
- {_SC("_OP_LOADFLOAT")},
- {_SC("_OP_DLOAD")},
- {_SC("_OP_TAILCALL")},
- {_SC("_OP_CALL")},
- {_SC("_OP_PREPCALL")},
- {_SC("_OP_PREPCALLK")},
- {_SC("_OP_GETK")},
- {_SC("_OP_MOVE")},
- {_SC("_OP_NEWSLOT")},
- {_SC("_OP_DELETE")},
- {_SC("_OP_SET")},
- {_SC("_OP_GET")},
- {_SC("_OP_EQ")},
- {_SC("_OP_NE")},
- {_SC("_OP_ARITH")},
- {_SC("_OP_BITW")},
- {_SC("_OP_RETURN")},
- {_SC("_OP_LOADNULLS")},
- {_SC("_OP_LOADROOTTABLE")},
- {_SC("_OP_LOADBOOL")},
- {_SC("_OP_DMOVE")},
- {_SC("_OP_JMP")},
- {_SC("_OP_JNZ")},
- {_SC("_OP_JZ")},
- {_SC("_OP_LOADFREEVAR")},
- {_SC("_OP_VARGC")},
- {_SC("_OP_GETVARGV")},
- {_SC("_OP_NEWTABLE")},
- {_SC("_OP_NEWARRAY")},
- {_SC("_OP_APPENDARRAY")},
- {_SC("_OP_GETPARENT")},
- {_SC("_OP_COMPARITH")},
- {_SC("_OP_COMPARITHL")},
- {_SC("_OP_INC")},
- {_SC("_OP_INCL")},
- {_SC("_OP_PINC")},
- {_SC("_OP_PINCL")},
- {_SC("_OP_CMP")},
- {_SC("_OP_EXISTS")},
- {_SC("_OP_INSTANCEOF")},
- {_SC("_OP_AND")},
- {_SC("_OP_OR")},
- {_SC("_OP_NEG")},
- {_SC("_OP_NOT")},
- {_SC("_OP_BWNOT")},
- {_SC("_OP_CLOSURE")},
- {_SC("_OP_YIELD")},
- {_SC("_OP_RESUME")},
- {_SC("_OP_FOREACH")},
- {_SC("_OP_POSTFOREACH")},
- {_SC("_OP_DELEGATE")},
- {_SC("_OP_CLONE")},
- {_SC("_OP_TYPEOF")},
- {_SC("_OP_PUSHTRAP")},
- {_SC("_OP_POPTRAP")},
- {_SC("_OP_THROW")},
- {_SC("_OP_CLASS")},
- {_SC("_OP_NEWSLOTA")},
- {_SC("_OP_SCOPE_END")}
+ {"_OP_LINE"},
+ {"_OP_LOAD"},
+ {"_OP_LOADINT"},
+ {"_OP_LOADFLOAT"},
+ {"_OP_DLOAD"},
+ {"_OP_TAILCALL"},
+ {"_OP_CALL"},
+ {"_OP_PREPCALL"},
+ {"_OP_PREPCALLK"},
+ {"_OP_GETK"},
+ {"_OP_MOVE"},
+ {"_OP_NEWSLOT"},
+ {"_OP_DELETE"},
+ {"_OP_SET"},
+ {"_OP_GET"},
+ {"_OP_EQ"},
+ {"_OP_NE"},
+ {"_OP_ARITH"},
+ {"_OP_BITW"},
+ {"_OP_RETURN"},
+ {"_OP_LOADNULLS"},
+ {"_OP_LOADROOTTABLE"},
+ {"_OP_LOADBOOL"},
+ {"_OP_DMOVE"},
+ {"_OP_JMP"},
+ {"_OP_JNZ"},
+ {"_OP_JZ"},
+ {"_OP_LOADFREEVAR"},
+ {"_OP_VARGC"},
+ {"_OP_GETVARGV"},
+ {"_OP_NEWTABLE"},
+ {"_OP_NEWARRAY"},
+ {"_OP_APPENDARRAY"},
+ {"_OP_GETPARENT"},
+ {"_OP_COMPARITH"},
+ {"_OP_COMPARITHL"},
+ {"_OP_INC"},
+ {"_OP_INCL"},
+ {"_OP_PINC"},
+ {"_OP_PINCL"},
+ {"_OP_CMP"},
+ {"_OP_EXISTS"},
+ {"_OP_INSTANCEOF"},
+ {"_OP_AND"},
+ {"_OP_OR"},
+ {"_OP_NEG"},
+ {"_OP_NOT"},
+ {"_OP_BWNOT"},
+ {"_OP_CLOSURE"},
+ {"_OP_YIELD"},
+ {"_OP_RESUME"},
+ {"_OP_FOREACH"},
+ {"_OP_POSTFOREACH"},
+ {"_OP_DELEGATE"},
+ {"_OP_CLONE"},
+ {"_OP_TYPEOF"},
+ {"_OP_PUSHTRAP"},
+ {"_OP_POPTRAP"},
+ {"_OP_THROW"},
+ {"_OP_CLASS"},
+ {"_OP_NEWSLOTA"},
+ {"_OP_SCOPE_END"}
};
#endif
void DumpLiteral(SQObjectPtr &o)
{
switch(type(o)){
- case OT_STRING: scprintf(_SC("\"%s\""),_stringval(o));break;
- case OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break;
-#if defined(_SQ64)
- case OT_INTEGER: scprintf(_SC("{%ld}"),_integer(o));break;
-#else
- case OT_INTEGER: scprintf(_SC("{%d}"),_integer(o));break;
-#endif
- case OT_BOOL: scprintf(_SC("%s"),_integer(o)?_SC("true"):_SC("false"));break;
- default: scprintf(_SC("(%s %p)"),GetTypeName(o),(void*)_rawval(o));break; break; //shut up compiler
+ case OT_STRING: printf("\"%s\"",_stringval(o));break;
+ case OT_FLOAT: printf("{%f}",_float(o));break;
+ case OT_INTEGER: printf("{" OTTD_PRINTF64 "}",_integer(o));break;
+ case OT_BOOL: printf("%s",_integer(o)?"true":"false");break;
+ default: printf("(%s %p)",GetTypeName(o),(void*)_rawval(o));break; break; //shut up compiler
}
}
@@ -119,11 +120,11 @@ void SQFuncState::Dump(SQFunctionProto *func)
{
SQUnsignedInteger n=0,i;
SQInteger si;
- scprintf(_SC("SQInstruction sizeof %d\n"),sizeof(SQInstruction));
- scprintf(_SC("SQObject sizeof %d\n"),sizeof(SQObject));
- scprintf(_SC("--------------------------------------------------------------------\n"));
- scprintf(_SC("*****FUNCTION [%s]\n"),type(func->_name)==OT_STRING?_stringval(func->_name):_SC("unknown"));
- scprintf(_SC("-----LITERALS\n"));
+ printf("SQInstruction sizeof %d\n",sizeof(SQInstruction));
+ printf("SQObject sizeof %d\n",sizeof(SQObject));
+ printf("--------------------------------------------------------------------\n");
+ printf("*****FUNCTION [%s]\n",type(func->_name)==OT_STRING?_stringval(func->_name):"unknown");
+ printf("-----LITERALS\n");
SQObjectPtr refidx,key,val;
SQInteger idx;
SQObjectPtrVec templiterals;
@@ -133,43 +134,43 @@ void SQFuncState::Dump(SQFunctionProto *func)
templiterals[_integer(val)]=key;
}
for(i=0;i>\n"));
+ printf("<>\n");
n=0;
for(i=0;i<_parameters.size();i++){
- scprintf(_SC("[%d] "),n);
+ printf("[%d] ",n);
DumpLiteral(_parameters[i]);
- scprintf(_SC("\n"));
+ printf("\n");
n++;
}
- scprintf(_SC("-----LOCALS\n"));
+ printf("-----LOCALS\n");
for(si=0;si_nlocalvarinfos;si++){
SQLocalVarInfo lvi=func->_localvarinfos[si];
- scprintf(_SC("[%d] %s \t%d %d\n"),lvi._pos,_stringval(lvi._name),lvi._start_op,lvi._end_op);
+ printf("[%d] %s \t%d %d\n",lvi._pos,_stringval(lvi._name),lvi._start_op,lvi._end_op);
n++;
}
- scprintf(_SC("-----LINE INFO\n"));
+ printf("-----LINE INFO\n");
for(i=0;i<_lineinfos.size();i++){
SQLineInfo li=_lineinfos[i];
- scprintf(_SC("op [%d] line [%d] \n"),li._op,li._line);
+ printf("op [%d] line [%d] \n",li._op,li._line);
n++;
}
- scprintf(_SC("-----dump\n"));
+ printf("-----dump\n");
n=0;
for(i=0;i<_instructions.size();i++){
SQInstruction &inst=_instructions[i];
if(inst.op==_OP_LOAD || inst.op==_OP_DLOAD || inst.op==_OP_PREPCALLK || inst.op==_OP_GETK ){
SQInteger lidx = inst._arg1;
- scprintf(_SC("[%03d] %15s %d "),n,g_InstrDesc[inst.op].name,inst._arg0);
+ printf("[%03d] %15s %d ",n,g_InstrDesc[inst.op].name,inst._arg0);
if(lidx >= 0xFFFFFFFF)
- scprintf(_SC("null"));
+ printf("null");
else {
SQInteger refidx;
SQObjectPtr val,key,refo;
@@ -179,13 +180,13 @@ void SQFuncState::Dump(SQFunctionProto *func)
DumpLiteral(key);
}
if(inst.op != _OP_DLOAD) {
- scprintf(_SC(" %d %d \n"),inst._arg2,inst._arg3);
+ printf(" %d %d \n",inst._arg2,inst._arg3);
}
else {
- scprintf(_SC(" %d "),inst._arg2);
+ printf(" %d ",inst._arg2);
lidx = inst._arg3;
if(lidx >= 0xFFFFFFFF)
- scprintf(_SC("null"));
+ printf("null");
else {
SQInteger refidx;
SQObjectPtr val,key,refo;
@@ -193,23 +194,23 @@ void SQFuncState::Dump(SQFunctionProto *func)
refo = refidx;
}
DumpLiteral(key);
- scprintf(_SC("\n"));
+ printf("\n");
}
}
}
else if(inst.op==_OP_LOADFLOAT) {
- scprintf(_SC("[%03d] %15s %d %f %d %d\n"),n,g_InstrDesc[inst.op].name,inst._arg0,*((SQFloat*)&inst._arg1),inst._arg2,inst._arg3);
+ printf("[%03d] %15s %d %f %d %d\n",n,g_InstrDesc[inst.op].name,inst._arg0,*((SQFloat*)&inst._arg1),inst._arg2,inst._arg3);
}
else if(inst.op==_OP_ARITH){
- scprintf(_SC("[%03d] %15s %d %d %d %c\n"),n,g_InstrDesc[inst.op].name,inst._arg0,inst._arg1,inst._arg2,inst._arg3);
+ printf("[%03d] %15s %d %d %d %c\n",n,g_InstrDesc[inst.op].name,inst._arg0,inst._arg1,inst._arg2,inst._arg3);
}
else
- scprintf(_SC("[%03d] %15s %d %d %d %d\n"),n,g_InstrDesc[inst.op].name,inst._arg0,inst._arg1,inst._arg2,inst._arg3);
+ printf("[%03d] %15s %d %d %d %d\n",n,g_InstrDesc[inst.op].name,inst._arg0,inst._arg1,inst._arg2,inst._arg3);
n++;
}
- scprintf(_SC("-----\n"));
- scprintf(_SC("stack size[%d]\n"),func->_stacksize);
- scprintf(_SC("--------------------------------------------------------------------\n\n"));
+ printf("-----\n");
+ printf("stack size[%d]\n",func->_stacksize);
+ printf("--------------------------------------------------------------------\n\n");
}
#endif
@@ -233,7 +234,7 @@ SQInteger SQFuncState::GetConstant(const SQObject &cons)
_nliterals++;
if(_nliterals > MAX_LITERALS) {
val.Null();
- Error(_SC("internal compiler error: too many literals"));
+ Error("internal compiler error: too many literals");
}
}
return _integer(val);
@@ -262,7 +263,7 @@ SQInteger SQFuncState::AllocStackPos()
SQInteger npos=_vlocals.size();
_vlocals.push_back(SQLocalVarInfo());
if(_vlocals.size()>((SQUnsignedInteger)_stacksize)) {
- if(_stacksize>MAX_FUNC_STACKSIZE) Error(_SC("internal compiler error: too many locals"));
+ if(_stacksize>MAX_FUNC_STACKSIZE) Error("internal compiler error: too many locals");
_stacksize=_vlocals.size();
}
return npos;
@@ -418,7 +419,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
break;
case _OP_GET:
if( pi.op == _OP_LOAD && pi._arg0 == i._arg2 && (!IsLocal(pi._arg0))){
- pi._arg1 = pi._arg1;
pi._arg2 = (unsigned char)i._arg1;
pi.op = _OP_GETK;
pi._arg0 = i._arg0;
@@ -430,7 +430,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
if( pi.op == _OP_LOAD && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){
pi.op = _OP_PREPCALLK;
pi._arg0 = i._arg0;
- pi._arg1 = pi._arg1;
pi._arg2 = i._arg2;
pi._arg3 = i._arg3;
return;
@@ -440,7 +439,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
if(pi.op == _OP_LOAD && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){
pi.op = _OP_APPENDARRAY;
pi._arg0 = i._arg0;
- pi._arg1 = pi._arg1;
pi._arg2 = MAX_FUNC_STACKSIZE;
pi._arg3 = MAX_FUNC_STACKSIZE;
return;
@@ -475,7 +473,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
{
pi.op = i.op;
pi._arg0 = i._arg0;
- pi._arg1 = pi._arg1;
pi._arg2 = i._arg2;
pi._arg3 = MAX_FUNC_STACKSIZE;
return;
@@ -541,7 +538,7 @@ SQFunctionProto *SQFuncState::BuildProto()
for(SQUnsignedInteger no = 0; no < _lineinfos.size(); no++) f->_lineinfos[no] = _lineinfos[no];
for(SQUnsignedInteger no = 0; no < _defaultparams.size(); no++) f->_defaultparams[no] = _defaultparams[no];
- memcpy(f->_instructions,&_instructions[0],_instructions.size()*sizeof(SQInstruction));
+ memcpy(f->_instructions,&_instructions[0],(size_t)_instructions.size()*sizeof(SQInstruction));
f->_varparams = _varparams;
diff --git a/src/3rdparty/squirrel/squirrel/sqlexer.cpp b/src/3rdparty/squirrel/squirrel/sqlexer.cpp
index c03048e9a2..77c487a269 100644
--- a/src/3rdparty/squirrel/squirrel/sqlexer.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqlexer.cpp
@@ -1,30 +1,41 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include "sqpcheader.h"
#include
-#include
#include "sqtable.h"
#include "sqstring.h"
#include "sqcompiler.h"
#include "sqlexer.h"
+#include "../../../string_func.h"
+
+#include "../../../safeguards.h"
+
#define CUR_CHAR (_currdata)
#define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;}
#define IS_EOB() (CUR_CHAR <= SQUIRREL_EOB)
#define NEXT() {Next();_currentcolumn++;}
-#define INIT_TEMP_STRING() { _longstr.resize(0);}
-#define APPEND_CHAR(c) { _longstr.push_back(c);}
-#define TERMINATE_BUFFER() {_longstr.push_back(_SC('\0'));}
-#define ADD_KEYWORD(key,id) _keywords->NewSlot( SQString::Create(ss, _SC(#key)) ,SQInteger(id))
+#define ADD_KEYWORD(key,id) _keywords->NewSlot( SQString::Create(ss, #key) ,SQInteger(id))
-SQLexer::SQLexer(){}
SQLexer::~SQLexer()
{
_keywords->Release();
}
-void SQLexer::Init(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,CompilerErrorFunc efunc,void *ed)
+void SQLexer::APPEND_CHAR(WChar c)
+{
+ char buf[4];
+ size_t chars = Utf8Encode(buf, c);
+ for (size_t i = 0; i < chars; i++) {
+ _longstr.push_back(buf[i]);
+ }
+}
+
+SQLexer::SQLexer(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,CompilerErrorFunc efunc,void *ed)
{
_errfunc = efunc;
_errtarget = ed;
@@ -74,20 +85,26 @@ void SQLexer::Init(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,Compile
_lasttokenline = _currentline = 1;
_currentcolumn = 0;
_prevtoken = -1;
+ _curtoken = -1;
+
+ _svalue = NULL;
+ _nvalue = 0;
+ _fvalue = 0;
+
Next();
}
-void SQLexer::Error(const SQChar *err)
+NORETURN void SQLexer::Error(const SQChar *err)
{
_errfunc(_errtarget,err);
}
void SQLexer::Next()
{
- SQInteger t = _readf(_up);
- if(t > MAX_CHAR) Error(_SC("Invalid character"));
+ WChar t = _readf(_up);
+ if(t > MAX_CHAR) Error("Invalid character");
if(t != 0) {
- _currdata = (LexChar)t;
+ _currdata = t;
return;
}
_currdata = SQUIRREL_EOB;
@@ -110,9 +127,9 @@ void SQLexer::LexBlockComment()
bool done = false;
while(!done) {
switch(CUR_CHAR) {
- case _SC('*'): { NEXT(); if(CUR_CHAR == _SC('/')) { done = true; NEXT(); }}; continue;
- case _SC('\n'): _currentline++; NEXT(); continue;
- case SQUIRREL_EOB: Error(_SC("missing \"*/\" in comment"));
+ case '*': { NEXT(); if(CUR_CHAR == '/') { done = true; NEXT(); }}; continue;
+ case '\n': _currentline++; NEXT(); continue;
+ case SQUIRREL_EOB: Error("missing \"*/\" in comment");
default: NEXT();
}
}
@@ -123,136 +140,134 @@ SQInteger SQLexer::Lex()
_lasttokenline = _currentline;
while(CUR_CHAR != SQUIRREL_EOB) {
switch(CUR_CHAR){
- case _SC('\t'): case _SC('\r'): case _SC(' '): NEXT(); continue;
- case _SC('\n'):
+ case '\t': case '\r': case ' ': NEXT(); continue;
+ case '\n':
_currentline++;
_prevtoken=_curtoken;
- _curtoken=_SC('\n');
+ _curtoken='\n';
NEXT();
_currentcolumn=1;
continue;
- case _SC('/'):
+ case '/':
NEXT();
switch(CUR_CHAR){
- case _SC('*'):
+ case '*':
NEXT();
LexBlockComment();
continue;
- case _SC('/'):
- do { NEXT(); } while (CUR_CHAR != _SC('\n') && (!IS_EOB()));
+ case '/':
+ do { NEXT(); } while (CUR_CHAR != '\n' && (!IS_EOB()));
continue;
- case _SC('='):
+ case '=':
NEXT();
RETURN_TOKEN(TK_DIVEQ);
- continue;
- case _SC('>'):
+ case '>':
NEXT();
RETURN_TOKEN(TK_ATTR_CLOSE);
- continue;
default:
RETURN_TOKEN('/');
}
- case _SC('='):
+ case '=':
NEXT();
- if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('=') }
+ if (CUR_CHAR != '='){ RETURN_TOKEN('=') }
else { NEXT(); RETURN_TOKEN(TK_EQ); }
- case _SC('<'):
+ case '<':
NEXT();
- if ( CUR_CHAR == _SC('=') ) { NEXT(); RETURN_TOKEN(TK_LE) }
- else if ( CUR_CHAR == _SC('-') ) { NEXT(); RETURN_TOKEN(TK_NEWSLOT); }
- else if ( CUR_CHAR == _SC('<') ) { NEXT(); RETURN_TOKEN(TK_SHIFTL); }
- else if ( CUR_CHAR == _SC('/') ) { NEXT(); RETURN_TOKEN(TK_ATTR_OPEN); }
- //else if ( CUR_CHAR == _SC('[') ) { NEXT(); ReadMultilineString(); RETURN_TOKEN(TK_STRING_LITERAL); }
+ if ( CUR_CHAR == '=' ) { NEXT(); RETURN_TOKEN(TK_LE) }
+ else if ( CUR_CHAR == '-' ) { NEXT(); RETURN_TOKEN(TK_NEWSLOT); }
+ else if ( CUR_CHAR == '<' ) { NEXT(); RETURN_TOKEN(TK_SHIFTL); }
+ else if ( CUR_CHAR == '/' ) { NEXT(); RETURN_TOKEN(TK_ATTR_OPEN); }
+ //else if ( CUR_CHAR == '[' ) { NEXT(); ReadMultilineString(); RETURN_TOKEN(TK_STRING_LITERAL); }
else { RETURN_TOKEN('<') }
- case _SC('>'):
+ case '>':
NEXT();
- if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_GE);}
- else if(CUR_CHAR == _SC('>')){
+ if (CUR_CHAR == '='){ NEXT(); RETURN_TOKEN(TK_GE);}
+ else if(CUR_CHAR == '>'){
NEXT();
- if(CUR_CHAR == _SC('>')){
+ if(CUR_CHAR == '>'){
NEXT();
RETURN_TOKEN(TK_USHIFTR);
}
RETURN_TOKEN(TK_SHIFTR);
}
else { RETURN_TOKEN('>') }
- case _SC('!'):
+ case '!':
NEXT();
- if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('!')}
+ if (CUR_CHAR != '='){ RETURN_TOKEN('!')}
else { NEXT(); RETURN_TOKEN(TK_NE); }
- case _SC('@'): {
+ case '@': {
SQInteger stype;
NEXT();
- if(CUR_CHAR != _SC('"'))
- Error(_SC("string expected"));
- if((stype=ReadString(_SC('"'),true))!=-1) {
+ if(CUR_CHAR != '"')
+ Error("string expected");
+ if((stype=ReadString('"',true))!=-1) {
RETURN_TOKEN(stype);
}
- Error(_SC("error parsing the string"));
+ Error("error parsing the string");
}
- case _SC('"'):
- case _SC('\''): {
+ case '"':
+ case '\'': {
SQInteger stype;
if((stype=ReadString(CUR_CHAR,false))!=-1){
RETURN_TOKEN(stype);
}
- Error(_SC("error parsing the string"));
+ Error("error parsing the string");
}
- case _SC('{'): case _SC('}'): case _SC('('): case _SC(')'): case _SC('['): case _SC(']'):
- case _SC(';'): case _SC(','): case _SC('?'): case _SC('^'): case _SC('~'):
+ case '{': case '}': case '(': case ')': case '[': case ']':
+ case ';': case ',': case '?': case '^': case '~':
{SQInteger ret = CUR_CHAR;
NEXT(); RETURN_TOKEN(ret); }
- case _SC('.'):
+ case '.':
NEXT();
- if (CUR_CHAR != _SC('.')){ RETURN_TOKEN('.') }
+ if (CUR_CHAR != '.'){ RETURN_TOKEN('.') }
NEXT();
- if (CUR_CHAR != _SC('.')){ Error(_SC("invalid token '..'")); }
+ if (CUR_CHAR != '.'){ Error("invalid token '..'"); }
NEXT();
RETURN_TOKEN(TK_VARPARAMS);
- case _SC('&'):
+ case '&':
NEXT();
- if (CUR_CHAR != _SC('&')){ RETURN_TOKEN('&') }
+ if (CUR_CHAR != '&'){ RETURN_TOKEN('&') }
else { NEXT(); RETURN_TOKEN(TK_AND); }
- case _SC('|'):
+ case '|':
NEXT();
- if (CUR_CHAR != _SC('|')){ RETURN_TOKEN('|') }
+ if (CUR_CHAR != '|'){ RETURN_TOKEN('|') }
else { NEXT(); RETURN_TOKEN(TK_OR); }
- case _SC(':'):
+ case ':':
NEXT();
- if (CUR_CHAR != _SC(':')){ RETURN_TOKEN(':') }
+ if (CUR_CHAR != ':'){ RETURN_TOKEN(':') }
else { NEXT(); RETURN_TOKEN(TK_DOUBLE_COLON); }
- case _SC('*'):
+ case '*':
NEXT();
- if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MULEQ);}
+ if (CUR_CHAR == '='){ NEXT(); RETURN_TOKEN(TK_MULEQ);}
else RETURN_TOKEN('*');
- case _SC('%'):
+ case '%':
NEXT();
- if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MODEQ);}
+ if (CUR_CHAR == '='){ NEXT(); RETURN_TOKEN(TK_MODEQ);}
else RETURN_TOKEN('%');
- case _SC('-'):
+ case '-':
NEXT();
- if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MINUSEQ);}
- else if (CUR_CHAR == _SC('-')){ NEXT(); RETURN_TOKEN(TK_MINUSMINUS);}
+ if (CUR_CHAR == '='){ NEXT(); RETURN_TOKEN(TK_MINUSEQ);}
+ else if (CUR_CHAR == '-'){ NEXT(); RETURN_TOKEN(TK_MINUSMINUS);}
else RETURN_TOKEN('-');
- case _SC('+'):
+ case '+':
NEXT();
- if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_PLUSEQ);}
- else if (CUR_CHAR == _SC('+')){ NEXT(); RETURN_TOKEN(TK_PLUSPLUS);}
+ if (CUR_CHAR == '='){ NEXT(); RETURN_TOKEN(TK_PLUSEQ);}
+ else if (CUR_CHAR == '+'){ NEXT(); RETURN_TOKEN(TK_PLUSPLUS);}
else RETURN_TOKEN('+');
case SQUIRREL_EOB:
return 0;
default:{
- if (scisdigit(CUR_CHAR)) {
+ if (isdigit(CUR_CHAR)) {
SQInteger ret = ReadNumber();
RETURN_TOKEN(ret);
}
- else if (scisalpha(CUR_CHAR) || CUR_CHAR == _SC('_')) {
+ else if (isalpha(CUR_CHAR) || CUR_CHAR == '_') {
SQInteger t = ReadID();
RETURN_TOKEN(t);
}
else {
SQInteger c = CUR_CHAR;
- if (sciscntrl((int)c)) Error(_SC("unexpected character(control)"));
+ if (iscntrl((int)c)) Error("unexpected character(control)");
NEXT();
RETURN_TOKEN(c);
}
@@ -273,7 +288,7 @@ SQInteger SQLexer::GetIDType(SQChar *s)
}
-SQInteger SQLexer::ReadString(SQChar ndelim,bool verbatim)
+SQInteger SQLexer::ReadString(WChar ndelim,bool verbatim)
{
INIT_TEMP_STRING();
NEXT();
@@ -282,22 +297,22 @@ SQInteger SQLexer::ReadString(SQChar ndelim,bool verbatim)
while(CUR_CHAR != ndelim) {
switch(CUR_CHAR) {
case SQUIRREL_EOB:
- Error(_SC("unfinished string"));
+ Error("unfinished string");
return -1;
- case _SC('\n'):
- if(!verbatim) Error(_SC("newline in a constant"));
+ case '\n':
+ if(!verbatim) Error("newline in a constant");
APPEND_CHAR(CUR_CHAR); NEXT();
_currentline++;
break;
- case _SC('\\'):
+ case '\\':
if(verbatim) {
APPEND_CHAR('\\'); NEXT();
}
else {
NEXT();
switch(CUR_CHAR) {
- case _SC('x'): NEXT(); {
- if(!isxdigit(CUR_CHAR)) Error(_SC("hexadecimal number expected"));
+ case 'x': NEXT(); {
+ if(!isxdigit(CUR_CHAR)) Error("hexadecimal number expected");
const SQInteger maxdigits = 4;
SQChar temp[maxdigits+1];
SQInteger n = 0;
@@ -308,22 +323,22 @@ SQInteger SQLexer::ReadString(SQChar ndelim,bool verbatim)
}
temp[n] = 0;
SQChar *sTemp;
- APPEND_CHAR((SQChar)scstrtoul(temp,&sTemp,16));
+ APPEND_CHAR((SQChar)strtoul(temp,&sTemp,16));
}
break;
- case _SC('t'): APPEND_CHAR(_SC('\t')); NEXT(); break;
- case _SC('a'): APPEND_CHAR(_SC('\a')); NEXT(); break;
- case _SC('b'): APPEND_CHAR(_SC('\b')); NEXT(); break;
- case _SC('n'): APPEND_CHAR(_SC('\n')); NEXT(); break;
- case _SC('r'): APPEND_CHAR(_SC('\r')); NEXT(); break;
- case _SC('v'): APPEND_CHAR(_SC('\v')); NEXT(); break;
- case _SC('f'): APPEND_CHAR(_SC('\f')); NEXT(); break;
- case _SC('0'): APPEND_CHAR(_SC('\0')); NEXT(); break;
- case _SC('\\'): APPEND_CHAR(_SC('\\')); NEXT(); break;
- case _SC('"'): APPEND_CHAR(_SC('"')); NEXT(); break;
- case _SC('\''): APPEND_CHAR(_SC('\'')); NEXT(); break;
+ case 't': APPEND_CHAR('\t'); NEXT(); break;
+ case 'a': APPEND_CHAR('\a'); NEXT(); break;
+ case 'b': APPEND_CHAR('\b'); NEXT(); break;
+ case 'n': APPEND_CHAR('\n'); NEXT(); break;
+ case 'r': APPEND_CHAR('\r'); NEXT(); break;
+ case 'v': APPEND_CHAR('\v'); NEXT(); break;
+ case 'f': APPEND_CHAR('\f'); NEXT(); break;
+ case '0': APPEND_CHAR('\0'); NEXT(); break;
+ case '\\': APPEND_CHAR('\\'); NEXT(); break;
+ case '"': APPEND_CHAR('"'); NEXT(); break;
+ case '\'': APPEND_CHAR('\''); NEXT(); break;
default:
- Error(_SC("unrecognised escaper char"));
+ Error("unrecognised escaper char");
break;
}
}
@@ -344,9 +359,9 @@ SQInteger SQLexer::ReadString(SQChar ndelim,bool verbatim)
}
TERMINATE_BUFFER();
SQInteger len = _longstr.size()-1;
- if(ndelim == _SC('\'')) {
- if(len == 0) Error(_SC("empty constant"));
- if(len > 1) Error(_SC("constant too long"));
+ if(ndelim == '\'') {
+ if(len == 0) Error("empty constant");
+ if(len > 1) Error("constant too long");
_nvalue = _longstr[0];
return TK_INTEGER;
}
@@ -359,8 +374,8 @@ void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res)
*res = 0;
while(*s != 0)
{
- if(scisdigit(*s)) *res = (*res)*16+((*s++)-'0');
- else if(scisxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10);
+ if(isdigit(*s)) *res = (*res)*16+((*s++)-'0');
+ else if(isxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10);
else { assert(0); }
}
}
@@ -374,7 +389,7 @@ void LexInteger(const SQChar *s,SQUnsignedInteger *res)
}
}
-SQInteger scisodigit(SQChar c) { return c >= _SC('0') && c <= _SC('7'); }
+SQInteger scisodigit(SQChar c) { return c >= '0' && c <= '7'; }
void LexOctal(const SQChar *s,SQUnsignedInteger *res)
{
@@ -401,14 +416,14 @@ SQInteger SQLexer::ReadNumber()
SQChar *sTemp;
INIT_TEMP_STRING();
NEXT();
- if(firstchar == _SC('0') && (toupper(CUR_CHAR) == _SC('X') || scisodigit(CUR_CHAR)) ) {
+ if(firstchar == '0' && (toupper(CUR_CHAR) == 'X' || scisodigit(CUR_CHAR)) ) {
if(scisodigit(CUR_CHAR)) {
type = TOCTAL;
while(scisodigit(CUR_CHAR)) {
APPEND_CHAR(CUR_CHAR);
NEXT();
}
- if(scisdigit(CUR_CHAR)) Error(_SC("invalid octal number"));
+ if(isdigit(CUR_CHAR)) Error("invalid octal number");
}
else {
NEXT();
@@ -417,15 +432,15 @@ SQInteger SQLexer::ReadNumber()
APPEND_CHAR(CUR_CHAR);
NEXT();
}
- if(_longstr.size() > MAX_HEX_DIGITS) Error(_SC("too many digits for an Hex number"));
+ if(_longstr.size() > MAX_HEX_DIGITS) Error("too many digits for an Hex number");
}
}
else {
APPEND_CHAR((int)firstchar);
- while (CUR_CHAR == _SC('.') || scisdigit(CUR_CHAR) || isexponent(CUR_CHAR)) {
- if(CUR_CHAR == _SC('.') || isexponent(CUR_CHAR)) type = TFLOAT;
+ while (CUR_CHAR == '.' || isdigit(CUR_CHAR) || isexponent(CUR_CHAR)) {
+ if(CUR_CHAR == '.' || isexponent(CUR_CHAR)) type = TFLOAT;
if(isexponent(CUR_CHAR)) {
- if(type != TFLOAT) Error(_SC("invalid numeric format"));
+ if(type != TFLOAT) Error("invalid numeric format");
type = TSCIENTIFIC;
APPEND_CHAR(CUR_CHAR);
NEXT();
@@ -433,7 +448,7 @@ SQInteger SQLexer::ReadNumber()
APPEND_CHAR(CUR_CHAR);
NEXT();
}
- if(!scisdigit(CUR_CHAR)) Error(_SC("exponent expected"));
+ if(!isdigit(CUR_CHAR)) Error("exponent expected");
}
APPEND_CHAR(CUR_CHAR);
@@ -444,7 +459,7 @@ SQInteger SQLexer::ReadNumber()
switch(type) {
case TSCIENTIFIC:
case TFLOAT:
- _fvalue = (SQFloat)scstrtod(&_longstr[0],&sTemp);
+ _fvalue = (SQFloat)strtod(&_longstr[0],&sTemp);
return TK_FLOAT;
case TINT:
LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue);
@@ -466,7 +481,7 @@ SQInteger SQLexer::ReadID()
do {
APPEND_CHAR(CUR_CHAR);
NEXT();
- } while(scisalnum(CUR_CHAR) || CUR_CHAR == _SC('_'));
+ } while(isalnum(CUR_CHAR) || CUR_CHAR == '_');
TERMINATE_BUFFER();
res = GetIDType(&_longstr[0]);
if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR) {
diff --git a/src/3rdparty/squirrel/squirrel/sqlexer.h b/src/3rdparty/squirrel/squirrel/sqlexer.h
index 1d81ab3c8b..b53b309d6b 100644
--- a/src/3rdparty/squirrel/squirrel/sqlexer.h
+++ b/src/3rdparty/squirrel/squirrel/sqlexer.h
@@ -2,25 +2,26 @@
#ifndef _SQLEXER_H_
#define _SQLEXER_H_
-typedef unsigned short LexChar;
-
struct SQLexer
{
- SQLexer();
~SQLexer();
- void Init(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up,CompilerErrorFunc efunc,void *ed);
- void Error(const SQChar *err);
+ SQLexer(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up,CompilerErrorFunc efunc,void *ed);
+ NORETURN void Error(const SQChar *err);
SQInteger Lex();
const SQChar *Tok2Str(SQInteger tok);
private:
SQInteger GetIDType(SQChar *s);
- SQInteger ReadString(SQChar ndelim,bool verbatim);
+ SQInteger ReadString(WChar ndelim,bool verbatim);
SQInteger ReadNumber();
void LexBlockComment();
SQInteger ReadID();
void Next();
SQInteger _curtoken;
SQTable *_keywords;
+ void INIT_TEMP_STRING() { _longstr.resize(0); }
+ void APPEND_CHAR(WChar c);
+ void TERMINATE_BUFFER() { _longstr.push_back('\0'); }
+
public:
SQInteger _prevtoken;
SQInteger _currentline;
@@ -31,7 +32,7 @@ public:
SQFloat _fvalue;
SQLEXREADFUNC _readf;
SQUserPointer _up;
- LexChar _currdata;
+ WChar _currdata;
SQSharedState *_sharedstate;
sqvector _longstr;
CompilerErrorFunc _errfunc;
diff --git a/src/3rdparty/squirrel/squirrel/sqmem.cpp b/src/3rdparty/squirrel/squirrel/sqmem.cpp
index 6faf8165ae..5c1b3966aa 100644
--- a/src/3rdparty/squirrel/squirrel/sqmem.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqmem.cpp
@@ -1,9 +1,16 @@
/*
- see copyright notice in squirrel.h
-*/
-#include "sqpcheader.h"
-void *sq_vm_malloc(SQUnsignedInteger size){ return malloc(size); }
+ * see copyright notice in squirrel.h
+ */
-void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return realloc(p, size); }
+#include "../../../stdafx.h"
+
+#include "sqpcheader.h"
+
+#include "../../../core/alloc_func.hpp"
+#include "../../../safeguards.h"
+
+void *sq_vm_malloc(SQUnsignedInteger size){ return MallocT((size_t)size); }
+
+void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return ReallocT(static_cast(p), (size_t)size); }
void sq_vm_free(void *p, SQUnsignedInteger size){ free(p); }
diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp
index c19e71fa9b..d48baca1e9 100644
--- a/src/3rdparty/squirrel/squirrel/sqobject.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp
@@ -1,6 +1,9 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include "sqpcheader.h"
#include "sqvm.h"
#include "sqstring.h"
@@ -11,30 +14,32 @@
#include "sqclass.h"
#include "sqclosure.h"
+#include "../../../safeguards.h"
+
const SQChar *IdType2Name(SQObjectType type)
{
switch(_RAW_TYPE(type))
{
- case _RT_NULL:return _SC("null");
- case _RT_INTEGER:return _SC("integer");
- case _RT_FLOAT:return _SC("float");
- case _RT_BOOL:return _SC("bool");
- case _RT_STRING:return _SC("string");
- case _RT_TABLE:return _SC("table");
- case _RT_ARRAY:return _SC("array");
- case _RT_GENERATOR:return _SC("generator");
+ case _RT_NULL:return "null";
+ case _RT_INTEGER:return "integer";
+ case _RT_FLOAT:return "float";
+ case _RT_BOOL:return "bool";
+ case _RT_STRING:return "string";
+ case _RT_TABLE:return "table";
+ case _RT_ARRAY:return "array";
+ case _RT_GENERATOR:return "generator";
case _RT_CLOSURE:
case _RT_NATIVECLOSURE:
- return _SC("function");
+ return "function";
case _RT_USERDATA:
case _RT_USERPOINTER:
- return _SC("userdata");
- case _RT_THREAD: return _SC("thread");
- case _RT_FUNCPROTO: return _SC("function");
- case _RT_CLASS: return _SC("class");
- case _RT_INSTANCE: return _SC("instance");
- case _RT_WEAKREF: return _SC("weakref");
+ return "userdata";
+ case _RT_THREAD: return "thread";
+ case _RT_FUNCPROTO: return "function";
+ case _RT_CLASS: return "class";
+ case _RT_INSTANCE: return "instance";
+ case _RT_WEAKREF: return "weakref";
default:
return NULL;
}
@@ -130,8 +135,8 @@ bool SQDelegable::SetDelegate(SQTable *mt)
bool SQGenerator::Yield(SQVM *v)
{
- if(_state==eSuspended) { v->Raise_Error(_SC("internal vm error, yielding dead generator")); return false;}
- if(_state==eDead) { v->Raise_Error(_SC("internal vm error, yielding a dead generator")); return false; }
+ if(_state==eSuspended) { v->Raise_Error("internal vm error, yielding dead generator"); return false;}
+ if(_state==eDead) { v->Raise_Error("internal vm error, yielding a dead generator"); return false; }
SQInteger size = v->_top-v->_stackbase;
_ci=*v->ci;
_stack.resize(size);
@@ -156,8 +161,8 @@ bool SQGenerator::Yield(SQVM *v)
bool SQGenerator::Resume(SQVM *v,SQInteger target)
{
SQInteger size=_stack.size();
- if(_state==eDead){ v->Raise_Error(_SC("resuming dead generator")); return false; }
- if(_state==eRunning){ v->Raise_Error(_SC("resuming active generator")); return false; }
+ if(_state==eDead){ v->Raise_Error("resuming dead generator"); return false; }
+ if(_state==eRunning){ v->Raise_Error("resuming active generator"); return false; }
SQInteger prevtop=v->_top-v->_stackbase;
PUSH_CALLINFO(v,_ci);
SQInteger oldstackbase=v->_stackbase;
@@ -184,7 +189,7 @@ bool SQGenerator::Resume(SQVM *v,SQInteger target)
v->ci->_prevstkbase = (SQInt32)(v->_stackbase - oldstackbase);
_state=eRunning;
if (type(v->_debughook) != OT_NULL && _rawval(v->_debughook) != _rawval(v->ci->_closure))
- v->CallDebugHook(_SC('c'));
+ v->CallDebugHook('c');
return true;
}
@@ -232,7 +237,7 @@ SQInteger SQFunctionProto::GetLine(SQInstruction *curr)
bool SafeWrite(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUserPointer dest,SQInteger size)
{
if(write(up,dest,size) != size) {
- v->Raise_Error(_SC("io error (write function failure)"));
+ v->Raise_Error("io error (write function failure)");
return false;
}
return true;
@@ -241,7 +246,7 @@ bool SafeWrite(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUserPointer de
bool SafeRead(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUserPointer dest,SQInteger size)
{
if(size && read(up,dest,size) != size) {
- v->Raise_Error(_SC("io error, read function failure, the origin stream could be corrupted/trucated"));
+ v->Raise_Error("io error, read function failure, the origin stream could be corrupted/trucated");
return false;
}
return true;
@@ -257,7 +262,7 @@ bool CheckTag(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQInteger tag)
SQInteger t;
_CHECK_IO(SafeRead(v,read,up,&t,sizeof(t)));
if(t != tag){
- v->Raise_Error(_SC("invalid or corrupted closure stream"));
+ v->Raise_Error("invalid or corrupted closure stream");
return false;
}
return true;
@@ -269,7 +274,7 @@ bool WriteObject(HSQUIRRELVM v,SQUserPointer up,SQWRITEFUNC write,SQObjectPtr &o
switch(type(o)){
case OT_STRING:
_CHECK_IO(SafeWrite(v,write,up,&_string(o)->_len,sizeof(SQInteger)));
- _CHECK_IO(SafeWrite(v,write,up,_stringval(o),rsl(_string(o)->_len)));
+ _CHECK_IO(SafeWrite(v,write,up,_stringval(o),_string(o)->_len));
break;
case OT_INTEGER:
_CHECK_IO(SafeWrite(v,write,up,&_integer(o),sizeof(SQInteger)));break;
@@ -278,7 +283,7 @@ bool WriteObject(HSQUIRRELVM v,SQUserPointer up,SQWRITEFUNC write,SQObjectPtr &o
case OT_NULL:
break;
default:
- v->Raise_Error(_SC("cannot serialize a %s"),GetTypeName(o));
+ v->Raise_Error("cannot serialize a %s",GetTypeName(o));
return false;
}
return true;
@@ -292,7 +297,7 @@ bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o)
case OT_STRING:{
SQInteger len;
_CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger)));
- _CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(rsl(len)),rsl(len)));
+ _CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(len),len));
o=SQString::Create(_ss(v),_ss(v)->GetScratchPad(-1),len);
}
break;
@@ -308,7 +313,7 @@ bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o)
o=_null_;
break;
default:
- v->Raise_Error(_SC("cannot serialize a %s"),IdType2Name(t));
+ v->Raise_Error("cannot serialize a %s",IdType2Name(t));
return false;
}
return true;
diff --git a/src/3rdparty/squirrel/squirrel/sqobject.h b/src/3rdparty/squirrel/squirrel/sqobject.h
index ac367ae02c..d71e515a8d 100644
--- a/src/3rdparty/squirrel/squirrel/sqobject.h
+++ b/src/3rdparty/squirrel/squirrel/sqobject.h
@@ -32,24 +32,24 @@ enum SQMetaMethod{
MT_LAST = 18
};
-#define MM_ADD _SC("_add")
-#define MM_SUB _SC("_sub")
-#define MM_MUL _SC("_mul")
-#define MM_DIV _SC("_div")
-#define MM_UNM _SC("_unm")
-#define MM_MODULO _SC("_modulo")
-#define MM_SET _SC("_set")
-#define MM_GET _SC("_get")
-#define MM_TYPEOF _SC("_typeof")
-#define MM_NEXTI _SC("_nexti")
-#define MM_CMP _SC("_cmp")
-#define MM_CALL _SC("_call")
-#define MM_CLONED _SC("_cloned")
-#define MM_NEWSLOT _SC("_newslot")
-#define MM_DELSLOT _SC("_delslot")
-#define MM_TOSTRING _SC("_tostring")
-#define MM_NEWMEMBER _SC("_newmember")
-#define MM_INHERITED _SC("_inherited")
+#define MM_ADD "_add"
+#define MM_SUB "_sub"
+#define MM_MUL "_mul"
+#define MM_DIV "_div"
+#define MM_UNM "_unm"
+#define MM_MODULO "_modulo"
+#define MM_SET "_set"
+#define MM_GET "_get"
+#define MM_TYPEOF "_typeof"
+#define MM_NEXTI "_nexti"
+#define MM_CMP "_cmp"
+#define MM_CALL "_call"
+#define MM_CLONED "_cloned"
+#define MM_NEWSLOT "_newslot"
+#define MM_DELSLOT "_delslot"
+#define MM_TOSTRING "_tostring"
+#define MM_NEWMEMBER "_newmember"
+#define MM_INHERITED "_inherited"
#define MINPOWER2 4
diff --git a/src/3rdparty/squirrel/squirrel/sqopcodes.h b/src/3rdparty/squirrel/squirrel/sqopcodes.h
index d20ef4f3f5..a9e4a8743c 100644
--- a/src/3rdparty/squirrel/squirrel/sqopcodes.h
+++ b/src/3rdparty/squirrel/squirrel/sqopcodes.h
@@ -92,8 +92,7 @@ struct SQInstructionDesc {
struct SQInstruction
{
- SQInstruction(){};
- SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
+ SQInstruction(SQOpcode _op=_OP_SCOPE_END,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
{ op = _op;
_arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1;
_arg2 = (unsigned char)a2;_arg3 = (unsigned char)a3;
diff --git a/src/3rdparty/squirrel/squirrel/sqpcheader.h b/src/3rdparty/squirrel/squirrel/sqpcheader.h
index db49f5e0d1..3cebdd11ac 100644
--- a/src/3rdparty/squirrel/squirrel/sqpcheader.h
+++ b/src/3rdparty/squirrel/squirrel/sqpcheader.h
@@ -6,10 +6,6 @@
#include
#endif
-#include
-#include
-#include
-#include
#include
//squirrel stuff
#include
diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp
index 45b533776a..35878e197b 100644
--- a/src/3rdparty/squirrel/squirrel/sqstate.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp
@@ -1,6 +1,9 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include "sqpcheader.h"
#include "sqopcodes.h"
#include "sqvm.h"
@@ -12,20 +15,14 @@
#include "squserdata.h"
#include "sqclass.h"
+#include "../../../safeguards.h"
+
SQObjectPtr _null_;
SQObjectPtr _true_(true);
SQObjectPtr _false_(false);
SQObjectPtr _one_((SQInteger)1);
SQObjectPtr _minusone_((SQInteger)-1);
-SQSharedState::SQSharedState()
-{
- _compilererrorhandler = NULL;
- _printfunc = NULL;
- _debuginfo = false;
- _notifyallexceptions = false;
-}
-
#define newsysstring(s) { \
_systemstrings->push_back(SQString::Create(this,s)); \
}
@@ -94,8 +91,12 @@ SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
return t;
}
-void SQSharedState::Init()
+SQSharedState::SQSharedState()
{
+ _compilererrorhandler = NULL;
+ _printfunc = NULL;
+ _debuginfo = false;
+ _notifyallexceptions = false;
_scratchpad=NULL;
_scratchpadsize=0;
#ifndef NO_GARBAGE_COLLECTOR
@@ -108,21 +109,21 @@ void SQSharedState::Init()
_metamethodsmap = SQTable::Create(this,MT_LAST-1);
//adding type strings to avoid memory trashing
//types names
- newsysstring(_SC("null"));
- newsysstring(_SC("table"));
- newsysstring(_SC("array"));
- newsysstring(_SC("closure"));
- newsysstring(_SC("string"));
- newsysstring(_SC("userdata"));
- newsysstring(_SC("integer"));
- newsysstring(_SC("float"));
- newsysstring(_SC("userpointer"));
- newsysstring(_SC("function"));
- newsysstring(_SC("generator"));
- newsysstring(_SC("thread"));
- newsysstring(_SC("class"));
- newsysstring(_SC("instance"));
- newsysstring(_SC("bool"));
+ newsysstring("null");
+ newsysstring("table");
+ newsysstring("array");
+ newsysstring("closure");
+ newsysstring("string");
+ newsysstring("userdata");
+ newsysstring("integer");
+ newsysstring("float");
+ newsysstring("userpointer");
+ newsysstring("function");
+ newsysstring("generator");
+ newsysstring("thread");
+ newsysstring("class");
+ newsysstring("instance");
+ newsysstring("bool");
//meta methods
newmetamethod(MM_ADD);
newmetamethod(MM_SUB);
@@ -143,7 +144,7 @@ void SQSharedState::Init()
newmetamethod(MM_NEWMEMBER);
newmetamethod(MM_INHERITED);
- _constructoridx = SQString::Create(this,_SC("constructor"));
+ _constructoridx = SQString::Create(this,"constructor");
_registry = SQTable::Create(this,0);
_consts = SQTable::Create(this,0);
_table_default_delegate = CreateDefaultDelegate(this,_table_default_delegate_funcz);
@@ -486,10 +487,10 @@ void RefTable::AllocNodes(SQUnsignedInteger size)
//////////////////////////////////////////////////////////////////////////
//SQStringTable
/*
-* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
-* http://www.lua.org/copyright.html#4
-* http://www.lua.org/source/4.0.1/src_lstring.c.html
-*/
+ * The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
+ * http://www.lua.org/copyright.html#4
+ * http://www.lua.org/source/4.0.1/src_lstring.c.html
+ */
SQStringTable::SQStringTable()
{
@@ -507,26 +508,22 @@ void SQStringTable::AllocNodes(SQInteger size)
{
_numofslots = size;
_strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
- memset(_strings,0,sizeof(SQString*)*_numofslots);
+ memset(_strings,0,sizeof(SQString*)*(size_t)_numofslots);
}
SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
{
if(len<0)
- len = (SQInteger)scstrlen(news);
- SQHash h = ::_hashstr(news,len)&(_numofslots-1);
+ len = (SQInteger)strlen(news);
+ SQHash h = ::_hashstr(news,(size_t)len)&(_numofslots-1);
SQString *s;
for (s = _strings[h]; s; s = s->_next){
- if(s->_len == len && (!memcmp(news,s->_val,rsl(len))))
+ if(s->_len == len && (!memcmp(news,s->_val,(size_t)len)))
return s; //found
}
- SQString *t=(SQString *)SQ_MALLOC(rsl(len)+sizeof(SQString));
- new (t) SQString;
- memcpy(t->_val,news,rsl(len));
- t->_val[len] = _SC('\0');
- t->_len = len;
- t->_hash = ::_hashstr(news,len);
+ SQString *t=(SQString *)SQ_MALLOC(len+sizeof(SQString));
+ new (t) SQString(news, len);
t->_next = _strings[h];
_strings[h] = t;
_slotused++;
@@ -535,6 +532,16 @@ SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
return t;
}
+SQString::SQString(const SQChar *news, SQInteger len)
+{
+ memcpy(_val,news,(size_t)len);
+ _val[len] = '\0';
+ _len = len;
+ _hash = ::_hashstr(news,(size_t)len);
+ _next = NULL;
+ _sharedstate = NULL;
+}
+
void SQStringTable::Resize(SQInteger size)
{
SQInteger oldsize=_numofslots;
@@ -568,7 +575,7 @@ void SQStringTable::Remove(SQString *bs)
_slotused--;
SQInteger slen = s->_len;
s->~SQString();
- SQ_FREE(s,sizeof(SQString) + rsl(slen));
+ SQ_FREE(s,sizeof(SQString) + slen);
return;
}
prev = s;
diff --git a/src/3rdparty/squirrel/squirrel/sqstate.h b/src/3rdparty/squirrel/squirrel/sqstate.h
index 302f68611a..da6bf9ae64 100644
--- a/src/3rdparty/squirrel/squirrel/sqstate.h
+++ b/src/3rdparty/squirrel/squirrel/sqstate.h
@@ -58,7 +58,6 @@ struct SQSharedState
{
SQSharedState();
~SQSharedState();
- void Init();
public:
SQChar* GetScratchPad(SQInteger size);
SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
@@ -123,12 +122,6 @@ private:
#define _instance_ddel _table(_sharedstate->_instance_default_delegate)
#define _weakref_ddel _table(_sharedstate->_weakref_default_delegate)
-#ifdef SQUNICODE //rsl REAL STRING LEN
-#define rsl(l) ((l)<<1)
-#else
-#define rsl(l) (l)
-#endif
-
extern SQObjectPtr _null_;
extern SQObjectPtr _true_;
extern SQObjectPtr _false_;
diff --git a/src/3rdparty/squirrel/squirrel/sqstring.h b/src/3rdparty/squirrel/squirrel/sqstring.h
index 14f09e1b0f..a5f298e1e2 100644
--- a/src/3rdparty/squirrel/squirrel/sqstring.h
+++ b/src/3rdparty/squirrel/squirrel/sqstring.h
@@ -13,7 +13,7 @@ inline SQHash _hashstr (const SQChar *s, size_t l)
struct SQString : public SQRefCounted
{
- SQString(){}
+ SQString(const SQChar *news, SQInteger len);
~SQString(){}
public:
static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 );
diff --git a/src/3rdparty/squirrel/squirrel/sqtable.cpp b/src/3rdparty/squirrel/squirrel/sqtable.cpp
index bb5feba3e7..60146fe738 100644
--- a/src/3rdparty/squirrel/squirrel/sqtable.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqtable.cpp
@@ -1,12 +1,17 @@
/*
-see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include "sqpcheader.h"
#include "sqvm.h"
#include "sqtable.h"
#include "sqfuncproto.h"
#include "sqclosure.h"
+#include "../../../safeguards.h"
+
SQTable::SQTable(SQSharedState *ss,SQInteger nInitialSize)
{
SQInteger pow2size=MINPOWER2;
diff --git a/src/3rdparty/squirrel/squirrel/sqtable.h b/src/3rdparty/squirrel/squirrel/sqtable.h
index 2b4a3d4de4..52d9ba41ab 100644
--- a/src/3rdparty/squirrel/squirrel/sqtable.h
+++ b/src/3rdparty/squirrel/squirrel/sqtable.h
@@ -2,10 +2,10 @@
#ifndef _SQTABLE_H_
#define _SQTABLE_H_
/*
-* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
-* http://www.lua.org/copyright.html#4
-* http://www.lua.org/source/4.0.1/src_ltable.c.html
-*/
+ * The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
+ * http://www.lua.org/copyright.html#4
+ * http://www.lua.org/source/4.0.1/src_ltable.c.html
+ */
#include "sqstring.h"
diff --git a/src/3rdparty/squirrel/squirrel/squserdata.h b/src/3rdparty/squirrel/squirrel/squserdata.h
index 8b6b431481..3bf1a9dbad 100644
--- a/src/3rdparty/squirrel/squirrel/squserdata.h
+++ b/src/3rdparty/squirrel/squirrel/squserdata.h
@@ -4,7 +4,8 @@
struct SQUserData : SQDelegable
{
- SQUserData(SQSharedState *ss){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); }
+ SQUserData(SQSharedState *ss, SQInteger size){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); _size = size; _typetag = 0;
+}
~SQUserData()
{
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);
@@ -13,9 +14,7 @@ struct SQUserData : SQDelegable
static SQUserData* Create(SQSharedState *ss, SQInteger size)
{
SQUserData* ud = (SQUserData*)SQ_MALLOC(sizeof(SQUserData)+(size-1));
- new (ud) SQUserData(ss);
- ud->_size = size;
- ud->_typetag = 0;
+ new (ud) SQUserData(ss, size);
return ud;
}
#ifndef NO_GARBAGE_COLLECTOR
diff --git a/src/3rdparty/squirrel/squirrel/squtils.h b/src/3rdparty/squirrel/squirrel/squtils.h
index 111a1c383a..28c6cbec2b 100644
--- a/src/3rdparty/squirrel/squirrel/squtils.h
+++ b/src/3rdparty/squirrel/squirrel/squtils.h
@@ -41,7 +41,7 @@ public:
size_t allocated_size = _allocated * sizeof(T);
_allocated = 0;
- for(SQUnsignedInteger i = 0; i < _size; i++)
+ for(size_t i = 0; i < _size; i++)
_vals[i].~T();
SQ_FREE(_vals, allocated_size);
}
@@ -61,7 +61,7 @@ public:
for(SQUnsignedInteger i = newsize; i < _size; i++) {
_vals[i].~T();
}
- _size = newsize;
+ _size = (size_t)newsize;
}
}
void shrinktofit() { if(_size > 4) { _realloc(_size); } }
@@ -90,7 +90,7 @@ public:
{
_vals[idx].~T();
if(idx < (_size - 1)) {
- memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
+ memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - (size_t)idx - 1));
}
_size--;
}
@@ -103,10 +103,10 @@ private:
{
newsize = (newsize > 0)?newsize:4;
_vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
- _allocated = newsize;
+ _allocated = (size_t)newsize;
}
- SQUnsignedInteger _size;
- SQUnsignedInteger _allocated;
+ size_t _size;
+ size_t _allocated;
};
#endif //_SQUTILS_H_
diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp
index c8f4db674a..973002b49d 100644
--- a/src/3rdparty/squirrel/squirrel/sqvm.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp
@@ -1,10 +1,12 @@
/*
- see copyright notice in squirrel.h
-*/
+ * see copyright notice in squirrel.h
+ */
+
+#include "../../../stdafx.h"
+
#include
#include "sqpcheader.h"
#include
-#include
#include "sqopcodes.h"
#include "sqfuncproto.h"
#include "sqvm.h"
@@ -15,6 +17,10 @@
#include "sqarray.h"
#include "sqclass.h"
+#include "../../../string_func.h"
+
+#include "../../../safeguards.h"
+
#define TOP() (_stack._vals[_top-1])
#define CLEARSTACK(_last_top) { if((_last_top) >= _top) ClearStack(_last_top); }
@@ -45,10 +51,10 @@ bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,con
case BW_SHIFTL: res = i1 << i2; break;
case BW_SHIFTR: res = i1 >> i2; break;
case BW_USHIFTR:res = (SQInteger)(*((SQUnsignedInteger*)&i1) >> i2); break;
- default: { Raise_Error(_SC("internal vm error bitwise op failed")); return false; }
+ default: { Raise_Error("internal vm error bitwise op failed"); return false; }
}
}
- else { Raise_Error(_SC("bitwise op between '%s' and '%s'"),GetTypeName(o1),GetTypeName(o2)); return false;}
+ else { Raise_Error("bitwise op between '%s' and '%s'",GetTypeName(o1),GetTypeName(o2)); return false;}
trg = res;
return true;
}
@@ -61,11 +67,11 @@ bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,
switch(op) {
case '+': res = i1 + i2; break;
case '-': res = i1 - i2; break;
- case '/': if(i2 == 0) { Raise_Error(_SC("division by zero")); return false; }
+ case '/': if(i2 == 0) { Raise_Error("division by zero"); return false; }
res = i1 / i2;
break;
case '*': res = i1 * i2; break;
- case '%': if(i2 == 0) { Raise_Error(_SC("modulo by zero")); return false; }
+ case '%': if(i2 == 0) { Raise_Error("modulo by zero"); return false; }
res = i1 % i2;
break;
default: res = 0xDEADBEEF;
@@ -88,7 +94,7 @@ bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,
if(!StringCat(o1, o2, trg)) return false;
}
else if(!ArithMetaMethod(op,o1,o2,trg)) {
- Raise_Error(_SC("arith op %c on between '%s' and '%s'"),op,GetTypeName(o1),GetTypeName(o2)); return false;
+ Raise_Error("arith op %c on between '%s' and '%s'",op,GetTypeName(o1),GetTypeName(o2)); return false;
}
}
return true;
@@ -109,6 +115,11 @@ SQVM::SQVM(SQSharedState *ss)
_can_suspend = false;
_in_stackoverflow = false;
_ops_till_suspend = 0;
+ _callsstack = NULL;
+ _callsstacksize = 0;
+ _alloccallsstacksize = 0;
+ _top = 0;
+ _stackbase = 0;
ci = NULL;
INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
}
@@ -137,11 +148,11 @@ bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr
{
SQMetaMethod mm;
switch(op){
- case _SC('+'): mm=MT_ADD; break;
- case _SC('-'): mm=MT_SUB; break;
- case _SC('/'): mm=MT_DIV; break;
- case _SC('*'): mm=MT_MUL; break;
- case _SC('%'): mm=MT_MODULO; break;
+ case '+': mm=MT_ADD; break;
+ case '-': mm=MT_SUB; break;
+ case '/': mm=MT_DIV; break;
+ case '*': mm=MT_MUL; break;
+ case '%': mm=MT_MODULO; break;
default: mm = MT_ADD; assert(0); break; //shutup compiler
}
if(is_delegable(o1) && _delegable(o1)->_delegate) {
@@ -173,7 +184,7 @@ bool SQVM::NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o)
}
default:break; //shutup compiler
}
- Raise_Error(_SC("attempt to negate a %s"), GetTypeName(o));
+ Raise_Error("attempt to negate a %s", GetTypeName(o));
return false;
}
@@ -185,7 +196,7 @@ bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result)
SQObjectPtr res;
switch(type(o1)){
case OT_STRING:
- _RET_SUCCEED(scstrcmp(_stringval(o1),_stringval(o2)));
+ _RET_SUCCEED(strcmp(_stringval(o1),_stringval(o2)));
case OT_INTEGER:
/* FS#3954: wrong integer comparison */
_RET_SUCCEED((_integer(o1)<_integer(o2))?-1:(_integer(o1)==_integer(o2))?0:1);
@@ -198,7 +209,7 @@ bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result)
Push(o1);Push(o2);
if(CallMetaMethod(_delegable(o1),MT_CMP,2,res)) {
if(type(res) != OT_INTEGER) {
- Raise_Error(_SC("_cmp must return an integer"));
+ Raise_Error("_cmp must return an integer");
return false;
}
_RET_SUCCEED(_integer(res))
@@ -251,22 +262,19 @@ bool SQVM::CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObject
void SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res)
{
+ char buf[64];
switch(type(o)) {
case OT_STRING:
res = o;
return;
case OT_FLOAT:
- scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),_SC("%g"),_float(o));
+ seprintf(buf, lastof(buf),"%g",_float(o));
break;
case OT_INTEGER:
-#if defined(_SQ64)
- scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),_SC("%ld"),_integer(o));
-#else
- scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),_SC("%d"),_integer(o));
-#endif
+ seprintf(buf, lastof(buf),OTTD_PRINTF64,_integer(o));
break;
case OT_BOOL:
- scsprintf(_sp(rsl(6)),_integer(o)?_SC("true"):_SC("false"));
+ seprintf(buf, lastof(buf),_integer(o)?"true":"false");
break;
case OT_TABLE:
case OT_USERDATA:
@@ -280,9 +288,9 @@ void SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res)
}
}
default:
- scsprintf(_sp(rsl(sizeof(void*)+20)),_SC("(%s : 0x%p)"),GetTypeName(o),(void*)_rawval(o));
+ seprintf(buf, lastof(buf),"(%s : 0x%p)",GetTypeName(o),(void*)_rawval(o));
}
- res = SQString::Create(_ss(this),_spval);
+ res = SQString::Create(_ss(this),buf);
}
@@ -292,9 +300,9 @@ bool SQVM::StringCat(const SQObjectPtr &str,const SQObjectPtr &obj,SQObjectPtr &
ToString(str, a);
ToString(obj, b);
SQInteger l = _string(a)->_len , ol = _string(b)->_len;
- SQChar *s = _sp(rsl(l + ol + 1));
- memcpy(s, _stringval(a), rsl(l));
- memcpy(s + l, _stringval(b), rsl(ol));
+ SQChar *s = _sp(l + ol + 1);
+ memcpy(s, _stringval(a), (size_t)l);
+ memcpy(s + l, _stringval(b), (size_t)ol);
dest = SQString::Create(_ss(this), _spval, l + ol);
return true;
}
@@ -350,7 +358,7 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege
else if(func->_varparams)
{
if (nargs < paramssize) {
- Raise_Error(_SC("wrong number of parameters"));
+ Raise_Error("wrong number of parameters");
return false;
}
for(SQInteger n = 0; n < nargs - paramssize; n++) {
@@ -359,7 +367,7 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege
}
}
else {
- Raise_Error(_SC("wrong number of parameters"));
+ Raise_Error("wrong number of parameters");
return false;
}
}
@@ -396,7 +404,7 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege
_top = newtop;
_stackbase = stackbase;
if (type(_debughook) != OT_NULL && _rawval(_debughook) != _rawval(ci->_closure))
- CallDebugHook(_SC('c'));
+ CallDebugHook('c');
return true;
}
@@ -404,7 +412,7 @@ bool SQVM::Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval)
{
if (type(_debughook) != OT_NULL && _rawval(_debughook) != _rawval(ci->_closure))
for(SQInteger i=0;i_ncalls;i++)
- CallDebugHook(_SC('r'));
+ CallDebugHook('r');
SQBool broot = ci->_root;
SQInteger last_top = _top;
@@ -470,9 +478,9 @@ bool SQVM::DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjec
SQRESULT SQVM::Suspend()
{
if (_suspended)
- return sq_throwerror(this, _SC("cannot suspend an already suspended vm"));
+ return sq_throwerror(this, "cannot suspend an already suspended vm");
if (_nnativecalls!=2)
- return sq_throwerror(this, _SC("cannot suspend through native calls/metamethods"));
+ return sq_throwerror(this, "cannot suspend through native calls/metamethods");
return SQ_SUSPEND_FLAG;
}
@@ -510,12 +518,12 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr
o4 = o2 = itr;
if(type(itr) == OT_NULL) _FINISH(exitpos);
if(!Get(o1, itr, o3, false,false)) {
- Raise_Error(_SC("_nexti returned an invalid idx"));
+ Raise_Error("_nexti returned an invalid idx");
return false;
}
_FINISH(1);
}
- Raise_Error(_SC("_nexti failed"));
+ Raise_Error("_nexti failed");
return false;
}
break;
@@ -531,19 +539,20 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr
_generator(o1)->Resume(this, arg_2+1);
_FINISH(0);
}
+ /* FALL THROUGH */
default:
- Raise_Error(_SC("cannot iterate %s"), GetTypeName(o1));
+ Raise_Error("cannot iterate %s", GetTypeName(o1));
}
return false; //cannot be hit(just to avoid warnings)
}
bool SQVM::DELEGATE_OP(SQObjectPtr &trg,SQObjectPtr &o1,SQObjectPtr &o2)
{
- if(type(o1) != OT_TABLE) { Raise_Error(_SC("delegating a '%s'"), GetTypeName(o1)); return false; }
+ if(type(o1) != OT_TABLE) { Raise_Error("delegating a '%s'", GetTypeName(o1)); return false; }
switch(type(o2)) {
case OT_TABLE:
if(!_table(o1)->SetDelegate(_table(o2))){
- Raise_Error(_SC("delegate cycle detected"));
+ Raise_Error("delegate cycle detected");
return false;
}
break;
@@ -551,7 +560,7 @@ bool SQVM::DELEGATE_OP(SQObjectPtr &trg,SQObjectPtr &o1,SQObjectPtr &o2)
_table(o1)->SetDelegate(NULL);
break;
default:
- Raise_Error(_SC("using '%s' as delegate"), GetTypeName(o2));
+ Raise_Error("using '%s' as delegate", GetTypeName(o2));
return false;
break;
}
@@ -603,15 +612,15 @@ bool SQVM::CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func)
bool SQVM::GETVARGV_OP(SQObjectPtr &target,SQObjectPtr &index,CallInfo *ci)
{
if(ci->_vargs.size == 0) {
- Raise_Error(_SC("the function doesn't have var args"));
+ Raise_Error("the function doesn't have var args");
return false;
}
if(!sq_isnumeric(index)){
- Raise_Error(_SC("indexing 'vargv' with %s"),GetTypeName(index));
+ Raise_Error("indexing 'vargv' with %s",GetTypeName(index));
return false;
}
SQInteger idx = tointeger(index);
- if(idx < 0 || idx >= ci->_vargs.size){ Raise_Error(_SC("vargv index out of range")); return false; }
+ if(idx < 0 || idx >= ci->_vargs.size){ Raise_Error("vargv index out of range"); return false; }
target = _vargsstack[ci->_vargs.base+idx];
return true;
}
@@ -621,7 +630,7 @@ bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes
SQClass *base = NULL;
SQObjectPtr attrs;
if(baseclass != -1) {
- if(type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { Raise_Error(_SC("trying to inherit from a %s"),GetTypeName(_stack._vals[_stackbase+baseclass])); return false; }
+ if(type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { Raise_Error("trying to inherit from a %s",GetTypeName(_stack._vals[_stackbase+baseclass])); return false; }
base = _class(_stack._vals[_stackbase + baseclass]);
}
if(attributes != MAX_FUNC_STACKSIZE) {
@@ -676,7 +685,7 @@ bool SQVM::GETPARENT_OP(SQObjectPtr &o,SQObjectPtr &target)
case OT_CLASS: target = _class(o)->_base?_class(o)->_base:_null_;
break;
default:
- Raise_Error(_SC("the %s type doesn't have a parent slot"), GetTypeName(o));
+ Raise_Error("the %s type doesn't have a parent slot", GetTypeName(o));
return false;
}
return true;
@@ -684,7 +693,7 @@ bool SQVM::GETPARENT_OP(SQObjectPtr &o,SQObjectPtr &target)
bool SQVM::Execute(SQObjectPtr &closure, SQInteger target, SQInteger nargs, SQInteger stackbase,SQObjectPtr &outres, SQBool raiseerror,ExecutionType et)
{
- if ((_nnativecalls + 1) > MAX_NATIVE_CALLS) { Raise_Error(_SC("Native stack overflow")); return false; }
+ if ((_nnativecalls + 1) > MAX_NATIVE_CALLS) { Raise_Error("Native stack overflow"); return false; }
_nnativecalls++;
AutoDec ad(&_nnativecalls);
SQInteger traps = 0;
@@ -739,12 +748,12 @@ exception_restore:
const SQInstruction &_i_ = *ci->_ip++;
//dumpstack(_stackbase);
- //scprintf("%s %d %d %d %d\n",g_InstrDesc[_i_.op].name,arg0,arg1,arg2,arg3);
+ //printf("%s %d %d %d %d\n",g_InstrDesc[_i_.op].name,arg0,arg1,arg2,arg3);
switch(_i_.op)
{
case _OP_LINE:
if(type(_debughook) != OT_NULL && _rawval(_debughook) != _rawval(ci->_closure))
- CallDebugHook(_SC('l'),arg1);
+ CallDebugHook('l',arg1);
continue;
case _OP_LOAD: TARGET = ci->_literals[arg1]; continue;
case _OP_LOADINT: TARGET = (SQInteger)arg1; continue;
@@ -760,6 +769,7 @@ exception_restore:
ct_stackbase = _stackbase;
goto common_call;
}
+ /* FALL THROUGH */
case _OP_CALL: {
ct_tailcall = false;
ct_target = arg0;
@@ -829,11 +839,11 @@ common_call:
STK(ct_target) = clo;
break;
}
- Raise_Error(_SC("attempt to call '%s'"), GetTypeName(clo));
+ Raise_Error("attempt to call '%s'", GetTypeName(clo));
SQ_THROW();
}
default:
- Raise_Error(_SC("attempt to call '%s'"), GetTypeName(clo));
+ Raise_Error("attempt to call '%s'", GetTypeName(clo));
SQ_THROW();
}
}
@@ -935,7 +945,7 @@ common_call:
case _OP_EXISTS: TARGET = Get(STK(arg1), STK(arg2), temp_reg, true,false)?_true_:_false_;continue;
case _OP_INSTANCEOF:
if(type(STK(arg1)) != OT_CLASS || type(STK(arg2)) != OT_INSTANCE)
- {Raise_Error(_SC("cannot apply instanceof between a %s and a %s"),GetTypeName(STK(arg1)),GetTypeName(STK(arg2))); SQ_THROW();}
+ {Raise_Error("cannot apply instanceof between a %s and a %s",GetTypeName(STK(arg1)),GetTypeName(STK(arg2))); SQ_THROW();}
TARGET = _instance(STK(arg2))->InstanceOf(_class(STK(arg1)))?_true_:_false_;
continue;
case _OP_AND:
@@ -958,7 +968,7 @@ common_call:
TARGET = SQInteger(~t);
continue;
}
- Raise_Error(_SC("attempt to perform a bitwise op on a %s"), GetTypeName(STK(arg1)));
+ Raise_Error("attempt to perform a bitwise op on a %s", GetTypeName(STK(arg1)));
SQ_THROW();
case _OP_CLOSURE: {
SQClosure *c = ci->_closure._unVal.pClosure;
@@ -973,7 +983,7 @@ common_call:
traps -= ci->_etraps;
if(sarg1 != MAX_FUNC_STACKSIZE) STK(arg1) = temp_reg;
}
- else { Raise_Error(_SC("trying to yield a '%s',only genenerator can be yielded"), GetTypeName(ci->_closure)); SQ_THROW();}
+ else { Raise_Error("trying to yield a '%s',only genenerator can be yielded", GetTypeName(ci->_closure)); SQ_THROW();}
if(Return(arg0, arg1, temp_reg)){
assert(traps == 0);
outres = temp_reg;
@@ -983,7 +993,7 @@ common_call:
}
continue;
case _OP_RESUME:
- if(type(STK(arg1)) != OT_GENERATOR){ Raise_Error(_SC("trying to resume a '%s',only genenerator can be resumed"), GetTypeName(STK(arg1))); SQ_THROW();}
+ if(type(STK(arg1)) != OT_GENERATOR){ Raise_Error("trying to resume a '%s',only genenerator can be resumed", GetTypeName(STK(arg1))); SQ_THROW();}
_GUARD(_generator(STK(arg1))->Resume(this, arg0));
traps += ci->_etraps;
continue;
@@ -999,7 +1009,7 @@ common_call:
case _OP_DELEGATE: _GUARD(DELEGATE_OP(TARGET,STK(arg1),STK(arg2))); continue;
case _OP_CLONE:
if(!Clone(STK(arg1), TARGET))
- { Raise_Error(_SC("cloning a %s"), GetTypeName(STK(arg1))); SQ_THROW();}
+ { Raise_Error("cloning a %s", GetTypeName(STK(arg1))); SQ_THROW();}
continue;
case _OP_TYPEOF: TypeOf(STK(arg1), TARGET); continue;
case _OP_PUSHTRAP:{
@@ -1015,7 +1025,7 @@ common_call:
}
}
continue;
- case _OP_THROW: Raise_Error(TARGET); SQ_THROW(); continue;
+ case _OP_THROW: Raise_Error(TARGET); SQ_THROW();
case _OP_CLASS: _GUARD(CLASS_OP(TARGET,arg1,arg2)); continue;
case _OP_NEWSLOTA:
bool bstatic = (arg0&NEW_SLOT_STATIC_FLAG)?true:false;
@@ -1125,11 +1135,11 @@ void SQVM::CallDebugHook(SQInteger type,SQInteger forcedline)
bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackbase,SQObjectPtr &retval,bool &suspend)
{
- if (_nnativecalls + 1 > MAX_NATIVE_CALLS) { Raise_Error(_SC("Native stack overflow")); return false; }
+ if (_nnativecalls + 1 > MAX_NATIVE_CALLS) { Raise_Error("Native stack overflow"); return false; }
SQInteger nparamscheck = nclosure->_nparamscheck;
if(((nparamscheck > 0) && (nparamscheck != nargs))
|| ((nparamscheck < 0) && (nargs < (-nparamscheck)))) {
- Raise_Error(_SC("wrong number of parameters"));
+ Raise_Error("wrong number of parameters");
return false;
}
@@ -1337,10 +1347,10 @@ bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr
}
break;
case OT_ARRAY:
- if(!sq_isnumeric(key)) {Raise_Error(_SC("indexing %s with %s"),GetTypeName(self),GetTypeName(key)); return false; }
+ if(!sq_isnumeric(key)) {Raise_Error("indexing %s with %s",GetTypeName(self),GetTypeName(key)); return false; }
return _array(self)->Set(tointeger(key),val);
default:
- Raise_Error(_SC("trying to set '%s'"),GetTypeName(self));
+ Raise_Error("trying to set '%s'",GetTypeName(self));
return false;
}
if(fetchroot) {
@@ -1379,7 +1389,7 @@ cloned_mt:
bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
{
- if(type(key) == OT_NULL) { Raise_Error(_SC("null cannot be used as index")); return false; }
+ if(type(key) == OT_NULL) { Raise_Error("null cannot be used as index"); return false; }
switch(type(self)) {
case OT_TABLE: {
bool rawcall = true;
@@ -1397,25 +1407,25 @@ bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObject
SQObjectPtr res;
Push(self);Push(key);Push(val);
if(!CallMetaMethod(_instance(self),MT_NEWSLOT,3,res)) {
- Raise_Error(_SC("class instances do not support the new slot operator"));
+ Raise_Error("class instances do not support the new slot operator");
return false;
}
break;}
case OT_CLASS:
if(!_class(self)->NewSlot(_ss(this),key,val,bstatic)) {
if(_class(self)->_locked) {
- Raise_Error(_SC("trying to modify a class that has already been instantiated"));
+ Raise_Error("trying to modify a class that has already been instantiated");
return false;
}
else {
SQObjectPtr oval = PrintObjVal(key);
- Raise_Error(_SC("the property '%s' already exists"),_stringval(oval));
+ Raise_Error("the property '%s' already exists",_stringval(oval));
return false;
}
}
break;
default:
- Raise_Error(_SC("indexing %s with %s"),GetTypeName(self),GetTypeName(key));
+ Raise_Error("indexing %s with %s",GetTypeName(self),GetTypeName(key));
return false;
break;
}
@@ -1446,7 +1456,7 @@ bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr
}
}
else {
- Raise_Error(_SC("cannot delete a slot from %s"),GetTypeName(self));
+ Raise_Error("cannot delete a slot from %s",GetTypeName(self));
return false;
}
}
@@ -1454,7 +1464,7 @@ bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr
}
break;
default:
- Raise_Error(_SC("attempt to delete a slot from a %s"),GetTypeName(self));
+ Raise_Error("attempt to delete a slot from a %s",GetTypeName(self));
return false;
}
return true;
@@ -1558,37 +1568,37 @@ void SQVM::dumpstack(SQInteger stackbase,bool dumpall)
{
SQInteger size=dumpall?_stack.size():_top;
SQInteger n=0;
- scprintf(_SC("\n>>>>stack dump<<<<\n"));
+ printf("\n>>>>stack dump<<<<\n");
CallInfo &ci=_callsstack[_callsstacksize-1];
- scprintf(_SC("IP: %p\n"),ci._ip);
- scprintf(_SC("prev stack base: %d\n"),ci._prevstkbase);
- scprintf(_SC("prev top: %d\n"),ci._prevtop);
+ printf("IP: %p\n",ci._ip);
+ printf("prev stack base: %d\n",ci._prevstkbase);
+ printf("prev top: %d\n",ci._prevtop);
for(SQInteger i=0;i"));else scprintf(_SC(" "));
- scprintf(_SC("[%d]:"),n);
+ if(stackbase==i)printf(">");else printf(" ");
+ printf("[%d]:",n);
switch(type(obj)){
- case OT_FLOAT: scprintf(_SC("FLOAT %.3f"),_float(obj));break;
- case OT_INTEGER: scprintf(_SC("INTEGER %d"),_integer(obj));break;
- case OT_BOOL: scprintf(_SC("BOOL %s"),_integer(obj)?"true":"false");break;
- case OT_STRING: scprintf(_SC("STRING %s"),_stringval(obj));break;
- case OT_NULL: scprintf(_SC("NULL")); break;
- case OT_TABLE: scprintf(_SC("TABLE %p[%p]"),_table(obj),_table(obj)->_delegate);break;
- case OT_ARRAY: scprintf(_SC("ARRAY %p"),_array(obj));break;
- case OT_CLOSURE: scprintf(_SC("CLOSURE [%p]"),_closure(obj));break;
- case OT_NATIVECLOSURE: scprintf(_SC("NATIVECLOSURE"));break;
- case OT_USERDATA: scprintf(_SC("USERDATA %p[%p]"),_userdataval(obj),_userdata(obj)->_delegate);break;
- case OT_GENERATOR: scprintf(_SC("GENERATOR %p"),_generator(obj));break;
- case OT_THREAD: scprintf(_SC("THREAD [%p]"),_thread(obj));break;
- case OT_USERPOINTER: scprintf(_SC("USERPOINTER %p"),_userpointer(obj));break;
- case OT_CLASS: scprintf(_SC("CLASS %p"),_class(obj));break;
- case OT_INSTANCE: scprintf(_SC("INSTANCE %p"),_instance(obj));break;
- case OT_WEAKREF: scprintf(_SC("WEAKERF %p"),_weakref(obj));break;
+ case OT_FLOAT: printf("FLOAT %.3f",_float(obj));break;
+ case OT_INTEGER: printf("INTEGER %d",_integer(obj));break;
+ case OT_BOOL: printf("BOOL %s",_integer(obj)?"true":"false");break;
+ case OT_STRING: printf("STRING %s",_stringval(obj));break;
+ case OT_NULL: printf("NULL"); break;
+ case OT_TABLE: printf("TABLE %p[%p]",_table(obj),_table(obj)->_delegate);break;
+ case OT_ARRAY: printf("ARRAY %p",_array(obj));break;
+ case OT_CLOSURE: printf("CLOSURE [%p]",_closure(obj));break;
+ case OT_NATIVECLOSURE: printf("NATIVECLOSURE");break;
+ case OT_USERDATA: printf("USERDATA %p[%p]",_userdataval(obj),_userdata(obj)->_delegate);break;
+ case OT_GENERATOR: printf("GENERATOR %p",_generator(obj));break;
+ case OT_THREAD: printf("THREAD [%p]",_thread(obj));break;
+ case OT_USERPOINTER: printf("USERPOINTER %p",_userpointer(obj));break;
+ case OT_CLASS: printf("CLASS %p",_class(obj));break;
+ case OT_INSTANCE: printf("INSTANCE %p",_instance(obj));break;
+ case OT_WEAKREF: printf("WEAKERF %p",_weakref(obj));break;
default:
assert(0);
break;
};
- scprintf(_SC("\n"));
+ printf("\n");
++n;
}
}
diff --git a/src/3rdparty/squirrel/squirrel/sqvm.h b/src/3rdparty/squirrel/squirrel/sqvm.h
index d272d152e7..89a592e136 100644
--- a/src/3rdparty/squirrel/squirrel/sqvm.h
+++ b/src/3rdparty/squirrel/squirrel/sqvm.h
@@ -203,7 +203,7 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->
if(v->_callsstacksize == v->_alloccallsstacksize) { \
if (v->_callsstacksize > 65535 && !v->_in_stackoverflow) {\
v->_in_stackoverflow = true; \
- v->Raise_Error(_SC("stack overflow"));\
+ v->Raise_Error("stack overflow");\
v->CallErrorHandler(v->_lasterror);\
return false;\
}\
diff --git a/src/ai/ai_config.cpp b/src/ai/ai_config.cpp
index ba009b0570..3beb74cb57 100644
--- a/src/ai/ai_config.cpp
+++ b/src/ai/ai_config.cpp
@@ -1,4 +1,4 @@
-/* $Id: ai_config.cpp 24789 2012-12-05 19:36:04Z frosch $ */
+/* $Id: ai_config.cpp 26509 2014-04-25 15:40:32Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -11,10 +11,13 @@
#include "../stdafx.h"
#include "../settings_type.h"
+#include "../string_func.h"
#include "ai.hpp"
#include "ai_config.hpp"
#include "ai_info.hpp"
+#include "../safeguards.h"
+
/** Configuration for AI start date, every AI has this setting. */
ScriptConfigItem _start_date_config = {
"start_date",
@@ -107,7 +110,7 @@ void AIConfig::SetSetting(const char *name, int value)
if (it != this->settings.end()) {
(*it).second = value;
} else {
- this->settings[strdup(name)] = value;
+ this->settings[stredup(name)] = value;
}
return;
diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp
index 64f835b242..82c3b3e307 100644
--- a/src/ai/ai_core.cpp
+++ b/src/ai/ai_core.cpp
@@ -1,4 +1,4 @@
-/* $Id: ai_core.cpp 25592 2013-07-12 18:54:27Z rubidium $ */
+/* $Id: ai_core.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -22,6 +22,8 @@
#include "ai_info.hpp"
#include "ai.hpp"
+#include "../safeguards.h"
+
/* static */ uint AI::frame_counter = 0;
/* static */ AIScannerInfo *AI::scanner_info = NULL;
/* static */ AIScannerLibrary *AI::scanner_library = NULL;
diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp
index f5dd10f4fa..f90887bd5d 100644
--- a/src/ai/ai_gui.cpp
+++ b/src/ai/ai_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: ai_gui.cpp 26086 2013-11-24 14:46:26Z rubidium $ */
+/* $Id: ai_gui.cpp 26954 2014-10-04 18:19:22Z peter1138 $ */
/*
* This file is part of OpenTTD.
@@ -40,11 +40,12 @@
#include "../game/game_info.hpp"
#include "../game/game_instance.hpp"
-
#include "table/strings.h"
#include
+#include "../safeguards.h"
+
static ScriptConfig *GetConfig(CompanyID slot)
{
if (slot == OWNER_DEITY) return GameConfig::GetConfig();
@@ -345,7 +346,7 @@ struct AISettingsWindow : public Window {
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
if (widget == WID_AIS_BACKGROUND) {
- this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
+ this->line_height = max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
resize->width = 1;
resize->height = this->line_height;
@@ -370,6 +371,7 @@ struct AISettingsWindow : public Window {
int y = r.top;
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
+ int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2;
for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) {
const ScriptConfigItem &config_item = **it;
int current_value = config->GetSetting((config_item).name);
@@ -411,7 +413,7 @@ struct AISettingsWindow : public Window {
}
}
- DrawString(text_left, text_right, y + WD_MATRIX_TOP, str, colour);
+ DrawString(text_left, text_right, y + text_y_offset, str, colour);
y += this->line_height;
}
}
@@ -853,7 +855,7 @@ struct AIConfigWindow : public Window {
case WID_AIC_GAMELIST: {
this->selected_slot = OWNER_DEITY;
this->InvalidateData();
- if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowAIListWindow((CompanyID)this->selected_slot);
+ if (click_count > 1 && this->selected_slot != INVALID_COMPANY && _game_mode != GM_NORMAL) ShowAIListWindow((CompanyID)this->selected_slot);
break;
}
diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp
index 942a0e5b13..194f65bcb6 100644
--- a/src/ai/ai_info.cpp
+++ b/src/ai/ai_info.cpp
@@ -1,4 +1,4 @@
-/* $Id: ai_info.cpp 25001 2013-02-14 18:58:04Z rubidium $ */
+/* $Id: ai_info.cpp 26774 2014-09-06 17:46:56Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,15 +15,20 @@
#include "ai_info.hpp"
#include "ai_scanner.hpp"
#include "../debug.h"
+#include "../string_func.h"
#include "../rev.h"
+#include "../safeguards.h"
+
/**
* Check if the API version provided by the AI is supported.
* @param api_version The API version as provided by the AI.
*/
static bool CheckAPIVersion(const char *api_version)
{
- return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0;
+ return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 ||
+ strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 ||
+ strcmp(api_version, "1.5") == 0;
}
#if defined(WIN32)
@@ -60,15 +65,15 @@ template <> const char *GetClassName() { return "AIInfo"; }
{
/* Get the AIInfo */
SQUserPointer instance = NULL;
- if (SQ_FAILED(sq_getinstanceup(vm, 2, &instance, 0)) || instance == NULL) return sq_throwerror(vm, _SC("Pass an instance of a child class of AIInfo to RegisterAI"));
+ if (SQ_FAILED(sq_getinstanceup(vm, 2, &instance, 0)) || instance == NULL) return sq_throwerror(vm, "Pass an instance of a child class of AIInfo to RegisterAI");
AIInfo *info = (AIInfo *)instance;
SQInteger res = ScriptInfo::Constructor(vm, info);
if (res != 0) return res;
ScriptConfigItem config = _start_date_config;
- config.name = strdup(config.name);
- config.description = strdup(config.description);
+ config.name = stredup(config.name);
+ config.description = stredup(config.description);
info->config_list.push_front(config);
if (info->engine->MethodExists(*info->SQ_instance, "MinVersionToLoad")) {
@@ -90,7 +95,7 @@ template <> const char *GetClassName() { return "AIInfo"; }
return SQ_ERROR;
}
} else {
- info->api_version = strdup("0.7");
+ info->api_version = stredup("0.7");
}
/* Remove the link to the real instance, else it might get deleted by RegisterAI() */
@@ -113,7 +118,7 @@ template <> const char *GetClassName() { return "AIInfo"; }
char buf[8];
seprintf(buf, lastof(buf), "%d.%d", GB(_openttd_newgrf_version, 28, 4), GB(_openttd_newgrf_version, 24, 4));
- info->api_version = strdup(buf);
+ info->api_version = stredup(buf);
/* Remove the link to the real instance, else it might get deleted by RegisterAI() */
sq_setinstanceup(vm, 2, NULL);
diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp
index ad48fa411e..9b4917d690 100644
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -1,4 +1,4 @@
-/* $Id: ai_instance.cpp 25236 2013-05-12 13:12:55Z rubidium $ */
+/* $Id: ai_instance.cpp 26893 2014-09-21 16:20:48Z fonsinchen $ */
/*
* This file is part of OpenTTD.
@@ -82,6 +82,8 @@
#include "../company_base.h"
#include "../company_func.h"
+#include "../safeguards.h"
+
AIInstance::AIInstance() :
ScriptInstance("AI")
{}
@@ -169,6 +171,17 @@ void AIInstance::RegisterAPI()
SQAISignList_Register(this->engine);
SQAIStation_Register(this->engine);
SQAIStationList_Register(this->engine);
+ SQAIStationList_Cargo_Register(this->engine);
+ SQAIStationList_CargoPlanned_Register(this->engine);
+ SQAIStationList_CargoPlannedByFrom_Register(this->engine);
+ SQAIStationList_CargoPlannedByVia_Register(this->engine);
+ SQAIStationList_CargoPlannedFromByVia_Register(this->engine);
+ SQAIStationList_CargoPlannedViaByFrom_Register(this->engine);
+ SQAIStationList_CargoWaiting_Register(this->engine);
+ SQAIStationList_CargoWaitingByFrom_Register(this->engine);
+ SQAIStationList_CargoWaitingByVia_Register(this->engine);
+ SQAIStationList_CargoWaitingFromByVia_Register(this->engine);
+ SQAIStationList_CargoWaitingViaByFrom_Register(this->engine);
SQAIStationList_Vehicle_Register(this->engine);
SQAISubsidy_Register(this->engine);
SQAISubsidyList_Register(this->engine);
diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp
index 6eb99c74e0..9fc8542312 100644
--- a/src/ai/ai_scanner.cpp
+++ b/src/ai/ai_scanner.cpp
@@ -1,4 +1,4 @@
-/* $Id: ai_scanner.cpp 23740 2012-01-03 21:32:51Z rubidium $ */
+/* $Id: ai_scanner.cpp 26509 2014-04-25 15:40:32Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -18,6 +18,8 @@
#include "ai_info.hpp"
#include "ai_scanner.hpp"
+#include "../safeguards.h"
+
AIScannerInfo::AIScannerInfo() :
ScriptScanner(),
@@ -31,7 +33,7 @@ void AIScannerInfo::Initialize()
/* Create the dummy AI */
free(this->main_script);
- this->main_script = strdup("%_dummy");
+ this->main_script = stredup("%_dummy");
extern void Script_CreateDummyInfo(HSQUIRRELVM vm, const char *type, const char *dir);
Script_CreateDummyInfo(this->engine->GetVM(), "AI", "ai");
}
@@ -46,9 +48,9 @@ AIScannerInfo::~AIScannerInfo()
delete this->info_dummy;
}
-void AIScannerInfo::GetScriptName(ScriptInfo *info, char *name, int len)
+void AIScannerInfo::GetScriptName(ScriptInfo *info, char *name, const char *last)
{
- snprintf(name, len, "%s", info->GetName());
+ seprintf(name, last, "%s", info->GetName());
}
void AIScannerInfo::RegisterAPI(class Squirrel *engine)
@@ -96,7 +98,7 @@ AIInfo *AIScannerInfo::FindInfo(const char *nameParam, int versionParam, bool fo
if (nameParam == NULL) return NULL;
char ai_name[1024];
- ttd_strlcpy(ai_name, nameParam, sizeof(ai_name));
+ strecpy(ai_name, nameParam, lastof(ai_name));
strtolower(ai_name);
AIInfo *info = NULL;
@@ -118,7 +120,7 @@ AIInfo *AIScannerInfo::FindInfo(const char *nameParam, int versionParam, bool fo
if (force_exact_match) {
/* Try to find a direct 'name.version' match */
char ai_name_tmp[1024];
- snprintf(ai_name_tmp, sizeof(ai_name_tmp), "%s.%d", ai_name, versionParam);
+ seprintf(ai_name_tmp, lastof(ai_name_tmp), "%s.%d", ai_name, versionParam);
strtolower(ai_name_tmp);
if (this->info_list.find(ai_name_tmp) != this->info_list.end()) return static_cast(this->info_list[ai_name_tmp]);
}
@@ -143,10 +145,10 @@ void AIScannerLibrary::Initialize()
ScriptScanner::Initialize("AIScanner");
}
-void AIScannerLibrary::GetScriptName(ScriptInfo *info, char *name, int len)
+void AIScannerLibrary::GetScriptName(ScriptInfo *info, char *name, const char *last)
{
AILibrary *library = static_cast(info);
- snprintf(name, len, "%s.%s", library->GetCategory(), library->GetInstanceName());
+ seprintf(name, last, "%s.%s", library->GetCategory(), library->GetInstanceName());
}
void AIScannerLibrary::RegisterAPI(class Squirrel *engine)
@@ -158,7 +160,7 @@ AILibrary *AIScannerLibrary::FindLibrary(const char *library, int version)
{
/* Internally we store libraries as 'library.version' */
char library_name[1024];
- snprintf(library_name, sizeof(library_name), "%s.%d", library, version);
+ seprintf(library_name, lastof(library_name), "%s.%d", library, version);
strtolower(library_name);
/* Check if the library + version exists */
diff --git a/src/ai/ai_scanner.hpp b/src/ai/ai_scanner.hpp
index 1f246e9a95..65bacfe2da 100644
--- a/src/ai/ai_scanner.hpp
+++ b/src/ai/ai_scanner.hpp
@@ -1,4 +1,4 @@
-/* $Id: ai_scanner.hpp 24900 2013-01-08 22:46:42Z planetmaker $ */
+/* $Id: ai_scanner.hpp 26487 2014-04-23 21:16:58Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -42,7 +42,7 @@ public:
void SetDummyAI(class AIInfo *info);
protected:
- /* virtual */ void GetScriptName(ScriptInfo *info, char *name, int len);
+ /* virtual */ void GetScriptName(ScriptInfo *info, char *name, const char *last);
/* virtual */ const char *GetFileName() const { return PATHSEP "info.nut"; }
/* virtual */ Subdirectory GetDirectory() const { return AI_DIR; }
/* virtual */ const char *GetScannerName() const { return "AIs"; }
@@ -65,7 +65,7 @@ public:
class AILibrary *FindLibrary(const char *library, int version);
protected:
- /* virtual */ void GetScriptName(ScriptInfo *info, char *name, int len);
+ /* virtual */ void GetScriptName(ScriptInfo *info, char *name, const char *last);
/* virtual */ const char *GetFileName() const { return PATHSEP "library.nut"; }
/* virtual */ Subdirectory GetDirectory() const { return AI_LIBRARY_DIR; }
/* virtual */ const char *GetScannerName() const { return "AI Libraries"; }
diff --git a/src/aircraft.h b/src/aircraft.h
index ffc29accfe..43466c4601 100644
--- a/src/aircraft.h
+++ b/src/aircraft.h
@@ -1,4 +1,4 @@
-/* $Id: aircraft.h 24839 2012-12-23 01:00:25Z michi_cc $ */
+/* $Id: aircraft.h 26866 2014-09-21 06:35:34Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,6 +15,17 @@
#include "station_map.h"
#include "vehicle_base.h"
+/**
+ * Base values for flight levels above ground level for 'normal' flight and holding patterns.
+ * Due to speed and direction, the actual flight level may be higher.
+ */
+enum AircraftFlyingAltitude {
+ AIRCRAFT_MIN_FLYING_ALTITUDE = 120, ///< Minimum flying altitude above tile.
+ AIRCRAFT_MAX_FLYING_ALTITUDE = 360, ///< Maximum flying altitude above tile.
+ PLANE_HOLD_MAX_FLYING_ALTITUDE = 150, ///< holding flying altitude above tile of planes.
+ HELICOPTER_HOLD_MAX_FLYING_ALTITUDE = 184 ///< holding flying altitude above tile of helicopters.
+};
+
struct Aircraft;
/** An aircraft can be one of those types. */
@@ -25,11 +36,18 @@ enum AircraftSubType {
AIR_ROTOR = 6, ///< rotor of an helicopter
};
-/** Aircraft flags. */
-enum VehicleAirFlags {
- VAF_DEST_TOO_FAR = 0, ///< Next destination is too far away.
+/** Flags for air vehicles; shared with disaster vehicles. */
+enum AirVehicleFlags {
+ VAF_DEST_TOO_FAR = 0, ///< Next destination is too far away.
+
+ /* The next two flags are to prevent stair climbing of the aircraft. The idea is that the aircraft
+ * will ascend or descend multiple flight levels at a time instead of following the contours of the
+ * landscape at a fixed altitude. This only has effect when there are more than 15 height levels. */
+ VAF_IN_MAX_HEIGHT_CORRECTION = 1, ///< The vehicle is currently lowering its altitude because it hit the upper bound.
+ VAF_IN_MIN_HEIGHT_CORRECTION = 2, ///< The vehicle is currently raising its altitude because it hit the lower bound.
};
+static const int ROTOR_Z_OFFSET = 5; ///< Z Offset between helicopter- and rotorsprite.
void HandleAircraftEnterHangar(Aircraft *v);
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);
@@ -39,7 +57,10 @@ void UpdateAircraftCache(Aircraft *v, bool update_range = false);
void AircraftLeaveHangar(Aircraft *v, Direction exit_dir);
void AircraftNextAirportPos_and_Order(Aircraft *v);
void SetAircraftPosition(Aircraft *v, int x, int y, int z);
-int GetAircraftFlyingAltitude(const Aircraft *v);
+
+void GetAircraftFlightLevelBounds(const Vehicle *v, int *min, int *max);
+template
+int GetAircraftFlightLevel(T *v, bool takeoff = false);
/** Variables that are cached to improve performance and such. */
struct AircraftCache {
@@ -59,7 +80,7 @@ struct Aircraft FINAL : public SpecializedVehicle {
DirectionByte last_direction;
byte number_consecutive_turns; ///< Protection to prevent the aircraft of making a lot of turns in order to reach a specific point.
byte turn_counter; ///< Ticks between each turn to prevent > 45 degree turns.
- byte flags; ///< Aircraft flags. @see VehicleAirFlags
+ byte flags; ///< Aircraft flags. @see AirVehicleFlags
AircraftCache acache;
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 8d6da45840..bf4b53f139 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -1,4 +1,4 @@
-/* $Id: aircraft_cmd.cpp 26134 2013-11-28 19:37:24Z rubidium $ */
+/* $Id: aircraft_cmd.cpp 27134 2015-02-01 20:54:24Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -36,14 +36,11 @@
#include "core/random_func.hpp"
#include "core/backup_type.hpp"
#include "zoom_func.h"
+#include "disaster_vehicle.h"
#include "table/strings.h"
-static const int ROTOR_Z_OFFSET = 5; ///< Z Offset between helicopter- and rotorsprite.
-
-static const int PLANE_HOLDING_ALTITUDE = 150; ///< Altitude of planes in holding pattern (= lowest flight altitude).
-static const int HELI_FLIGHT_ALTITUDE = 184; ///< Normal flight altitude of helicopters.
-
+#include "safeguards.h"
void Aircraft::UpdateDeltaXY(Direction direction)
{
@@ -204,13 +201,15 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en
{
SpriteID sprite = GetAircraftIcon(engine, image_type);
const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL);
- preferred_x = Clamp(preferred_x, left - UnScaleByZoom(real_sprite->x_offs, ZOOM_LVL_GUI), right - UnScaleByZoom(real_sprite->width, ZOOM_LVL_GUI) - UnScaleByZoom(real_sprite->x_offs, ZOOM_LVL_GUI));
+ preferred_x = Clamp(preferred_x,
+ left - UnScaleGUI(real_sprite->x_offs),
+ right - UnScaleGUI(real_sprite->width) - UnScaleGUI(real_sprite->x_offs));
DrawSprite(sprite, pal, preferred_x, y);
if (!(AircraftVehInfo(engine)->subtype & AIR_CTOL)) {
SpriteID rotor_sprite = GetCustomRotorIcon(engine, image_type);
if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED;
- DrawSprite(rotor_sprite, PAL_NONE, preferred_x, y - 5);
+ DrawSprite(rotor_sprite, PAL_NONE, preferred_x, y - ScaleGUITrad(5));
}
}
@@ -227,10 +226,10 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoff
{
const Sprite *spr = GetSprite(GetAircraftIcon(engine, image_type), ST_NORMAL);
- width = UnScaleByZoom(spr->width, ZOOM_LVL_GUI);
- height = UnScaleByZoom(spr->height, ZOOM_LVL_GUI);
- xoffs = UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI);
- yoffs = UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI);
+ width = UnScaleGUI(spr->width);
+ height = UnScaleGUI(spr->height);
+ xoffs = UnScaleGUI(spr->x_offs);
+ yoffs = UnScaleGUI(spr->y_offs);
}
/**
@@ -335,8 +334,8 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
UpdateAircraftCache(v, true);
- VehicleUpdatePosition(v);
- VehicleUpdatePosition(u);
+ v->UpdatePosition();
+ u->UpdatePosition();
/* Aircraft with 3 vehicles (chopper)? */
if (v->subtype == AIR_HELICOPTER) {
@@ -357,7 +356,7 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
w->UpdateDeltaXY(INVALID_DIR);
u->SetNext(w);
- VehicleUpdatePosition(w);
+ w->UpdatePosition();
}
}
@@ -485,7 +484,7 @@ static void HelicopterTickHandler(Aircraft *v)
u->cur_image = img;
- VehicleUpdatePositionAndViewport(u);
+ u->UpdatePositionAndViewport();
}
/**
@@ -501,7 +500,7 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z)
v->y_pos = y;
v->z_pos = z;
- VehicleUpdatePosition(v);
+ v->UpdatePosition();
v->UpdateViewport(true, false);
if (v->subtype == AIR_HELICOPTER) v->Next()->Next()->cur_image = GetRotorImage(v, EIT_ON_MAP);
@@ -516,7 +515,7 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z)
u->z_pos = GetSlopePixelZ(safe_x, safe_y);
u->cur_image = v->cur_image;
- VehicleUpdatePositionAndViewport(u);
+ u->UpdatePositionAndViewport();
u = u->Next();
if (u != NULL) {
@@ -524,7 +523,7 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z)
u->y_pos = y;
u->z_pos = z + ROTOR_Z_OFFSET;
- VehicleUpdatePositionAndViewport(u);
+ u->UpdatePositionAndViewport();
}
}
@@ -663,20 +662,35 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
}
/**
- * Gets the cruise altitude of an aircraft.
- * The cruise altitude is determined by the velocity of the vehicle
- * and the direction it is moving
- * @param v The vehicle. Should be an aircraft
- * @returns Altitude in pixel units
+ * Get the tile height below the aircraft.
+ * This function is needed because aircraft can leave the mapborders.
+ *
+ * @param v The vehicle to get the height for.
+ * @return The height in pixels from 'z_pos' 0.
*/
-int GetAircraftFlyingAltitude(const Aircraft *v)
+int GetTileHeightBelowAircraft(const Vehicle *v)
{
- if (v->subtype == AIR_HELICOPTER) return HELI_FLIGHT_ALTITUDE;
+ int safe_x = Clamp(v->x_pos, 0, MapMaxX() * TILE_SIZE);
+ int safe_y = Clamp(v->y_pos, 0, MapMaxY() * TILE_SIZE);
+ return TileHeight(TileVirtXY(safe_x, safe_y)) * TILE_HEIGHT;
+}
- /* Make sure Aircraft fly no lower so that they don't conduct
- * CFITs (controlled flight into terrain)
- */
- int base_altitude = PLANE_HOLDING_ALTITUDE;
+/**
+ * Get the 'flight level' bounds, in pixels from 'z_pos' 0 for a particular
+ * vehicle for normal flight situation.
+ * When the maximum is reached the vehicle should consider descending.
+ * When the minimum is reached the vehicle should consider ascending.
+ *
+ * @param v The vehicle to get the flight levels for.
+ * @param [out] min_level The minimum bounds for flight level.
+ * @param [out] max_level The maximum bounds for flight level.
+ */
+void GetAircraftFlightLevelBounds(const Vehicle *v, int *min_level, int *max_level)
+{
+ int base_altitude = GetTileHeightBelowAircraft(v);
+ if (v->type == VEH_AIRCRAFT && Aircraft::From(v)->subtype == AIR_HELICOPTER) {
+ base_altitude += HELICOPTER_HOLD_MAX_FLYING_ALTITUDE - PLANE_HOLD_MAX_FLYING_ALTITUDE;
+ }
/* Make sure eastbound and westbound planes do not "crash" into each
* other by providing them with vertical separation
@@ -693,11 +707,67 @@ int GetAircraftFlyingAltitude(const Aircraft *v)
}
/* Make faster planes fly higher so that they can overtake slower ones */
- base_altitude += min(20 * (v->vcache.cached_max_speed / 200), 90);
+ base_altitude += min(20 * (v->vcache.cached_max_speed / 200) - 90, 0);
- return base_altitude;
+ if (min_level != NULL) *min_level = base_altitude + AIRCRAFT_MIN_FLYING_ALTITUDE;
+ if (max_level != NULL) *max_level = base_altitude + AIRCRAFT_MAX_FLYING_ALTITUDE;
}
+/**
+ * Gets the maximum 'flight level' for the holding pattern of the aircraft,
+ * in pixels 'z_pos' 0, depending on terrain below..
+ *
+ * @param v The aircraft that may or may not need to decrease its altitude.
+ * @return Maximal aircraft holding altitude, while in normal flight, in pixels.
+ */
+int GetAircraftHoldMaxAltitude(const Aircraft *v)
+{
+ int tile_height = GetTileHeightBelowAircraft(v);
+
+ return tile_height + ((v->subtype == AIR_HELICOPTER) ? HELICOPTER_HOLD_MAX_FLYING_ALTITUDE : PLANE_HOLD_MAX_FLYING_ALTITUDE);
+}
+
+template
+int GetAircraftFlightLevel(T *v, bool takeoff)
+{
+ /* Aircraft is in flight. We want to enforce it being somewhere
+ * between the minimum and the maximum allowed altitude. */
+ int aircraft_min_altitude;
+ int aircraft_max_altitude;
+ GetAircraftFlightLevelBounds(v, &aircraft_min_altitude, &aircraft_max_altitude);
+ int aircraft_middle_altitude = (aircraft_min_altitude + aircraft_max_altitude) / 2;
+
+ /* If those assumptions would be violated, aircrafts would behave fairly strange. */
+ assert(aircraft_min_altitude < aircraft_middle_altitude);
+ assert(aircraft_middle_altitude < aircraft_max_altitude);
+
+ int z = v->z_pos;
+ if (z < aircraft_min_altitude ||
+ (HasBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION) && z < aircraft_middle_altitude)) {
+ /* Ascend. And don't fly into that mountain right ahead.
+ * And avoid our aircraft become a stairclimber, so if we start
+ * correcting altitude, then we stop correction not too early. */
+ SetBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION);
+ z += takeoff ? 2 : 1;
+ } else if (!takeoff && (z > aircraft_max_altitude ||
+ (HasBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION) && z > aircraft_middle_altitude))) {
+ /* Descend lower. You are an aircraft, not an space ship.
+ * And again, don't stop correcting altitude too early. */
+ SetBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION);
+ z--;
+ } else if (HasBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION) && z >= aircraft_middle_altitude) {
+ /* Now, we have corrected altitude enough. */
+ ClrBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION);
+ } else if (HasBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION) && z <= aircraft_middle_altitude) {
+ /* Now, we have corrected altitude enough. */
+ ClrBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION);
+ }
+
+ return z;
+}
+
+template int GetAircraftFlightLevel(DisasterVehicle *v, bool takeoff);
+
/**
* Find the entry point to an airport depending on direction which
* the airport is being approached from. Each airport can have up to
@@ -710,7 +780,7 @@ int GetAircraftFlyingAltitude(const Aircraft *v)
* @param v The vehicle that is approaching the airport
* @param apc The Airport Class being approached.
* @param rotation The rotation of the airport.
- * @returns The index of the entry point
+ * @return The index of the entry point
*/
static byte AircraftGetEntryPoint(const Aircraft *v, const AirportFTAClass *apc, Direction rotation)
{
@@ -787,7 +857,7 @@ static bool AircraftController(Aircraft *v)
UpdateAircraftCache(v);
AircraftNextAirportPos_and_Order(v);
/* get aircraft back on running altitude */
- SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlyingAltitude(v));
+ SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlightLevel(v));
return false;
}
}
@@ -815,7 +885,9 @@ static bool AircraftController(Aircraft *v)
count = UpdateAircraftSpeed(v);
if (count > 0) {
v->tile = 0;
- int z_dest = GetAircraftFlyingAltitude(v);
+
+ int z_dest;
+ GetAircraftFlightLevelBounds(v, &z_dest, NULL);
/* Reached altitude? */
if (v->z_pos >= z_dest) {
@@ -972,12 +1044,14 @@ static bool AircraftController(Aircraft *v)
int z = v->z_pos;
if (amd.flag & AMED_TAKEOFF) {
- z = min(z + 2, GetAircraftFlyingAltitude(v));
+ z = GetAircraftFlightLevel(v, true);
+ } else if (amd.flag & AMED_HOLD) {
+ /* Let the plane drop from normal flight altitude to holding pattern altitude */
+ if (z > GetAircraftHoldMaxAltitude(v)) z--;
+ } else if ((amd.flag & AMED_SLOWTURN) && (amd.flag & AMED_NOSPDCLAMP)) {
+ z = GetAircraftFlightLevel(v);
}
- /* Let the plane drop from normal flight altitude to holding pattern altitude */
- if ((amd.flag & AMED_HOLD) && (z > PLANE_HOLDING_ALTITUDE)) z--;
-
if (amd.flag & AMED_LAND) {
if (st->airport.tile == INVALID_TILE) {
/* Airport has been removed, abort the landing procedure */
@@ -985,7 +1059,7 @@ static bool AircraftController(Aircraft *v)
UpdateAircraftCache(v);
AircraftNextAirportPos_and_Order(v);
/* get aircraft back on running altitude */
- SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v));
+ SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlightLevel(v));
continue;
}
diff --git a/src/aircraft_gui.cpp b/src/aircraft_gui.cpp
index 43aef1b796..358710b99e 100644
--- a/src/aircraft_gui.cpp
+++ b/src/aircraft_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: aircraft_gui.cpp 25454 2013-06-24 18:39:19Z rubidium $ */
+/* $Id: aircraft_gui.cpp 27134 2015-02-01 20:54:24Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -21,6 +21,8 @@
#include "table/strings.h"
+#include "safeguards.h"
+
/**
* Draw the details for the given vehicle at the given position
*
@@ -84,22 +86,26 @@ void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID s
SpriteID sprite = v->GetImage(rtl ? DIR_E : DIR_W, image_type);
const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL);
- int width = UnScaleByZoom(real_sprite->width, ZOOM_LVL_GUI);
- int x_offs = UnScaleByZoom(real_sprite->x_offs, ZOOM_LVL_GUI);
+ int width = UnScaleGUI(real_sprite->width);
+ int x_offs = UnScaleGUI(real_sprite->x_offs);
int x = rtl ? right - width - x_offs : left - x_offs;
bool helicopter = v->subtype == AIR_HELICOPTER;
+ int y_offs = ScaleGUITrad(10);
+ int heli_offs = 0;
+
PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
- DrawSprite(sprite, pal, x, y + 10);
+ DrawSprite(sprite, pal, x, y + y_offs);
if (helicopter) {
const Aircraft *a = Aircraft::From(v);
SpriteID rotor_sprite = GetCustomRotorSprite(a, true, image_type);
if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED;
- DrawSprite(rotor_sprite, PAL_NONE, x, y + 5);
+ heli_offs = ScaleGUITrad(5);
+ DrawSprite(rotor_sprite, PAL_NONE, x, y + y_offs - heli_offs);
}
if (v->index == selection) {
x += x_offs;
- y += UnScaleByZoom(real_sprite->y_offs, ZOOM_LVL_GUI) + 10 - (helicopter ? 5 : 0);
- DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleByZoom(real_sprite->height, ZOOM_LVL_GUI) + (helicopter ? 5 : 0) + 1, COLOUR_WHITE, FR_BORDERONLY);
+ y += UnScaleGUI(real_sprite->y_offs) + y_offs - heli_offs;
+ DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(real_sprite->height) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY);
}
}
diff --git a/src/airport.cpp b/src/airport.cpp
index ac32d11eb9..65c2f55487 100644
--- a/src/airport.cpp
+++ b/src/airport.cpp
@@ -1,4 +1,4 @@
-/* $Id: airport.cpp 24900 2013-01-08 22:46:42Z planetmaker $ */
+/* $Id: airport.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,6 +15,8 @@
#include "table/airport_movement.h"
#include "table/airporttile_ids.h"
+#include "safeguards.h"
+
/**
* Define a generic airport.
diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp
index 1b048775a3..f0db39f6c0 100644
--- a/src/airport_gui.cpp
+++ b/src/airport_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: airport_gui.cpp 26165 2013-12-18 18:23:30Z frosch $ */
+/* $Id: airport_gui.cpp 27163 2015-02-22 15:26:27Z frosch $ */
/*
* This file is part of OpenTTD.
@@ -31,6 +31,8 @@
#include "widgets/airport_widget.h"
+#include "safeguards.h"
+
static AirportClassID _selected_airport_class; ///< the currently visible airport class
static int _selected_airport_index; ///< the index of the selected airport in the current class or -1
@@ -44,7 +46,7 @@ void CcBuildAirport(const CommandCost &result, TileIndex tile, uint32 p1, uint32
{
if (result.Failed()) return;
- if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT, tile);
+ if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile);
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
}
@@ -80,6 +82,18 @@ struct BuildAirToolbarWindow : Window {
if (_settings_client.gui.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0, false);
}
+ /**
+ * 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 (!gui_scope) return;
+
+ if (!CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) delete this;
+ }
+
virtual void OnClick(Point pt, int widget, int click_count)
{
switch (widget) {
@@ -226,8 +240,27 @@ public:
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
this->OnInvalidateData();
- this->vscroll->SetCount(AirportClass::Get(_selected_airport_class)->GetSpecCount());
- this->SelectFirstAvailableAirport(true);
+ /* Ensure airport class is valid (changing NewGRFs). */
+ _selected_airport_class = Clamp(_selected_airport_class, APC_BEGIN, (AirportClassID)(AirportClass::GetClassCount() - 1));
+ const AirportClass *ac = AirportClass::Get(_selected_airport_class);
+ this->vscroll->SetCount(ac->GetSpecCount());
+
+ /* Ensure the airport index is valid for this class (changing NewGRFs). */
+ _selected_airport_index = Clamp(_selected_airport_index, -1, ac->GetSpecCount() - 1);
+
+ /* Only when no valid airport was selected, we want to select the first airport. */
+ bool selectFirstAirport = true;
+ if (_selected_airport_index != -1) {
+ const AirportSpec *as = ac->GetSpec(_selected_airport_index);
+ if (as->IsAvailable()) {
+ /* Ensure the airport layout is valid. */
+ _selected_airport_layout = Clamp(_selected_airport_layout, 0, as->num_table - 1);
+ selectFirstAirport = false;
+ this->UpdateSelectSize();
+ }
+ }
+
+ if (selectFirstAirport) this->SelectFirstAvailableAirport(true);
}
virtual ~BuildAirportWindow()
@@ -392,7 +425,7 @@ public:
* Never make the window smaller to avoid oscillating if the size change affects the acceptance.
* (This is the case, if making the window bigger moves the mouse into the window.) */
if (top > bottom) {
- ResizeWindow(this, 0, top - bottom);
+ ResizeWindow(this, 0, top - bottom, false);
}
}
diff --git a/src/animated_tile.cpp b/src/animated_tile.cpp
index a0497bd49f..8a58a7d7b1 100644
--- a/src/animated_tile.cpp
+++ b/src/animated_tile.cpp
@@ -1,4 +1,4 @@
-/* $Id: animated_tile.cpp 22017 2011-02-07 22:29:47Z rubidium $ */
+/* $Id: animated_tile.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -14,6 +14,8 @@
#include "tile_cmd.h"
#include "viewport_func.h"
+#include "safeguards.h"
+
/** The table/list with animated tiles. */
TileIndex *_animated_tile_list = NULL;
/** The number of animated tiles in the current state. */
diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp
index 95b27d5d10..156498f38b 100644
--- a/src/articulated_vehicles.cpp
+++ b/src/articulated_vehicles.cpp
@@ -1,4 +1,4 @@
-/* $Id: articulated_vehicles.cpp 25259 2013-05-19 14:22:04Z rubidium $ */
+/* $Id: articulated_vehicles.cpp 26863 2014-09-20 15:31:26Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -19,6 +19,8 @@
#include "table/strings.h"
+#include "safeguards.h"
+
static const uint MAX_ARTICULATED_PARTS = 100; ///< Maximum of articulated parts per vehicle, i.e. when to abort calling the articulated vehicle callback.
/**
@@ -160,6 +162,41 @@ CargoArray GetCapacityOfArticulatedParts(EngineID engine)
return capacity;
}
+/**
+ * Get the default cargoes and refits of an articulated vehicle.
+ * The refits are linked to a cargo rather than an articulated part to prevent a long list of parts.
+ * @param engine Model to investigate.
+ * @param[out] cargoes Total amount of units that can be transported, summed by cargo.
+ * @param[out] refits Whether a (possibly partial) refit for each cargo is possible.
+ */
+void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, uint32 *refits)
+{
+ cargoes->Clear();
+ *refits = 0;
+
+ const Engine *e = Engine::Get(engine);
+
+ CargoID cargo_type;
+ uint16 cargo_capacity = GetVehicleDefaultCapacity(engine, &cargo_type);
+ if (cargo_type < NUM_CARGO && cargo_capacity > 0) {
+ (*cargoes)[cargo_type] += cargo_capacity;
+ if (IsEngineRefittable(engine)) SetBit(*refits, cargo_type);
+ }
+
+ if (!e->IsGroundVehicle() || !HasBit(e->info.callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) return;
+
+ for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) {
+ EngineID artic_engine = GetNextArticulatedPart(i, engine);
+ if (artic_engine == INVALID_ENGINE) break;
+
+ cargo_capacity = GetVehicleDefaultCapacity(artic_engine, &cargo_type);
+ if (cargo_type < NUM_CARGO && cargo_capacity > 0) {
+ (*cargoes)[cargo_type] += cargo_capacity;
+ if (IsEngineRefittable(artic_engine)) SetBit(*refits, cargo_type);
+ }
+ }
+}
+
/**
* Checks whether any of the articulated parts is refittable
* @param engine the first part
@@ -408,6 +445,6 @@ void AddArticulatedParts(Vehicle *first)
if (flip_image) v->spritenum++;
- VehicleUpdatePosition(v);
+ v->UpdatePosition();
}
}
diff --git a/src/autoreplace.cpp b/src/autoreplace.cpp
index fb23fb9e07..656334708f 100644
--- a/src/autoreplace.cpp
+++ b/src/autoreplace.cpp
@@ -1,4 +1,4 @@
-/* $Id: autoreplace.cpp 24950 2013-01-31 10:21:04Z peter1138 $ */
+/* $Id: autoreplace.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,6 +15,8 @@
#include "autoreplace_base.h"
#include "core/pool_func.hpp"
+#include "safeguards.h"
+
/** The pool of autoreplace "orders". */
EngineRenewPool _enginerenew_pool("EngineRenew");
INSTANTIATE_POOL_METHODS(EngineRenew)
@@ -28,7 +30,7 @@ static EngineRenew *GetEngineReplacement(EngineRenewList erl, EngineID engine, G
EngineRenew *er = (EngineRenew *)erl;
while (er != NULL) {
- if (er->from == engine && er->group_id == group) return er;
+ if (er->from == engine && GroupIsInGroup(group, er->group_id)) return er;
er = er->next;
}
return NULL;
diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp
index 5689937d5a..13473a7192 100644
--- a/src/autoreplace_cmd.cpp
+++ b/src/autoreplace_cmd.cpp
@@ -1,4 +1,4 @@
-/* $Id: autoreplace_cmd.cpp 26317 2014-02-07 23:48:56Z frosch $ */
+/* $Id: autoreplace_cmd.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -22,6 +22,8 @@
#include "table/strings.h"
+#include "safeguards.h"
+
extern void ChangeVehicleViewports(VehicleID from_index, VehicleID to_index);
extern void ChangeVehicleNews(VehicleID from_index, VehicleID to_index);
extern void ChangeVehicleViewWindow(VehicleID from_index, VehicleID to_index);
diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp
index 0b725052cb..f6e3b17559 100644
--- a/src/autoreplace_gui.cpp
+++ b/src/autoreplace_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: autoreplace_gui.cpp 25919 2013-10-28 10:28:24Z frosch $ */
+/* $Id: autoreplace_gui.cpp 26960 2014-10-05 11:20:02Z peter1138 $ */
/*
* This file is part of OpenTTD.
@@ -28,8 +28,8 @@
#include "widgets/autoreplace_widget.h"
+#include "safeguards.h"
-uint GetEngineListHeight(VehicleType type);
void DrawEngineList(VehicleType type, int x, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group);
static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
@@ -84,6 +84,9 @@ class ReplaceVehicleWindow : public Window {
bool reset_sel_engine; ///< Also reset #sel_engine while updating left and/or right (#update_left and/or #update_right) and no valid engine selected.
GroupID sel_group; ///< Group selected to replace.
int details_height; ///< Minimal needed height of the details panels (found so far).
+ byte sort_criteria; ///< Criteria of sorting vehicles.
+ bool descending_sort_order; ///< Order of sorting vehicles.
+ bool show_hidden_engines; ///< Whether to show the hidden engines.
RailType sel_railtype; ///< Type of rail tracks selected.
Scrollbar *vscroll[2];
@@ -124,6 +127,7 @@ class ReplaceVehicleWindow : public Window {
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, type) {
+ if (!draw_left && !this->show_hidden_engines && e->IsHidden(_local_company)) continue;
EngineID eid = e->index;
if (type == VEH_TRAIN && !this->GenerateReplaceRailList(eid, draw_left, this->replace_engines)) continue; // special rules for trains
@@ -140,7 +144,12 @@ class ReplaceVehicleWindow : public Window {
if (eid == this->sel_engine[side]) selected_engine = eid; // The selected engine is still in the list
}
this->sel_engine[side] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore)
- EngList_Sort(list, &EngineNumberSorter);
+ if (draw_left) {
+ EngList_Sort(list, &EngineNumberSorter);
+ } else {
+ _engine_sort_direction = this->descending_sort_order;
+ EngList_Sort(list, _engine_sort_functions[this->window_number][this->sort_criteria]);
+ }
}
/** Generate the lists */
@@ -227,12 +236,20 @@ public:
this->details_height = ((vehicletype == VEH_TRAIN) ? 10 : 9) * FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
this->sel_engine[0] = INVALID_ENGINE;
this->sel_engine[1] = INVALID_ENGINE;
+ this->show_hidden_engines = _engine_sort_show_hidden_engines[vehicletype];
this->CreateNestedTree();
this->vscroll[0] = this->GetScrollbar(WID_RV_LEFT_SCROLLBAR);
this->vscroll[1] = this->GetScrollbar(WID_RV_RIGHT_SCROLLBAR);
+
+ NWidgetCore *widget = this->GetWidget(WID_RV_SHOW_HIDDEN_ENGINES);
+ widget->widget_data = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN + vehicletype;
+ widget->tool_tip = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP + vehicletype;
+ widget->SetLowered(this->show_hidden_engines);
this->FinishInitNested(vehicletype);
+ this->sort_criteria = _engine_sort_last_criteria[vehicletype];
+ this->descending_sort_order = _engine_sort_last_order[vehicletype];
this->owner = _local_company;
this->sel_group = id_g;
}
@@ -240,6 +257,14 @@ public:
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
switch (widget) {
+ case WID_RV_SORT_ASCENDING_DESCENDING: {
+ Dimension d = GetStringBoundingBox(this->GetWidget(widget)->widget_data);
+ d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
+ d.height += padding.height;
+ *size = maxdim(*size, d);
+ break;
+ }
+
case WID_RV_LEFT_MATRIX:
case WID_RV_RIGHT_MATRIX:
resize->height = GetEngineListHeight((VehicleType)this->window_number);
@@ -276,10 +301,8 @@ public:
}
case WID_RV_INFO_TAB: {
- SetDParam(0, STR_REPLACE_NOT_REPLACING);
- Dimension d = GetStringBoundingBox(STR_BLACK_STRING);
- SetDParam(0, STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED);
- d = maxdim(d, GetStringBoundingBox(STR_BLACK_STRING));
+ Dimension d = GetStringBoundingBox(STR_REPLACE_NOT_REPLACING);
+ d = maxdim(d, GetStringBoundingBox(STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED));
d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT;
d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
*size = maxdim(*size, d);
@@ -334,6 +357,10 @@ public:
}
break;
+ case WID_RV_SORT_DROPDOWN:
+ SetDParam(0, _engine_sort_listing[this->window_number][this->sort_criteria]);
+ break;
+
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: {
const Company *c = Company::Get(_local_company);
SetDParam(0, c->settings.renew_keep_length ? STR_CONFIG_SETTING_ON : STR_CONFIG_SETTING_OFF);
@@ -349,22 +376,27 @@ public:
virtual void DrawWidget(const Rect &r, int widget) const
{
switch (widget) {
+ case WID_RV_SORT_ASCENDING_DESCENDING:
+ this->DrawSortButtonState(WID_RV_SORT_ASCENDING_DESCENDING, this->descending_sort_order ? SBS_DOWN : SBS_UP);
+ break;
+
case WID_RV_INFO_TAB: {
const Company *c = Company::Get(_local_company);
+ StringID str;
if (this->sel_engine[0] != INVALID_ENGINE) {
if (!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)) {
- SetDParam(0, STR_REPLACE_NOT_REPLACING);
+ str = STR_REPLACE_NOT_REPLACING;
} else {
bool when_old = false;
EngineID e = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group, &when_old);
- SetDParam(0, when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME);
- SetDParam(1, e);
+ str = when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME;
+ SetDParam(0, e);
}
} else {
- SetDParam(0, STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED);
+ str = STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED;
}
- DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_BLACK_STRING, TC_FROMSTRING, SA_HOR_CENTER);
+ DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, str, TC_BLACK, SA_HOR_CENTER);
break;
}
@@ -392,16 +424,12 @@ public:
* Either engines list is empty
* or The selected replacement engine has a replacement (to prevent loops). */
this->SetWidgetDisabledState(WID_RV_START_REPLACE,
- this->sel_engine[0] == INVALID_ENGINE ||
- this->sel_engine[1] == INVALID_ENGINE ||
- EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE);
+ this->sel_engine[0] == INVALID_ENGINE || this->sel_engine[1] == INVALID_ENGINE || EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE);
/* Disable the "Stop Replacing" button if:
* The left engines list (existing vehicle) is empty
* or The selected vehicle has no replacement set up */
- this->SetWidgetDisabledState(WID_RV_STOP_REPLACE,
- this->sel_engine[0] == INVALID_ENGINE ||
- !EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
+ this->SetWidgetDisabledState(WID_RV_STOP_REPLACE, this->sel_engine[0] == INVALID_ENGINE || !EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
if (this->window_number == VEH_TRAIN) {
/* sets the colour of that art thing */
@@ -436,6 +464,25 @@ public:
virtual void OnClick(Point pt, int widget, int click_count)
{
switch (widget) {
+ case WID_RV_SORT_ASCENDING_DESCENDING:
+ this->descending_sort_order ^= true;
+ _engine_sort_last_order[this->window_number] = this->descending_sort_order;
+ this->engines[1].ForceRebuild();
+ this->SetDirty();
+ break;
+
+ case WID_RV_SHOW_HIDDEN_ENGINES:
+ this->show_hidden_engines ^= true;
+ _engine_sort_show_hidden_engines[this->window_number] = this->show_hidden_engines;
+ this->engines[1].ForceRebuild();
+ this->SetWidgetLoweredState(widget, this->show_hidden_engines);
+ this->SetDirty();
+ break;
+
+ case WID_RV_SORT_DROPDOWN:
+ DisplayVehicleSortDropDown(this, static_cast(this->window_number), this->sort_criteria, WID_RV_SORT_DROPDOWN);
+ break;
+
case WID_RV_TRAIN_ENGINEWAGON_TOGGLE:
this->replace_engines = !(this->replace_engines);
this->engines[0].ForceRebuild();
@@ -495,6 +542,15 @@ public:
virtual void OnDropdownSelect(int widget, int index)
{
switch (widget) {
+ case WID_RV_SORT_DROPDOWN:
+ if (this->sort_criteria != index) {
+ this->sort_criteria = index;
+ _engine_sort_last_criteria[this->window_number] = this->sort_criteria;
+ this->engines[1].ForceRebuild();
+ this->SetDirty();
+ }
+ break;
+
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: {
RailType temp = (RailType)index;
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
@@ -546,6 +602,27 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
+ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP), SetFill(1, 1), SetMinimalSize(0, 12), SetResize(1, 0),
+ EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP), SetFill(1, 1), SetMinimalSize(0, 12), SetResize(1, 0),
+ EndContainer(),
+ EndContainer(),
+ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
+ NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
+ NWidget(NWID_VERTICAL),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 1),
+ NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
+ EndContainer(),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_RV_SHOW_HIDDEN_ENGINES), SetDataTip(STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN, STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP),
+ NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(),
+ EndContainer(),
+ EndContainer(),
+ EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_LEFT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_HELP_LEFT_ARRAY), SetResize(1, 1), SetScrollbar(WID_RV_LEFT_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_RV_LEFT_SCROLLBAR),
@@ -587,6 +664,27 @@ static const NWidgetPart _nested_replace_vehicle_widgets[] = {
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
+ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP), SetFill(1, 1), SetMinimalSize(0, 12), SetResize(1, 0),
+ EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP), SetFill(1, 1), SetMinimalSize(0, 12), SetResize(1, 0),
+ EndContainer(),
+ EndContainer(),
+ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
+ NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
+ NWidget(NWID_VERTICAL),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
+ NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
+ EndContainer(),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_RV_SHOW_HIDDEN_ENGINES), SetDataTip(STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN, STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP),
+ NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(),
+ EndContainer(),
+ EndContainer(),
+ EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_LEFT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_HELP_LEFT_ARRAY), SetResize(1, 1), SetScrollbar(WID_RV_LEFT_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_RV_LEFT_SCROLLBAR),
diff --git a/src/base_consist.cpp b/src/base_consist.cpp
index 3708a054e6..6ae0ec866a 100644
--- a/src/base_consist.cpp
+++ b/src/base_consist.cpp
@@ -1,4 +1,4 @@
-/* $Id: base_consist.cpp 24446 2012-07-29 16:48:00Z frosch $ */
+/* $Id: base_consist.cpp 26509 2014-04-25 15:40:32Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -12,6 +12,9 @@
#include "stdafx.h"
#include "base_consist.h"
#include "vehicle_base.h"
+#include "string_func.h"
+
+#include "safeguards.h"
BaseConsist::~BaseConsist()
{
@@ -27,7 +30,7 @@ void BaseConsist::CopyConsistPropertiesFrom(const BaseConsist *src)
if (this == src) return;
free(this->name);
- this->name = src->name != NULL ? strdup(src->name) : NULL;
+ this->name = src->name != NULL ? stredup(src->name) : NULL;
this->current_order_time = src->current_order_time;
this->lateness_counter = src->lateness_counter;
diff --git a/src/base_media_func.h b/src/base_media_func.h
index 352460d971..a31dd105c3 100644
--- a/src/base_media_func.h
+++ b/src/base_media_func.h
@@ -1,4 +1,4 @@
-/* $Id: base_media_func.h 26073 2013-11-23 18:13:46Z rubidium $ */
+/* $Id: base_media_func.h 26637 2014-06-09 17:43:59Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -51,16 +51,16 @@ bool BaseSet::FillSetDetails(IniFile *ini, const
IniItem *item;
fetch_metadata("name");
- this->name = strdup(item->value);
+ this->name = stredup(item->value);
fetch_metadata("description");
- this->description[strdup("")] = strdup(item->value);
+ this->description[stredup("")] = stredup(item->value);
/* Add the translations of the descriptions too. */
for (const IniItem *item = metadata->item; item != NULL; item = item->next) {
if (strncmp("description.", item->name, 12) != 0) continue;
- this->description[strdup(item->name + 12)] = strdup(item->value);
+ this->description[stredup(item->name + 12)] = stredup(item->value);
}
fetch_metadata("shortname");
@@ -100,7 +100,7 @@ bool BaseSet::FillSetDetails(IniFile *ini, const
/* Then find the MD5 checksum */
item = md5s->GetItem(filename, false);
- if (item == NULL) {
+ if (item == NULL || item->value == NULL) {
DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename, full_filename);
return false;
}
@@ -129,9 +129,9 @@ bool BaseSet::FillSetDetails(IniFile *ini, const
if (item == NULL) item = origin->GetItem("default", false);
if (item == NULL) {
DEBUG(grf, 1, "No origin warning message specified for: %s", filename);
- file->missing_warning = strdup("");
+ file->missing_warning = stredup("");
} else {
- file->missing_warning = strdup(item->value);
+ file->missing_warning = stredup(item->value);
}
switch (T::CheckMD5(file, BASESET_DIR)) {
@@ -164,7 +164,7 @@ bool BaseMedia::AddFile(const char *filename, size_t basepath_length,
IniFile *ini = new IniFile();
ini->LoadFromDisk(filename, BASESET_DIR);
- char *path = strdup(filename + basepath_length);
+ char *path = stredup(filename + basepath_length);
char *psep = strrchr(path, PATHSEPCHAR);
if (psep != NULL) {
psep[1] = '\0';
diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp
index e087fb94a7..05a6407ab4 100644
--- a/src/blitter/32bpp_anim.cpp
+++ b/src/blitter/32bpp_anim.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_anim.cpp 24111 2012-04-10 20:16:51Z rubidium $ */
+/* $Id: 32bpp_anim.cpp 26970 2014-10-06 19:15:00Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,6 +15,8 @@
#include "../table/sprites.h"
+#include "../safeguards.h"
+
/** Instantiation of the 32bpp with animation blitter factory. */
static FBlitter_32bppAnim iFBlitter_32bppAnim;
@@ -133,6 +135,56 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
}
break;
+ case BM_CRASH_REMAP:
+ if (src_px->a == 255) {
+ do {
+ uint m = *src_n;
+ if (m == 0) {
+ uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
+ *dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
+ *anim = 0;
+ } else {
+ uint r = remap[GB(m, 0, 8)];
+ *anim = r | (m & 0xFF00);
+ if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
+ }
+ anim++;
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ } else {
+ do {
+ uint m = *src_n;
+ if (m == 0) {
+ if (src_px->a != 0) {
+ uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
+ *dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
+ *anim = 0;
+ }
+ } else {
+ uint r = remap[GB(m, 0, 8)];
+ *anim = 0;
+ if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
+ }
+ anim++;
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ }
+ break;
+
+
+ case BM_BLACK_REMAP:
+ do {
+ *dst++ = Colour(0, 0, 0);
+ *anim++ = 0;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ break;
+
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
@@ -208,6 +260,8 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
case BM_NORMAL: Draw (bp, zoom); return;
case BM_COLOUR_REMAP: Draw(bp, zoom); return;
case BM_TRANSPARENT: Draw (bp, zoom); return;
+ case BM_CRASH_REMAP: Draw (bp, zoom); return;
+ case BM_BLACK_REMAP: Draw (bp, zoom); return;
}
}
@@ -439,7 +493,7 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette)
}
/* Make sure the backend redraws the whole screen */
- _video_driver->MakeDirty(0, 0, _screen.width, _screen.height);
+ VideoDriver::GetInstance()->MakeDirty(0, 0, _screen.width, _screen.height);
}
Blitter::PaletteAnimation Blitter_32bppAnim::UsePaletteAnimation()
diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp
index 16632718fa..8e2489d2c9 100644
--- a/src/blitter/32bpp_anim_sse4.cpp
+++ b/src/blitter/32bpp_anim_sse4.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_anim_sse4.cpp 26260 2014-01-13 18:20:23Z rubidium $ */
+/* $Id: 32bpp_anim_sse4.cpp 26969 2014-10-06 18:45:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -17,6 +17,8 @@
#include "32bpp_anim_sse4.hpp"
#include "32bpp_sse_func.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the SSE4 32bpp blitter factory. */
static FBlitter_32bppSSE4_Anim iFBlitter_32bppSSE4_Anim;
@@ -313,6 +315,38 @@ bmcr_alpha_blend_single:
if (src[0].a) anim[0] = 0;
}
break;
+
+ case BM_CRASH_REMAP:
+ for (uint x = (uint) bp->width; x > 0; x--) {
+ if (src_mv->m == 0) {
+ if (src->a != 0) {
+ uint8 g = MakeDark(src->r, src->g, src->b);
+ *dst = ComposeColourRGBA(g, g, g, src->a, *dst);
+ *anim = 0;
+ }
+ } else {
+ uint r = remap[src_mv->m];
+ if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
+ }
+ src_mv++;
+ dst++;
+ src++;
+ anim++;
+ }
+ break;
+
+ case BM_BLACK_REMAP:
+ for (uint x = (uint) bp->width; x > 0; x--) {
+ if (src->a != 0) {
+ *dst = Colour(0, 0, 0);
+ *anim = 0;
+ }
+ src_mv++;
+ dst++;
+ src++;
+ anim++;
+ }
+ break;
}
next_line:
@@ -373,6 +407,8 @@ bm_normal:
}
break;
case BM_TRANSPARENT: Draw(bp, zoom); return;
+ case BM_CRASH_REMAP: Draw(bp, zoom); return;
+ case BM_BLACK_REMAP: Draw(bp, zoom); return;
}
}
diff --git a/src/blitter/32bpp_base.cpp b/src/blitter/32bpp_base.cpp
index 56bc84dcba..376ea5ab72 100644
--- a/src/blitter/32bpp_base.cpp
+++ b/src/blitter/32bpp_base.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_base.cpp 24900 2013-01-08 22:46:42Z planetmaker $ */
+/* $Id: 32bpp_base.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -12,6 +12,8 @@
#include "../stdafx.h"
#include "32bpp_base.hpp"
+#include "../safeguards.h"
+
void *Blitter_32bppBase::MoveTo(void *video, int x, int y)
{
return (uint32 *)video + x + y * _screen.pitch;
diff --git a/src/blitter/32bpp_base.hpp b/src/blitter/32bpp_base.hpp
index 33e637e070..8ff11e0f5c 100644
--- a/src/blitter/32bpp_base.hpp
+++ b/src/blitter/32bpp_base.hpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_base.hpp 24610 2012-10-17 20:21:43Z frosch $ */
+/* $Id: 32bpp_base.hpp 26463 2014-04-13 19:22:23Z peter1138 $ */
/*
* This file is part of OpenTTD.
@@ -112,6 +112,19 @@ public:
return Colour(r * nom / denom, g * nom / denom, b * nom / denom);
}
+ /**
+ * Make a colour dark grey, for specialized 32bpp remapping.
+ * @param r red component
+ * @param g green component
+ * @param b blue component
+ * @return the brightness value of the new colour, now dark grey.
+ */
+ static inline uint8 MakeDark(uint8 r, uint8 g, uint8 b)
+ {
+ /* Magic-numbers are ~66% of those used in MakeGrey() */
+ return ((r * 13063) + (g * 25647) + (b * 4981)) / 65536;
+ }
+
/**
* Make a colour grey - based.
* @param colour the colour to make grey.
diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp
index c054c7f820..c505bff52d 100644
--- a/src/blitter/32bpp_optimized.cpp
+++ b/src/blitter/32bpp_optimized.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_optimized.cpp 25820 2013-10-06 19:38:36Z frosch $ */
+/* $Id: 32bpp_optimized.cpp 26969 2014-10-06 18:45:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -14,6 +14,8 @@
#include "../settings_type.h"
#include "32bpp_optimized.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the optimized 32bpp blitter factory. */
static FBlitter_32bppOptimized iFBlitter_32bppOptimized;
@@ -141,6 +143,49 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
}
break;
+ case BM_CRASH_REMAP:
+ if (src_px->a == 255) {
+ do {
+ uint m = *src_n;
+ if (m == 0) {
+ uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
+ *dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
+ } else {
+ uint r = remap[GB(m, 0, 8)];
+ if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
+ }
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ } else {
+ do {
+ uint m = *src_n;
+ if (m == 0) {
+ if (src_px->a != 0) {
+ uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
+ *dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
+ }
+ } else {
+ uint r = remap[GB(m, 0, 8)];
+ if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
+ }
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ }
+ break;
+
+ case BM_BLACK_REMAP:
+ do {
+ *dst = Colour(0, 0, 0);
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ break;
+
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
@@ -204,6 +249,8 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode,
case BM_NORMAL: Draw (bp, zoom); return;
case BM_COLOUR_REMAP: Draw(bp, zoom); return;
case BM_TRANSPARENT: Draw (bp, zoom); return;
+ case BM_CRASH_REMAP: Draw (bp, zoom); return;
+ case BM_BLACK_REMAP: Draw (bp, zoom); return;
}
}
diff --git a/src/blitter/32bpp_simple.cpp b/src/blitter/32bpp_simple.cpp
index 5b8267b645..54cf38a2ba 100644
--- a/src/blitter/32bpp_simple.cpp
+++ b/src/blitter/32bpp_simple.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_simple.cpp 26103 2013-11-25 13:06:33Z rubidium $ */
+/* $Id: 32bpp_simple.cpp 26969 2014-10-06 18:45:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,6 +15,8 @@
#include "../table/sprites.h"
+#include "../safeguards.h"
+
/** Instantiation of the simple 32bpp blitter factory. */
static FBlitter_32bppSimple iFBlitter_32bppSimple;
@@ -45,6 +47,23 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
}
break;
+ case BM_CRASH_REMAP:
+ if (src->m == 0) {
+ if (src->a != 0) {
+ uint8 g = MakeDark(src->r, src->g, src->b);
+ *dst = ComposeColourRGBA(g, g, g, src->a, *dst);
+ }
+ } else {
+ if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->AdjustBrightness(this->LookupColourInPalette(bp->remap[src->m]), src->v), src->a, *dst);
+ }
+ break;
+
+ case BM_BLACK_REMAP:
+ if (src->a != 0) {
+ *dst = Colour(0, 0, 0);
+ }
+ break;
+
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
diff --git a/src/blitter/32bpp_sse2.cpp b/src/blitter/32bpp_sse2.cpp
index fbb69f0499..dd1208cef6 100644
--- a/src/blitter/32bpp_sse2.cpp
+++ b/src/blitter/32bpp_sse2.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_sse2.cpp 26259 2014-01-13 18:17:17Z rubidium $ */
+/* $Id: 32bpp_sse2.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -17,6 +17,8 @@
#include "32bpp_sse2.hpp"
#include "32bpp_sse_func.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the SSE2 32bpp blitter factory. */
static FBlitter_32bppSSE2 iFBlitter_32bppSSE2;
@@ -36,6 +38,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
/* Calculate sizes and allocate. */
SpriteData sd;
+ memset(&sd, 0, sizeof(sd));
uint all_sprites_size = 0;
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {
const SpriteLoader::Sprite *src_sprite = &sprite[z];
diff --git a/src/blitter/32bpp_sse4.cpp b/src/blitter/32bpp_sse4.cpp
index b605cad2f0..5f053fd9f4 100644
--- a/src/blitter/32bpp_sse4.cpp
+++ b/src/blitter/32bpp_sse4.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_sse4.cpp 26258 2014-01-13 18:12:33Z rubidium $ */
+/* $Id: 32bpp_sse4.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -17,6 +17,8 @@
#include "32bpp_sse4.hpp"
#include "32bpp_sse_func.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the SSE4 32bpp blitter factory. */
static FBlitter_32bppSSE4 iFBlitter_32bppSSE4;
diff --git a/src/blitter/32bpp_sse_func.hpp b/src/blitter/32bpp_sse_func.hpp
index 155292e899..2ad3602eea 100644
--- a/src/blitter/32bpp_sse_func.hpp
+++ b/src/blitter/32bpp_sse_func.hpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_sse_func.hpp 26334 2014-02-11 21:17:43Z frosch $ */
+/* $Id: 32bpp_sse_func.hpp 27020 2014-10-15 18:31:37Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -159,7 +159,7 @@ static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightnes
__m128i briAB = _mm_cvtsi32_si128(brightness);
briAB = _mm_shuffle_epi8(briAB, BRIGHTNESS_LOW_CONTROL_MASK); // DEFAULT_BRIGHTNESS in 0, 0x00 in 2.
colAB = _mm_mullo_epi16(colAB, briAB);
- __m128i colAB_ob = _mm_srli_epi16(colAB, 8+7);
+ __m128i colAB_ob = _mm_srli_epi16(colAB, 8 + 7);
colAB = _mm_srli_epi16(colAB, 7);
/* Sum overbright.
@@ -238,13 +238,13 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel
for (int y = bp->height; y != 0; y--) {
Colour *dst = dst_line;
const Colour *src = src_rgba_line + META_LENGTH;
- if (mode == BM_COLOUR_REMAP) src_mv = src_mv_line;
+ if (mode == BM_COLOUR_REMAP || mode == BM_CRASH_REMAP) src_mv = src_mv_line;
if (read_mode == RM_WITH_MARGIN) {
assert(bt_last == BT_NONE); // or you must ensure block type is preserved
src += src_rgba_line[0].data;
dst += src_rgba_line[0].data;
- if (mode == BM_COLOUR_REMAP) src_mv += src_rgba_line[0].data;
+ if (mode == BM_COLOUR_REMAP || mode == BM_CRASH_REMAP) src_mv += src_rgba_line[0].data;
const int width_diff = si->sprite_width - bp->width;
effective_width = bp->width - (int) src_rgba_line[0].data;
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
@@ -377,10 +377,38 @@ bmcr_alpha_blend_single:
dst->data = _mm_cvtsi128_si32(DarkenTwoPixels(srcABCD, dstABCD, DARKEN_PARAM_1, DARKEN_PARAM_2));
}
break;
+
+ case BM_CRASH_REMAP:
+ for (uint x = (uint) bp->width; x > 0; x--) {
+ if (src_mv->m == 0) {
+ if (src->a != 0) {
+ uint8 g = MakeDark(src->r, src->g, src->b);
+ *dst = ComposeColourRGBA(g, g, g, src->a, *dst);
+ }
+ } else {
+ uint r = remap[src_mv->m];
+ if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
+ }
+ src_mv++;
+ dst++;
+ src++;
+ }
+ break;
+
+ case BM_BLACK_REMAP:
+ for (uint x = (uint) bp->width; x > 0; x--) {
+ if (src->a != 0) {
+ *dst = Colour(0, 0, 0);
+ }
+ src_mv++;
+ dst++;
+ src++;
+ }
+ break;
}
next_line:
- if (mode == BM_COLOUR_REMAP) src_mv_line += si->sprite_width;
+ if (mode == BM_COLOUR_REMAP || mode == BM_CRASH_REMAP) src_mv_line += si->sprite_width;
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
dst_line += bp->pitch;
}
@@ -429,6 +457,8 @@ bm_normal:
Draw(bp, zoom); return;
}
case BM_TRANSPARENT: Draw(bp, zoom); return;
+ case BM_CRASH_REMAP: Draw(bp, zoom); return;
+ case BM_BLACK_REMAP: Draw(bp, zoom); return;
}
}
#endif /* FULL_ANIMATION */
diff --git a/src/blitter/32bpp_ssse3.cpp b/src/blitter/32bpp_ssse3.cpp
index c96e5e6280..dbf99b4549 100644
--- a/src/blitter/32bpp_ssse3.cpp
+++ b/src/blitter/32bpp_ssse3.cpp
@@ -1,4 +1,4 @@
-/* $Id: 32bpp_ssse3.cpp 26258 2014-01-13 18:12:33Z rubidium $ */
+/* $Id: 32bpp_ssse3.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -17,6 +17,8 @@
#include "32bpp_ssse3.hpp"
#include "32bpp_sse_func.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the SSSE3 32bpp blitter factory. */
static FBlitter_32bppSSSE3 iFBlitter_32bppSSSE3;
diff --git a/src/blitter/8bpp_base.cpp b/src/blitter/8bpp_base.cpp
index dfdf6c34db..e94c1e0ff2 100644
--- a/src/blitter/8bpp_base.cpp
+++ b/src/blitter/8bpp_base.cpp
@@ -1,4 +1,4 @@
-/* $Id: 8bpp_base.cpp 24900 2013-01-08 22:46:42Z planetmaker $ */
+/* $Id: 8bpp_base.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -13,6 +13,8 @@
#include "../gfx_func.h"
#include "8bpp_base.hpp"
+#include "../safeguards.h"
+
void Blitter_8bppBase::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal)
{
const uint8 *ctab = GetNonSprite(pal, ST_RECOLOUR) + 1;
diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp
index 50d5e929a7..f1aa0054e1 100644
--- a/src/blitter/8bpp_optimized.cpp
+++ b/src/blitter/8bpp_optimized.cpp
@@ -1,4 +1,4 @@
-/* $Id: 8bpp_optimized.cpp 25820 2013-10-06 19:38:36Z frosch $ */
+/* $Id: 8bpp_optimized.cpp 26969 2014-10-06 18:45:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -13,8 +13,11 @@
#include "../zoom_func.h"
#include "../settings_type.h"
#include "../core/math_func.hpp"
+#include "../core/mem_func.hpp"
#include "8bpp_optimized.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the 8bpp optimised blitter factory. */
static FBlitter_8bppOptimized iFBlitter_8bppOptimized;
@@ -83,7 +86,8 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z
width -= pixels;
switch (mode) {
- case BM_COLOUR_REMAP: {
+ case BM_COLOUR_REMAP:
+ case BM_CRASH_REMAP: {
const uint8 *remap = bp->remap;
do {
uint m = remap[*src];
@@ -93,6 +97,11 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z
break;
}
+ case BM_BLACK_REMAP:
+ MemSetT(dst, 0, pixels);
+ dst += pixels;
+ break;
+
case BM_TRANSPARENT: {
const uint8 *remap = bp->remap;
src += pixels;
@@ -104,7 +113,7 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z
}
default:
- memcpy(dst, src, pixels);
+ MemCpyT(dst, src, pixels);
dst += pixels; src += pixels;
break;
}
diff --git a/src/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp
index 100f5ed1c9..0b17907b87 100644
--- a/src/blitter/8bpp_simple.cpp
+++ b/src/blitter/8bpp_simple.cpp
@@ -1,4 +1,4 @@
-/* $Id: 8bpp_simple.cpp 26103 2013-11-25 13:06:33Z rubidium $ */
+/* $Id: 8bpp_simple.cpp 26969 2014-10-06 18:45:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -13,6 +13,8 @@
#include "../zoom_func.h"
#include "8bpp_simple.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the simple 8bpp blitter factory. */
static FBlitter_8bppSimple iFBlitter_8bppSimple;
@@ -37,6 +39,7 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom
switch (mode) {
case BM_COLOUR_REMAP:
+ case BM_CRASH_REMAP:
colour = bp->remap[*src];
break;
@@ -44,6 +47,10 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom
if (*src != 0) colour = bp->remap[*dst];
break;
+ case BM_BLACK_REMAP:
+ colour = 0;
+ break;
+
default:
colour = *src;
break;
diff --git a/src/blitter/base.cpp b/src/blitter/base.cpp
index bd73058e93..cbce0efa04 100644
--- a/src/blitter/base.cpp
+++ b/src/blitter/base.cpp
@@ -1,4 +1,4 @@
-/* $Id: base.cpp 25911 2013-10-23 19:41:20Z fonsinchen $ */
+/* $Id: base.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -13,6 +13,8 @@
#include "base.hpp"
#include "../core/math_func.hpp"
+#include "../safeguards.h"
+
void Blitter::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash)
{
int dy;
diff --git a/src/blitter/base.hpp b/src/blitter/base.hpp
index 37a09794d8..d0eec25a59 100644
--- a/src/blitter/base.hpp
+++ b/src/blitter/base.hpp
@@ -1,4 +1,4 @@
-/* $Id: base.hpp 25911 2013-10-23 19:41:20Z fonsinchen $ */
+/* $Id: base.hpp 26969 2014-10-06 18:45:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -20,6 +20,8 @@ enum BlitterMode {
BM_NORMAL, ///< Perform the simple blitting.
BM_COLOUR_REMAP, ///< Perform a colour remapping.
BM_TRANSPARENT, ///< Perform transparency colour remapping.
+ BM_CRASH_REMAP, ///< Perform a crash remapping.
+ BM_BLACK_REMAP, ///< Perform remapping to a completely blackened sprite
};
/**
diff --git a/src/blitter/factory.hpp b/src/blitter/factory.hpp
index 45e213d496..8a7724e49d 100644
--- a/src/blitter/factory.hpp
+++ b/src/blitter/factory.hpp
@@ -1,4 +1,4 @@
-/* $Id: factory.hpp 26215 2014-01-03 08:29:07Z rubidium $ */
+/* $Id: factory.hpp 26509 2014-04-25 15:40:32Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -63,7 +63,7 @@ protected:
* @pre There is no blitter registered with this name.
*/
BlitterFactory(const char *name, const char *description, bool usable = true) :
- name(strdup(name)), description(strdup(description))
+ name(stredup(name)), description(stredup(description))
{
if (usable) {
/*
diff --git a/src/blitter/null.cpp b/src/blitter/null.cpp
index a88e027770..b722e25fe8 100644
--- a/src/blitter/null.cpp
+++ b/src/blitter/null.cpp
@@ -1,4 +1,4 @@
-/* $Id: null.cpp 25820 2013-10-06 19:38:36Z frosch $ */
+/* $Id: null.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -12,6 +12,8 @@
#include "../stdafx.h"
#include "null.hpp"
+#include "../safeguards.h"
+
/** Instantiation of the null blitter factory. */
static FBlitter_Null iFBlitter_Null;
diff --git a/src/bmp.cpp b/src/bmp.cpp
index ef0fd045b5..63fc62fced 100644
--- a/src/bmp.cpp
+++ b/src/bmp.cpp
@@ -1,4 +1,4 @@
-/* $Id: bmp.cpp 26058 2013-11-23 13:15:07Z rubidium $ */
+/* $Id: bmp.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -15,6 +15,8 @@
#include "core/alloc_func.hpp"
#include "core/mem_func.hpp"
+#include "safeguards.h"
+
void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file)
{
buffer->pos = -1;
diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp
index 70bc4b06db..f417ef59f5 100644
--- a/src/bootstrap_gui.cpp
+++ b/src/bootstrap_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: bootstrap_gui.cpp 26209 2014-01-02 22:41:58Z rubidium $ */
+/* $Id: bootstrap_gui.cpp 26538 2014-04-28 21:06:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -29,6 +29,8 @@
#include "table/strings.h"
+#include "safeguards.h"
+
/** Widgets for the background window to prevent smearing. */
static const struct NWidgetPart _background_widgets[] = {
NWidget(WWT_PANEL, COLOUR_DARK_BLUE, WID_BB_BACKGROUND), SetResize(1, 1),
@@ -244,7 +246,7 @@ bool HandleBootstrap()
new BootstrapAskForDownloadWindow();
/* Process the user events. */
- _video_driver->MainLoop();
+ VideoDriver::GetInstance()->MainLoop();
/* _exit_game is used to get out of the video driver's main loop.
* In case GM_BOOTSTRAP is still set we did not exit it via the
diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp
index a1624b8a7a..2e9657e322 100644
--- a/src/bridge_gui.cpp
+++ b/src/bridge_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: bridge_gui.cpp 25668 2013-08-05 20:36:24Z michi_cc $ */
+/* $Id: bridge_gui.cpp 26960 2014-10-05 11:20:02Z peter1138 $ */
/*
* This file is part of OpenTTD.
@@ -29,6 +29,8 @@
#include "table/strings.h"
+#include "safeguards.h"
+
/** The type of the last built rail bridge */
static BridgeType _last_railbridge_type = 0;
/** The type of the last built road bridge */
@@ -166,7 +168,7 @@ public:
switch (widget) {
case WID_BBS_DROPDOWN_ORDER: {
Dimension d = GetStringBoundingBox(this->GetWidget(widget)->widget_data);
- d.width += padding.width + WD_SORTBUTTON_ARROW_WIDTH * 2; // Doubled since the string is centred and it also looks better.
+ d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
d.height += padding.height;
*size = maxdim(*size, d);
break;
diff --git a/src/bridge_map.cpp b/src/bridge_map.cpp
index db0c45d1b0..9330fd0821 100644
--- a/src/bridge_map.cpp
+++ b/src/bridge_map.cpp
@@ -1,4 +1,4 @@
-/* $Id: bridge_map.cpp 23106 2011-11-04 11:30:37Z rubidium $ */
+/* $Id: bridge_map.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -13,6 +13,8 @@
#include "landscape.h"
#include "tunnelbridge_map.h"
+#include "safeguards.h"
+
/**
* Finds the end of a bridge in the specified direction starting at a middle tile
diff --git a/src/bridge_map.h b/src/bridge_map.h
index 9edccd7243..3b272f3551 100644
--- a/src/bridge_map.h
+++ b/src/bridge_map.h
@@ -1,4 +1,4 @@
-/* $Id: bridge_map.h 24912 2013-01-13 13:17:12Z frosch $ */
+/* $Id: bridge_map.h 26879 2014-09-21 11:24:51Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -37,28 +37,14 @@ static inline bool IsBridgeTile(TileIndex t)
return IsTileType(t, MP_TUNNELBRIDGE) && IsBridge(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
- */
-static inline bool MayHaveBridgeAbove(TileIndex t)
-{
- return IsTileType(t, MP_CLEAR) || IsTileType(t, MP_RAILWAY) || IsTileType(t, MP_ROAD) ||
- IsTileType(t, MP_WATER) || IsTileType(t, MP_TUNNELBRIDGE) || IsTileType(t, MP_OBJECT);
-}
-
/**
* checks if a bridge is set above the ground of this tile
* @param t The tile to analyze
- * @pre MayHaveBridgeAbove(t)
* @return true if a bridge is detected above
*/
static inline bool IsBridgeAbove(TileIndex t)
{
- assert(MayHaveBridgeAbove(t));
- return GB(_m[t].m6, 6, 2) != 0;
+ return GB(_m[t].type, 2, 2) != 0;
}
/**
@@ -70,7 +56,7 @@ static inline bool IsBridgeAbove(TileIndex t)
static inline BridgeType GetBridgeType(TileIndex t)
{
assert(IsBridgeTile(t));
- return GB(_m[t].m6, 2, 4);
+ return GB(_me[t].m6, 2, 4);
}
/**
@@ -82,7 +68,7 @@ static inline BridgeType GetBridgeType(TileIndex t)
static inline Axis GetBridgeAxis(TileIndex t)
{
assert(IsBridgeAbove(t));
- return (Axis)(GB(_m[t].m6, 6, 2) - 1);
+ return (Axis)(GB(_m[t].type, 2, 2) - 1);
}
TileIndex GetNorthernBridgeEnd(TileIndex t);
@@ -104,18 +90,15 @@ static inline int GetBridgePixelHeight(TileIndex tile)
* Remove the bridge over the given axis.
* @param t the tile to remove the bridge from
* @param a the axis of the bridge to remove
- * @pre MayHaveBridgeAbove(t)
*/
static inline void ClearSingleBridgeMiddle(TileIndex t, Axis a)
{
- assert(MayHaveBridgeAbove(t));
- ClrBit(_m[t].m6, 6 + a);
+ ClrBit(_m[t].type, 2 + a);
}
/**
* Removes bridges from the given, that is bridges along the X and Y axis.
* @param t the tile to remove the bridge from
- * @pre MayHaveBridgeAbove(t)
*/
static inline void ClearBridgeMiddle(TileIndex t)
{
@@ -127,12 +110,10 @@ static inline void ClearBridgeMiddle(TileIndex t)
* Set that there is a bridge over the given axis.
* @param t the tile to add the bridge to
* @param a the axis of the bridge to add
- * @pre MayHaveBridgeAbove(t)
*/
static inline void SetBridgeMiddle(TileIndex t, Axis a)
{
- assert(MayHaveBridgeAbove(t));
- SetBit(_m[t].m6, 6 + a);
+ SetBit(_m[t].type, 2 + a);
}
/**
@@ -153,7 +134,7 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
_m[t].m3 = rt;
_m[t].m4 = 0;
_m[t].m5 = 1 << 7 | tt << 2 | d;
- SB(_m[t].m6, 2, 4, bridgetype);
+ SB(_me[t].m6, 2, 4, bridgetype);
_me[t].m7 = 0;
}
diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp
index 178b29dcc8..715c87e99e 100644
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -1,4 +1,4 @@
-/* $Id: build_vehicle_gui.cpp 26241 2014-01-12 18:00:39Z frosch $ */
+/* $Id: build_vehicle_gui.cpp 26960 2014-10-05 11:20:02Z peter1138 $ */
/*
* This file is part of OpenTTD.
@@ -37,6 +37,8 @@
#include "table/strings.h"
+#include "safeguards.h"
+
/**
* Get the height of a single 'entry' in the engine lists.
* @param type the vehicle type to get the height of
@@ -56,13 +58,13 @@ static const NWidgetPart _nested_build_vehicle_widgets[] = {
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY),
- NWidget(NWID_HORIZONTAL),
- NWidget(NWID_VERTICAL),
- NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASSENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0),
- NWidget(NWID_SPACER), SetFill(1, 1),
- EndContainer(),
- NWidget(NWID_VERTICAL),
+ NWidget(NWID_VERTICAL),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
+ EndContainer(),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_ENGINES),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
EndContainer(),
EndContainer(),
@@ -79,6 +81,7 @@ static const NWidgetPart _nested_build_vehicle_widgets[] = {
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BV_BUILD_SEL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_BUILD), SetResize(1, 0), SetFill(1, 0),
EndContainer(),
+ NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDE), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_RENAME), SetResize(1, 0), SetFill(1, 0),
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer(),
@@ -88,10 +91,11 @@ static const NWidgetPart _nested_build_vehicle_widgets[] = {
static const CargoID CF_ANY = CT_NO_REFIT; ///< Show all vehicles independent of carried cargo (i.e. no filtering)
static const CargoID CF_NONE = CT_INVALID; ///< Show only vehicles which do not carry cargo (e.g. train engines)
-static bool _internal_sort_order; ///< false = descending, true = ascending
-static byte _last_sort_criteria[] = {0, 0, 0, 0};
-static bool _last_sort_order[] = {false, false, false, false};
-static CargoID _last_filter_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ANY};
+bool _engine_sort_direction; ///< \c false = descending, \c true = ascending.
+byte _engine_sort_last_criteria[] = {0, 0, 0, 0}; ///< Last set sort criteria, for each vehicle type.
+bool _engine_sort_last_order[] = {false, false, false, false}; ///< Last set direction of the sort order, for each vehicle type.
+bool _engine_sort_show_hidden_engines[] = {false, false, false, false}; ///< Last set 'show hidden engines' setting for each vehicle type.
+static CargoID _engine_sort_last_cargo_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ANY}; ///< Last set filter criteria, for each vehicle type.
/**
* Determines order of engines by engineID
@@ -103,7 +107,7 @@ static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
{
int r = Engine::Get(*a)->list_position - Engine::Get(*b)->list_position;
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -120,7 +124,7 @@ static int CDECL EngineIntroDateSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -153,7 +157,7 @@ static int CDECL EngineNameSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -170,7 +174,7 @@ static int CDECL EngineReliabilitySorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -187,7 +191,7 @@ static int CDECL EngineCostSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -204,7 +208,7 @@ static int CDECL EngineSpeedSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -221,7 +225,7 @@ static int CDECL EnginePowerSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -238,7 +242,7 @@ static int CDECL EngineTractiveEffortSorter(const EngineID *a, const EngineID *b
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -255,7 +259,7 @@ static int CDECL EngineRunningCostSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -281,7 +285,7 @@ static int CDECL EnginePowerVsRunningCostSorter(const EngineID *a, const EngineI
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/* Train sorting functions */
@@ -303,7 +307,7 @@ static int CDECL TrainEngineCapacitySorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -320,7 +324,7 @@ static int CDECL TrainEnginesThenWagonsSorter(const EngineID *a, const EngineID
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/* Road vehicle sorting functions */
@@ -339,7 +343,7 @@ static int CDECL RoadVehEngineCapacitySorter(const EngineID *a, const EngineID *
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/* Ship vehicle sorting functions */
@@ -361,7 +365,7 @@ static int CDECL ShipEngineCapacitySorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/* Aircraft sorting functions */
@@ -391,7 +395,7 @@ static int CDECL AircraftEngineCargoSorter(const EngineID *a, const EngineID *b)
return EngineNumberSorter(a, b);
}
}
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
/**
@@ -409,10 +413,11 @@ static int CDECL AircraftRangeSorter(const EngineID *a, const EngineID *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
- return _internal_sort_order ? -r : r;
+ return _engine_sort_direction ? -r : r;
}
-static EngList_SortTypeFunction * const _sorter[][11] = {{
+/** Sort functions for the vehicle sort criteria, for each vehicle type. */
+EngList_SortTypeFunction * const _engine_sort_functions[][11] = {{
/* Trains */
&EngineNumberSorter,
&EngineCostSorter,
@@ -461,7 +466,8 @@ static EngList_SortTypeFunction * const _sorter[][11] = {{
&AircraftRangeSorter,
}};
-static const StringID _sort_listing[][12] = {{
+/** Dropdown menu strings for the vehicle sort criteria. */
+const StringID _engine_sort_listing[][12] = {{
/* Trains */
STR_SORT_BY_ENGINE_ID,
STR_SORT_BY_COST,
@@ -526,21 +532,20 @@ static GUIEngineList::FilterFunction * const _filter_funcs[] = {
&CargoFilter,
};
-static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine, bool refittable)
+static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine)
{
- CargoArray cap = GetCapacityOfArticulatedParts(engine);
+ CargoArray cap;
+ uint32 refits;
+ GetArticulatedVehicleCargoesAndRefits(engine, &cap, &refits);
for (CargoID c = 0; c < NUM_CARGO; c++) {
if (cap[c] == 0) continue;
SetDParam(0, c);
SetDParam(1, cap[c]);
- SetDParam(2, refittable ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
+ SetDParam(2, HasBit(refits, c) ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
y += FONT_HEIGHT_NORMAL;
-
- /* Only show as refittable once */
- refittable = false;
}
return y;
@@ -825,7 +830,7 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number)
if (articulated_cargo) {
/* Cargo type + capacity, or N/A */
- int new_y = DrawCargoCapacityInfo(left, right, y, engine_number, refittable);
+ int new_y = DrawCargoCapacityInfo(left, right, y, engine_number);
if (new_y == y) {
SetDParam(0, CT_INVALID);
@@ -911,8 +916,13 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *
/* Note: num_engines is only used in the autoreplace GUI, so it is correct to use _local_company here. */
const uint num_engines = GetGroupNumEngines(_local_company, selected_group, engine);
+ const Engine *e = Engine::Get(engine);
+ bool hidden = HasBit(e->company_hidden, _local_company);
+ StringID str = hidden ? STR_HIDDEN_ENGINE_NAME : STR_ENGINE_NAME;
+ TextColour tc = (engine == selected_id) ? TC_WHITE : (TC_NO_SHADE | (hidden ? TC_GREY : TC_BLACK));
+
SetDParam(0, engine);
- DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK);
+ DrawString(text_left, text_right, y + normal_text_y_offset, str, tc);
DrawVehicleEngine(l, r, sprite_x, y + sprite_y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_company), EIT_PURCHASE);
if (show_count) {
SetDParam(0, num_engines);
@@ -922,18 +932,42 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *
}
}
+/**
+ * Display the dropdown for the vehicle sort criteria.
+ * @param w Parent window (holds the dropdown button).
+ * @param vehicle_type %Vehicle type being sorted.
+ * @param selected Currently selected sort criterium.
+ * @param button Widget button.
+ */
+void DisplayVehicleSortDropDown(Window *w, VehicleType vehicle_type, int selected, int button)
+{
+ uint32 hidden_mask = 0;
+ /* Disable sorting by power or tractive effort when the original acceleration model for road vehicles is being used. */
+ if (vehicle_type == VEH_ROAD && _settings_game.vehicle.roadveh_acceleration_model == AM_ORIGINAL) {
+ SetBit(hidden_mask, 3); // power
+ SetBit(hidden_mask, 4); // tractive effort
+ SetBit(hidden_mask, 8); // power by running costs
+ }
+ /* Disable sorting by tractive effort when the original acceleration model for trains is being used. */
+ if (vehicle_type == VEH_TRAIN && _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL) {
+ SetBit(hidden_mask, 4); // tractive effort
+ }
+ ShowDropDownMenu(w, _engine_sort_listing[vehicle_type], selected, button, 0, hidden_mask);
+}
+/** GUI for building vehicles. */
struct BuildVehicleWindow : Window {
- VehicleType vehicle_type;
+ VehicleType vehicle_type; ///< Type of vehicles shown in the window.
union {
- RailTypeByte railtype;
- RoadTypes roadtypes;
- } filter;
- bool descending_sort_order;
- byte sort_criteria;
- bool listview_mode;
- EngineID sel_engine;
- EngineID rename_engine;
+ RailTypeByte railtype; ///< Rail type to show, or #RAILTYPE_END.
+ RoadTypes roadtypes; ///< Road type to show, or #ROADTYPES_ALL.
+ } filter; ///< Filter to apply.
+ bool descending_sort_order; ///< Sort direction, @see _engine_sort_direction
+ byte sort_criteria; ///< Current sort criterium.
+ bool show_hidden_engines; ///< State of the 'show hidden engines' button.
+ bool listview_mode; ///< If set, only display the available vehicles and do not show a 'build' button.
+ EngineID sel_engine; ///< Currently selected engine, or #INVALID_ENGINE
+ EngineID rename_engine; ///< Engine being renamed.
GUIEngineList eng_list;
CargoID cargo_filter[NUM_CARGO + 2]; ///< Available cargo filters; CargoID or CF_ANY or CF_NONE
StringID cargo_filter_texts[NUM_CARGO + 3]; ///< Texts for filter_cargo, terminated by INVALID_STRING_ID
@@ -946,10 +980,11 @@ struct BuildVehicleWindow : Window {
this->vehicle_type = type;
this->window_number = tile == INVALID_TILE ? (int)type : tile;
- this->sel_engine = INVALID_ENGINE;
+ this->sel_engine = INVALID_ENGINE;
- this->sort_criteria = _last_sort_criteria[type];
- this->descending_sort_order = _last_sort_order[type];
+ this->sort_criteria = _engine_sort_last_criteria[type];
+ this->descending_sort_order = _engine_sort_last_order[type];
+ this->show_hidden_engines = _engine_sort_show_hidden_engines[type];
switch (type) {
default: NOT_REACHED();
@@ -979,6 +1014,9 @@ struct BuildVehicleWindow : Window {
NWidgetCore *widget = this->GetWidget(WID_BV_LIST);
widget->tool_tip = STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP + type;
+ widget = this->GetWidget(WID_BV_SHOW_HIDE);
+ widget->tool_tip = STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP + type;
+
widget = this->GetWidget(WID_BV_BUILD);
widget->widget_data = STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON + type;
widget->tool_tip = STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP + type;
@@ -987,6 +1025,11 @@ struct BuildVehicleWindow : Window {
widget->widget_data = STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON + type;
widget->tool_tip = STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP + type;
+ widget = this->GetWidget(WID_BV_SHOW_HIDDEN_ENGINES);
+ widget->widget_data = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN + type;
+ widget->tool_tip = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP + type;
+ widget->SetLowered(this->show_hidden_engines);
+
this->details_height = ((this->vehicle_type == VEH_TRAIN) ? 10 : 9) * FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
this->FinishInitNested(tile == INVALID_TILE ? (int)type : tile);
@@ -1033,7 +1076,7 @@ struct BuildVehicleWindow : Window {
/* Find the last cargo filter criteria. */
for (uint i = 0; i < filter_items; i++) {
- if (this->cargo_filter[i] == _last_filter_criteria[this->vehicle_type]) {
+ if (this->cargo_filter[i] == _engine_sort_last_cargo_criteria[this->vehicle_type]) {
this->cargo_filter_criteria = i;
break;
}
@@ -1083,6 +1126,7 @@ struct BuildVehicleWindow : Window {
* when engines become obsolete and are removed */
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
+ if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue;
EngineID eid = e->index;
const RailVehicleInfo *rvi = &e->u.rail;
@@ -1106,15 +1150,15 @@ struct BuildVehicleWindow : Window {
this->sel_engine = sel_id;
/* make engines first, and then wagons, sorted by selected sort_criteria */
- _internal_sort_order = false;
+ _engine_sort_direction = false;
EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter);
/* and then sort engines */
- _internal_sort_order = this->descending_sort_order;
- EngList_SortPartial(&this->eng_list, _sorter[0][this->sort_criteria], 0, num_engines);
+ _engine_sort_direction = this->descending_sort_order;
+ EngList_SortPartial(&this->eng_list, _engine_sort_functions[0][this->sort_criteria], 0, num_engines);
/* and finally sort wagons */
- EngList_SortPartial(&this->eng_list, _sorter[0][this->sort_criteria], num_engines, num_wagons);
+ EngList_SortPartial(&this->eng_list, _engine_sort_functions[0][this->sort_criteria], num_engines, num_wagons);
}
/* Figure out what road vehicle EngineIDs to put in the list */
@@ -1126,6 +1170,7 @@ struct BuildVehicleWindow : Window {
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
+ if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue;
EngineID eid = e->index;
if (!IsEngineBuildable(eid, VEH_ROAD, _local_company)) continue;
if (!HasBit(this->filter.roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
@@ -1144,6 +1189,7 @@ struct BuildVehicleWindow : Window {
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_SHIP) {
+ if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue;
EngineID eid = e->index;
if (!IsEngineBuildable(eid, VEH_SHIP, _local_company)) continue;
*this->eng_list.Append() = eid;
@@ -1168,6 +1214,7 @@ struct BuildVehicleWindow : Window {
* when planes become obsolete and are removed */
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_AIRCRAFT) {
+ if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue;
EngineID eid = e->index;
if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_company)) continue;
/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
@@ -1204,8 +1251,8 @@ struct BuildVehicleWindow : Window {
this->FilterEngineList();
- _internal_sort_order = this->descending_sort_order;
- EngList_Sort(&this->eng_list, _sorter[this->vehicle_type][this->sort_criteria]);
+ _engine_sort_direction = this->descending_sort_order;
+ EngList_Sort(&this->eng_list, _engine_sort_functions[this->vehicle_type][this->sort_criteria]);
this->eng_list.Compact();
this->eng_list.RebuildDone();
@@ -1214,44 +1261,50 @@ struct BuildVehicleWindow : Window {
void OnClick(Point pt, int widget, int click_count)
{
switch (widget) {
- case WID_BV_SORT_ASSENDING_DESCENDING:
+ case WID_BV_SORT_ASCENDING_DESCENDING:
this->descending_sort_order ^= true;
- _last_sort_order[this->vehicle_type] = this->descending_sort_order;
+ _engine_sort_last_order[this->vehicle_type] = this->descending_sort_order;
this->eng_list.ForceRebuild();
this->SetDirty();
break;
+ case WID_BV_SHOW_HIDDEN_ENGINES:
+ this->show_hidden_engines ^= true;
+ _engine_sort_show_hidden_engines[this->vehicle_type] = this->show_hidden_engines;
+ this->eng_list.ForceRebuild();
+ this->SetWidgetLoweredState(widget, this->show_hidden_engines);
+ this->SetDirty();
+ break;
+
case WID_BV_LIST: {
uint i = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_BV_LIST);
size_t num_items = this->eng_list.Length();
this->sel_engine = (i < num_items) ? this->eng_list[i] : INVALID_ENGINE;
this->SetDirty();
- if (click_count > 1 && !this->listview_mode) this->OnClick(pt, WID_BV_BUILD, 1);
+ if (_ctrl_pressed) {
+ this->OnClick(pt, WID_BV_SHOW_HIDE, 1);
+ } else if (click_count > 1 && !this->listview_mode) {
+ this->OnClick(pt, WID_BV_BUILD, 1);
+ }
break;
}
- case WID_BV_SORT_DROPDOWN: { // Select sorting criteria dropdown menu
- uint32 hidden_mask = 0;
- /* Disable sorting by power or tractive effort when the original acceleration model for road vehicles is being used. */
- if (this->vehicle_type == VEH_ROAD &&
- _settings_game.vehicle.roadveh_acceleration_model == AM_ORIGINAL) {
- SetBit(hidden_mask, 3); // power
- SetBit(hidden_mask, 4); // tractive effort
- SetBit(hidden_mask, 8); // power by running costs
- }
- /* Disable sorting by tractive effort when the original acceleration model for trains is being used. */
- if (this->vehicle_type == VEH_TRAIN &&
- _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL) {
- SetBit(hidden_mask, 4); // tractive effort
- }
- ShowDropDownMenu(this, _sort_listing[this->vehicle_type], this->sort_criteria, WID_BV_SORT_DROPDOWN, 0, hidden_mask);
+ case WID_BV_SORT_DROPDOWN: // Select sorting criteria dropdown menu
+ DisplayVehicleSortDropDown(this, this->vehicle_type, this->sort_criteria, WID_BV_SORT_DROPDOWN);
break;
- }
case WID_BV_CARGO_FILTER_DROPDOWN: // Select cargo filtering criteria dropdown menu
ShowDropDownMenu(this, this->cargo_filter_texts, this->cargo_filter_criteria, WID_BV_CARGO_FILTER_DROPDOWN, 0, 0);
break;
+ case WID_BV_SHOW_HIDE: {
+ const Engine *e = (this->sel_engine == INVALID_ENGINE) ? NULL : Engine::Get(this->sel_engine);
+ if (e != NULL) {
+ DoCommandP(0, 0, this->sel_engine | (e->IsHidden(_current_company) ? 0 : (1u << 31)), CMD_SET_VEHICLE_VISIBILITY);
+ }
+ break;
+ }
+
case WID_BV_BUILD: {
EngineID sel_eng = this->sel_engine;
if (sel_eng != INVALID_ENGINE) {
@@ -1286,7 +1339,7 @@ struct BuildVehicleWindow : Window {
_settings_game.vehicle.roadveh_acceleration_model == AM_ORIGINAL &&
this->sort_criteria > 7) {
this->sort_criteria = 0;
- _last_sort_criteria[VEH_ROAD] = 0;
+ _engine_sort_last_criteria[VEH_ROAD] = 0;
}
this->eng_list.ForceRebuild();
}
@@ -1304,11 +1357,22 @@ struct BuildVehicleWindow : Window {
break;
case WID_BV_SORT_DROPDOWN:
- SetDParam(0, _sort_listing[this->vehicle_type][this->sort_criteria]);
+ SetDParam(0, _engine_sort_listing[this->vehicle_type][this->sort_criteria]);
break;
case WID_BV_CARGO_FILTER_DROPDOWN:
SetDParam(0, this->cargo_filter_texts[this->cargo_filter_criteria]);
+ break;
+
+ case WID_BV_SHOW_HIDE: {
+ const Engine *e = (this->sel_engine == INVALID_ENGINE) ? NULL : Engine::Get(this->sel_engine);
+ if (e != NULL && e->IsHidden(_local_company)) {
+ SetDParam(0, STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON + this->vehicle_type);
+ } else {
+ SetDParam(0, STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON + this->vehicle_type);
+ }
+ break;
+ }
}
}
@@ -1318,19 +1382,27 @@ struct BuildVehicleWindow : Window {
case WID_BV_LIST:
resize->height = GetEngineListHeight(this->vehicle_type);
size->height = 3 * resize->height;
+ size->width = max(size->width, GetVehicleImageCellSize(this->vehicle_type, EIT_PURCHASE).extend_left + GetVehicleImageCellSize(this->vehicle_type, EIT_PURCHASE).extend_right + 165);
break;
case WID_BV_PANEL:
size->height = this->details_height;
break;
- case WID_BV_SORT_ASSENDING_DESCENDING: {
+ case WID_BV_SORT_ASCENDING_DESCENDING: {
Dimension d = GetStringBoundingBox(this->GetWidget(widget)->widget_data);
- d.width += padding.width + WD_SORTBUTTON_ARROW_WIDTH * 2; // Doubled since the string is centred and it also looks better.
+ d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
d.height += padding.height;
*size = maxdim(*size, d);
break;
}
+
+ case WID_BV_SHOW_HIDE:
+ *size = GetStringBoundingBox(STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON + this->vehicle_type);
+ *size = maxdim(*size, GetStringBoundingBox(STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON + this->vehicle_type));
+ size->width += padding.width;
+ size->height += padding.height;
+ break;
}
}
@@ -1341,8 +1413,8 @@ struct BuildVehicleWindow : Window {
DrawEngineList(this->vehicle_type, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, &this->eng_list, this->vscroll->GetPosition(), min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->eng_list.Length()), this->sel_engine, false, DEFAULT_GROUP);
break;
- case WID_BV_SORT_ASSENDING_DESCENDING:
- this->DrawSortButtonState(WID_BV_SORT_ASSENDING_DESCENDING, this->descending_sort_order ? SBS_DOWN : SBS_UP);
+ case WID_BV_SORT_ASCENDING_DESCENDING:
+ this->DrawSortButtonState(WID_BV_SORT_ASCENDING_DESCENDING, this->descending_sort_order ? SBS_DOWN : SBS_UP);
break;
}
}
@@ -1352,6 +1424,8 @@ struct BuildVehicleWindow : Window {
this->GenerateBuildList();
this->vscroll->SetCount(this->eng_list.Length());
+ this->SetWidgetDisabledState(WID_BV_SHOW_HIDE, this->sel_engine == INVALID_ENGINE);
+
this->DrawWidgets();
if (!this->IsShaded()) {
@@ -1385,7 +1459,7 @@ struct BuildVehicleWindow : Window {
case WID_BV_SORT_DROPDOWN:
if (this->sort_criteria != index) {
this->sort_criteria = index;
- _last_sort_criteria[this->vehicle_type] = this->sort_criteria;
+ _engine_sort_last_criteria[this->vehicle_type] = this->sort_criteria;
this->eng_list.ForceRebuild();
}
break;
@@ -1393,7 +1467,7 @@ struct BuildVehicleWindow : Window {
case WID_BV_CARGO_FILTER_DROPDOWN: // Select a cargo filter criteria
if (this->cargo_filter_criteria != index) {
this->cargo_filter_criteria = index;
- _last_filter_criteria[this->vehicle_type] = this->cargo_filter[this->cargo_filter_criteria];
+ _engine_sort_last_cargo_criteria[this->vehicle_type] = this->cargo_filter[this->cargo_filter_criteria];
/* deactivate filter if criteria is 'Show All', activate it otherwise */
this->eng_list.SetFilterState(this->cargo_filter[this->cargo_filter_criteria] != CF_ANY);
this->eng_list.ForceRebuild();
diff --git a/src/cargoaction.cpp b/src/cargoaction.cpp
index 367592fc3f..3f608dd02d 100644
--- a/src/cargoaction.cpp
+++ b/src/cargoaction.cpp
@@ -1,4 +1,4 @@
-/* $Id: cargoaction.cpp 26330 2014-02-10 18:55:03Z fonsinchen $ */
+/* $Id: cargoaction.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
/*
* This file is part of OpenTTD.
@@ -14,6 +14,8 @@
#include "cargoaction.h"
#include "station_base.h"
+#include "safeguards.h"
+
/**
* Decides if a packet needs to be split.
* @param cp Packet to be either split or moved in one piece.
diff --git a/src/cargomonitor.cpp b/src/cargomonitor.cpp
index 529e5e1229..aad1c4de3c 100644
--- a/src/cargomonitor.cpp
+++ b/src/cargomonitor.cpp
@@ -1,4 +1,4 @@
-/* $Id: cargomonitor.cpp 24986 2013-02-10 19:49:04Z zuu $ */
+/* $Id: cargomonitor.cpp 26685 2014-07-12 17:04:14Z alberth $ */
/*
* This file is part of OpenTTD.
@@ -13,15 +13,17 @@
#include "cargomonitor.h"
#include "station_base.h"
+#include "safeguards.h"
+
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
+ * 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.
+ * @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)
{
@@ -42,7 +44,7 @@ static void ClearCargoMonitoring(CargoMonitorMap &cargo_monitor_map, CompanyID c
/**
* Clear all pick-up cargo monitors.
- * @param company clear all pick-up monitors for this company or if INVALID_OWNER
+ * @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)
@@ -52,7 +54,7 @@ void ClearCargoPickupMonitoring(CompanyID company)
/**
* Clear all delivery cargo monitors.
- * @param company clear all delivery monitors for this company or if INVALID_OWNER
+ * @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)
@@ -67,7 +69,7 @@ void ClearCargoDeliveryMonitoring(CompanyID company)
* @param keep_monitoring After returning from this call, continue monitoring.
* @return Amount collected since last query/activation for the monitored combination.
*/
-static uint32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
+static int32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
{
CargoMonitorMap::iterator iter = monitor_map.find(monitor);
if (iter == monitor_map.end()) {
@@ -77,7 +79,7 @@ static uint32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bo
}
return 0;
} else {
- uint32 result = iter->second;
+ int32 result = iter->second;
iter->second = 0;
if (!keep_monitoring) monitor_map.erase(iter);
return result;
@@ -90,7 +92,7 @@ static uint32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bo
* @param keep_monitoring After returning from this call, continue monitoring.
* @return Amount of delivered cargo for the monitored combination.
*/
-uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
+int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
{
return GetAmount(_cargo_deliveries, monitor, keep_monitoring);
}
@@ -102,7 +104,7 @@ uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
* @return Amount of picked up cargo for the monitored combination.
* @note Cargo pick up is counted on final delivery, to prevent users getting credit for picking up cargo without delivering it.
*/
-uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
+int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
{
return GetAmount(_cargo_pickups, monitor, keep_monitoring);
}
diff --git a/src/cargomonitor.h b/src/cargomonitor.h
index f9f0def6d8..f292ba993e 100644
--- a/src/cargomonitor.h
+++ b/src/cargomonitor.h
@@ -1,4 +1,4 @@
-/* $Id: cargomonitor.h 24986 2013-02-10 19:49:04Z zuu $ */
+/* $Id: cargomonitor.h 26685 2014-07-12 17:04:14Z alberth $ */
/*
* This file is part of OpenTTD.
@@ -16,6 +16,7 @@
#include "company_func.h"
#include "industry.h"
#include "town.h"
+#include "core/overflowsafe_type.hpp"
#include