Compare commits

..

691 Commits

Author SHA1 Message Date
frosch
ed5ccce41b (svn r27195) [1.5] -Update: Documentation 2015-03-29 20:42:26 +03:00
frosch
6b42179419 (svn r27194) [1.5] -Change: New titlegame (Emperor Jake) 2015-03-29 20:42:13 +03:00
frosch
5b1632f4aa (svn r27190) -Fix [FS#6255] (r27106): Original road vehicle acceleration crashed for vehicles taking over. 2015-03-16 20:01:14 +00:00
translators
dbcf0d8625 (svn r27189) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
2015-03-16 17:45:22 +00:00
translators
a04042f7b4 (svn r27188) -Update from WebTranslator v3.0:
korean - 2 changes by telk5093
2015-03-15 20:20:16 +00:00
frosch
aef1cf42e1 (svn r27187) -Fix: Code style. 2015-03-15 12:19:58 +00:00
michi_cc
ab048fdcd1 (svn r27186) -Codechange: Rename AlwaysDrawUnpavedRoads() to better reflect what it does. 2015-03-14 14:27:07 +00:00
rubidium
7cb07acd86 (svn r27185) -Fix: prevent the compiler from optimizing an assignment away which caused GCC 5 to actually crash 2015-03-13 20:54:35 +00:00
rubidium
76b1bd0f4c (svn r27184) -Cleanup: remove some removed strings 2015-03-13 20:53:29 +00:00
rubidium
7ae2a1764d (svn r27183) -Fix: GCC5 compilation 2015-03-13 19:42:49 +00:00
translators
a149707db7 (svn r27182) -Update from WebTranslator v3.0:
luxembourgish - 4 changes by Phreeze
2015-03-13 17:45:21 +00:00
translators
f34340a2d6 (svn r27181) -Update from WebTranslator v3.0:
french - 4 changes by glx
2015-03-11 17:46:24 +00:00
translators
18d8d3e5a6 (svn r27180) -Update from WebTranslator v3.0:
catalan - 16 changes by juanjo
norwegian_bokmal - 4 changes by cuthbert
spanish - 1 changes by juanjo
2015-03-10 17:47:16 +00:00
translators
ad056b0da5 (svn r27179) -Update from WebTranslator v3.0:
afrikaans - 10 changes by telanus
croatian - 4 changes by VoyagerOne
finnish - 4 changes by jpx_
hebrew - 9 changes by oofnik
italian - 3 changes by lorenzodv
korean - 11 changes by Gimel3830, telk5093
lithuanian - 4 changes by Stabilitronas
polish - 4 changes by wojteks86
romanian - 29 changes by kneekoo
gaelic - 4 changes by GunChleoc
slovak - 17 changes by Milsa
spanish - 4 changes by SilverSurferZzZ
2015-03-09 18:15:33 +00:00
frosch
a14b836bf2 (svn r27178) -Fix [FS#5969]: Data race due to lazy initialisation of objects. 2015-03-07 18:27:01 +00:00
translators
163ab9fd56 (svn r27177) -Update from WebTranslator v3.0:
catalan - 3 changes by juanjo
dutch - 4 changes by habell
russian - 4 changes by Lone_Wolf
spanish - 10 changes by juanjo
tamil - 7 changes by ganesh
2015-03-02 17:46:37 +00:00
planetmaker
0a9364cef6 (svn r27176) -Fix: Compilation with MinGW64 (Eddy Arfik) 2015-03-02 09:10:16 +00:00
translators
833f680a5e (svn r27175) -Update from WebTranslator v3.0:
catalan - 14 changes by arnau
italian - 4 changes by lorenzodv
korean - 3 changes by telk5093
2015-03-01 17:46:04 +00:00
alberth
da9721ffd6 (svn r27174) -Feature[FS#6236]: Display relative offset changes in the sprite aligner (juzza1). 2015-03-01 08:17:14 +00:00
frosch
06e97d529b (svn r27173) -Fix [FS#6237] (r27134): Use the regular clipping functions in the sprite aligner instead of some magic. 2015-02-28 20:09:49 +00:00
frosch
c0801cbd8d (svn r27172) -Fix [FS#6238] (r27167): Apparently Windows randomly drops SetCursorPos calls. According to internet due to incorrect/missing synchronisation in threads accessing the event queue. 2015-02-28 17:13:07 +00:00
translators
b251ba3e66 (svn r27171) -Update from WebTranslator v3.0:
korean - 11 changes by telk5093
latin - 2 changes by Supercheese
2015-02-25 17:46:35 +00:00
frosch
c7ec7761f8 (svn r27169) -Update: Documentation 2015-02-24 19:25:31 +00:00
translators
a601894017 (svn r27168) -Update from WebTranslator v3.0:
latin - 4 changes by Supercheese
2015-02-23 17:45:46 +00:00
frosch
3cceb21a94 (svn r27167) -Fix: [SDL, Windows] Right-mouse-button scrolling scrolled/jumped way to far, when OpenTTD lagged during mouse event processing. 2015-02-22 23:06:45 +00:00
frosch
74b0e2b73e (svn r27166) -Codechange: Optimise ScriptList by making use of iterators instead of looking up map-items multiple times per API call. 2015-02-22 23:04:02 +00:00
translators
10c653e702 (svn r27165) -Update from WebTranslator v3.0:
english_US - 3 changes by Supercheese
2015-02-22 17:45:17 +00:00
alberth
cd36ff1bfe (svn r27164) -Add: [NoGo] Game scripts can point to a location, station, industry, or town when publishing news. 2015-02-22 17:25:29 +00:00
frosch
6cb930168f (svn r27163) -Fix [FS#6204]: Toolbars were not invalidated when changing max-vehicles settings. (adf88) 2015-02-22 15:26:27 +00:00
frosch
8d04567343 (svn r27162) -Fix [FS#6208]: Tile selection was drawn outside of map in some cases. (adf88) 2015-02-22 15:05:48 +00:00
frosch
939719ffc0 (svn r27161) -Fix [FS#6156] [FS#6206]: Reimplement the viewport drawing algorithm. 2015-02-22 14:42:34 +00:00
frosch
d35670aa2a (svn r27160) -Fix: Division of signed values by TILE_SIZE requires cast to stay signed. 2015-02-22 14:14:30 +00:00
frosch
7dee16a9b9 (svn r27159) -Codechange: Simplify mapping from smallmap to viewport coordinates by duplicating less code. 2015-02-22 14:12:34 +00:00
frosch
79380a566e (svn r27158) -Codechange: Simplify mapping from viewport to smallmap coordinates by duplicating less code. 2015-02-22 14:10:44 +00:00
frosch
bd3a8bf9e4 (svn r27157) -Fix: Mark bridge middle tiles dirty when building/removing/changing bridges. 2015-02-22 14:01:24 +00:00
translators
9a601a1029 (svn r27156) -Update from WebTranslator v3.0:
traditional_chinese - 1 changes by siu238X
2015-02-20 17:45:21 +00:00
translators
2b82b55b7f (svn r27155) -Update from WebTranslator v3.0:
traditional_chinese - 1 changes by siu238X
2015-02-19 17:45:41 +00:00
translators
993622d770 (svn r27154) -Update from WebTranslator v3.0:
indonesian - 9 changes by UseYourIllusion
korean - 4 changes by telk5093
2015-02-18 17:45:30 +00:00
translators
c4f8995a1d (svn r27153) -Update from WebTranslator v3.0:
german - 3 changes by mbender
korean - 2 changes by telk5093
malay - 12 changes by im54
2015-02-15 17:45:47 +00:00
frosch
4b39e3d98c (svn r27152) -Fix: Generated files. 2015-02-15 14:56:21 +00:00
frosch
04b8fe6d0b (svn r27151) -Add: Allow changing max heightlevel in scenario editor. 2015-02-14 21:55:30 +00:00
frosch
e40c3149de (svn r27150) -Fix (r27146): Forgot scenario toolbar. 2015-02-14 21:22:47 +00:00
translators
5779e0d192 (svn r27149) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
2015-02-14 17:45:41 +00:00
frosch
891e4c40ce (svn r27148) -Fix: Rounding and unit-conversion inconsistencies in calls to MarkAllViewportsDirty. 2015-02-14 12:53:07 +00:00
frosch
5ebc0c9934 (svn r27147) -Fix: Scale (non-custom) default window sizes according to GUI zoom. 2015-02-13 21:25:48 +00:00
frosch
abe22e594d (svn r27146) -Fix: Make statusbar and chat-entry window use the same width as the toolbar. Otherwise they lack a size definition. 2015-02-13 21:13:45 +00:00
translators
0360abb54e (svn r27145) -Update from WebTranslator v3.0:
malay - 11 changes by TheITChap
2015-02-13 17:45:22 +00:00
frosch
3d37abf802 (svn r27144) -Change: The chatbox-width setting now uses percent of screen width instead of pixels. 2015-02-12 20:00:23 +00:00
translators
f610db45b8 (svn r27142) -Update from WebTranslator v3.0:
turkish - 77 changes by wakeup
2015-02-10 17:45:15 +00:00
translators
9cb0d889d7 (svn r27141) -Update from WebTranslator v3.0:
indonesian - 57 changes by fanioz
korean - 3 changes by telk5093
2015-02-09 17:45:34 +00:00
alberth
6670d28cca (svn r27140) -Codechange: Fix typo in GenenerateLandscapeWindowMode (chillcore) 2015-02-08 21:05:48 +00:00
translators
11d6570585 (svn r27139) -Update from WebTranslator v3.0:
korean - 12 changes by Gimel3830
2015-02-08 17:45:49 +00:00
frosch
00981908d0 (svn r27138) -Fix: [NewGRF] Negative positions in industry layouts were interpreted incorrectly; however since the wrong behaviour is saner, define as the correct behaviour for GRFv8. 2015-02-06 21:56:50 +00:00
frosch
f933dec10b (svn r27137) -Fix (r0): Oilrig empty-tile checks were incorrect due to wrong TileIndexDiff->TileIndexDiffC conversion. 2015-02-06 21:54:19 +00:00
translators
dcf5c12280 (svn r27136) -Update from WebTranslator v3.0:
afrikaans - 1 changes by telanus
2015-02-05 17:45:18 +00:00
frosch
b6568912f1 (svn r27135) -Fix: Misalignment in generate world window in case of small fonts. 2015-02-01 22:04:50 +00:00
frosch
8767a11d60 (svn r27134) -Codechange: Simplify GUI scaling by adding UnScaleGUI() and ScaleGUITrad(). 2015-02-01 20:54:24 +00:00
frosch
cd3f113249 (svn r27133) -Fix: Dragging of free wagons in depot failed with GUI zoom. 2015-02-01 19:40:04 +00:00
frosch
a0c42f25a4 (svn r27132) -Codechange: Add an assertion about the size of the Tile struct to ensure alignment assumptions. 2015-02-01 12:25:51 +00:00
frosch
18a1131e9f (svn r27131) -Fix: Dropdown- and tooltip-windows should not steal the focus. 2015-02-01 12:23:39 +00:00
translators
4e626567ae (svn r27130) -Update from WebTranslator v3.0:
simplified_chinese - 1 changes by ww9980
2015-01-31 17:45:21 +00:00
translators
70d52a502a (svn r27129) -Update from WebTranslator v3.0:
malay - 18 changes by im54
2015-01-30 17:45:13 +00:00
translators
c2ce131f21 (svn r27128) -Update from WebTranslator v3.0:
afrikaans - 2 changes by kdzar
2015-01-29 17:45:32 +00:00
translators
fd3388467f (svn r27127) -Update from WebTranslator v3.0:
latin - 1 changes by Supercheese
2015-01-26 17:45:25 +00:00
planetmaker
19bf264433 (svn r27126) -Fix [FS#6218] (r26873): Reduce memory footprint of map array by shuffling its variables 2015-01-26 10:27:51 +00:00
translators
14a24f5732 (svn r27125) -Update from WebTranslator v3.0:
latin - 3 changes by Supercheese
2015-01-23 17:45:19 +00:00
translators
577d812df4 (svn r27124) -Update from WebTranslator v3.0:
norwegian_nynorsk - 18 changes by 2rB
2015-01-22 17:45:22 +00:00
frosch
bf714413a2 (svn r27123) -Fix [FS#5371] [FS#6214]: API docs (krinn) 2015-01-20 19:11:31 +00:00
translators
f22b6d3116 (svn r27122) -Update from WebTranslator v3.0:
bulgarian - 22 changes by komara
2015-01-19 17:45:27 +00:00
translators
d97b60fb21 (svn r27121) -Update from WebTranslator v3.0:
irish - 2 changes by tem
latin - 1 changes by Supercheese
2015-01-18 17:45:32 +00:00
translators
c16caa87d5 (svn r27120) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
2015-01-17 17:45:21 +00:00
frosch
e5a8f6e7d4 (svn r27119) -Fix: Action 7/9 condition 0A failed for present, but disabled, NewGRF. 2015-01-17 15:00:02 +00:00
translators
59db260e63 (svn r27118) -Update from WebTranslator v3.0:
english_US - 1 changes by Supercheese
irish - 5 changes by tem
2015-01-15 17:45:31 +00:00
frosch
0a10fce8f1 (svn r27117) -Fix/Feature: Make use of both rocky tile sets from the base graphics. 2015-01-10 20:10:51 +00:00
translators
99b89f67db (svn r27116) -Update from WebTranslator v3.0:
esperanto - 1 changes by polluks
slovak - 15 changes by Blayss
2015-01-10 17:46:35 +00:00
translators
de3e7110e0 (svn r27115) -Update from WebTranslator v3.0:
irish - 10 changes by tem
2015-01-07 17:45:20 +00:00
translators
63318c2144 (svn r27114) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
danish - 2 changes by Gankenstein
spanish - 5 changes by juanjo
2015-01-06 17:45:49 +00:00
translators
a41fc2e341 (svn r27113) -Update from WebTranslator v3.0:
spanish - 1 changes by juanjo
2015-01-05 17:45:15 +00:00
translators
4dc65dd9b5 (svn r27112) -Update from WebTranslator v3.0:
luxembourgish - 1 changes by Phreeze
spanish - 2 changes by SilverSurferZzZ
2015-01-04 17:45:35 +00:00
alberth
39d6562158 (svn r27111) -Doc: Extend script documentation with Save and Load functions. 2015-01-04 15:14:13 +00:00
translators
e25e44866e (svn r27110) -Update from WebTranslator v3.0:
afrikaans - 1 changes by telanus
spanish - 1 changes by SilverSurferZzZ
2015-01-03 17:45:29 +00:00
rubidium
f0924bb910 (svn r27109) -Fix (r27102): MinGW compilation 2015-01-02 19:50:43 +00:00
translators
19198a2156 (svn r27108) -Update from WebTranslator v3.0:
latin - 1 changes by Supercheese
spanish - 2 changes by SilverSurferZzZ
2015-01-02 17:45:51 +00:00
rubidium
cd9d6f85e5 (svn r27107) -Fix [FS#6183]: 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; e.g. facing toward a depot with the entry facing the wrong way failed to reverse whereas facing towards an empty tile allowed the vehicle to reverse (estys) 2015-01-02 12:11:20 +00:00
michi_cc
9983ddee32 (svn r27106) -Fix [FS#6176]: Use the actual max speed of the vehicle in front when determining if a RV can overtake. 2015-01-01 22:39:35 +00:00
rubidium
84b7773724 (svn r27105) -Fix [FS#6195]: grow_counter was not properly bounded by growth_rate, but by some other value used to calculate growth_rate. 2015-01-01 21:25:42 +00:00
rubidium
65f836f677 (svn r27104) -Fix [FS#6194]: support 64 bits integere in the ScriptLists as well 2015-01-01 21:08:19 +00:00
rubidium
dd40950643 (svn r27103) -Update: copyright date 2015-01-01 20:51:18 +00:00
rubidium
978d4e4eaa (svn r27102) -Fix [FS#6194]: money values would end up wrong in strings when outside of the bounds of a 32 bits integer 2015-01-01 20:50:43 +00:00
translators
1ed92b3ca3 (svn r27101) -Update from WebTranslator v3.0:
simplified_chinese - 4 changes by mhching
luxembourgish - 17 changes by Phreeze
2014-12-31 17:45:32 +00:00
translators
44cfdbbfc6 (svn r27100) -Update from WebTranslator v3.0:
luxembourgish - 334 changes by Phreeze
2014-12-30 17:45:27 +00:00
translators
3245076905 (svn r27099) -Update from WebTranslator v3.0:
spanish - 2 changes by SilverSurferZzZ
2014-12-27 17:45:27 +00:00
translators
202adad53a (svn r27098) -Update from WebTranslator v3.0:
hungarian - 1 changes by Brumi
2014-12-26 17:45:15 +00:00
translators
4841873f36 (svn r27097) -Update from WebTranslator v3.0:
serbian - 26 changes by Suleiman
2014-12-25 17:45:19 +00:00
frosch
6b0ea01f4e (svn r27095) -Update: Documentation 2014-12-24 19:31:26 +00:00
translators
e02b267f01 (svn r27094) -Update from WebTranslator v3.0:
esperanto - 4 changes by polluks
2014-12-24 17:45:15 +00:00
frosch
0bc06e8e08 (svn r27093) -Update: Add 3rdparty/os2 licenses to readme.txt 2014-12-24 17:37:30 +00:00
frosch
93fb724f87 (svn r27092) -Fix/Add [FS#6186]: Compilation on OS/2 (smedles) 2014-12-24 17:17:18 +00:00
frosch
23b44140a9 (svn r27091) -Fix [FS#6170] (r27012): Make manpage more portable. (bentley) 2014-12-24 16:53:04 +00:00
frosch
ff43128963 (svn r27090) -Codechange [FS#5976]: Simplify some hierarchical groups code. (Juanjo) 2014-12-24 16:49:57 +00:00
translators
2cf3024d39 (svn r27089) -Update from WebTranslator v3.0:
esperanto - 24 changes by polluks
2014-12-23 17:45:30 +00:00
translators
cd4db2e8e7 (svn r27088) -Update from WebTranslator v3.0:
irish - 20 changes by tem
2014-12-22 17:45:13 +00:00
rubidium
fe92e9678f (svn r27087) -Fix (r26864): the shadow bit of disaster vehicles got cleared after being set to show a shadow 2014-12-21 20:49:15 +00:00
alberth
8f6df8c230 (svn r27086) -Codechange: Simplify opening of windows by always returning a valid window pointer. 2014-12-18 18:22:23 +00:00
alberth
eb9da96a46 (svn r27085) -Fix: Always return a valid window to the world generation gui code. 2014-12-18 18:20:59 +00:00
alberth
b67d483b46 (svn r27084) -Doc: Improve documentation of AllocateWindowDescFront. 2014-12-18 16:50:11 +00:00
translators
21a4672485 (svn r27083) -Update from WebTranslator v3.0:
latin - 9 changes by Supercheese
2014-12-16 17:45:31 +00:00
translators
768a4cd790 (svn r27082) -Update from WebTranslator v3.0:
lithuanian - 4 changes by Stabilitronas
2014-12-14 17:45:22 +00:00
translators
79e90dfe11 (svn r27081) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
lithuanian - 11 changes by Stabilitronas
2014-12-13 17:45:40 +00:00
translators
cfa4bf7e8c (svn r27080) -Update from WebTranslator v3.0:
latin - 2 changes by Supercheese
2014-12-11 17:45:32 +00:00
planetmaker
84e2d4dd9e (svn r27079) -Fix: Compilation with freetype2 version 2.5.4 and newer (AMDmi3) 2014-12-11 12:25:53 +00:00
translators
395c65e561 (svn r27078) -Update from WebTranslator v3.0:
latin - 12 changes by Supercheese
portuguese - 47 changes by ZeDWeB
2014-12-10 17:45:59 +00:00
translators
8c4d779ff1 (svn r27077) -Update from WebTranslator v3.0:
danish - 10 changes by manframe
2014-12-08 17:45:49 +00:00
translators
489958f1a4 (svn r27076) -Update from WebTranslator v3.0:
arabic_egypt - 1 changes by awensome
2014-12-07 17:45:17 +00:00
frosch
1bbe59af69 (svn r27075) -Fix [FS#6182]: Variable 47 used the carge translation table of the wrong GRF in case of callback 1D. 2014-12-07 14:13:21 +00:00
translators
051be72ba3 (svn r27074) -Update from WebTranslator v3.0:
japanese - 16 changes by guppy
2014-12-05 17:45:14 +00:00
translators
801d4ba918 (svn r27073) -Update from WebTranslator v3.0:
danish - 14 changes by manframe
2014-12-04 17:45:15 +00:00
translators
bd6a4c35c4 (svn r27072) -Update from WebTranslator v3.0:
danish - 8 changes by manframe
korean - 3 changes by telk5093
serbian - 22 changes by SoMiPro202
2014-12-03 17:46:16 +00:00
translators
9edee18e28 (svn r27071) -Update from WebTranslator v3.0:
spanish - 2 changes by juanjo
2014-12-02 17:45:26 +00:00
translators
68937dc638 (svn r27070) -Update from WebTranslator v3.0:
catalan - 1 changes by juanjo
spanish - 3 changes by juanjo
2014-12-01 17:45:48 +00:00
translators
c2acc4ffbb (svn r27069) -Update from WebTranslator v3.0:
bulgarian - 3 changes by pdedinski
2014-11-30 17:45:17 +00:00
translators
61d1f8e121 (svn r27068) -Update from WebTranslator v3.0:
danish - 28 changes by manframe
tamil - 52 changes by aswn
2014-11-26 17:45:22 +00:00
translators
91cb6e8774 (svn r27067) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
2014-11-25 17:45:18 +00:00
translators
ef49bca5c7 (svn r27066) -Update from WebTranslator v3.0:
polish - 19 changes by wojteks86
2014-11-23 17:45:54 +00:00
translators
4e3622bade (svn r27065) -Update from WebTranslator v3.0:
danish - 18 changes by manframe
2014-11-21 17:45:16 +00:00
translators
4b62fc9bbd (svn r27064) -Update from WebTranslator v3.0:
danish - 35 changes by manframe
irish - 16 changes by tem
2014-11-20 17:45:41 +00:00
frosch
e4063cb6d4 (svn r27063) -Fix [FS#6172]: Some lists did not use natural string sorting. 2014-11-18 20:12:42 +00:00
translators
ae17dd7d19 (svn r27062) -Update from WebTranslator v3.0:
latin - 5 changes by Supercheese
2014-11-14 17:45:15 +00:00
translators
ca02d7df4f (svn r27061) -Update from WebTranslator v3.0:
czech - 1 changes by marek995
latvian - 1 changes by Parastais
2014-11-13 17:45:38 +00:00
peter1138
e21ebb26c8 (svn r27060) -Doc: Remove obsolete comment (64KB LUT would be 8GB with current limits) 2014-11-11 11:50:04 +00:00
planetmaker
2d3ad05aa7 (svn r27059) -Change: [Makefile] Make sure to use plain mercurial output unaltered by personal presets 2014-11-09 16:37:07 +00:00
translators
2072edc02c (svn r27058) -Update from WebTranslator v3.0:
french - 1 changes by romazoon
galician - 70 changes by permudo
latin - 5 changes by Supercheese
2014-11-08 17:45:53 +00:00
translators
f3ec20a494 (svn r27057) -Update from WebTranslator v3.0:
latin - 2 changes by Supercheese
2014-11-06 17:45:32 +00:00
translators
aa0e397c97 (svn r27056) -Update from WebTranslator v3.0:
czech - 2 changes by Eskymak
portuguese - 4 changes by vesgo
2014-11-05 17:46:01 +00:00
translators
a2bde8dba6 (svn r27055) -Update from WebTranslator v3.0:
simplified_chinese - 6 changes by siu238X
traditional_chinese - 49 changes by siu238X
2014-11-04 17:45:38 +00:00
translators
a9a8ed5188 (svn r27054) -Update from WebTranslator v3.0:
irish - 9 changes by tem
portuguese - 40 changes by vesgo
2014-11-03 17:45:59 +00:00
translators
3eb4d49f97 (svn r27053) -Update from WebTranslator v3.0:
latin - 2 changes by Supercheese
vietnamese - 145 changes by nglekhoi
2014-11-02 17:46:34 +00:00
translators
c0445bb20a (svn r27052) -Update from WebTranslator v3.0:
simplified_chinese - 24 changes by siu238X
traditional_chinese - 19 changes by siu238X
swedish - 23 changes by Chrill
2014-11-01 17:46:13 +00:00
translators
619e6bbeda (svn r27051) -Update from WebTranslator v3.0:
irish - 15 changes by tem
2014-10-29 17:45:14 +00:00
translators
e9ba763f74 (svn r27050) -Update from WebTranslator v3.0:
irish - 62 changes by tem
korean - 1 changes by telk5093
2014-10-28 17:45:28 +00:00
peter1138
1ad3db76e6 (svn r27049) -Fix (r26482): Fix compilation with --enable-desync-debug. 2014-10-28 11:32:19 +00:00
peter1138
2c21d4fbd1 (svn r27048) -Fix (r26158): Position in articulated vehicle is 4D, not 4A. 2014-10-28 00:51:51 +00:00
translators
9cb1ca6fbd (svn r27047) -Update from WebTranslator v3.0:
norwegian_nynorsk - 58 changes by eloekset
spanish - 2 changes by SilverSurferZzZ
turkish - 10 changes by wakeup
2014-10-27 17:47:15 +00:00
fonsinchen
221f1a2e46 (svn r27046) -Fix [FS#5812]: Don't require double-press from non-dead console hotkeys. 2014-10-26 20:01:36 +00:00
translators
7e6eb5043b (svn r27045) -Update from WebTranslator v3.0:
irish - 83 changes by tem
gaelic - 1 changes by GunChleoc
spanish - 2 changes by SilverSurferZzZ
2014-10-26 17:46:16 +00:00
frosch
372acd13be (svn r27044) -Change (r26905, r26984): Scale heightmap greyscales > 0 evenly to heightlevels > 0, instead of giving heightlevel 1 a bigger loading. Sea level remains at pure black only. 2014-10-25 22:24:05 +00:00
rubidium
ed8f48a945 (svn r27043) -Fix: could not enter third digit of snow line height 2014-10-25 21:02:59 +00:00
translators
574767cacf (svn r27042) -Update from WebTranslator v3.0:
irish - 265 changes by tem
2014-10-25 17:45:23 +00:00
rubidium
f453c166c5 (svn r27041) -Update: ob* translations 2014-10-25 12:35:48 +00:00
fonsinchen
0affe0e119 (svn r27040) -Fix: Don't use GCC diagnostic push/pop if unsupported 2014-10-25 12:32:42 +00:00
translators
dd8f90882f (svn r27039) -Update from WebTranslator v3.0:
irish - 123 changes by tem
latvian - 77 changes by Parastais
2014-10-24 17:45:29 +00:00
translators
543656f256 (svn r27038) -Update from WebTranslator v3.0:
belarusian - 21 changes by KorneySan
catalan - 2 changes by juanjo
czech - 14 changes by Eskymak
russian - 1 changes by KorneySan
2014-10-23 17:46:24 +00:00
rubidium
988b387f14 (svn r27037) -Fix [FS#6150] (r26878): m6 was moved from Tile To TileExtended, but it wasn't properly removed from Tile (patch by Juanjo) 2014-10-23 17:13:44 +00:00
rubidium
1149f7be46 (svn r27036) -Fix [FS#6148] (r26928): crash when changing smallmap colour when the smallmap window has not been opened yet 2014-10-23 10:50:34 +00:00
matthijs
3ef8ddce2b (svn r27035) -Feature: Support .txt.xz changelog, readme and license files in basesets, newgrfs, etc 2014-10-23 10:49:19 +00:00
matthijs
fa0860db9d (svn r27034) -Feature: Support .txt.gz changelog, readme and license files in basesets, newgrfs, etc 2014-10-23 10:49:16 +00:00
matthijs
3596bee92f (svn r27033) -Codechange: Generalize GetTextfile for multiple extensions
- Instead of hardcoding the .txt extension in a printf string, it is
    now stored in an array of possible extensions. This array still only
    contains .txt, so behaviour is unchanged, but this makes it easier
    to add other extensions later.
2014-10-23 10:49:14 +00:00
rubidium
a0f58d54dc (svn r27032) -Merge: documentation updates from 1.4 branch 2014-10-23 09:47:15 +00:00
translators
05e8bdebc2 (svn r27031) -Update from WebTranslator v3.0:
irish - 94 changes by tem
2014-10-22 17:45:39 +00:00
rubidium
09f6c46d0b (svn r27030) -Fix: crash when having the vehicle list opened from a buoy or oil rig while the buoy/oil rig gets its final removal (i.e. the sign gets removed) 2014-10-21 19:16:47 +00:00
translators
3cd00ed2fc (svn r27027) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
dutch - 2 changes by habell
finnish - 45 changes by jpx_
irish - 58 changes by tem
spanish - 2 changes by SilverSurferZzZ
2014-10-21 17:48:00 +00:00
rubidium
c017c18c26 (svn r27026) -Fix: some (older-ish) GCC compiler warnings 2014-10-21 16:58:15 +00:00
translators
a2f1351a90 (svn r27025) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
latin - 8 changes by Supercheese
norwegian_bokmal - 6 changes by cuthbert
2014-10-18 17:47:05 +00:00
peter1138
0889145dc5 (svn r27024) -Codechange: Adjust spacing on small order list. 2014-10-18 16:12:48 +00:00
peter1138
ca4f7b0eca (svn r27023) -Codechange: Scale tooltip size by UI scale. 2014-10-18 16:11:40 +00:00
translators
616622a8c0 (svn r27022) -Update from WebTranslator v3.0:
afrikaans - 2 changes by telanus
swedish - 3 changes by spacejens
welsh - 9 changes by kazzie
2014-10-17 17:46:54 +00:00
translators
eb2c2bdafa (svn r27021) -Update from WebTranslator v3.0:
afrikaans - 20 changes by telanus
romanian - 17 changes by kitguyy
2014-10-16 17:45:44 +00:00
rubidium
0c2f4bdc2b (svn r27020) -Cleanup: some coding style consistency improvements (mostly spaces) 2014-10-15 18:31:37 +00:00
translators
4f1d50190a (svn r27019) -Update from WebTranslator v3.0:
catalan - 3 changes by juanjo
croatian - 1 changes by VoyagerOne
romanian - 19 changes by kitguyy
russian - 6 changes by Lone_Wolf
spanish - 2 changes by SilverSurferZzZ
2014-10-15 17:46:35 +00:00
rubidium
4c6febee49 (svn r27018) -Fix [FS#6141] (r27008): the higher amplitudes needed for higher maps were not ignored properly causing much smoother maps than wanted 2014-10-14 17:49:32 +00:00
translators
5911d5cb93 (svn r27017) -Update from WebTranslator v3.0:
catalan - 11 changes by juanjo
english_US - 1 changes by Supercheese
german - 6 changes by planetmaker
hungarian - 14 changes by Brumi
italian - 1 changes by lorenzodv
latin - 6 changes by Supercheese
spanish - 3 changes by SilverSurferZzZ
welsh - 8 changes by kazzie
2014-10-14 17:48:51 +00:00
peter1138
4de8b75605 (svn r27016) -Fix (r27004): Setting font-sprite data failed for some user(s). 2014-10-14 16:09:21 +00:00
peter1138
d549ed2d6c (svn r27015) -Codechange: Also scale the character spacing for fonts without shadow. 2014-10-14 14:16:38 +00:00
rubidium
ba96233b6e (svn r27014) -Fix [FS#6102]: unit number was not always fully shown in depots 2014-10-14 11:40:38 +00:00
rubidium
890f50d491 (svn r27013) -Codechange: extract the functionality to determine the number of digits to make space for when drawing an unit number into a separate function 2014-10-14 11:23:41 +00:00
rubidium
76f6bf0b32 (svn r27012) -Change: improvements to the man page (bentley) 2014-10-14 08:24:47 +00:00
translators
6cba7f4447 (svn r27011) -Update from WebTranslator v3.0:
catalan - 1 changes by juanjo
croatian - 15 changes by VoyagerOne
dutch - 28 changes by habell
latin - 5 changes by Supercheese
latvian - 50 changes by Olby
gaelic - 34 changes by GunChleoc
spanish - 2 changes by SilverSurferZzZ
2014-10-13 17:49:11 +00:00
rubidium
5d7f235bd3 (svn r27010) -Feature [FS#4126]: more height levels (ic111, ChillCore, CommanderZ) 2014-10-13 14:30:59 +00:00
rubidium
0efe811f74 (svn r27009) -Add: extra level of general map heightness (ChillCore) 2014-10-13 14:22:48 +00:00
rubidium
1d685c9711 (svn r27008) -Change: extrapolate the amplitudes for the large wavelengths needed for much higher maps 2014-10-13 14:16:20 +00:00
rubidium
cb64738f4c (svn r27007) -Codechange: allow for more frequencies (based on patch by ic111) 2014-10-13 14:14:04 +00:00
rubidium
4a497c1bbb (svn r27006) -Codechange: move getting of the amplitude to a seperate function 2014-10-13 14:12:06 +00:00
rubidium
325d2b419d (svn r27005) -Fix (r26999): variety distribution curve map scaling did one conversion to height_t too many 2014-10-13 14:07:37 +00:00
peter1138
aa6fdf6f13 (svn r27004) -Codechange: Make GUI size apply to (sprite-font) text as well. 2014-10-12 20:43:25 +00:00
rubidium
660a95e5d2 (svn r27003) -Cleanup: fix the use of spaces and asterices "around" some comments 2014-10-12 18:41:53 +00:00
rubidium
26574124b1 (svn r27002) -Fix-ish: replace some non-ASCII characters with ASCII characters, e.g. @þaram to @param 2014-10-12 18:26:54 +00:00
translators
0b76408304 (svn r27001) -Update from WebTranslator v3.0:
afrikaans - 4 changes by telanus
catalan - 16 changes by juanjo
english_US - 6 changes by Supercheese
french - 5 changes by glx
hungarian - 66 changes by IPG
italian - 5 changes by lorenzodv
korean - 5 changes by telk5093
russian - 5 changes by Lone_Wolf
spanish - 4 changes by SilverSurferZzZ
2014-10-12 17:49:12 +00:00
rubidium
ffb443934a (svn r27000) -Fix (r26999): compilation error with some versions of GCC 2014-10-12 11:53:13 +00:00
rubidium
a9de336295 (svn r26999) -Codechange: make the variety distribution automatically scale to the maximum height of the map 2014-10-12 11:28:45 +00:00
rubidium
c44c6b0f9b (svn r26998) -Change: account for the map size when determining the maximum height of the landscape; a 24 high mountain at 64x64 leaves barely any usable space, but on a 4096x4096 it's just a "small" bump (ic111) 2014-10-12 10:55:49 +00:00
rubidium
5159d90e6c (svn r26997) -Fix/codechange: use signed integers for TGP's internal map size and X/Y variables due to X/Y in comparisons occasionally getting smaller than 0 due to subtractions 2014-10-12 10:49:29 +00:00
peter1138
dcced1007b (svn r26996) -Codechange: Don't clamp airport construction window size -- this causes very poor performance if the game window is not large enough. 2014-10-12 10:48:18 +00:00
frosch
3ea4eebe9a (svn r26995) -Fix: Add missing files to source.list 2014-10-11 21:38:32 +00:00
planetmaker
51a2a31c46 (svn r26994) -Fix (r26992): Missing svn properties 2014-10-11 21:35:56 +00:00
planetmaker
ff71a8f5c9 (svn r26993) -Feature: Latin translation (Supercheese) 2014-10-11 21:30:33 +00:00
translators
3c2316b979 (svn r26992) -Update from WebTranslator v3.0:
basque - 60 changes by Thadah
french - 10 changes by glx
italian - 8 changes by lorenzodv
norwegian_bokmal - 4 changes by cuthbert
swedish - 3 changes by Zuu
2014-10-11 17:48:09 +00:00
rubidium
d43c3d73e1 (svn r26991) -Fix [FS#6132]: typo in help text (Supercheese) 2014-10-11 16:16:52 +00:00
peter1138
2655de52d7 (svn r26990) -Feature: Add option to choose normal, double or quad-size interface. 2014-10-11 13:22:37 +00:00
planetmaker
f7c64bc2dd (svn r26989) -Change [FS#6135]: Introduction of Euro in Lithuania is 2015 (devastator) 2014-10-10 23:07:59 +00:00
frosch
354f03ad5d (svn r26988) -Add: [NewGRF] Allow callback 160 to access variable 61. 2014-10-10 19:46:10 +00:00
translators
1e954351ff (svn r26987) -Update from WebTranslator v3.0:
english_US - 8 changes by Supercheese
german - 9 changes by planetmaker
korean - 10 changes by telk5093
russian - 8 changes by Lone_Wolf
2014-10-10 17:46:12 +00:00
frosch
4132e4e7e3 (svn r26986) -Change: Rename 'Advanced Settings' to just 'Settings'. 2014-10-09 21:16:29 +00:00
frosch
f72e4dfbe4 (svn r26985) -Change: Make settings categories more descriptive. 2014-10-09 20:40:36 +00:00
frosch
284912d102 (svn r26984) -Fix (r26905) [FS#6134]: Heightlevels must be scaled by number of intervals, not by the value of the highest interval. Otherwise the highest interval becomes non-proportionally small. 2014-10-09 19:57:40 +00:00
frosch
9efb6be700 (svn r26983) -Fix: Account for max_heightlevel when saving heightmaps. 2014-10-09 19:52:07 +00:00
translators
c3e286ae58 (svn r26982) -Update from WebTranslator v3.0:
simplified_chinese - 39 changes by siu238X
2014-10-09 17:46:13 +00:00
translators
bea7010a8b (svn r26979) -Update from WebTranslator v3.0:
english_US - 1 changes by Supercheese
2014-10-08 17:45:15 +00:00
peter1138
39fa9d2127 (svn r26978) -Fix (r23609): Typo in game script warning message. 2014-10-08 16:34:52 +00:00
translators
8a971f0229 (svn r26976) -Update from WebTranslator v3.0:
korean - 6 changes by telk5093
2014-10-07 17:45:44 +00:00
rubidium
815576440c (svn r26975) -Fix: reading too many bits when determining the client index for desync debug message 2014-10-07 17:32:29 +00:00
rubidium
fdd5b2293d (svn r26971) -Fix: widget_data was sometimes uint16 and sometimes uint32; make it always be uint32 2014-10-06 19:16:29 +00:00
rubidium
9f654b200d (svn r26970) -Fix (r26969): non-sse animated blitter crashed occasionally 2014-10-06 19:15:00 +00:00
rubidium
eabb35a874 (svn r26969) -Fix (r26869): black palette didn't work very well with unmasked 32bpp sprites 2014-10-06 18:45:51 +00:00
translators
485f60bb9f (svn r26968) -Update from WebTranslator v3.0:
croatian - 4 changes by VoyagerOne
2014-10-06 17:45:25 +00:00
rubidium
42a4379fad (svn r26967) -Fix [FS#6127]: inconsistency between strings regarding cloning vehicles (Supercheese) 2014-10-06 16:36:36 +00:00
peter1138
c7e2b466a5 (svn r26966) -Codechange: Remove two strings made obsolete in r26965. 2014-10-05 21:21:24 +00:00
peter1138
ee266b9b9d (svn r26965) -Codechange: Add palette bit to indicate that palette is actually a text colour remap, and draw closebox as a sprite, using said bit. Change news popup to use closebox widget for its closebox. 2014-10-05 21:18:37 +00:00
peter1138
d3c614c3cf (svn r26964) -Codechange: Allow editbox size to change. 2014-10-05 18:10:01 +00:00
translators
c4e8c81707 (svn r26963) -Update from WebTranslator v3.0:
english_US - 3 changes by Supercheese
hebrew - 10 changes by oofnik
norwegian_bokmal - 39 changes by cuthbert
2014-10-05 17:45:47 +00:00
peter1138
a0c53f7c4c (svn r26962) -Fix: Set up scrollbar size at the correct time (where it can be changed). Also ensure scrollbar is long enough to at least contain its buttons. 2014-10-05 16:43:44 +00:00
peter1138
b46e61be63 (svn r26961) -Codechange: GUI-scale for landscape editor terraform window. 2014-10-05 14:01:44 +00:00
peter1138
6872b647f1 (svn r26960) -Codechange: Draw sort button symbols as sprites, and pad sort buttons with non-static width. 2014-10-05 11:20:02 +00:00
peter1138
ae22f8ab55 (svn r26959) -Codechange: GUI-scale for settings window. 2014-10-04 20:34:43 +00:00
peter1138
79e124cf2b (svn r26957) -Codechange: Spread the station cargo icons out by GUI scale. 2014-10-04 20:18:25 +00:00
peter1138
44fa18b4fa (svn r26956) -Codechange: GUI-scale for cheat window. 2014-10-04 19:52:23 +00:00
rubidium
67991b70f0 (svn r26955) -Fix [FS#6126]: owner of road depot road types were not properly changed upon bankruptcy causing crashes when trying to remove the depot in certain situations 2014-10-04 19:23:43 +00:00
peter1138
d3332d106b (svn r26954) -Codechange: GUI-scale for AI/GS settings and NewGRF settings windows. 2014-10-04 18:19:22 +00:00
peter1138
7f6a282b7f (svn r26953) -Codechange: GUI-scale for company manager face on news popup. 2014-10-04 18:13:10 +00:00
translators
cc0847deb9 (svn r26952) -Update from WebTranslator v3.0:
japanese - 54 changes by guppy
2014-10-04 17:45:15 +00:00
peter1138
f7f49c15a3 (svn r26951) -Codechange: Do the GUI-scale dance for vehicle, depot, and purchase lists. 2014-10-04 16:40:23 +00:00
peter1138
3b3c1f1cec (svn r26950) -Codechange: GUI-scale dancing for NewGRF objects window. 2014-10-04 11:49:05 +00:00
translators
687ad230d8 (svn r26949) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
english_US - 5 changes by Supercheese
brazilian_portuguese - 19 changes by Tucalipe
russian - 3 changes by Lone_Wolf
spanish - 2 changes by SilverSurferZzZ
2014-10-03 17:46:24 +00:00
translators
94c7401a78 (svn r26948) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
spanish - 1 changes by SilverSurferZzZ
2014-10-02 17:45:22 +00:00
rubidium
a255c87d32 (svn r26947) -Fix [FS#6122, FS#6125]: textual improvements of the base "translation" 2014-10-02 17:41:36 +00:00
rubidium
517bfd4361 (svn r26946) -Fix (r26945): MSVC doesn't seem to have round yet 2014-10-02 17:40:45 +00:00
rubidium
94513de4f8 (svn r26945) -Fix-ish: better scaling of the "cells" in which variety distribution happens for non-square maps (attempt to make reasonably square areas) 2014-10-02 17:32:45 +00:00
translators
ada4718568 (svn r26944) -Update from WebTranslator v3.0:
czech - 74 changes by djst
spanish - 2 changes by SilverSurferZzZ
2014-10-01 17:45:44 +00:00
planetmaker
d40eafd92e (svn r26943) -Fix: [Win32] Silence a warning about comparison of signed and unsigned variables when using gcc 2014-09-30 21:10:32 +00:00
peter1138
04c78761b7 (svn r26942) -Codechange: Make sprite aligner useful for people making full-zoom graphics. 2014-09-30 11:35:21 +00:00
peter1138
3911ea1f90 (svn r26941) -Codechange: Make NewGRF sprite aligner work with GUI size. 2014-09-30 11:29:23 +00:00
rubidium
d63fcbe519 (svn r26940) -Fix (r26937): comparing values of different signedness 2014-09-29 19:21:55 +00:00
rubidium
e550580d74 (svn r26939) -Cleanup: some bits of coding style cleanup for TGP 2014-09-29 19:04:34 +00:00
rubidium
72354f7e6a (svn r26938) -Codechange: simplify RandomHeight significantly 2014-09-29 19:04:02 +00:00
rubidium
4549a07a89 (svn r26937) -Cleanup: simplify the logic for heightmap generation in TGP; instead of performing more and more loops the larger the map becomes to elaborately set the height to 0 many times, just run it for each frequency and be done with it 2014-09-29 18:18:21 +00:00
translators
5d09105bf1 (svn r26936) -Update from WebTranslator v3.0:
spanish - 1 changes by SilverSurferZzZ
2014-09-29 17:45:23 +00:00
peter1138
217635d357 (svn r26935) -Codechange: Fit company colour selection drop down list to UI scale. 2014-09-28 19:19:47 +00:00
peter1138
fc3ee5b7a8 (svn r26934) -Fix (r26933): Don't statically initialise non-static variables. 2014-09-28 09:21:51 +00:00
peter1138
b1f6dd5455 (svn r26933) -Codechange: Resize engine preview window to fit vehicle sprite. 2014-09-28 09:02:11 +00:00
rubidium
e1120327e7 (svn r26932) -Codechange: replace some constants with less weird looking constants and simplify clamping by actually using Clamp 2014-09-27 20:39:32 +00:00
translators
3ae9ca8759 (svn r26931) -Update from WebTranslator v3.0:
russian - 3 changes by Lone_Wolf
2014-09-27 17:45:18 +00:00
rubidium
340ecd7385 (svn r26930) -Add: extra shadings to he heightmap colour tables (Chillcore) 2014-09-27 14:51:34 +00:00
rubidium
367150ba34 (svn r26929) -Change: accounts for maximum height when filling the height legend of the smallmap 2014-09-27 14:49:37 +00:00
rubidium
4b8d6ee319 (svn r26928) -Change: scale the heightmap colours over the whole range of heights (based on patch by ic111) 2014-09-27 11:17:54 +00:00
rubidium
ae406cf52e (svn r26927) -Codechange: split the heightmap colour tables into their own file in the table folder 2014-09-27 10:43:59 +00:00
rubidium
84920f721d (svn r26926) -Change: limit flat world height to the maximum configured map height 2014-09-27 09:53:48 +00:00
translators
e41a83dc32 (svn r26925) -Update from WebTranslator v3.0:
croatian - 14 changes by VoyagerOne
german - 49 changes by planetmaker
spanish - 2 changes by SilverSurferZzZ
welsh - 3 changes by kazzie
2014-09-26 17:46:30 +00:00
peter1138
d408cabca7 (svn r26924) -Codechange: Fit YES/NO query window buttons to window, instead of unaligned. 2014-09-26 16:15:50 +00:00
peter1138
a1929222d5 (svn r26923) -Codechange: Make multiplayer lobby fit to icon size. 2014-09-26 16:05:42 +00:00
frosch
049c7dba29 (svn r26922) -Fix: Include strings.h on HAIKU for strcasecmp. Some platforms do not have a strings.h at all, most define the functions in string.h as well. 2014-09-25 20:45:25 +00:00
peter1138
01c30568e8 (svn r26921) -Codechange: Adjust content window listing to fit icon size. 2014-09-25 19:27:07 +00:00
translators
33061f4024 (svn r26920) -Update from WebTranslator v3.0:
french - 79 changes by glx
spanish - 3 changes by SilverSurferZzZ
tamil - 2 changes by vv
2014-09-25 17:45:45 +00:00
peter1138
d48a176f4c (svn r26919) -Fix [FS#6096]: Crash when enabling "Full animation" if multiplayer chat text is on screen. 2014-09-25 16:04:02 +00:00
fonsinchen
1b8186ea8e (svn r26918) -Fix [FS#6110]: Reserve cargo only after unloading finished or if the vehicle has the desired cargo already 2014-09-24 20:56:52 +00:00
fonsinchen
7306fe015d (svn r26917) -Revert (r26857): It broke improved loading. 2014-09-24 20:55:47 +00:00
translators
2df038c705 (svn r26916) -Update from WebTranslator v3.0:
afrikaans - 13 changes by mulderpf
catalan - 24 changes by juanjo
spanish - 3 changes by SilverSurferZzZ
2014-09-24 17:45:37 +00:00
frosch
fc36231cdf (svn r26915) -Fix: API docs 2014-09-24 16:45:20 +00:00
translators
b752ba6a0c (svn r26912) -Update from WebTranslator v3.0:
czech - 21 changes by argoneus
korean - 2 changes by telk5093
lithuanian - 18 changes by Stabilitronas
spanish - 3 changes by SilverSurferZzZ
welsh - 14 changes by kazzie
2014-09-23 17:46:13 +00:00
rubidium
1477b365c1 (svn r26911) -Change: increase maximum possible flat land height in scenario editor to be entered directly (ic111) 2014-09-22 19:21:37 +00:00
rubidium
22dd5ddca1 (svn r26910) -Fix: account for the height of the landscape at the edge of the map to determine the scroll boundaries (based on patch by ic111) 2014-09-22 18:14:44 +00:00
translators
04a8b1cdf9 (svn r26909) -Update from WebTranslator v3.0:
belarusian - 13 changes by KorneySan
catalan - 1 changes by juanjo
english_US - 15 changes by Supercheese
german - 13 changes by planetmaker
italian - 14 changes by lorenzodv
korean - 17 changes by telk5093
polish - 13 changes by wojteks86
russian - 13 changes by Lone_Wolf
2014-09-22 17:46:35 +00:00
rubidium
1c077e596b (svn r26908) -Codechange: replace a magic number by a more logical calculation 2014-09-22 15:04:18 +00:00
peter1138
49dafc0848 (svn r26907) -Codechange: Scale engine purchase list to GUI zoom level for multihead engines. 2014-09-22 13:13:02 +00:00
peter1138
4f63bbedc1 (svn r26906) -Codechange: Scale depot and station picker buttons by GUI zoom level. 2014-09-22 08:01:25 +00:00
rubidium
8a0e523ce5 (svn r26905) -Change: account for the maximum map height when converting heightmaps 2014-09-21 18:29:18 +00:00
rubidium
11e9afdf5e (svn r26904) -Fix: account for the height level for showing the seen area in the viewport (ic111) 2014-09-21 18:07:54 +00:00
translators
9a2d28e4c6 (svn r26903) -Update from WebTranslator v3.0:
lithuanian - 132 changes by Stabilitronas
vietnamese - 1 changes by nglekhoi
welsh - 5 changes by kazzie
2014-09-21 17:45:52 +00:00
rubidium
58f1e15bce (svn r26902) -Fix (r26900): erroneous spaces instead of tabs 2014-09-21 17:37:30 +00:00
rubidium
1d81ca44f2 (svn r26901) -Fix [FS#6120]: typo in string 2014-09-21 17:31:41 +00:00
rubidium
dfd472f4a4 (svn r26900) -Fix-ish: dirty the appropriate area around map edges when terraforming there to prevent any artefacts from occuring (ic111) 2014-09-21 17:29:48 +00:00
rubidium
6cee5310c1 (svn r26899) -Codechange: reduce the amount of tiles that needs to be drawn by taking the height of tiles into account instead of drawing way too many (ic111) 2014-09-21 17:27:37 +00:00
rubidium
0584d36c0b (svn r26898) -Fix: hopefully make regression under MinGW work again 2014-09-21 17:22:50 +00:00
fonsinchen
14604b9215 (svn r26897) -Change: Add some more AIStationList autotests 2014-09-21 16:45:51 +00:00
fonsinchen
3f2da92ea2 (svn r26896) -Codechange: Move AIStationList* tests to separate test case 2014-09-21 16:44:37 +00:00
fonsinchen
82baae3eb8 (svn r26895) -Change: Allow for multiple independent test cases for AI API regression 2014-09-21 16:41:03 +00:00
fonsinchen
df1971fbde (svn r26894) -Feature: Swap method for script lists 2014-09-21 16:25:15 +00:00
fonsinchen
d206b436aa (svn r26893) -Feature: ScriptStationList_Cargo for sorting cargo by from and via 2014-09-21 16:20:48 +00:00
fonsinchen
b6833fc6ef (svn r26892) -Feature: Script API for retrieving planned flow 2014-09-21 16:20:14 +00:00
fonsinchen
78df68e695 (svn r26891) -Codechange: Add methods to retrieve flows from a FlowStatMap 2014-09-21 16:19:52 +00:00
rubidium
b0c7488f6d (svn r26890) -Cleanup: remove unneeded obfuscation via IConsoleSetSetting 2014-09-21 14:45:35 +00:00
fonsinchen
ce9d75f517 (svn r26889) -Feature: Predict links for station-autorefitting vehicles 2014-09-21 14:22:32 +00:00
rubidium
4e021f0059 (svn r26888) -Codechange: use ints for some z-levels of vehicles (ic111) 2014-09-21 12:44:38 +00:00
rubidium
6b35c182ce (svn r26887) -Add: cheat for changing the height level (mostly due to the mess with changing snow levels and such) 2014-09-21 12:39:24 +00:00
rubidium
babe50da92 (svn r26886) -Change (r26885): the max height setting belongs more in the limitations section of the settings 2014-09-21 12:35:34 +00:00
rubidium
fa193ece85 (svn r26885) -Feature-ish: user interface for limiting the maximum height of a map 2014-09-21 12:25:04 +00:00
rubidium
d17a4e0918 (svn r26884) -Change: scale the NewGRF's snow line level according to the configured maximum map height 2014-09-21 12:02:03 +00:00
rubidium
0daf8085c0 (svn r26883) -Change: make maximum desert height scale with the maximum configured height 2014-09-21 11:53:06 +00:00
rubidium
647a3c8e5f (svn r26882) -Feature: allow limiting the height of bridges (ic111) 2014-09-21 11:40:11 +00:00
rubidium
b50c649405 (svn r26881) -Codechange: bump the savegame version 2014-09-21 11:28:29 +00:00
rubidium
ab3660278a (svn r26880) -Add: stub settings for limiting bridge and map height 2014-09-21 11:27:34 +00:00
rubidium
dc2b4f2498 (svn r26879) -Codechange: remove most MayHaveBridgeAbove calls since the data is now always accessible 2014-09-21 11:24:51 +00:00
rubidium
f3b79480ed (svn r26878) -Change: move m6 to TileExtended to keep Tile 8 bytes and thus better alignable 2014-09-21 11:23:33 +00:00
rubidium
8a993b6141 (svn r26877) -Update: documentation about the map array 2014-09-21 11:20:29 +00:00
rubidium
173a234951 (svn r26876) -Codechange: move 'has bride above' data from m6 to type 2014-09-21 11:20:11 +00:00
rubidium
f82c07b582 (svn r26875) -Codechange: move TropicZone information from m6 to type 2014-09-21 11:18:10 +00:00
rubidium
fe1e883dc9 (svn r26874) -Fix (r26872): hopefully fix MSVC compile error 2014-09-21 11:17:47 +00:00
rubidium
337af973b0 (svn r26873) -Change: split type_height into a type and height array (ic111) 2014-09-21 11:14:58 +00:00
rubidium
3dfb423446 (svn r26872) -Change: give the disaster vehicles the same treatment as aircraft in r26866; make the ascend and descend if needed to cross high mountains (based on patch by ic111) 2014-09-21 11:12:42 +00:00
peter1138
c709953a3b (svn r26871) -Codechange: Centre and draw arbitrary size highscore screen. Highscore text continues to be drawn with 640x480 dimensions. 2014-09-21 09:12:04 +00:00
rubidium
44bcff645c (svn r26870) -Fix (r15190): since freeform edges the 'tile height' at southern edge * 8 pixels just 'south' of the edge tile would not be drawn and would as a result not be refreshed causing artefacts to remain there. This adds a virtual slope to level 0 so it can be redrawn appropriately. Loosely based on patch by ic111 2014-09-21 08:19:32 +00:00
rubidium
6592da4952 (svn r26869) -Add: support for an all black palette to prevent the need of having a black tile of all different slopes (ic111) 2014-09-21 07:57:45 +00:00
rubidium
feab521cd5 (svn r26868) -Add: methods for getting a (theoretical) slope and tile height of tiles outside of the map array (ic111) 2014-09-21 07:48:18 +00:00
rubidium
f9be0f5faa (svn r26867) -Fix (r26866): hopefully fix MSVC compile error 2014-09-21 06:41:11 +00:00
rubidium
39ded38c01 (svn r26866) -Change: make aircraft ascend/descend when they are too close to the ground or too far away (based on patch by ic111) 2014-09-21 06:35:34 +00:00
translators
51e2c2bf62 (svn r26865) -Update from WebTranslator v3.0:
welsh - 11 changes by kazzie
2014-09-20 17:45:14 +00:00
rubidium
8ab4f746f2 (svn r26864) -Codechange: bring a bit more OO into the disaster vehicles 2014-09-20 15:46:44 +00:00
rubidium
ac269a3f08 (svn r26863) -Codechange: move a number of Vehicle* functions into the Vehicle class 2014-09-20 15:31:26 +00:00
peter1138
c07aea8ab8 (svn r26862) -Codechange: Don't shrink widget size in new game window. 2014-09-20 12:27:09 +00:00
peter1138
2f871d02b3 (svn r26861) -Codechange: Include height of dropdown image in dropdown widget. Draw vertically centred image in dropdown button. 2014-09-20 12:25:36 +00:00
rubidium
890c61d596 (svn r26860) -Codechange: improve worst case performance of terraforming (O(n^2) -> O(n log n)) and let memory usage scale to the amount of tiles affected instead of allocating memory for the worst case scenario (patch by ic111) 2014-09-20 12:11:15 +00:00
frosch
fba10bead9 (svn r26859) -Fix [FS#6119]: Height computation of game script text in town GUI did not consider margins. 2014-09-20 11:32:54 +00:00
peter1138
657c108d32 (svn r26858) -Codechange: Rearrange smallmap filter and settings expand/collapse buttons to fix frame borders and allow buttons to fit height of resize button. 2014-09-20 10:23:38 +00:00
fonsinchen
e353f22dc1 (svn r26857) -Fix [FS#6110]: Reserve cargo after refitting and only if necessary. 2014-09-20 09:41:25 +00:00
peter1138
c2d4068a5e (svn r26856) -Codechange: Ensure company face widgets can fit company face. 2014-09-20 09:18:22 +00:00
peter1138
2bb3524416 (svn r26855) -Codechange: Render vertical scrollbars the same as horizontal scrollbars, with sprites instead of text. 2014-09-20 08:55:35 +00:00
peter1138
a3eaa31178 (svn r26854) -Codechange: Don't override computed minimal size with static minimal size, instead only increase it. 2014-09-20 00:27:14 +00:00
rubidium
6a1ed21342 (svn r26853) -Cleanup [Squirrel]: remove some stuff that we never did and especially never should use 2014-09-19 20:06:51 +00:00
rubidium
1bc9785a6e (svn r26852) -Fix: WT3 validation error 2014-09-19 17:53:50 +00:00
translators
118bb9a193 (svn r26851) -Update from WebTranslator v3.0:
belarusian - 33 changes by KorneySan
brazilian_portuguese - 100 changes by Tucalipe
russian - 2 changes by KorneySan
welsh - 4 changes by kazzie
2014-09-19 17:47:00 +00:00
planetmaker
7836a487ae (svn r26850) -Fix: [Makefile] Compilation of strgen requires also defining variable in for platforms like Solaris 2014-09-19 09:28:23 +00:00
alberth
1e7992d4f9 (svn r26849) -Fix[FS#6113]: Better display of refit information in articulated vehicles. 2014-09-18 19:53:22 +00:00
alberth
d0f23b0b7e (svn r26848) -Codechange: Unduplicate summing of cargo capacities in GetTotalCapacityOfArticulatedParts. 2014-09-18 19:50:41 +00:00
fonsinchen
672b14a7c6 (svn r26847) -Fix [FS#6110]: Don't assign a next hop when returning cargo 2014-09-18 17:49:19 +00:00
translators
41ad2aecd8 (svn r26846) -Update from WebTranslator v3.0:
bulgarian - 46 changes by Wold
english_US - 5 changes by Supercheese
2014-09-18 17:45:51 +00:00
rubidium
e87572d103 (svn r26845) -Fix [Squirrel]: more uninitialized variables in constructors 2014-09-17 18:35:45 +00:00
rubidium
d3a68c3391 (svn r26844) -Fix: clang compile error 2014-09-17 17:52:50 +00:00
translators
5fe44256e2 (svn r26843) -Update from WebTranslator v3.0:
ukrainian - 25 changes by Strategy
welsh - 8 changes by kazzie
2014-09-17 17:45:37 +00:00
rubidium
c35e638c36 (svn r26842) -Codechange [Squirrel]: other simple cases of non-initialised instance variables 2014-09-16 21:14:18 +00:00
rubidium
8560071dbc (svn r26841) -Codechange [Squirrel]: move the actual initialisation of instance variables of SQString into the constructor 2014-09-16 21:13:24 +00:00
rubidium
20cb257a05 (svn r26840) -Fix [Squirrel]: merge Init and constructor of SQSharedState 2014-09-16 21:11:14 +00:00
rubidium
525316ea9b (svn r26839) -Fix [Squirrel]: some dead code and making switch fall throughs more explicit 2014-09-16 21:10:01 +00:00
rubidium
061be20b78 (svn r26838) -Fix (r26831): attempt to make MSVC like the code again 2014-09-16 20:14:03 +00:00
rubidium
e19dfdee99 (svn r26837) -Fix [Squirrel]: remove some pointless assignments 2014-09-16 20:09:20 +00:00
rubidium
3d2f511f43 (svn r26836) -Fix [Squirrel]: merge SQLexer::Init with the constructor; there's no need to construct first and then call init in the next line 2014-09-16 20:08:44 +00:00
rubidium
5502a19f3d (svn r26835) -Fix [Squirrel]: remove dead code from the lexer 2014-09-16 20:07:47 +00:00
rubidium
fef12f24dd (svn r26834) -Fix [Squirrel]: prevent unitialized memory warning by moving code from (static) Init to constructure for SQFunctionProto 2014-09-16 20:07:19 +00:00
rubidium
8716e0c26d (svn r26833) -Fix [Squirrel]: remove a few bits of dead code 2014-09-16 20:06:28 +00:00
rubidium
dd0254220f (svn r26832) -Fix [Squirrel]: ensure instance variable of SQNativeClosure is properly initialized 2014-09-16 20:06:05 +00:00
rubidium
de8230a219 (svn r26831) -Fix [Squirrel]: (bogus) warning about falling through in a switch 2014-09-16 20:05:21 +00:00
rubidium
a27c92acb5 (svn r26830) -Fix: WT3 string validation 2014-09-16 17:56:15 +00:00
translators
3280146448 (svn r26829) -Update from WebTranslator v3.0:
finnish - 19 changes by jpx_
persian - 65 changes by Garga
polish - 4 changes by wojteks86
russian - 2 changes by Lone_Wolf
swedish - 31 changes by spacejens
urdu - 80 changes by siphr
welsh - 42 changes by kazzie
2014-09-16 17:47:02 +00:00
rubidium
876d87097a (svn r26828) -Fix: memory leak when passing -c multiple times 2014-09-16 17:14:07 +00:00
frosch
5ecbc2dd16 (svn r26827) -Change [FS#6116]: The ok-button in the OSK for the signs list should just close the OSK. 2014-09-15 19:26:03 +00:00
translators
ff7ce41362 (svn r26826) -Update from WebTranslator v3.0:
croatian - 4 changes by VoyagerOne
greek - 2 changes by Jubilee
italian - 4 changes by lorenzodv
korean - 32 changes by telk5093
persian - 34 changes by farazfaraji
urdu - 9 changes by siphr
2014-09-15 17:47:04 +00:00
translators
b90fc355fb (svn r26821) -Update from WebTranslator v3.0:
greek - 95 changes by Jubilee
gaelic - 33 changes by GunChleoc
2014-09-14 15:30:47 +00:00
rubidium
c225276a7a (svn r26819) -Fix [FS#6112] (r26787): trying to delete just loaded objects that had not yet resolved their references caused a crash upon savegame load (only when loading a game from a server, e.g. joining MP) 2014-09-14 15:11:33 +00:00
michi_cc
79e180250c (svn r26818) -Fix [FS#AndyShouldHaveFoundFlySprayByNow] (r26758): [OSX] Line history and scrolling in the console window went on a walk. 2014-09-13 22:00:10 +00:00
translators
84b9d25374 (svn r26817) -Update from WebTranslator v3.0:
afrikaans - 2 changes by telanus
catalan - 4 changes by juanjo
german - 3 changes by planetmaker
russian - 2 changes by Lone_Wolf
2014-09-13 17:46:45 +00:00
frosch
a7678c367e (svn r26816) -Fix [FS#6109]: Properly zero-initialise data in _temp_engine. 2014-09-13 14:46:03 +00:00
planetmaker
035fedd30b (svn r26815) -Change: Allow to set the granularity of the tooltip hover time in milliseconds instead of seconds. New default value is 250ms 2014-09-13 13:30:31 +00:00
planetmaker
7663c54905 (svn r26814) -Fix [FS#6098]: Wording of tooltip in sprite alignment tool 2014-09-12 20:30:23 +00:00
translators
7e159a5303 (svn r26813) -Update from WebTranslator v3.0:
afrikaans - 16 changes by telanus
german - 25 changes by MG
2014-09-12 17:45:33 +00:00
translators
889592549b (svn r26812) -Update from WebTranslator v3.0:
afrikaans - 9 changes by telanus
polish - 30 changes by McZapkie
slovak - 4 changes by Milsa
slovenian - 1 changes by ntadej
spanish - 4 changes by SilverSurferZzZ
2014-09-11 17:46:29 +00:00
alberth
f24aa8807d (svn r26811) -Fix[FS#6108]: Fixed spelling error in widget name. 2014-09-11 17:10:38 +00:00
translators
82aa086673 (svn r26810) -Update from WebTranslator v3.0:
dutch - 76 changes by habell
spanish - 6 changes by SilverSurferZzZ
swedish - 51 changes by spacejens
welsh - 26 changes by kazzie
2014-09-10 17:45:58 +00:00
rubidium
18e157fe7a (svn r26809) -Fix: do not dereference the -1 index of the file names array of music files. It definitely breaks on m68k, and might cause failures on other platforms as well 2014-09-10 16:33:42 +00:00
translators
77a77575dc (svn r26808) -Update from WebTranslator v3.0:
catalan - 26 changes by juanjo
hebrew - 3 changes by rril
russian - 1 changes by Lone_Wolf
spanish - 7 changes by SilverSurferZzZ
2014-09-09 17:46:14 +00:00
translators
1806f6ba81 (svn r26807) -Update from WebTranslator v3.0:
catalan - 18 changes by juanjo
croatian - 29 changes by VoyagerOne
english_US - 29 changes by Supercheese
italian - 29 changes by lorenzodv
russian - 29 changes by Lone_Wolf
spanish - 12 changes by SilverSurferZzZ
2014-09-08 17:46:46 +00:00
translators
378e92e6ed (svn r26806) -Update from WebTranslator v3.0:
esperanto - 1 changes by Ryton
gaelic - 49 changes by GunChleoc
2014-09-07 17:45:44 +00:00
alberth
aa2078a40e (svn r26805) -Feature: Allow hiding of non-interesting engines in the autoreplace GUI. 2014-09-07 16:14:38 +00:00
alberth
cb3f69f746 (svn r26804) -Feature: Allow hiding of non-interesting engines in the build vehicle GUI. 2014-09-07 16:14:06 +00:00
alberth
48c5bb4dc0 (svn r26803) -Doc: Document some fields in the build vehicle gui, and the rail definition struct. 2014-09-07 16:13:29 +00:00
alberth
44d2f6a988 (svn r26802) -Add: Command to set visibility of an engine for a company (based on patch by Juanjo). 2014-09-07 16:12:58 +00:00
alberth
7df9a39172 (svn r26801) -Add: Labels above the lists in the autoreplace GUI. 2014-09-07 16:11:58 +00:00
alberth
5d38e0f24b (svn r26800) -Feature[FS#1640]: Vehicle sorting in autoreplace GUI. 2014-09-07 16:11:14 +00:00
alberth
427fdb2fb3 (svn r26799) -Codechange: Export vehicle sorting data and functions. 2014-09-07 16:10:27 +00:00
alberth
8292133522 (svn r26798) -Codechange: Code style fixes. 2014-09-07 16:09:48 +00:00
rubidium
5f8b37047a (svn r26797) -Codechange: rewrite the UTF8 reading code to make use of already existing functions instead of partially trying to implemented them 2014-09-07 16:03:41 +00:00
rubidium
9cbdd45751 (svn r26796) -Fix: reading of high byte of "ASCII" files yielded a negative int8, then casted to an uint32 which caused the Squirrel lexer to bail out. Regardless... the file isn't actually ASCII, but that's beyond the point for now 2014-09-07 16:03:02 +00:00
frosch
599a5a1969 (svn r26792) -Fix: TC_NO_SHADE did not work for 32bpp text rendering. 2014-09-07 15:25:54 +00:00
frosch
e00f4cac59 (svn r26788) -Add: Desync replay option to skip/replay failed commands 2014-09-07 14:21:16 +00:00
frosch
d2ec27c6c4 (svn r26787) -Fix (r20547): Loading a game with order backups leaked Orders and left unreachable items in the pool. 2014-09-07 13:52:20 +00:00
frosch
db45d979db (svn r26786) -Fix: Also replay failed commands. 2014-09-07 13:36:18 +00:00
rubidium
be23e13e33 (svn r26785) -Fix [Squirrel]: loading a value saved as boolean caused it to be of type integer instead of boolean 2014-09-07 09:30:57 +00:00
rubidium
00e1e69187 (svn r26784) -Codechange [Squirrel]: use WChar for the lexer 2014-09-07 06:46:03 +00:00
rubidium
0d042630d5 (svn r26783) -Fix (r26781): removed one include too many 2014-09-06 20:38:39 +00:00
rubidium
4506858a83 (svn r26782) -Fix (r26781): was in the wrong folder when commiting 2014-09-06 20:22:59 +00:00
rubidium
e8a72f8234 (svn r26781) -Codechange [Squirrel]: remove includes/definitions that are already in stdafx.h 2014-09-06 20:20:35 +00:00
rubidium
fc6d256948 (svn r26780) -Cleanup: remove unused SQUIRREL_API macro 2014-09-06 20:11:00 +00:00
rubidium
ed365a33c0 (svn r26779) -Cleanup [Squirrel]: remove extern "C" statements; we won't be exporting things to C from our squirrel 2014-09-06 20:05:07 +00:00
rubidium
506de3c53d (svn r26778) -Codechange: remove pointless rsl macro 2014-09-06 19:57:01 +00:00
rubidium
ac7ef48b0d (svn r26777) -Codechange: use safe string functions in squirrel code as well, and prevent using the ones that are deemed unsafe 2014-09-06 19:54:35 +00:00
rubidium
a106bd1dd5 (svn r26776) -Codechange: use safe string functions in script/squirrel*.cpp 2014-09-06 19:28:09 +00:00
rubidium
a7044da533 (svn r26775) -Cleanup [Squirrel]: "resolve" several of the unicode wrapper defines 2014-09-06 18:10:36 +00:00
rubidium
65cab46a84 (svn r26774) -Cleanup [Squirrel]: remove _SC macro 2014-09-06 17:46:56 +00:00
translators
cab419130e (svn r26773) -Update from WebTranslator v3.0:
bulgarian - 20 changes by komara
esperanto - 94 changes by Ryton
2014-09-06 17:45:42 +00:00
rubidium
ab4f228aa8 (svn r26772) -Cleanup [Squirrel]: remove traces to SQUNICODE define 2014-09-06 17:36:29 +00:00
rubidium
95549e6da5 (svn r26771) -Cleanup: remove OTTD2SQ and SQ2OTTD 2014-09-06 17:30:33 +00:00
rubidium
20a83b406e (svn r26770) -Fix [Squirrel]: in case SQChar is a char (previously everything non-Windows or non-Unicode, now everything), the lexer throws away the higher bytes of characters 2014-09-06 17:22:06 +00:00
rubidium
e874be7691 (svn r26769) -Codechange [Squirrel]: remove the difference between some platforms having wchar for SQChar and others just char; always use char (and UTF-8) like in the rest of (internal) OpenTTD 2014-09-06 17:20:45 +00:00
translators
2f697aa06d (svn r26768) -Update from WebTranslator v3.0:
bulgarian - 13 changes by komara
esperanto - 87 changes by Ryton
spanish - 19 changes by juanjo
2014-09-05 17:45:37 +00:00
translators
63b06faece (svn r26767) -Update from WebTranslator v3.0:
bulgarian - 8 changes by komara
2014-09-04 17:45:18 +00:00
translators
f54ce4f2fd (svn r26766) -Update from WebTranslator v3.0:
catalan - 5 changes by juanjo
2014-09-01 17:45:33 +00:00
translators
9270d243cd (svn r26765) -Update from WebTranslator v3.0:
welsh - 47 changes by kazzie
2014-08-31 17:45:19 +00:00
frosch
44fabee8ca (svn r26764) -Fix: Buffer overrun in SQCompiler::Error. (kalenz) 2014-08-31 10:20:30 +00:00
translators
12a6d877a6 (svn r26763) -Update from WebTranslator v3.0:
korean - 41 changes by telk5093
2014-08-30 17:45:19 +00:00
translators
2f6a314b36 (svn r26762) -Update from WebTranslator v3.0:
catalan - 6 changes by juanjo
2014-08-29 17:45:17 +00:00
translators
d4589aaba6 (svn r26761) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
english_US - 3 changes by Supercheese
spanish - 2 changes by juanjo
2014-08-27 17:45:46 +00:00
translators
86b4144a4a (svn r26760) -Update from WebTranslator v3.0:
english_US - 1 changes by Supercheese
ukrainian - 62 changes by Strategy
2014-08-25 17:45:29 +00:00
translators
47561a55a3 (svn r26759) -Update from WebTranslator v3.0:
italian - 50 changes by lorenzodv
spanish - 138 changes by juanjo
2014-08-24 17:45:30 +00:00
michi_cc
1a35644033 (svn r26758) -Fix [FS#5972]: [OSX] Implement more of the text editing API to prevent crashes and improve IME support. 2014-08-24 10:34:43 +00:00
translators
09d079b666 (svn r26757) -Update from WebTranslator v3.0:
afrikaans - 1 changes by telanus
catalan - 1 changes by juanjo
2014-08-23 17:45:42 +00:00
frosch
5853f9c714 (svn r26756) -Fix (r26747): Ground vehicle breakdown smoke was not supposed to be available yet, since it is a looping animation. 2014-08-23 13:31:20 +00:00
frosch
c6cd861997 (svn r26755) -Fix (r26747) [FS#6093]: Silence MSVC warning. 2014-08-23 10:44:32 +00:00
translators
6fbca04f06 (svn r26754) -Update from WebTranslator v3.0:
catalan - 9 changes by juanjo
2014-08-22 17:45:28 +00:00
rubidium
d214ca2c7d (svn r26753) -Fix: desync due to not always properly restoring game state from the savegame 2014-08-22 17:11:59 +00:00
translators
fd82ab4b60 (svn r26752) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
2014-08-20 17:45:28 +00:00
translators
01827a992d (svn r26751) -Update from WebTranslator v3.0:
croatian - 47 changes by VoyagerOne
english_AU - 50 changes by mrtux
finnish - 25 changes by jpx_
korean - 1 changes by telk5093
polish - 50 changes by wojteks86
2014-08-19 17:46:25 +00:00
translators
f1273275cc (svn r26750) -Update from WebTranslator v3.0:
belarusian - 47 changes by KorneySan
finnish - 22 changes by jpx_
2014-08-18 17:45:31 +00:00
translators
69c25c5d44 (svn r26749) -Update from WebTranslator v3.0:
afrikaans - 47 changes by telanus
hungarian - 50 changes by Brumi
2014-08-17 17:45:37 +00:00
frosch
f6c9743ad9 (svn r26748) -Merge: documentation updates from 1.4 branch 2014-08-17 16:13:23 +00:00
frosch
e704ab3921 (svn r26747) -Feature: [NewGRF] Advanced visual effects with multiple effect sprites independent of spawning model. 2014-08-17 14:53:11 +00:00
frosch
156fed1b61 (svn r26746) -Codechange: Separate enums for visual effect type and spawning model. 2014-08-17 14:52:48 +00:00
frosch
07077c2088 (svn r26745) -Codechange: Deduplicate calls to CreateEffectVehicleRel for vehicle visual effects. 2014-08-17 14:52:32 +00:00
frosch
898ec49421 (svn r26744) -Fix [FS6085-ish]: ScriptListSorterItemDescending::FindNext failed to detect the end. 2014-08-16 21:13:58 +00:00
frosch
63047e51b1 (svn r26743) -Codechange: Simplify ScriptList iterators. 2014-08-16 21:11:26 +00:00
frosch
98c4648d20 (svn r26742) -Doc: Why reverse_iterator is unsuitable for ScriptList iterators 2014-08-16 20:40:26 +00:00
frosch
7d1e17bdb5 (svn r26741) -Revert (r26736): reverse_iterators are invalidated when the element next to them is erased (not the element they are pointing to), which makes them unsuitable for ScriptList. 2014-08-16 20:37:33 +00:00
translators
f5d0b935c1 (svn r26738) -Update from WebTranslator v3.0:
catalan - 23 changes by juanjo
simplified_chinese - 50 changes by siu238X
traditional_chinese - 82 changes by siu238X
english_US - 49 changes by Supercheese
norwegian_bokmal - 2 changes by cuthbert
russian - 47 changes by Lone_Wolf
slovak - 1 changes by Milsa
2014-08-16 17:46:36 +00:00
rubidium
a290f4a6fb (svn r26737) -Fix (r26735): one = too many... why can't all languages use the same basic definition for comparisons? 2014-08-16 10:31:24 +00:00
rubidium
54ad0d342f (svn r26736) -Fix [Script]: infinite loop (by scripts; always returning the same item) when sorted by item in descending order by oddly constructed FindNext that uses forward iterators. Simply use the same code as the ascending item sort but use the reverse iterator instead of the forward. Also do this same trick for the descending value sort even though I couldn't trigger the problem there 2014-08-16 10:20:15 +00:00
rubidium
bbe58ca737 (svn r26735) -Fix (rmakefilerewrite): for profiling CFLAGS got a -p (for prof) and LDFLAGS got -pg (for gprof), but in the end gprof would be used (via make run-prof). Furthermore -pg isn't compatible with -fomit-frame-pointer on certain architectures (most importantly x86(_64)), so simply don't enable that flag when profiling is enabled 2014-08-16 10:17:18 +00:00
rubidium
a9367c0219 (svn r26734) -Fix-ish: make clear the AI/GS List's Begin and Next return the item, not the value 2014-08-16 10:05:57 +00:00
rubidium
213b0613c7 (svn r26733) -Fix [FS#6086]: inconsistency in using spaces between number and unit in some strings
Try to follow the SI recommendation to use a non-breaking space between a number and its units (and prefix)
2014-08-15 20:14:48 +00:00
rubidium
554eec1129 (svn r26732) -Fix [FS#6083]: do not reset the last selected airport or layout (unless it is really necessary) 2014-08-15 19:41:57 +00:00
translators
a7f020e8ef (svn r26731) -Update from WebTranslator v3.0:
afrikaans - 6 changes by telanus
belarusian - 3 changes by KorneySan
catalan - 5 changes by juanjo
korean - 2 changes by telk5093
russian - 2 changes by Lone_Wolf
2014-08-15 17:47:51 +00:00
translators
7de8318125 (svn r26730) -Update from WebTranslator v3.0:
afrikaans - 6 changes by telanus
croatian - 2 changes by VoyagerOne
dutch - 2 changes by habell
finnish - 2 changes by jpx_
german - 3 changes by planetmaker
lithuanian - 2 changes by Stabilitronas
swedish - 1 changes by spacejens
2014-08-14 17:47:03 +00:00
alberth
db47d62069 (svn r26729) -Feature: Warn about missing industries after generating a map. 2014-08-13 19:31:45 +00:00
translators
e15f2b8457 (svn r26728) -Update from WebTranslator v3.0:
croatian - 1 changes by VoyagerOne
2014-08-12 17:45:22 +00:00
translators
0b02513cc9 (svn r26727) -Update from WebTranslator v3.0:
english_US - 1 changes by Supercheese
finnish - 1 changes by jpx_
polish - 6 changes by p0358
2014-08-11 17:45:47 +00:00
translators
04a6430e97 (svn r26726) -Update from WebTranslator v3.0:
afrikaans - 4 changes by telanus
catalan - 1 changes by juanjo
russian - 1 changes by Lone_Wolf
2014-08-10 17:45:52 +00:00
alberth
c562fbc539 (svn r26725) -Fix: String pointed the user to a non-existent group of settings. 2014-08-10 12:52:23 +00:00
alberth
fa4996feef (svn r26724) -Fix[FS#6077] Use the normal search path to look for xdg-open at Unix (kernigh2) 2014-08-09 19:39:14 +00:00
alberth
633ac888f6 (svn r26723) -Fix[FS#5997]: Properly check for cargo acceptance of houses. 2014-08-09 19:32:51 +00:00
translators
46520308c4 (svn r26722) -Update from WebTranslator v3.0:
malay - 3 changes by TheITChap
norwegian_bokmal - 1 changes by
2014-08-07 17:45:31 +00:00
translators
871630f3ae (svn r26721) -Update from WebTranslator v3.0:
korean - 3 changes by telk5093
norwegian_bokmal - 1 changes by
2014-08-05 17:45:43 +00:00
translators
a56e57fa0f (svn r26720) -Update from WebTranslator v3.0:
arabic_egypt - 38 changes by ahm_ijal
norwegian_bokmal - 1 changes by 
slovak - 1 changes by Milsa
2014-08-03 17:45:30 +00:00
frosch
592cf107d1 (svn r26716) -Fix: CMD_CLEAR_ORDER_BACKUP should not be suppressed by pause modes. 2014-08-03 14:26:32 +00:00
frosch
8d8c06ce86 (svn r26713) -Fix (r23027): [NewGRF] Parameters to SCC_NEWGRF_PUSH_WORD and SCC_NEWGRF_UNPRINT were not skipped during drawing. 2014-08-03 11:59:07 +00:00
translators
3ed596a329 (svn r26712) -Update from WebTranslator v3.0:
malay - 5 changes by rasserie
norwegian_bokmal - 1 changes by 
slovak - 1 changes by Milsa
2014-08-01 17:46:07 +00:00
translators
5a296a2d08 (svn r26711) -Update from WebTranslator v3.0:
arabic_egypt - 26 changes by ahm_ijal
norwegian_bokmal - 1 changes by 
ukrainian - 2 changes by Strategy
2014-07-31 17:45:45 +00:00
planetmaker
cd084721b4 (svn r26709) -Fix (r15892 and others) [FS#6069]: [OSX] Compilation fails with some lzo2 versions if we define __LP64__ as 0 instead of checking whether it is defined (kernigh2) 2014-07-30 20:19:29 +00:00
rubidium
60b07504ee (svn r26708) -Codechange: replace C preprocessor with all kinds of options to prevent adding certain things to the result and the sed script to remove everything that shouldn't be in the resulting nfo file but came out of the C preprocessor by a small-ish awk program. This means no more breaking if a C preprocessor decides to add more data to the processed file (like GCC's inclusion of stdc-predef.h when not passing -nostdinc). It furthermore more than halfs the time needed for the assemble step of the extra GRF compilation 2014-07-30 17:21:42 +00:00
translators
a19c92bfdc (svn r26707) -Update from WebTranslator v3.0:
lithuanian - 1 changes by RunisLabs
norwegian_bokmal - 1 changes by 
ukrainian - 37 changes by Strategy
2014-07-29 17:45:32 +00:00
rubidium
498556d6ce (svn r26706) -Fix [FS#6015] (r20644): wrong breakdown sound was played for ships 2014-07-27 18:16:03 +00:00
rubidium
892423a90f (svn r26705) -Fix: WT3 validation error 2014-07-27 17:46:46 +00:00
translators
32ec863237 (svn r26704) -Update from WebTranslator v3.0:
norwegian_bokmal - 1 changes by 
slovak - 5 changes by Milsa
2014-07-27 17:45:52 +00:00
translators
1d62499d40 (svn r26703) -Update from WebTranslator v3.0:
belarusian - 69 changes by KorneySan
norwegian_bokmal - 1 changes by 
russian - 3 changes by KorneySan
slovenian - 26 changes by matej1245
2014-07-25 17:45:54 +00:00
rubidium
df2b116867 (svn r26702) -Fix [FS#6067]: integer overflows in acceleration code causing either too low acceleration or too large acceleration 2014-07-22 19:46:10 +00:00
translators
89eb2c8800 (svn r26701) -Update from WebTranslator v3.0:
traditional_chinese - 1 changes by siu238X
hungarian - 31 changes by Brumi
norwegian_bokmal - 1 changes by 
polish - 4 changes by McZapkie
2014-07-22 17:46:30 +00:00
rubidium
a1f31b735a (svn r26700) -Fix [FS#6066]: incorrect saving of order backups 2014-07-21 18:03:32 +00:00
rubidium
0d2f141c10 (svn r26699) -Fix-ish: do not crash when trying to show an error about vehicle in a NewGRF and the NewGRF was not loaded at all 2014-07-21 18:03:05 +00:00
translators
8b0ecf4e1b (svn r26698) -Update from WebTranslator v3.0:
norwegian_bokmal - 1 changes by 
ukrainian - 30 changes by odisseus
2014-07-21 17:46:01 +00:00
translators
7e01f3b3bd (svn r26697) -Update from WebTranslator v3.0:
simplified_chinese - 6 changes by siu238X
norwegian_bokmal - 52 changes by eirik174
swedish - 49 changes by BerraGson
2014-07-20 17:45:54 +00:00
translators
09e716882d (svn r26696) -Update from WebTranslator v3.0:
vietnamese - 11 changes by nglekhoi
2014-07-19 17:45:13 +00:00
frosch
489fac7339 (svn r26695) -Fix [FS#6064]: Slovakian uses space as group separator in numbers. 2014-07-17 19:06:33 +00:00
frosch
d10fe2ce21 (svn r26694) -Fix (r26547) [FS#6063]: When orders become invalid, reset the waiting time, but keep the travel time. 2014-07-16 22:24:55 +00:00
frosch
d563ff20e6 (svn r26693) -Codechange: Simplify GetOrderCmdFromTile (Juanjo) 2014-07-16 21:06:45 +00:00
frosch
dbc67efa98 (svn r26692) -Fix [FS#6059]: 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. (Juanjo) 2014-07-16 20:56:39 +00:00
frosch
a7987ade44 (svn r26691) -Codechange: Simplify ShowDropDownListAt (Juanjo) 2014-07-16 20:38:36 +00:00
translators
47b8c1a7b7 (svn r26690) -Update from WebTranslator v3.0:
catalan - 4 changes by juanjo
spanish - 5 changes by juanjo
2014-07-16 17:45:33 +00:00
rubidium
ac8ccca67a (svn r26688) -Fix: WT3 validation 2014-07-14 17:52:00 +00:00
translators
e34fe57a92 (svn r26687) -Update from WebTranslator v3.0:
polish - 10 changes by Kilian
slovak - 9 changes by Milsa
2014-07-14 17:45:42 +00:00
translators
3de5537331 (svn r26686) -Update from WebTranslator v3.0:
swedish - 11 changes by spacejens
2014-07-13 17:45:14 +00:00
alberth
ee7700ef78 (svn r26685) -Fix: Tighten parameter bound checks on GSCargoMonitor functions, and return -1 on out-of-bound parameters. 2014-07-12 17:04:14 +00:00
alberth
6fd3eaa287 (svn r26684) -Doc: Improve Doxygen markup with a few links to a constant and functions. 2014-07-12 12:21:40 +00:00
translators
1752ccf99c (svn r26683) -Update from WebTranslator v3.0:
hebrew - 6 changes by oofnik
malay - 3 changes by TheITChap
2014-07-11 17:45:27 +00:00
translators
1274287f9f (svn r26682) -Update from WebTranslator v3.0:
esperanto - 5 changes by polluks
indonesian - 51 changes by redout9122
malay - 9 changes by TheITChap
norwegian_bokmal - 6 changes by hafting
polish - 1 changes by nitro2012
2014-07-10 17:46:06 +00:00
translators
2f30a9ac28 (svn r26681) -Update from WebTranslator v3.0:
polish - 48 changes by Kilian
gaelic - 4 changes by GunChleoc
2014-07-09 17:45:26 +00:00
frosch
8e99615c7e (svn r26680) -Codechange: Simplify dropdown height computation. (Juanjo) 2014-07-08 20:07:50 +00:00
frosch
9d5a1b2275 (svn r26679) -Codechange: VehicleListIdentifier::Pack can be const. (Juanjo) 2014-07-08 20:07:21 +00:00
frosch
ef3ca2047b (svn r26678) -Codechange: Simplify settings widget layout. (Juanjo) 2014-07-08 20:06:45 +00:00
translators
208611801e (svn r26677) -Update from WebTranslator v3.0:
estonian - 9 changes by KSiimson
gaelic - 63 changes by GunChleoc
2014-07-08 17:45:23 +00:00
translators
9b34aedc1e (svn r26676) -Update from WebTranslator v3.0:
hebrew - 3 changes by oofnik
luxembourgish - 14 changes by Phreeze
2014-07-07 17:45:29 +00:00
translators
b12c4e0208 (svn r26675) -Update from WebTranslator v3.0:
estonian - 3 changes by KSiimson
luxembourgish - 16 changes by Phreeze
slovak - 1 changes by Milsa
2014-07-06 17:45:41 +00:00
translators
703ce33008 (svn r26672) -Update from WebTranslator v3.0:
catalan - 1 changes by juanjo
spanish - 44 changes by juanjo
2014-07-03 17:45:28 +00:00
translators
07486f963f (svn r26671) -Update from WebTranslator v3.0:
afrikaans - 4 changes by telanus
2014-07-02 17:45:15 +00:00
translators
f49395839e (svn r26669) -Update from WebTranslator v3.0:
afrikaans - 5 changes by telanus
korean - 1 changes by telk5093
brazilian_portuguese - 26 changes by Tucalipe
slovak - 60 changes by Milsa
2014-06-30 17:46:02 +00:00
translators
7f2870796a (svn r26667) -Update from WebTranslator v3.0:
afrikaans - 30 changes by mulderpf
slovak - 9 changes by Milsa
2014-06-29 17:45:25 +00:00
translators
e694a492cc (svn r26666) -Update from WebTranslator v3.0:
afrikaans - 176 changes by mulderpf
2014-06-28 17:45:18 +00:00
translators
c2252ade05 (svn r26665) -Update from WebTranslator v3.0:
afrikaans - 12 changes by telanus
slovak - 23 changes by klingacik
2014-06-26 17:45:22 +00:00
translators
5510275b2c (svn r26664) -Update from WebTranslator v3.0:
traditional_chinese - 15 changes by yjw691
english_US - 1 changes by Supercheese
lithuanian - 50 changes by Stabilitronas
2014-06-25 17:45:54 +00:00
translators
11d737da14 (svn r26663) -Update from WebTranslator v3.0:
japanese - 31 changes by guppy
lithuanian - 1 changes by Stabilitronas
norwegian_nynorsk - 19 changes by 2rB
2014-06-24 17:46:04 +00:00
translators
d28d396cb3 (svn r26662) -Update from WebTranslator v3.0:
lithuanian - 40 changes by Stabilitronas
2014-06-23 17:45:13 +00:00
translators
068c0224bf (svn r26661) -Update from WebTranslator v3.0:
italian - 15 changes by lorenzodv
korean - 1 changes by telk5093
lithuanian - 19 changes by Stabilitronas
brazilian_portuguese - 4 changes by Tucalipe
slovak - 1 changes by Milsa
2014-06-22 17:46:32 +00:00
fonsinchen
3f19e19952 (svn r26660) -Fix: CargoPacket::SourceStation() returns a StationID. 2014-06-21 19:52:52 +00:00
translators
5f3bd7ff9b (svn r26659) -Update from WebTranslator v3.0:
catalan - 31 changes by juanjo
2014-06-21 17:45:12 +00:00
translators
dae08c370b (svn r26658) -Update from WebTranslator v3.0:
estonian - 1 changes by
2014-06-20 21:17:15 +00:00
planetmaker
9a64e4b43e (svn r26657) -Add [FS#6047]: Days in dates are not represented by ordinal numbers in all languages 2014-06-20 20:57:32 +00:00
planetmaker
796fcaa9e1 (svn r26656) -Fix [FS#6044]: Production cheat cannot not be allowed to be active in multiplayer for desync reasons, even when activated in singleplayer previously 2014-06-20 20:04:10 +00:00
translators
6b4bae76b6 (svn r26655) -Update from WebTranslator v3.0:
estonian - 1 changes by 
lithuanian - 19 changes by Stabilitronas
2014-06-19 17:45:29 +00:00
michi_cc
7f9e7b1a08 (svn r26654) -Fix (r26482): Header file missing from sources.list. 2014-06-17 20:09:00 +00:00
rubidium
15c4a7ec1c (svn r26651) -Fix: make sure an abs is used that supports int64 when using abs on those variables 2014-06-17 19:01:45 +00:00
fonsinchen
bdde95513a (svn r26650) -Fix [FS#6041]: Support save/load chunk lengths of up to (1 << 32) - 1 2014-06-17 06:13:38 +00:00
translators
1f9c141ec5 (svn r26649) -Update from WebTranslator v3.0:
estonian - 1 changes by 
norwegian_bokmal - 29 changes by cuthbert
2014-06-16 17:45:36 +00:00
translators
21704f4531 (svn r26648) -Update from WebTranslator v3.0:
czech - 1 changes by Eskymak
estonian - 5 changes by taavi
2014-06-15 17:45:41 +00:00
translators
cc3627ad00 (svn r26647) -Update from WebTranslator v3.0:
polish - 11 changes by wojteks86
slovak - 6 changes by Milsa
welsh - 21 changes by kazzie
2014-06-14 17:46:15 +00:00
fonsinchen
ef2caa02b2 (svn r26646) -Fix [FS#6041]: Save locations instead of distances in link graphs to reduce size. 2014-06-14 13:35:39 +00:00
rubidium
3a49a63dd1 (svn r26645) -Fix: pointless zero-width character in string 2014-06-11 17:49:16 +00:00
translators
3c02d8ffac (svn r26644) -Update from WebTranslator v3.0:
dutch - 14 changes by habell
vietnamese - 16 changes by nglekhoi
2014-06-11 17:45:30 +00:00
translators
cf098ef1a0 (svn r26643) -Update from WebTranslator v3.0:
croatian - 1 changes by VoyagerOne
2014-06-10 17:45:30 +00:00
frosch
64923692c6 (svn r26642) -Fix [FS#6037-ish]: More strings with incorrect sub-string parameters. 2014-06-10 16:48:24 +00:00
frosch
9d996d2c09 (svn r26641) -Cleanup: Remove some unused strings. 2014-06-10 16:39:20 +00:00
frosch
7b3ead329b (svn r26640) -Cleanup: Remove some pointless STR_JUST_STRING detours. 2014-06-10 16:37:25 +00:00
frosch
ef0bff5ac3 (svn r26639) -Codechange: Simplify drawing early/late dates in timetable GUI. 2014-06-10 16:29:03 +00:00
translators
6cdd172027 (svn r26638) -Update from WebTranslator v3.0:
english_US - 1 changes by Supercheese
2014-06-09 17:45:16 +00:00
rubidium
5cfa181420 (svn r26637) -Fix [FS#6038]: segmentation fault when encountering a .obg/.obs/.obm with empty string/zero length/ MD5 checksums 2014-06-09 17:43:59 +00:00
rubidium
489f88fa02 (svn r26636) -Fix [FS#6026-ish]: (memory) size of variables saved for disaster vehicles was not correct in saveload description 2014-06-09 17:42:48 +00:00
translators
608a8ce8a1 (svn r26635) -Update from WebTranslator v3.0:
finnish - 2 changes by jpx_
2014-06-08 17:45:10 +00:00
frosch
9649cd8bea (svn r26634) -Fix: 'Load' button was not properly enabled/disabled for old savegames without NewGRF information. 2014-06-08 15:49:54 +00:00
translators
941c57cb07 (svn r26633) -Update from WebTranslator v3.0:
french - 1 changes by glx
korean - 1 changes by telk5093
2014-06-07 17:45:14 +00:00
frosch
f9dd8b57a4 (svn r26632) -Fix [FS#6037]: Incorrect usage of string commands in the order GUI. 2014-06-07 10:42:17 +00:00
translators
00b254a9b3 (svn r26631) -Update from WebTranslator v3.0:
catalan - 57 changes by juanjo
english_AU - 1 changes by mrtux
german - 1 changes by planetmaker
hebrew - 24 changes by oofnik
italian - 1 changes by lorenzodv
russian - 1 changes by Lone_Wolf
2014-06-06 17:45:44 +00:00
translators
ac04334897 (svn r26630) -Update from WebTranslator v3.0:
hebrew - 20 changes by oofnik
gaelic - 2 changes by GunChleoc
2014-06-05 17:45:20 +00:00
frosch
f8def6184b (svn r26629) -Fix [FS#6012]: If the video driver fails to supply a list of resolutions, display an error message. 2014-06-05 17:14:16 +00:00
translators
bb3544e086 (svn r26628) -Update from WebTranslator v3.0:
catalan - 13 changes by juanjo
german - 10 changes by planetmaker
2014-06-03 17:45:14 +00:00
translators
0de42947c7 (svn r26624) -Update from WebTranslator v3.0:
czech - 23 changes by Eskymak
slovak - 5 changes by Milsa
2014-06-01 17:45:14 +00:00
frosch
5fd223ae9b (svn r26623) -Codechange: Make SettingsEntry and SettingsPage polymorphic classes. 2014-06-01 12:14:32 +00:00
frosch
202c4ebd40 (svn r26622) -Codechange: Construct settings tree on the heap instead of using static arrays. 2014-06-01 11:51:24 +00:00
translators
9971990bd9 (svn r26621) -Update from WebTranslator v3.0:
finnish - 2 changes by jpx_
persian - 17 changes by Peymanpn
2014-05-30 17:45:14 +00:00
translators
42a22d3c41 (svn r26620) -Update from WebTranslator v3.0:
simplified_chinese - 27 changes by chenwt0315
russian - 8 changes by Lone_Wolf
2014-05-28 17:45:13 +00:00
translators
b64f543ee5 (svn r26619) -Update from WebTranslator v3.0:
catalan - 3 changes by juanjo
english_AU - 2 changes by mrtux
english_US - 29 changes by Supercheese
korean - 2 changes by telk5093
2014-05-27 17:45:34 +00:00
translators
a8a14caeac (svn r26618) -Update from WebTranslator v3.0:
catalan - 8 changes by juanjo
croatian - 12 changes by VoyagerOne
french - 2 changes by glx
german - 2 changes by planetmaker
italian - 12 changes by lorenzodv
russian - 2 changes by Lone_Wolf
2014-05-26 17:45:33 +00:00
rubidium
e8d4ab8994 (svn r26617) -Fix [FS#5973]: [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 2014-05-25 19:53:46 +00:00
planetmaker
e2be6f657d (svn r26616) -Fix (r26576) [FS#6025]: First send packages about new company, then clients joining it to admin port (Taede) 2014-05-25 19:01:30 +00:00
translators
03b3ff74f9 (svn r26615) -Update from WebTranslator v3.0:
catalan - 42 changes by juanjo
english_AU - 10 changes by mrtux
finnish - 10 changes by jpx_
french - 10 changes by glx
korean - 11 changes by telk5093
russian - 4 changes by Lone_Wolf
spanish - 3 changes by juanjo
2014-05-25 17:45:39 +00:00
frosch
59a49a4483 (svn r26614) -Add: Adv. settings window can handle the autosave setting as well. 2014-05-25 15:02:04 +00:00
alberth
c24998e79f (svn r26613) -Feature: Upgrade currently active newgrfs to newest installed version. 2014-05-24 19:15:57 +00:00
alberth
e333f0e9ef (svn r26612) -Add: Method to copy newgrf parameters. 2014-05-24 19:13:34 +00:00
alberth
88d1d3c8c1 (svn r26611) -Feature: Save and load grfid and md5sum of newgrfs in config file (frosch) 2014-05-24 19:12:48 +00:00
alberth
ac23e46713 (svn r26610) -Feature: Select an editable preset name for saving. 2014-05-24 19:11:20 +00:00
rubidium
dcc2da107a (svn r26609) -Fix: compile warnings on MSVC for 32 bits builds due to assigning values to variables with smaller integer size 2014-05-24 17:58:32 +00:00
translators
64d6adb063 (svn r26608) -Update from WebTranslator v3.0:
finnish - 17 changes by jpx_
italian - 1 changes by lorenzodv
russian - 12 changes by Lone_Wolf
spanish - 28 changes by Terkhen
2014-05-24 17:45:36 +00:00
translators
7a2d79f2ea (svn r26607) -Update from WebTranslator v3.0:
catalan - 25 changes by juanjo
simplified_chinese - 3 changes by xiangyigao
croatian - 17 changes by VoyagerOne
czech - 7 changes by Eskymak
lithuanian - 7 changes by Stabilitronas
russian - 8 changes by Lone_Wolf
2014-05-23 17:45:58 +00:00
frosch
6e9edc085b (svn r26606) -Fix [FS#6022]: Filename capitalisation (NG) 2014-05-22 19:03:14 +00:00
translators
f807d7f559 (svn r26605) -Update from WebTranslator v3.0:
dutch - 16 changes by habell
english_AU - 17 changes by mrtux
french - 17 changes by glx
german - 20 changes by planetmaker
italian - 17 changes by lorenzodv
korean - 22 changes by telk5093
russian - 1 changes by Lone_Wolf
slovak - 11 changes by Milsa
2014-05-22 17:45:52 +00:00
frosch
7e359e1b8d (svn r26604) -Add: Most of the mapgen settings to advances settings window. 2014-05-21 18:07:30 +00:00
translators
0f01ac42a0 (svn r26603) -Update from WebTranslator v3.0:
dutch - 1 changes by habell
korean - 3 changes by telk5093
luxembourgish - 76 changes by Phreeze
polish - 20 changes by Kilian
2014-05-21 17:45:38 +00:00
translators
6ab81f87e8 (svn r26602) -Update from WebTranslator v3.0:
luxembourgish - 135 changes by Phreeze
polish - 7 changes by Kilian
2014-05-20 17:45:14 +00:00
translators
8885100498 (svn r26601) -Update from WebTranslator v3.0:
vietnamese - 62 changes by maddot
2014-05-19 17:45:09 +00:00
translators
a53bbfd9e9 (svn r26598) -Update from WebTranslator v3.0:
korean - 1 changes by telk5093
2014-05-18 17:45:12 +00:00
fonsinchen
957b7c0199 (svn r26594) -Fix [FS#6006]: Don't call UpdateVehicleTimetable with dummy orders 2014-05-17 19:38:30 +00:00
frosch
3e7cd6d6c1 (svn r26593) -Fix: Goals were saved/loaded with incorrect size. 2014-05-17 17:18:07 +00:00
translators
fc86ec1f39 (svn r26592) -Update from WebTranslator v3.0:
catalan - 1 changes by juanjo
2014-05-17 08:21:45 +00:00
rubidium
4c6c4677fa (svn r26591) -Add: some instrumentation to catch most cases where the wrong number of bytes would be written into variables during loading (or read during saving) 2014-05-16 17:41:55 +00:00
rubidium
20f54c2f61 (svn r26590) -Fix: possible desync (big/little endian) due to not writing complete variables upon saveload 2014-05-16 17:39:35 +00:00
rubidium
7d2d4a1f82 (svn r26589) -Fix: SIGSEGV on all big endian architectures that tried to load e.g. the 1.4 intro game or anything else with more than 0 linkgraph nodes that was saved on little endian 2014-05-16 17:38:59 +00:00
translators
bd98b14ba5 (svn r26588) -Update from WebTranslator v3.0:
english_US - 1 changes by Supercheese
lithuanian - 3 changes by 
slovak - 15 changes by Milsa
2014-05-15 17:45:25 +00:00
translators
31ec113e54 (svn r26587) -Update from WebTranslator v3.0:
english_US - 3 changes by Supercheese
lithuanian - 3 changes by
2014-05-14 17:45:19 +00:00
fonsinchen
b2e322a3fc (svn r26586) -Fix [FS#5995]: Consider multiheaded trains in station refits (and clean up a bit) 2014-05-13 19:16:04 +00:00
rubidium
ebe3c797dc (svn r26585) -Fix/Feature [FS#5942]: don't truncate money to 32 bits 2014-05-11 20:25:26 +00:00
rubidium
36e8123e4c (svn r26584) -Codechange: [Squirrel] Make the internal integer for scripts always 64 bits, so scripts behave the same on 32 or 64 bits architectures 2014-05-11 20:16:37 +00:00
rubidium
dafbed20d2 (svn r26583) -Fix [FS#5974]: Game script could be changed in game by double clicking 2014-05-11 18:46:42 +00:00
rubidium
1b11ea80ee (svn r26582) -Feature-ish: quickly decay cargo after about 21 months of not having picked any of the cargo, and prevent houses and industries providing more cargo 2014-05-11 18:35:34 +00:00
rubidium
81c2d75048 (svn r26581) -Fix [FS#5989]: transfering cargo to a station doesn't give that station a rating and thus the cargo does not decay... until the first pickup happens
For cargo drops from industries/houses, the station gets a rating too so why not when cargo is dropped at the station from a train?
2014-05-11 18:31:38 +00:00
rubidium
fb9dbf30fa (svn r26580) -Codechange: s/GES_PICKUP/GES_RATING/ (it has nothing to do with actual pickup), s/acceptance_pickup/status/ (the enum isn't called GoodEntryStatus for a reason; it's not only acceptance and pickup anymore) 2014-05-11 18:02:11 +00:00
translators
efa70e7a7c (svn r26579) -Update from WebTranslator v3.0:
simplified_chinese - 17 changes by ww9980
traditional_chinese - 2 changes by ww9980
lithuanian - 3 changes by 
norwegian_bokmal - 2 changes by cuthbert
slovak - 2 changes by Milsa
spanish - 5 changes by juanjo
welsh - 50 changes by kazzie
2014-05-11 17:45:49 +00:00
rubidium
b6ffc92bb2 (svn r26578) -Fix (r26576): network compilation got broken 2014-05-11 13:17:21 +00:00
rubidium
7db8be4a1e (svn r26577) -Fix [FS#6001]: [Network] Client of non-dedicated server was not correctly put into the first company for all state variables 2014-05-11 13:07:36 +00:00
rubidium
492c6ed39b (svn r26576) -Fix [FS#6003]: [Network] AIs would not reset certain network state information upon creation of their company 2014-05-11 12:52:21 +00:00
fonsinchen
1dc630ff26 (svn r26575) -Change [FS#5995]: Add an assert to catch underflowing action counts. 2014-05-11 12:49:51 +00:00
fonsinchen
726e1b6920 (svn r26574) -Fix [FS#6006]: Don't reset current order wait time if it's timetabled. 2014-05-11 09:59:30 +00:00
translators
1a47fb03ea (svn r26573) -Update from WebTranslator v3.0:
catalan - 17 changes by juanjo
lithuanian - 3 changes by 
spanish - 32 changes by juanjo
2014-05-10 17:45:19 +00:00
translators
7f1fb05846 (svn r26572) -Update from WebTranslator v3.0:
japanese - 31 changes by guppy
lithuanian - 3 changes by Stabilitronas
persian - 5 changes by 100ra
slovak - 6 changes by Milsa
2014-05-09 17:45:28 +00:00
translators
c56deb61c9 (svn r26571) -Update from WebTranslator v3.0:
croatian - 1 changes by VoyagerOne
finnish - 1 changes by jpx_
hungarian - 1 changes by Brumi
italian - 1 changes by lorenzodv
lithuanian - 4 changes by Stabilitronas
slovak - 2 changes by Milsa
2014-05-08 17:45:52 +00:00
rubidium
d91d2bb29f (svn r26570) -Fix: WT3 validation issue 2014-05-07 17:49:22 +00:00
translators
df665a3ec2 (svn r26569) -Update from WebTranslator v3.0:
english_AU - 1 changes by mrtux
english_US - 1 changes by Supercheese
french - 57 changes by glx
german - 5 changes by planetmaker
korean - 1 changes by telk5093
lithuanian - 3 changes by 
luxembourgish - 51 changes by Phreeze
russian - 1 changes by KorneySan
2014-05-07 17:45:48 +00:00
planetmaker
28975c5558 (svn r26568) -Change (r26566): Better wording of the new warning (Supercheese) 2014-05-06 21:01:55 +00:00
planetmaker
597de74ea0 (svn r26567) -Cleanup: Remove unused StringID offset in orders check 2014-05-06 20:53:08 +00:00
planetmaker
a85838a618 (svn r26566) -Add [FS#6009]: Give a warning when a plane's orders tell it to use a runway which is too short for it (3298) 2014-05-06 20:50:58 +00:00
translators
121d62d922 (svn r26565) -Update from WebTranslator v3.0:
simplified_chinese - 4 changes by xiangyigao
english_AU - 56 changes by mrtux
korean - 12 changes by telk5093
lithuanian - 57 changes by Stabilitronas
2014-05-06 17:45:27 +00:00
translators
5ca05a28df (svn r26564) -Update from WebTranslator v3.0:
finnish - 5 changes by jpx_
hungarian - 22 changes by Brumi
2014-05-05 17:45:23 +00:00
fonsinchen
38ee1c7b92 (svn r26563) -Fix (r26558): Don't pass explicit template arguments to std::make_pair. 2014-05-04 19:03:54 +00:00
translators
82aa42080a (svn r26560) -Update from WebTranslator v3.0:
irish - 32 changes by tem
2014-05-04 17:45:09 +00:00
fonsinchen
cee5920fcc (svn r26558) -Fix: be more explicit about the type of iterators in the waiting cargo API 2014-05-04 15:16:58 +00:00
fonsinchen
7836470f60 (svn r26557) -Fix: clean up, test (somewhat), and complete the API for waiting cargo 2014-05-04 13:57:48 +00:00
rubidium
0535569d2f (svn r26556) -Codechange: use sources.list to tell a file shouldn't be built for a particular platform 2014-05-03 20:21:01 +00:00
translators
e3647002af (svn r26555) -Update from WebTranslator v3.0:
czech - 18 changes by Eskymak
english_US - 5 changes by Supercheese
2014-05-03 17:45:18 +00:00
alberth
e297f14676 (svn r26554) -Fix(r26489): Use last address of the destination buffer. 2014-05-03 15:45:54 +00:00
translators
f9f5f7aaa0 (svn r26553) -Update from WebTranslator v3.0:
croatian - 5 changes by VoyagerOne
dutch - 50 changes by habell
norwegian_bokmal - 16 changes by cuthbert
russian - 2 changes by Lone_Wolf
slovak - 18 changes by Milsa
2014-05-02 17:45:31 +00:00
translators
0c8ecb8364 (svn r26552) -Update from WebTranslator v3.0:
czech - 14 changes by djst
finnish - 1 changes by jpx_
italian - 5 changes by lorenzodv
brazilian_portuguese - 49 changes by Tucalipe
russian - 32 changes by Lone_Wolf
2014-05-01 17:45:32 +00:00
fonsinchen
7c9ef443e3 (svn r26551) -Fix: document revision number for latest savegame version change 2014-05-01 14:56:33 +00:00
fonsinchen
d4aae15fa5 (svn r26550) -Change: Show measured order times in timetable GUI 2014-05-01 14:53:06 +00:00
fonsinchen
b8381b6b25 (svn r26549) -Change: better estimation for link capacities during full load 2014-05-01 14:50:52 +00:00
fonsinchen
d5bd72296b (svn r26548) -Codechange: move updating of load_unload_ticks out of LoadUnloadVehicle 2014-05-01 14:49:44 +00:00
fonsinchen
c81a6070cb (svn r26547) -Codechange: Collect order travel and wait times independent of timetables 2014-05-01 14:49:16 +00:00
fonsinchen
d49dad9f9c (svn r26546) -Codechange: Make order wait_time, travel_time and max_speed private 2014-05-01 14:48:44 +00:00
translators
9f3590ccba (svn r26545) -Update from WebTranslator v3.0:
catalan - 1 changes by juanjo
croatian - 27 changes by VoyagerOne
czech - 4 changes by djst
korean - 8 changes by telk5093
2014-04-30 17:45:35 +00:00
translators
e1b03c3e43 (svn r26540) -Update from WebTranslator v3.0:
basque - 9 changes by laxkax
catalan - 10 changes by juanjo
italian - 12 changes by lorenzodv
2014-04-29 17:45:18 +00:00
rubidium
071662545c (svn r26539) -Fix [FS#5994]: [Windows] Crash due to assuming (formerly) _video_driver is being set before the operating system has time to perform the first "paint" callback 2014-04-28 21:09:19 +00:00
rubidium
beb540ec55 (svn r26538) -Codechange: remove double accounting of the drivers 2014-04-28 21:06:51 +00:00
translators
39e2e5af1e (svn r26537) -Update from WebTranslator v3.0:
catalan - 24 changes by juanjo
english_US - 25 changes by Supercheese
finnish - 31 changes by jpx_
german - 32 changes by planetmaker
korean - 43 changes by telk5093
luxembourgish - 39 changes by Phreeze
russian - 17 changes by Lone_Wolf
2014-04-28 17:49:35 +00:00
frosch
90f0ba840f (svn r26536) -Change: Reshuffle advanced settings tree. 2014-04-27 20:52:56 +00:00
frosch
639223058e (svn r26535) -Remove: Missed one 2014-04-27 20:51:28 +00:00
frosch
0fa2f909cc (svn r26534) -Remove: Soon unneeded translations. 2014-04-27 20:46:43 +00:00
frosch
e811c54d1d (svn r26533) -Codechange: Rename some strings 2014-04-27 20:40:52 +00:00
rubidium
12fb14724d (svn r26531) -Fix-ish: improve consistency of the usage of max and maximum 2014-04-27 19:32:22 +00:00
translators
5a8b28621f (svn r26530) -Update from WebTranslator v3.0:
catalan - 19 changes by juanjo
english_US - 18 changes by Supercheese
italian - 17 changes by lorenzodv
2014-04-27 17:49:36 +00:00
frosch
32c9d71baf (svn r26529) -Merge: documentation updates from 1.4 branch 2014-04-27 15:45:53 +00:00
frosch
fffab86525 (svn r26528) -Remove: A bunch of archaic settings from the advanced settings GUI. 2014-04-27 15:35:31 +00:00
frosch
7a6d2e0110 (svn r26527) -Codechange: Rename STR_MAPGEN_RANDOM to STR_FACE_RANDOM 2014-04-27 15:30:53 +00:00
frosch
f5545aa0b1 (svn r26526) -Remove: Ability to set map generation seed via GUI. If you really need it, use the console. 2014-04-27 15:15:28 +00:00
frosch
9430dfe7fa (svn r26525) -Remove: Screenshot format setting from GUI. 2014-04-27 15:13:46 +00:00
frosch
94116f93fb (svn r26524) -Remove: Soon unneeded translations. 2014-04-27 15:13:27 +00:00
frosch
3be8cb7061 (svn r26523) -Fix [FS#5992]: OpenBSD compilation (MagisterQuis) 2014-04-27 13:21:30 +00:00
frosch
b2c786ea68 (svn r26522) -Add: A config-file-only setting to disable usage of 8bpp video modes.
-Remove: [win32] fullscreen_bpp setting, which is replaced by above setting.
-Change: Disable usage of 8bpp blitters and video modes by default. Many modern OS and hardware cause issues with those.
2014-04-27 12:15:14 +00:00
rubidium
707ca990a9 (svn r26521) -Fix-ish: prevent from ever reading huge (or negative) amounts of data in strgen 2014-04-26 20:55:08 +00:00
frosch
e23c9b1fc5 (svn r26520) -Change: Reword some texts, mostly setting names. 2014-04-26 20:34:22 +00:00
translators
108fec6130 (svn r26519) -Update from WebTranslator v3.0:
korean - 2 changes by telk5093
2014-04-26 17:45:12 +00:00
rubidium
caffafc38b (svn r26518) -Change: make genworld messages on the dedicated server disable-able by using -dnet=0 2014-04-26 16:55:30 +00:00
rubidium
b3ea3c45f9 (svn r26517) -Fix: Windows 9x (or rather non-unicode) compile failures 2014-04-26 07:30:15 +00:00
rubidium
9edf5eba4e (svn r26514) -Fix: rewrite link-in-tar handling so it doesn't use strncpy and it doesn't overrun its buffers anymore 2014-04-25 21:29:54 +00:00
frosch
b40d6dfb81 (svn r26513) -Fix: 9x compilation, maybe 2014-04-25 19:25:38 +00:00
translators
6a9599e4a9 (svn r26512) -Update from WebTranslator v3.0:
croatian - 1 changes by VoyagerOne
2014-04-25 17:45:08 +00:00
rubidium
8fff83588d (svn r26511) -Codechange: use strecpy in game_text 2014-04-25 17:43:09 +00:00
rubidium
555ee931bf (svn r26510) -Codechange: use memcpy instead of strncpy in the town name replace word function since we never want to add a '\0' anyway, and we know the exact length too 2014-04-25 17:35:29 +00:00
rubidium
034735a54c (svn r26509) -Codechange: replace strdup with stredup (the latter ensures the return is not NULL) 2014-04-25 15:40:32 +00:00
rubidium
0b159549d4 (svn r26508) -Codechange: use seprintf instead of a custom vstrcatprintf hybrid 2014-04-25 15:25:59 +00:00
rubidium
e251d82f96 (svn r26507) -Cleanup: remove now unused custom strndup implementation 2014-04-25 15:17:17 +00:00
rubidium
b886c8db8c (svn r26506) -Codechange: replace most of vsnprintf with vseprintf 2014-04-24 19:51:45 +00:00
frosch
3232a64598 (svn r26505) -Fix (r23634, r26493): Incorrect usage of strecpy/strecat 2014-04-24 19:09:17 +00:00
frosch
efd1c31864 (svn r26504) -Fix (r26499): Obiwan and his gang. 2014-04-24 18:58:47 +00:00
rubidium
b8f9579133 (svn r26503) -Fix: compilation error with full debug build 2014-04-24 18:49:24 +00:00
rubidium
982c68754d (svn r26502) -Fix: OSX compilation error 2014-04-24 18:44:38 +00:00
rubidium
a13ec598a8 (svn r26501) -Fix: Windows compilation error 2014-04-24 18:44:29 +00:00
rubidium
baa9dd4b5d (svn r26500) -Cleanup: remove unused snprintf implementation 2014-04-24 18:40:16 +00:00
rubidium
699779324e (svn r26499) -Codechange: replace strndup with stredup 2014-04-24 18:37:39 +00:00
rubidium
4768fae6d4 (svn r26498) -Add: method for duplicating strings with similar behaviours as strecpy and strecat; give end pointer instead of a size 2014-04-24 18:21:32 +00:00
rubidium
0eda34689e (svn r26497) -Fix: make sure the strgen and settingsgen code gets notified of changes to safeguards.h 2014-04-24 18:09:10 +00:00
frosch
aa743dc837 (svn r26496) -Fix (r1547): Reading console input on dedicated server relied on unspecified behaviour. 2014-04-24 17:49:31 +00:00
translators
9c4ab4cb8c (svn r26495) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
croatian - 1 changes by VoyagerOne
estonian - 2 changes by KSiimson
lithuanian - 3 changes by Stabilitronas
spanish - 1 changes by juanjo
2014-04-24 17:45:33 +00:00
rubidium
a7e999ee20 (svn r26494) -Codechange: replace some further usages of s(n)printf with seprintf 2014-04-24 17:40:43 +00:00
rubidium
e2330f16ea (svn r26493) -Codechange: use strecat to concatenate script settings instead of manually accounting for the amount of characters that has been written 2014-04-24 04:41:54 +00:00
rubidium
1ab6ab9094 (svn r26492) -Fix (r26491): obviously it's too late 2014-04-23 21:33:29 +00:00
rubidium
1535ad6327 (svn r26491) -Fix: compilation failure when networking is disabled 2014-04-23 21:32:41 +00:00
rubidium
4cc448fa82 (svn r26490) -Fix (r26489): compilation under Windows 2014-04-23 21:30:32 +00:00
rubidium
5c7c2445d8 (svn r26489) -Codechange: properly account for the end of buffers in the file io code instead of assuming MAX_PATH is okay 2014-04-23 21:23:21 +00:00
rubidium
a0eaaf80b7 (svn r26488) -Codechange: perform the appropriate length checks when getting a client name 2014-04-23 21:19:54 +00:00
rubidium
b1f6351eff (svn r26487) -Codechange: use lastof instead of lengthof/sizeof for script names 2014-04-23 21:16:58 +00:00
rubidium
6ecc602050 (svn r26486) -Codechange: replace a number of snprintfs with seprintf 2014-04-23 21:12:09 +00:00
frosch
24c7134bff (svn r26485) -Codechange: Replace ttd_strlcpy and ttd_strlcat with strecpy and strecat. 2014-04-23 20:44:42 +00:00
fonsinchen
547e8233be (svn r26484) -Change: Remove demand calculation based on tiles. 2014-04-23 20:23:22 +00:00
fonsinchen
ba66343558 (svn r26483) -Fix: Allow single-vehicle consists to station-refit in a meaningful way. 2014-04-23 20:22:27 +00:00
rubidium
2be4215f43 (svn r26482) -Codechange: add an include that allows us to undefine/redefine "unsafe" functions to prevent them from being used, and thus having to care about certain aspects of their return values 2014-04-23 20:13:33 +00:00
translators
dd84952d15 (svn r26481) -Update from WebTranslator v3.0:
polish - 1 changes by wojteks86
2014-04-22 17:45:10 +00:00
rubidium
f54d141211 (svn r26480) -Fix (r26479): forgot to remove a * 2014-04-21 18:35:12 +00:00
rubidium
a4e769d3f6 (svn r26479) -Codechange: use MallocT instead of malloc 2014-04-21 18:31:06 +00:00
translators
09e08c01ad (svn r26478) -Update from WebTranslator v3.0:
czech - 4 changes by djst
serbian - 2 changes by ivan_mile
2014-04-21 17:45:13 +00:00
translators
0c03fa3208 (svn r26477) -Update from WebTranslator v3.0:
catalan - 30 changes by juanjo
russian - 1 changes by Lone_Wolf
serbian - 18 changes by ivan_mile
turkish - 7 changes by wakeup
2014-04-20 17:45:24 +00:00
rubidium
aa7456e397 (svn r26476) -Fix: prevent comparing to NULL when strndup could not allocate memory 2014-04-20 16:43:22 +00:00
rubidium
101b982263 (svn r26475) -Fix: potentially undefined shifts in NewGRF code 2014-04-20 15:47:50 +00:00
rubidium
3c3f9663e9 (svn r26474) -Cleanup: remove unneeded check for NULL 2014-04-20 15:10:26 +00:00
rubidium
6504817680 (svn r26473) -Fix: make sure there is no uninitialised sprite data; the other blitters cleared the memory too 2014-04-20 14:55:28 +00:00
rubidium
67f3c2a764 (svn r26472) -Cleanup: pointless instance variable 2014-04-20 14:17:13 +00:00
translators
25c26d2eba (svn r26471) -Update from WebTranslator v3.0:
catalan - 4 changes by juanjo
simplified_chinese - 79 changes by xiangyigao
english_US - 8 changes by Supercheese
indonesian - 7 changes by Yoursnotmine
italian - 1 changes by lorenzodv
2014-04-19 17:45:28 +00:00
translators
9f38748a19 (svn r26470) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
korean - 3 changes by telk5093
polish - 4 changes by wojteks86
gaelic - 29 changes by GunChleoc
2014-04-18 17:45:28 +00:00
frosch
61399adc3f (svn r26469) -Fix [FS#5985, FS#5986, FS#5988]: Improve english strings. 2014-04-18 12:33:31 +00:00
translators
6cbe80f564 (svn r26468) -Update from WebTranslator v3.0:
catalan - 3 changes by arnau
czech - 4 changes by djst
english_AU - 2 changes by mrtux
2014-04-17 17:45:23 +00:00
peter1138
f2a47eb080 (svn r26467) -Fix: Include shadow on ... 2014-04-16 19:54:51 +00:00
translators
a05c07b45a (svn r26466) -Update from WebTranslator v3.0:
hungarian - 1 changes by Brumi
2014-04-16 17:45:09 +00:00
translators
505297aa17 (svn r26465) -Update from WebTranslator v3.0:
catalan - 23 changes by juanjo
croatian - 4 changes by VoyagerOne
english_US - 5 changes by Supercheese
finnish - 1 changes by jpx_
luxembourgish - 4 changes by Phreeze
swedish - 2 changes by Joel_A
2014-04-15 17:45:37 +00:00
translators
ff4030b6ad (svn r26464) -Update from WebTranslator v3.0:
belarusian - 4 changes by Wowanxm
catalan - 47 changes by juanjo
norwegian_bokmal - 3 changes by cuthbert
polish - 4 changes by wojteks86
brazilian_portuguese - 4 changes by Tucalipe
2014-04-14 17:45:28 +00:00
peter1138
3465686076 (svn r26463) -Fix (r10190ish): Add special handling for PALETTE_CRASH to work for non-8bpp-mapped sprites. 2014-04-13 19:22:23 +00:00
translators
fb4beb6338 (svn r26462) -Update from WebTranslator v3.0:
german - 3 changes by planetmaker
hungarian - 5 changes by Brumi
italian - 3 changes by lorenzodv
turkish - 4 changes by wakeup
welsh - 6 changes by kazzie
2014-04-13 17:45:28 +00:00
translators
aeb6671017 (svn r26459) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
simplified_chinese - 10 changes by siu238X, xiangyigao
traditional_chinese - 1 changes by siu238X
finnish - 2 changes by jpx_
russian - 2 changes by Lone_Wolf
2014-04-12 17:45:43 +00:00
planetmaker
c10662e4cc (svn r26458) -Doc: Correct a few spelling mistakes (__ln__) 2014-04-12 15:59:56 +00:00
planetmaker
5c3891fe3c (svn r26457) -Codechange: Remove unused parameter from SetIndustryCompleted 2014-04-12 11:43:04 +00:00
planetmaker
74f666d741 (svn r26456) -Update: Baseset translations. 2014-04-12 11:41:45 +00:00
peter1138
816ab7fc8a (svn r26455) -Change: Prompt for confirmation when deleting a vehicle group. 2014-04-11 18:14:44 +00:00
translators
d107b4f4bd (svn r26454) -Update from WebTranslator v3.0:
catalan - 2 changes by juanjo
simplified_chinese - 1 changes by xiangyigao
english_AU - 2 changes by mrtux
russian - 1 changes by Lone_Wolf
2014-04-11 17:45:27 +00:00
translators
1af7203e6d (svn r26453) -Update from WebTranslator v3.0:
basque - 35 changes by laxkax
simplified_chinese - 2 changes by Gavin
finnish - 2 changes by jpx_
italian - 1 changes by lorenzodv
korean - 2 changes by telk5093
gaelic - 1 changes by GunChleoc
2014-04-10 17:45:49 +00:00
translators
612ccec16c (svn r26452) -Update from WebTranslator v3.0:
basque - 18 changes by laxkax
english_US - 2 changes by Supercheese
russian - 2 changes by Lone_Wolf
2014-04-09 17:45:18 +00:00
peter1138
3ea8e22fc1 (svn r26451) -Change: Document GroupIsInGroup() function. 2014-04-08 21:52:53 +00:00
peter1138
ed8f6f1a0f (svn r26450) -Feature: Hierarchical vehicle subgroups. 2014-04-08 21:09:06 +00:00
planetmaker
1d8c673587 (svn r26449) -Add: Allow more sound sleep for dedicated servers when there's nothing to do and nobody paying attention 2014-04-08 20:19:41 +00:00
fonsinchen
8395c08738 (svn r26448) -Fix [FS#5970]: Avoid division by 0 when scaling flow values. 2014-04-08 19:28:14 +00:00
translators
4ef5339405 (svn r26447) -Update from WebTranslator v3.0:
basque - 56 changes by laxkax
2014-04-08 17:45:08 +00:00
translators
afebddccb3 (svn r26446) -Update from WebTranslator v3.0:
hungarian - 1 changes by Brumi
gaelic - 2 changes by GunChleoc
2014-04-05 17:45:22 +00:00
fonsinchen
d6097956a5 (svn r26445) -Change [FS#5961]: Draw links to match _settings_game.vehicle.road_side (M3Henry) 2014-04-05 14:28:55 +00:00
translators
551b0fdc5c (svn r26444) -Update from WebTranslator v3.0:
simplified_chinese - 5 changes by siu238X, xiangyigao
traditional_chinese - 2 changes by siu238X
czech - 1 changes by marek995
german - 1 changes by Jogio
2014-04-04 17:45:23 +00:00
planetmaker
822fc7d9b8 (svn r26443) -Fix [FS#5963]: Update documentation on how to solve the 'No suitable AI can be found' situation 2014-04-03 15:58:34 +00:00
planetmaker
6384755793 (svn r26442) -Fix [FS#5962] Silence compiler warning by adding newline at end of file 2014-04-03 10:54:37 +00:00
703 changed files with 25771 additions and 14388 deletions

View File

@@ -1 +0,0 @@
1.4.4 27029 0 1.4.4

View File

@@ -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 $@ $<

View File

@@ -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 $@ $<

View File

@@ -2,12 +2,12 @@
# $Id$
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/^+//'

View File

@@ -4,7 +4,7 @@ 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.5"; }
function GetDate() { return "2007-03-18"; }

View File

@@ -2,14 +2,11 @@
# $Id$
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

View File

@@ -972,48 +972,7 @@ function Regression::Order()
print(" SetStopLocation(): " + AIOrder.SetStopLocation(20, 0, AIOrder.STOPLOCATION_MIDDLE));
print(" GetStopLocation(): " + AIOrder.GetStopLocation(20, 0));
local list = AIStationList_Vehicle(12);
print("");
print("--StationList_Vehicle--");
print(" Count(): " + list.Count());
list.Valuate(AIStation.GetLocation);
print(" Location ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 0);
print(" CargoWaiting(0) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 1);
print(" CargoWaiting(1) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoRating, 1);
print(" CargoRating(1) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetDistanceManhattanToTile, 30000);
print(" DistanceManhattanToTile(30000) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetDistanceSquareToTile, 30000);
print(" DistanceSquareToTile(30000) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.IsWithinTownInfluence, 0);
print(" IsWithinTownInfluence(0) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list = AIVehicleList_Station(3);
local list = AIVehicleList_Station(3);
print("");
print("--VehicleList_Station--");
@@ -1234,10 +1193,6 @@ function Regression::Station()
print(" GetLocation(1000): " + AIStation.GetLocation(1000));
print(" GetStationID(33411): " + AIStation.GetStationID(33411));
print(" GetStationID(34411): " + AIStation.GetStationID(34411));
print(" GetCargoWaiting(0, 0): " + AIStation.GetCargoWaiting(0, 0));
print(" GetCargoWaiting(1000, 0): " + AIStation.GetCargoWaiting(1000, 0));
print(" GetCargoWaiting(0, 1000): " + AIStation.GetCargoWaiting(0, 1000));
print(" GetStationID(33411): " + AIStation.GetStationID(33411));
print(" HasRoadType(3, TRAM): " + AIStation.HasRoadType(3, AIRoad.ROADTYPE_TRAM));
print(" HasRoadType(3, ROAD): " + AIStation.HasRoadType(3, AIRoad.ROADTYPE_ROAD));
@@ -1254,25 +1209,42 @@ function Regression::Station()
print(" GetNearestTown(): " + AIStation.GetNearestTown(10000));
print(" GetNearestTown(): " + AIStation.GetNearestTown(3));
local list = AIStationList(AIStation.STATION_BUS_STOP + AIStation.STATION_TRUCK_STOP);
print("");
print("--CargoWaiting--");
for (local cargo = 0; cargo <= 1000; cargo += 1000) {
for (local station0 = 0; station0 <= 1000; station0 += 1000) {
print(" GetCargoWaiting(" + station0 + ", " + cargo + "): " +
AIStation.GetCargoWaiting(station0, cargo));
for (local station1 = 0; station1 <= 1000; station1 += 1000) {
print(" GetCargoWaitingFrom(" + station0 + ", " + station1 + ", " + cargo + "): " +
AIStation.GetCargoWaitingFrom(station0, station1, cargo));
print(" GetCargoWaitingVia(" + station0 + ", " + station1 + ", " + cargo + "): " +
AIStation.GetCargoWaitingFrom(station0, station1, cargo));
for (local station2 = 0; station2 <= 1000; station2 += 1000) {
print(" GetCargoWaitingFromVia(" + station0 + ", " + station1 + ", " + station2 + ", " + cargo + "): " +
AIStation.GetCargoWaitingFromVia(station0, station1, station2, cargo));
}
}
}
}
print("");
print("--StationList--");
print(" Count(): " + list.Count());
list.Valuate(AIStation.GetLocation);
print(" Location ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 0);
print(" CargoWaiting(0) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 1);
print(" CargoWaiting(1) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
print("--CargoPlanned--");
for (local cargo = 0; cargo <= 1000; cargo += 1000) {
for (local station0 = 0; station0 <= 1000; station0 += 1000) {
print(" GetCargoPlanned(" + station0 + ", " + cargo + "): " +
AIStation.GetCargoPlanned(station0, cargo));
for (local station1 = 0; station1 <= 1000; station1 += 1000) {
print(" GetCargoPlannedFrom(" + station0 + ", " + station1 + ", " + cargo + "): " +
AIStation.GetCargoPlannedFrom(station0, station1, cargo));
print(" GetCargoPlannedVia(" + station0 + ", " + station1 + ", " + cargo + "): " +
AIStation.GetCargoPlannedFrom(station0, station1, cargo));
for (local station2 = 0; station2 <= 1000; station2 += 1000) {
print(" GetCargoPlannedFromVia(" + station0 + ", " + station1 + ", " + station2 + ", " + cargo + "): " +
AIStation.GetCargoPlannedFromVia(station0, station1, station2, cargo));
}
}
}
}
}

View File

@@ -7487,9 +7487,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetLocation(1000): -1
GetStationID(33411): 4
GetStationID(34411): 65535
GetCargoWaiting(0, 0): 0
GetCargoWaiting(1000, 0): -1
GetCargoWaiting(0, 1000): -1
GetStationID(33411): 4
HasRoadType(3, TRAM): false
HasRoadType(3, ROAD): false
@@ -7504,17 +7501,81 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetNearestTown(): 65535
GetNearestTown(): 10
--StationList--
Count(): 2
Location ListDump:
5 => 33421
4 => 33411
CargoWaiting(0) ListDump:
5 => 0
4 => 0
CargoWaiting(1) ListDump:
5 => 0
4 => 0
--CargoWaiting--
GetCargoWaiting(0, 0): 0
GetCargoWaitingFrom(0, 0, 0): 0
GetCargoWaitingVia(0, 0, 0): 0
GetCargoWaitingFromVia(0, 0, 0, 0): 0
GetCargoWaitingFromVia(0, 0, 1000, 0): -1
GetCargoWaitingFrom(0, 1000, 0): -1
GetCargoWaitingVia(0, 1000, 0): -1
GetCargoWaitingFromVia(0, 1000, 0, 0): -1
GetCargoWaitingFromVia(0, 1000, 1000, 0): -1
GetCargoWaiting(1000, 0): -1
GetCargoWaitingFrom(1000, 0, 0): -1
GetCargoWaitingVia(1000, 0, 0): -1
GetCargoWaitingFromVia(1000, 0, 0, 0): -1
GetCargoWaitingFromVia(1000, 0, 1000, 0): -1
GetCargoWaitingFrom(1000, 1000, 0): -1
GetCargoWaitingVia(1000, 1000, 0): -1
GetCargoWaitingFromVia(1000, 1000, 0, 0): -1
GetCargoWaitingFromVia(1000, 1000, 1000, 0): -1
GetCargoWaiting(0, 1000): -1
GetCargoWaitingFrom(0, 0, 1000): -1
GetCargoWaitingVia(0, 0, 1000): -1
GetCargoWaitingFromVia(0, 0, 0, 1000): -1
GetCargoWaitingFromVia(0, 0, 1000, 1000): -1
GetCargoWaitingFrom(0, 1000, 1000): -1
GetCargoWaitingVia(0, 1000, 1000): -1
GetCargoWaitingFromVia(0, 1000, 0, 1000): -1
GetCargoWaitingFromVia(0, 1000, 1000, 1000): -1
GetCargoWaiting(1000, 1000): -1
GetCargoWaitingFrom(1000, 0, 1000): -1
GetCargoWaitingVia(1000, 0, 1000): -1
GetCargoWaitingFromVia(1000, 0, 0, 1000): -1
GetCargoWaitingFromVia(1000, 0, 1000, 1000): -1
GetCargoWaitingFrom(1000, 1000, 1000): -1
GetCargoWaitingVia(1000, 1000, 1000): -1
GetCargoWaitingFromVia(1000, 1000, 0, 1000): -1
GetCargoWaitingFromVia(1000, 1000, 1000, 1000): -1
--CargoPlanned--
GetCargoPlanned(0, 0): 0
GetCargoPlannedFrom(0, 0, 0): 0
GetCargoPlannedVia(0, 0, 0): 0
GetCargoPlannedFromVia(0, 0, 0, 0): 0
GetCargoPlannedFromVia(0, 0, 1000, 0): -1
GetCargoPlannedFrom(0, 1000, 0): -1
GetCargoPlannedVia(0, 1000, 0): -1
GetCargoPlannedFromVia(0, 1000, 0, 0): -1
GetCargoPlannedFromVia(0, 1000, 1000, 0): -1
GetCargoPlanned(1000, 0): -1
GetCargoPlannedFrom(1000, 0, 0): -1
GetCargoPlannedVia(1000, 0, 0): -1
GetCargoPlannedFromVia(1000, 0, 0, 0): -1
GetCargoPlannedFromVia(1000, 0, 1000, 0): -1
GetCargoPlannedFrom(1000, 1000, 0): -1
GetCargoPlannedVia(1000, 1000, 0): -1
GetCargoPlannedFromVia(1000, 1000, 0, 0): -1
GetCargoPlannedFromVia(1000, 1000, 1000, 0): -1
GetCargoPlanned(0, 1000): -1
GetCargoPlannedFrom(0, 0, 1000): -1
GetCargoPlannedVia(0, 0, 1000): -1
GetCargoPlannedFromVia(0, 0, 0, 1000): -1
GetCargoPlannedFromVia(0, 0, 1000, 1000): -1
GetCargoPlannedFrom(0, 1000, 1000): -1
GetCargoPlannedVia(0, 1000, 1000): -1
GetCargoPlannedFromVia(0, 1000, 0, 1000): -1
GetCargoPlannedFromVia(0, 1000, 1000, 1000): -1
GetCargoPlanned(1000, 1000): -1
GetCargoPlannedFrom(1000, 0, 1000): -1
GetCargoPlannedVia(1000, 0, 1000): -1
GetCargoPlannedFromVia(1000, 0, 0, 1000): -1
GetCargoPlannedFromVia(1000, 0, 1000, 1000): -1
GetCargoPlannedFrom(1000, 1000, 1000): -1
GetCargoPlannedVia(1000, 1000, 1000): -1
GetCargoPlannedFromVia(1000, 1000, 0, 1000): -1
GetCargoPlannedFromVia(1000, 1000, 1000, 1000): -1
--Tile--
HasTreeOnTile(): false
@@ -9106,30 +9167,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
SetStopLocation(): true
GetStopLocation(): 1
--StationList_Vehicle--
Count(): 2
Location ListDump:
5 => 33421
4 => 33411
CargoWaiting(0) ListDump:
5 => 0
4 => 0
CargoWaiting(1) ListDump:
5 => 0
4 => 0
CargoRating(1) ListDump:
5 => -1
4 => -1
DistanceManhattanToTile(30000) ListDump:
5 => 106
4 => 96
DistanceSquareToTile(30000) ListDump:
5 => 8818
4 => 7058
IsWithinTownInfluence(0) ListDump:
5 => 0
4 => 0
--VehicleList_Station--
Count(): 1
Location ListDump:

View File

@@ -0,0 +1,216 @@
/* $Id$ */
class Regression extends AIController {
function Start();
};
function Regression::StationList()
{
local list = AIStationList(AIStation.STATION_BUS_STOP + AIStation.STATION_TRUCK_STOP);
print("");
print("--StationList--");
print(" Count(): " + list.Count());
list.Valuate(AIStation.GetLocation);
print(" Location ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 0);
print(" CargoWaiting(0) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 1);
print(" CargoWaiting(1) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_Cargo()
{
print("");
print("--StationList_Cargo--");
for (local mode = AIStationList_Cargo.CM_WAITING; mode <= AIStationList_Cargo.CM_PLANNED; ++mode) {
print(" " + mode);
for (local selector = AIStationList_Cargo.CS_BY_FROM; selector <= AIStationList_Cargo.CS_FROM_BY_VIA ; ++selector) {
print(" " + selector);
local list = AIStationList_Cargo(mode, selector, 6, 0, 7);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
}
}
};
function Regression::StationList_CargoPlanned()
{
print("");
print("--StationList_CargoPlanned--");
for (local selector = AIStationList_Cargo.CS_BY_FROM; selector <= AIStationList_Cargo.CS_FROM_BY_VIA; ++selector) {
print(" " + selector);
local list = AIStationList_CargoPlanned(selector, 6, 0, 7);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
}
};
function Regression::StationList_CargoPlannedByFrom()
{
print("");
print("--StationList_CargoPlannedByFrom--");
local list = AIStationList_CargoPlannedByFrom(2, 0);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoPlannedByVia()
{
print("");
print("--StationList_CargoPlannedByVia--");
local list = AIStationList_CargoPlannedByVia(2, 0);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoPlannedViaByFrom()
{
print("");
print("--StationList_CargoPlannedViaByFrom--");
local list = AIStationList_CargoPlannedViaByFrom(6, 0, 7);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoPlannedFromByVia()
{
print("");
print("--StationList_CargoPlannedFromByVia--");
local list = AIStationList_CargoPlannedFromByVia(6, 0, 7);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoWaiting()
{
print("");
print("--StationList_CargoWaiting--");
for (local selector = AIStationList_Cargo.CS_BY_FROM; selector <= AIStationList_Cargo.CS_FROM_BY_VIA; ++selector) {
print(" " + selector);
local list = AIStationList_CargoWaiting(selector, 6, 0, 7);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
}
};
function Regression::StationList_CargoWaitingByFrom()
{
print("");
print("--StationList_CargoWaitingByFrom--");
local list = AIStationList_CargoWaitingByFrom(2, 0);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoWaitingByVia()
{
print("");
print("--StationList_CargoWaitingByVia--");
local list = AIStationList_CargoWaitingByVia(2, 0);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoWaitingViaByFrom()
{
print("");
print("--StationList_CargoWaitingViaByFrom--");
local list = AIStationList_CargoWaitingViaByFrom(6, 0, 7);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_CargoWaitingFromByVia()
{
print("");
print("--StationList_CargoWaitingFromByVia--");
local list = AIStationList_CargoWaitingFromByVia(2, 0, 2);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
};
function Regression::StationList_Vehicle()
{
local list = AIStationList_Vehicle(12);
print("");
print("--StationList_Vehicle--");
print(" Count(): " + list.Count());
list.Valuate(AIStation.GetLocation);
print(" Location ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 0);
print(" CargoWaiting(0) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoWaiting, 1);
print(" CargoWaiting(1) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetCargoRating, 1);
print(" CargoRating(1) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetDistanceManhattanToTile, 30000);
print(" DistanceManhattanToTile(30000) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.GetDistanceSquareToTile, 30000);
print(" DistanceSquareToTile(30000) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIStation.IsWithinTownInfluence, 0);
print(" IsWithinTownInfluence(0) ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
}
function Regression::Start()
{
StationList();
StationList_Cargo();
StationList_CargoPlanned();
StationList_CargoPlannedByFrom();
StationList_CargoPlannedByVia();
StationList_CargoPlannedViaByFrom();
StationList_CargoPlannedFromByVia();
StationList_CargoWaiting();
StationList_CargoWaitingByFrom();
StationList_CargoWaitingByVia();
StationList_CargoWaitingViaByFrom();
StationList_CargoWaitingFromByVia();
StationList_Vehicle();
}

View File

@@ -0,0 +1,127 @@
--StationList--
Count(): 5
Location ListDump:
6 => 42341
2 => 41831
7 => 41825
5 => 33421
4 => 33411
CargoWaiting(0) ListDump:
7 => 6
6 => 6
2 => 3
5 => 0
4 => 0
CargoWaiting(1) ListDump:
7 => 0
6 => 0
5 => 0
4 => 0
2 => 0
--StationList_Cargo--
0
0
6 => 6
1
6 => 2
2
2 => 4
7 => 2
3
1
0
7 => 18
6 => 16
2 => 7
1
6 => 8
2 => 3
2
2 => 16
6 => 14
7 => 11
3
6 => 10
2 => 8
--StationList_CargoPlanned--
0
7 => 18
6 => 16
2 => 7
1
6 => 8
2 => 3
2
2 => 16
6 => 14
7 => 11
3
6 => 10
2 => 8
--StationList_CargoPlannedByFrom--
7 => 8
6 => 8
2 => 7
--StationList_CargoPlannedByVia--
2 => 16
6 => 7
--StationList_CargoPlannedViaByFrom--
6 => 8
2 => 3
--StationList_CargoPlannedFromByVia--
6 => 10
2 => 8
--StationList_CargoWaiting--
0
6 => 6
1
6 => 2
2
2 => 4
7 => 2
3
--StationList_CargoWaitingByFrom--
2 => 3
--StationList_CargoWaitingByVia--
6 => 3
--StationList_CargoWaitingViaByFrom--
6 => 2
--StationList_CargoWaitingFromByVia--
6 => 3
--StationList_Vehicle--
Count(): 2
Location ListDump:
5 => 33421
4 => 33411
CargoWaiting(0) ListDump:
5 => 0
4 => 0
CargoWaiting(1) ListDump:
5 => 0
4 => 0
CargoRating(1) ListDump:
5 => -1
4 => -1
DistanceManhattanToTile(30000) ListDump:
5 => 106
4 => 96
DistanceSquareToTile(30000) ListDump:
5 => 8818
4 => 7058
IsWithinTownInfluence(0) ListDump:
5 => 0
4 => 0
ERROR: The script died unexpectedly.

Binary file not shown.

View File

@@ -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

View File

@@ -25,6 +25,7 @@ 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.
@@ -34,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.

Binary file not shown.

Binary file not shown.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -8,3 +8,10 @@
*/
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);
}

View File

@@ -1,3 +1,96 @@
1.5.0-RC1 (2015-03-18)
------------------------------------------------------------------------
- Feature: [NewGRF] Display relative offset changes in the sprite aligner [FS#6236] (r27174)
- Fix: Original road vehicle acceleration crashed for vehicles taking over [FS#6255] (r27190)
- Fix: GCC 5 compilation (r27185, r27183)
- Fix: Data race due to lazy initialisation of objects [FS#5969] (r27178)
- Fix: Compilation with MinGW64 (r27176)
- Fix: Use the regular clipping functions in the sprite aligner instead of some magic [FS#6237] (r27173)
- Fix: Windows randomly drops SetCursorPos calls, breaking the RMB-scrolling [FS#6238] (r27172)
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)

View File

@@ -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.
@@ -1035,9 +1035,9 @@ check_params() {
# of the tags folder, the folder of the tag does not have a .svn folder
# anymore and this fails to detect the subversion repository checkout.
log 1 "checking revision... svn detection (tag)"
elif [ -e "$ROOT_DIR/.git" ] && [ -n "`git help 2>/dev/null`" ]; then
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"
@@ -3183,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
@@ -3225,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

View File

@@ -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

View File

@@ -15,20 +15,60 @@
For a graphical representation of the tile-layout have a look at
<a href="landscape_grid.html">Landscape grid</a> page.
</p>
<p>Eight attributes (counting &quot;<span style="font-weight: bold;">type_height</span>&quot;) hold the informations about a tile.<BR>
<p>Nine attributes (counting &quot;<span style="font-weight: bold;">type</span>&quot; and
&quot;<span style="font-weight: bold;">height</span>&quot;) hold the informations about a tile.<BR>
These attributes are referred to as
&quot;<span style="font-weight: bold;">type_height</span>",
&quot;<span style="font-weight: bold;">type</span>",
&quot;<span style="font-weight: bold;">height</span>",
&quot;<span style="font-weight: bold;">m1</span>&quot;, &quot;<span style="font-weight: bold;">m2</span>&quot;,
&quot;<span style="font-weight: bold;">m3</span>&quot;, &quot;<span style="font-weight: bold;">m4</span>&quot;,
&quot;<span style="font-weight: bold;">m5</span>&quot;, &quot;<span style="font-weight: bold;">m6</span>&quot;
and "<span style="font-weight: bold;">m7</span>".<br>
The most important value is the class of a tile, stored in the upper 4 bits
of the <span style="font-weight: bold;">type_height</span> attribute. The lower 4 bits are used to encode the height and
slope data.
of the <span style="font-weight: bold;">type</span> attribute.
</p>
Frequently repeating patterns:
<ul>
<li><span style="font-weight: bold;">type</span>
<ul>
<li>
<a name="type"></a>
Bits 7..4:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">The tile type.</td></tr>
<tr><td style="width: 5em;"><tt>00</tt></td><td>Ground</td></tr>
<tr><td><tt>01</tt></td><td>Railway tracks</td></tr>
<tr><td><tt>02</tt></td><td>Roads</td></tr>
<tr><td><tt>03</tt></td><td>Town building</td></tr>
<tr><td><tt>04</tt></td><td>Trees</td></tr>
<tr><td><tt>05</tt></td><td>Station tiles</td></tr>
<tr><td><tt>06</tt></td><td>Water</td></tr>
<tr><td><tt>07</tt></td><td>Void</td></tr>
<tr><td><tt>08</tt></td><td>Industries</td></tr>
<tr><td><tt>09</tt></td><td>Tunnel / bridge</td></tr>
<tr><td><tt>0A</tt></td><td>Objects</td></tr>
</table>
</li>
Bits 3..2:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">Presence and direction of bridge above.</td></tr>
<tr><td style="width: 5em;"><tt>00</tt></td><td>no bridge</td></tr>
<tr><td><tt>01</tt></td><td>Axis X (North-East)</td></tr>
<tr><td><tt>02</tt></td><td>Axis Y (South-West)</td></tr>
</table>
<li>
<a name="tropic_zone"></a>
Bits 1..0:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">Only meaningfull in tropic climate. It contains the definition of the available zones</td></tr>
<tr><td style="width: 5em;"><tt>00</tt></td><td>normal</td></tr>
<tr><td><tt>01</tt></td><td>desert</td></tr>
<tr><td><tt>02</tt></td><td>rain forest</td></tr>
</table>
In any other climate these 2 bits are theoretically free of use, however using them does not seem useful.
</li>
</ul>
<li><span style="font-weight: bold;">m1</span>
<ul>
<li>
@@ -58,32 +98,6 @@
</li>
</ul>
</li>
<li><span style="font-weight: bold;">m6</span>
<ul>
<li>
<a name="bridge_direction"></a>
Bits 7..6:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">Presence and direction of bridge above, for tiles that support this.</td></tr>
<tr><td style="width: 5em;"><tt>00</tt></td><td>no bridge</td></tr>
<tr><td><tt>01</tt></td><td>Axis X (North-East)</td></tr>
<tr><td><tt>02</tt></td><td>Axis Y (South-West)</td></tr>
</table>
Some tiles, such as houses do not support bridges over them and use these bits for other purposes.
</li>
<li>
<a name="tropic_zone"></a>
Bits 1..0:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">Only meaningfull in tropic climate. It contains the definition of the available zones</td></tr>
<tr><td style="width: 5em;"><tt>00</tt></td><td>normal</td></tr>
<tr><td><tt>01</tt></td><td>desert</td></tr>
<tr><td><tt>02</tt></td><td>rain forest</td></tr>
</table>
In any other climate these 2 bits are theoretically free of use, however using them does not seem useful.
</li>
</ul>
</li>
<li><span style="font-weight: bold;">m7:</span><br>
Animation frame/state. Used for houses, industries, objects and stations.
</li>
@@ -196,9 +210,7 @@
</tr>
</table>
</li>
<li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
<li>m6 bits 4..2: type of hedge on NW border of the tile</li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
</ul>
</td>
</tr>
@@ -510,8 +522,6 @@
<li>m5 bit 4: pbs reservation state</li>
</ul>
</li>
<li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
</ul>
</td>
</tr>
@@ -666,8 +676,6 @@
<li>m7 bits 4..0: <a href="#OwnershipInfo">owner</a> of the road type 0 (normal road)</li>
</ul>
</li>
<li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
</ul>
</td>
</tr>
@@ -714,7 +722,6 @@
<li>bits 7..2 : lift position (for houses type 04 and 05)</li>
</ul>
</li>
<li>bits 1..0 : tropic zone specifier</li>
</ul>
</li>
<li>m7 :
@@ -836,7 +843,6 @@
</tr>
</table>
</li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
</ul>
</td>
</tr>
@@ -970,7 +976,6 @@
<li>m6 bits 5..3: the station type (rail, airport, truck, bus, oilrig, dock, buoy, waypoint)</li>
<li>m6 bit 2: pbs reservation state for railway stations/waypoints</li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
<li>m7 bits 4..0: <a href="#OwnershipInfo">owner</a> of road (road stops)</li>
<li>m7 bits 7..6: present road types (road stops)</li>
<li>m7: animation frame (railway stations/waypoints, airports)</li>
@@ -1083,8 +1088,6 @@
</tr>
</table>
</li>
<li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
</ul>
</td>
</tr>
@@ -1102,7 +1105,7 @@
<tr bgcolor="#CCCCCC">
<td valign=top nowrap><strong><a name="Class8"><tt> 8</tt></a></strong></td>
<td><strong>Industry tile </strong></td>
<td><strong>Industries </strong></td>
</tr>
<tr>
<td valign=top nowrap>&nbsp;</td>
@@ -1426,7 +1429,6 @@
</li>
<li>m6 bits 5..3: random triggers (NewGRF)</li>
<li>m6 bit 2: bit 8 of type (see m5)</li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
<li>m7: animation frame</li>
</ul>
</td>
@@ -1577,8 +1579,6 @@
</tr>
</table>
</li>
<li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
<li>m7 bits 4..0: <a href="#OwnershipInfo">owner</a> of road</li>
<li>m7 bit 5 set = on snow or desert</li>
<li>m7 bits 7..6: present road types for road</li>
@@ -1599,8 +1599,6 @@
<li>m2: index into the array of objects, bits 0 to 15 (upper bits in m5)</li>
<li>m3: random bits</li>
<li>m5: index into the array of objects, bits 16 to 23 (lower bits in m2)</li>
<li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
<li>m7: animation counter</li>
</ul>
</td>

View File

@@ -28,13 +28,14 @@ the array so you can quickly see what is used and what is not.
</ul>
<p>
<ul>
<li><span style="font-weight: bold;">type_height</span> - 8 bits in size, stores tile height (lower 4 bits) and tile class (upper 4 bits)</li>
<li><span style="font-weight: bold;">type</span> - 8 bits in size, tile class (bits 4..7), bridge (bits 2..3) tropic zone (bits 0..1, only valid in tropic climate)</li>
<li><span style="font-weight: bold;">height</span> - 8 bits in size, stores tile height</li>
<li><span style="font-weight: bold;">m1</span> - 8 bits in size, used to identify the owner of that tile (eg piece of rail, bridge, etc.)</li>
<li><span style="font-weight: bold;">m2</span> - 16 bits in size, used to identify the index of the given tile (object) in the (object-)array</li>
<li><span style="font-weight: bold;">m3</span> - 8 bits in size, is used for general storage</li>
<li><span style="font-weight: bold;">m4</span> - 8 bits in size, is used for general storage</li>
<li><span style="font-weight: bold;">m5</span> - 8 bits in size, is used for general storage</li>
<li><span style="font-weight: bold;">m6</span> - 8 bits in size, special meaning : lower 2 bits only valid in tropic climate, upper 2 bits for bridges</li>
<li><span style="font-weight: bold;">m6</span> - 8 bits in size, is used for general storage</li>
<li><span style="font-weight: bold;">m7</span> - 8 bits in size, is used for general storage</li>
</ul>
@@ -42,7 +43,8 @@ the array so you can quickly see what is used and what is not.
<tbody>
<tr>
<th colspan=2>class</th>
<th>type_height (8)</th>
<th>type (8)</th>
<th>height (8)</th>
<th>m1 (8)</th>
<th>m2 (16)</th>
<th>m3 (8)</th>
@@ -55,6 +57,7 @@ the array so you can quickly see what is used and what is not.
<td colspan=2 class="caption">bits</td>
<td class="bits">7654 3210</td>
<td class="bits">7654 3210</td>
<td class="bits">7654 3210</td>
<td class="bits">FEDC BA98 7654 3210</td>
<td class="bits">7654 3210</td>
<td class="bits">7654 3210</td>
@@ -66,69 +69,75 @@ the array so you can quickly see what is used and what is not.
<td rowspan="2">0</td>
<td class="caption">ground</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOO</span><span class="option">~ ~~~~</span></td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits">XXXX <span class="free">OOOO</span></td>
<td class="bits">XXXX XX<span class="free">OO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XX<span class="free">O</span>X XXXX</td>
<td class="bits"><span class="free">OOO</span>X XX<span class="free">OO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">farmland</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XX<span class="free">O</span>X XXXX</td>
<td class="bits"><span class="free">OOO</span>X XX<span class="free">OO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td rowspan=3>1</td>
<td class="caption">rail</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOO</span>X XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX <span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">rail with signals</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO</span> XXXX XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">depot</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits">XX<span class="free">O</span>X <span class="free">OO</span>XX</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td rowspan=3>2</td>
<td class="caption">road</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOO</span>X XXXX</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits">XXX<span class="free">O</span> XXXX</td>
</tr>
<tr>
@@ -136,10 +145,11 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX<span class="free"> OOO</span>X</td>
<td class="bits">XXXX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits">XXXX XXXX</td>
</tr>
<tr>
@@ -147,10 +157,11 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXX<span class="free">O</span> XXXX</td>
</tr>
<tr>
@@ -158,35 +169,38 @@ the array so you can quickly see what is used and what is not.
<td class="caption">house</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XX<span class="free">O</span><span class="option">~ ~~</span>XX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXX<span class="abuse">X XXXX</span></td>
<td class="bits"><span class="abuse">XXXX XX</span>XX</td>
<td class="bits"><span class="abuse">XXXX XX</span><span class="free">OO</span></td>
<td class="bits">XXXX <span class="abuse">XXXX</span></td>
</tr>
<tr>
<td>4</td>
<td class="caption">trees</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOO</span><span class="option">~ ~~~~</span></td>
<td class="bits"><span class="free">OOOO OOO</span>X XXXX XXXX</td>
<td class="bits"><span class="option">~~</span>XX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XX<span class="free">OO O</span>XXX</td>
<td class="bits"><span class="free">OOOO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td rowspan=7>5</td>
<td class="caption">rail station</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">O</span>XXX XXXX</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OO</span>XX XXXX</td>
<td class="bits"><span class="free">OO</span>XX XX<span class="free">OO</span></td>
<td class="bits">XXXX XXXX</td>
</tr>
<tr>
@@ -199,16 +213,18 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
</tr>
<tr>
<td class="caption">road stop</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="option">~~~~ ~</span>XXX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits">XX<span class="free">O</span>X XXXX</td>
</tr>
<tr>
@@ -216,10 +232,11 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="option">~~~~ ~</span>XXX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
@@ -227,10 +244,11 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits">XXXX XXXX</td>
</tr>
<tr>
@@ -238,10 +256,11 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="option">~~~~ ~~~~</span></td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
@@ -249,68 +268,74 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="option">~~~~ ~~~~</span></td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">O</span>XX</td>
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td rowspan=3>6</td>
<td class="caption">sea, shore</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">O</span>XXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">X<span class="option">~~</span>X XXXX</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">canal, river</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">shipdepot</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">-inherit-</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
<td>8</td>
<td class="caption">industry</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXX<span class="free">O</span> <span class="abuse">XXXX</span></td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OO</span>XX XXXX</td>
<td class="bits"><span class="free">OO</span>XX XX<span class="free">OO</span></td>
<td class="bits">XXXX XXXX</td>
</tr>
<tr>
<td rowspan=2>9</td>
<td class="caption">tunnel entrance</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOO</span>X XXXX</td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">X<span class="free">OO</span>X XXXX</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
</tr>
<tr>
@@ -321,19 +346,21 @@ the array so you can quickly see what is used and what is not.
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OO</span>XX XX<span class="free">OO</span></td>
<td class="bits">-inherit-</td>
</tr>
<tr>
<td rowspan=2>A</td>
<td class="caption">objects</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">O</span>XXX XXXX</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
</tr>
</tbody>

View File

@@ -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

View File

@@ -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
@@ -134,7 +134,6 @@ else
REV_NR=""
fi
MODIFIED="0" # This prevents Andorid build from connecting to a public servers
if [ "$MODIFIED" -eq "2" ]; then
REV="${REV}M"
fi

View File

@@ -1,6 +1,6 @@
OpenTTD's known bugs
Last updated: 2014-10-21
Release version: 1.4.4
Last updated: 2015-03-18
Release version: 1.5.0-RC1
------------------------------------------------------------------------

View File

@@ -104,3 +104,4 @@
#include "rivers/tropic.nfo"
#include "rivers/toyland.nfo"
#include "tunnel_portals.nfo"
#include "palette.nfo"

View File

@@ -0,0 +1,20 @@
//
// $Id$
//
// This file is part of OpenTTD.
// OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
// OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
//
-1 * 0 0C "All black palette"
-1 * 0 05 18 01
-1 * 0 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01

View File

@@ -1,3 +1,21 @@
openttd (1.5.0~RC1-0) unstable; urgency=low
* New upstream release 1.5.0-RC1
-- OpenTTD <info@openttd.org> Wed, 18 Mar 2015 21:00:00 +0100
openttd (1.5.0~beta2-0) unstable; urgency=low
* New upstream release 1.5.0-beta2
-- OpenTTD <info@openttd.org> 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 <info@openttd.org> Wed, 24 Dec 2014 21:00:00 +0100
openttd (1.4.4-0) unstable; urgency=low
* New upstream release 1.4.4

View File

@@ -1,9 +1,9 @@
# Version numbers to update
!define APPV_MAJOR 1
!define APPV_MINOR 4
!define APPV_MAINT 4
!define APPV_BUILD 1
!define APPV_EXTRA ""
!define APPV_MINOR 5
!define APPV_MAINT 0
!define APPV_BUILD 2
!define APPV_EXTRA "-RC1"
!define APPNAME "OpenTTD" ; Define application name
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version

View File

@@ -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."

View File

@@ -227,6 +227,12 @@
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\lang\korean.lng;%(Outputs)</Outputs>
</CustomBuild>
<CustomBuild Include="..\src\lang\latin.txt">
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating latin language file</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\lang\latin.lng;%(Outputs)</Outputs>
</CustomBuild>
<CustomBuild Include="..\src\lang\latvian.txt">
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating latvian language file</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"</Command>

View File

@@ -97,6 +97,9 @@
<CustomBuild Include="..\src\lang\korean.txt">
<Filter>Translations</Filter>
</CustomBuild>
<CustomBuild Include="..\src\lang\latin.txt">
<Filter>Translations</Filter>
</CustomBuild>
<CustomBuild Include="..\src\lang\latvian.txt">
<Filter>Translations</Filter>
</CustomBuild>

View File

@@ -513,6 +513,21 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\latin.txt"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Generating latin language file"
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;exit 0&#x0D;&#x0A;"
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
Outputs="..\bin\lang\latin.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\latvian.txt"
>

View File

@@ -514,6 +514,21 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\latin.txt"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Generating latin language file"
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;exit 0&#x0D;&#x0A;"
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
Outputs="..\bin\lang\latin.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\latvian.txt"
>

View File

@@ -311,6 +311,7 @@
<ClCompile Include="..\src\debug.cpp" />
<ClCompile Include="..\src\dedicated.cpp" />
<ClCompile Include="..\src\depot.cpp" />
<ClCompile Include="..\src\disaster_vehicle.cpp" />
<ClCompile Include="..\src\driver.cpp" />
<ClCompile Include="..\src\economy.cpp" />
<ClCompile Include="..\src\effectvehicle.cpp" />
@@ -437,6 +438,7 @@
<ClInclude Include="..\src\depot_type.h" />
<ClInclude Include="..\src\direction_func.h" />
<ClInclude Include="..\src\direction_type.h" />
<ClInclude Include="..\src\disaster_vehicle.h" />
<ClInclude Include="..\src\music\dmusic.h" />
<ClInclude Include="..\src\driver.h" />
<ClInclude Include="..\src\economy_base.h" />
@@ -568,6 +570,7 @@
<ClInclude Include="..\src\road_type.h" />
<ClInclude Include="..\src\roadstop_base.h" />
<ClInclude Include="..\src\roadveh.h" />
<ClInclude Include="..\src\safeguards.h" />
<ClInclude Include="..\src\screenshot.h" />
<ClInclude Include="..\src\sdl.h" />
<ClInclude Include="..\src\sound\sdl_s.h" />
@@ -623,7 +626,6 @@
<ClInclude Include="..\src\tilehighlight_type.h" />
<ClInclude Include="..\src\tilematrix_type.hpp" />
<ClInclude Include="..\src\timetable.h" />
<ClInclude Include="..\src\toolbar_type.h" />
<ClInclude Include="..\src\toolbar_gui.h" />
<ClInclude Include="..\src\town.h" />
<ClInclude Include="..\src\town_type.h" />
@@ -805,7 +807,6 @@
<ClCompile Include="..\src\clear_cmd.cpp" />
<ClCompile Include="..\src\company_cmd.cpp" />
<ClCompile Include="..\src\depot_cmd.cpp" />
<ClCompile Include="..\src\disaster_cmd.cpp" />
<ClCompile Include="..\src\group_cmd.cpp" />
<ClCompile Include="..\src\industry_cmd.cpp" />
<ClCompile Include="..\src\misc_cmd.cpp" />
@@ -882,6 +883,7 @@
<ClInclude Include="..\src\table\elrail_data.h" />
<ClInclude Include="..\src\table\engines.h" />
<ClInclude Include="..\src\table\genland.h" />
<ClInclude Include="..\src\table\heightmap_colours.h" />
<ClInclude Include="..\src\table\industry_land.h" />
<ClInclude Include="..\src\table\landscape_sprite.h" />
<ClInclude Include="..\src\table\newgrf_debug_data.h" />
@@ -952,6 +954,7 @@
<ClInclude Include="..\src\3rdparty\squirrel\squirrel\sqstate.h" />
<ClInclude Include="..\src\3rdparty\squirrel\include\sqstdaux.h" />
<ClInclude Include="..\src\3rdparty\squirrel\include\sqstdmath.h" />
<ClInclude Include="..\src\3rdparty\squirrel\include\sqstdstring.h" />
<ClInclude Include="..\src\3rdparty\squirrel\squirrel\sqstring.h" />
<ClInclude Include="..\src\3rdparty\squirrel\squirrel\sqtable.h" />
<ClInclude Include="..\src\3rdparty\squirrel\include\squirrel.h" />

View File

@@ -162,6 +162,9 @@
<ClCompile Include="..\src\depot.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\disaster_vehicle.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\driver.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@@ -540,6 +543,9 @@
<ClInclude Include="..\src\direction_type.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\disaster_vehicle.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\music\dmusic.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -933,6 +939,9 @@
<ClInclude Include="..\src\roadveh.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\safeguards.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\screenshot.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -1098,9 +1107,6 @@
<ClInclude Include="..\src\timetable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\toolbar_type.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\toolbar_gui.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -1644,9 +1650,6 @@
<ClCompile Include="..\src\depot_cmd.cpp">
<Filter>Command handlers</Filter>
</ClCompile>
<ClCompile Include="..\src\disaster_cmd.cpp">
<Filter>Command handlers</Filter>
</ClCompile>
<ClCompile Include="..\src\group_cmd.cpp">
<Filter>Command handlers</Filter>
</ClCompile>
@@ -1875,6 +1878,9 @@
<ClInclude Include="..\src\table\genland.h">
<Filter>Tables</Filter>
</ClInclude>
<ClInclude Include="..\src\table\heightmap_colours.h">
<Filter>Tables</Filter>
</ClInclude>
<ClInclude Include="..\src\table\industry_land.h">
<Filter>Tables</Filter>
</ClInclude>
@@ -2085,6 +2091,9 @@
<ClInclude Include="..\src\3rdparty\squirrel\include\sqstdmath.h">
<Filter>Squirrel headers</Filter>
</ClInclude>
<ClInclude Include="..\src\3rdparty\squirrel\include\sqstdstring.h">
<Filter>Squirrel headers</Filter>
</ClInclude>
<ClInclude Include="..\src\3rdparty\squirrel\squirrel\sqstring.h">
<Filter>Squirrel headers</Filter>
</ClInclude>

View File

@@ -514,6 +514,10 @@
RelativePath=".\..\src\depot.cpp"
>
</File>
<File
RelativePath=".\..\src\disaster_vehicle.cpp"
>
</File>
<File
RelativePath=".\..\src\driver.cpp"
>
@@ -1022,6 +1026,10 @@
RelativePath=".\..\src\direction_type.h"
>
</File>
<File
RelativePath=".\..\src\disaster_vehicle.h"
>
</File>
<File
RelativePath=".\..\src\music\dmusic.h"
>
@@ -1546,6 +1554,10 @@
RelativePath=".\..\src\roadveh.h"
>
</File>
<File
RelativePath=".\..\src\safeguards.h"
>
</File>
<File
RelativePath=".\..\src\screenshot.h"
>
@@ -1766,10 +1778,6 @@
RelativePath=".\..\src\timetable.h"
>
</File>
<File
RelativePath=".\..\src\toolbar_type.h"
>
</File>
<File
RelativePath=".\..\src\toolbar_gui.h"
>
@@ -2510,10 +2518,6 @@
RelativePath=".\..\src\depot_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\disaster_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\group_cmd.cpp"
>
@@ -2826,6 +2830,10 @@
RelativePath=".\..\src\table\genland.h"
>
</File>
<File
RelativePath=".\..\src\table\heightmap_colours.h"
>
</File>
<File
RelativePath=".\..\src\table\industry_land.h"
>
@@ -3122,6 +3130,10 @@
RelativePath=".\..\src\3rdparty\squirrel\include\sqstdmath.h"
>
</File>
<File
RelativePath=".\..\src\3rdparty\squirrel\include\sqstdstring.h"
>
</File>
<File
RelativePath=".\..\src\3rdparty\squirrel\squirrel\sqstring.h"
>

View File

@@ -511,6 +511,10 @@
RelativePath=".\..\src\depot.cpp"
>
</File>
<File
RelativePath=".\..\src\disaster_vehicle.cpp"
>
</File>
<File
RelativePath=".\..\src\driver.cpp"
>
@@ -1019,6 +1023,10 @@
RelativePath=".\..\src\direction_type.h"
>
</File>
<File
RelativePath=".\..\src\disaster_vehicle.h"
>
</File>
<File
RelativePath=".\..\src\music\dmusic.h"
>
@@ -1543,6 +1551,10 @@
RelativePath=".\..\src\roadveh.h"
>
</File>
<File
RelativePath=".\..\src\safeguards.h"
>
</File>
<File
RelativePath=".\..\src\screenshot.h"
>
@@ -1763,10 +1775,6 @@
RelativePath=".\..\src\timetable.h"
>
</File>
<File
RelativePath=".\..\src\toolbar_type.h"
>
</File>
<File
RelativePath=".\..\src\toolbar_gui.h"
>
@@ -2507,10 +2515,6 @@
RelativePath=".\..\src\depot_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\disaster_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\group_cmd.cpp"
>
@@ -2823,6 +2827,10 @@
RelativePath=".\..\src\table\genland.h"
>
</File>
<File
RelativePath=".\..\src\table\heightmap_colours.h"
>
</File>
<File
RelativePath=".\..\src\table\industry_land.h"
>
@@ -3119,6 +3127,10 @@
RelativePath=".\..\src\3rdparty\squirrel\include\sqstdmath.h"
>
</File>
<File
RelativePath=".\..\src\3rdparty\squirrel\include\sqstdstring.h"
>
</File>
<File
RelativePath=".\..\src\3rdparty\squirrel\squirrel\sqstring.h"
>

View File

@@ -1,5 +1,5 @@
Last updated: 2014-10-21
Release version: 1.4.4
Last updated: 2015-03-18
Release version: 1.5.0-RC1
------------------------------------------------------------------------
@@ -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.
@@ -723,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!

View File

@@ -19,6 +19,7 @@ date.cpp
debug.cpp
dedicated.cpp
depot.cpp
disaster_vehicle.cpp
driver.cpp
economy.cpp
effectvehicle.cpp
@@ -92,13 +93,16 @@ tgp.cpp
tile_map.cpp
tilearea.cpp
townname.cpp
tutorial_gui.cpp
#if WIN32
#else
#if WINCE
#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
@@ -173,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
@@ -304,6 +309,7 @@ road_internal.h
road_type.h
roadstop_base.h
roadveh.h
safeguards.h
screenshot.h
sdl.h
sound/sdl_s.h
@@ -359,7 +365,6 @@ tilehighlight_func.h
tilehighlight_type.h
tilematrix_type.hpp
timetable.h
toolbar_type.h
toolbar_gui.h
town.h
town_type.h
@@ -564,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
@@ -645,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
@@ -723,6 +728,7 @@ script/squirrel_std.hpp
3rdparty/squirrel/squirrel/sqstate.h
3rdparty/squirrel/include/sqstdaux.h
3rdparty/squirrel/include/sqstdmath.h
3rdparty/squirrel/include/sqstdstring.h
3rdparty/squirrel/squirrel/sqstring.h
3rdparty/squirrel/squirrel/sqtable.h
3rdparty/squirrel/include/squirrel.h
@@ -899,12 +905,6 @@ script/api/script_window.cpp
# Blitters
#if DEDICATED
#else
blitter/16bpp_base.cpp
blitter/16bpp_base.hpp
blitter/16bpp_anim.cpp
blitter/16bpp_anim.hpp
blitter/16bpp_simple.cpp
blitter/16bpp_simple.hpp
blitter/32bpp_anim.cpp
blitter/32bpp_anim.hpp
#if SSE
@@ -1110,7 +1110,10 @@ music/null_m.cpp
#else
#if DOS
#else
music/extmidi.cpp
#if MORPHOS
#else
music/extmidi.cpp
#end
#end
#end
#end

View File

@@ -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)

299
src/3rdparty/os2/getaddrinfo.c vendored Normal file
View File

@@ -0,0 +1,299 @@
/*
* This file is part of libESMTP, a library for submission of RFC 2822
* formatted electronic mail messages using the SMTP protocol described
* in RFC 2821.
*
* Copyright (C) 2001,2002 Brian Stafford <brian@stafford.uklinux.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* An emulation of the RFC 2553 / Posix getaddrinfo resolver interface.
*/
#if !HAVE_GETADDRINFO
/* Need to turn off Posix features in glibc to build this */
#undef _POSIX_C_SOURCE
#undef _XOPEN_SOURCE
#include "getaddrinfo.h"
//#include "compat/inet_pton.h"
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
static struct addrinfo *
dup_addrinfo (struct addrinfo *info, void *addr, size_t addrlen) {
struct addrinfo *ret;
ret = malloc (sizeof (struct addrinfo));
if (ret == NULL)
return NULL;
memcpy (ret, info, sizeof (struct addrinfo));
ret->ai_addr = malloc (addrlen);
if (ret->ai_addr == NULL) {
free (ret);
return NULL;
}
memcpy (ret->ai_addr, addr, addrlen);
ret->ai_addrlen = addrlen;
return ret;
}
int
getaddrinfo (const char *nodename, const char *servname,
const struct addrinfo *hints, struct addrinfo **res)
{
struct hostent *hp;
struct servent *servent;
const char *socktype;
int port;
struct addrinfo hint, result;
struct addrinfo *ai, *sai, *eai;
char **addrs;
if (servname == NULL && nodename == NULL)
return EAI_NONAME;
memset (&result, 0, sizeof result);
/* default for hints */
if (hints == NULL) {
memset (&hint, 0, sizeof hint);
hint.ai_family = PF_UNSPEC;
hints = &hint;
}
if (servname == NULL)
port = 0;
else {
/* check for tcp or udp sockets only */
if (hints->ai_socktype == SOCK_STREAM)
socktype = "tcp";
else if (hints->ai_socktype == SOCK_DGRAM)
socktype = "udp";
else
return EAI_SERVICE;
result.ai_socktype = hints->ai_socktype;
/* Note: maintain port in host byte order to make debugging easier */
if (isdigit (*servname))
port = strtol (servname, NULL, 10);
else if ((servent = getservbyname (servname, socktype)) != NULL)
port = ntohs (servent->s_port);
else
return EAI_NONAME;
}
/* if nodename == NULL refer to the local host for a client or any
for a server */
if (nodename == NULL) {
struct sockaddr_in sin;
/* check protocol family is PF_UNSPEC or PF_INET - could try harder
for IPv6 but that's more code than I'm prepared to write */
if (hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET)
result.ai_family = AF_INET;
else
return EAI_FAMILY;
sin.sin_family = result.ai_family;
sin.sin_port = htons (port);
if (hints->ai_flags & AI_PASSIVE)
sin.sin_addr.s_addr = htonl (INADDR_ANY);
else
sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
/* Duplicate result and addr and return */
*res = dup_addrinfo (&result, &sin, sizeof sin);
return (*res == NULL) ? EAI_MEMORY : 0;
}
/* If AI_NUMERIC is specified, use inet_pton to translate numbers and
dots notation. */
if (hints->ai_flags & AI_NUMERICHOST) {
struct sockaddr_in sin;
/* check protocol family is PF_UNSPEC or PF_INET */
if (hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET)
result.ai_family = AF_INET;
else
return EAI_FAMILY;
sin.sin_family = result.ai_family;
sin.sin_port = htons (port);
if (inet_pton(result.ai_family, nodename, &sin.sin_addr)==0)
return EAI_NONAME;
sin.sin_addr.s_addr = inet_addr (nodename);
/* Duplicate result and addr and return */
*res = dup_addrinfo (&result, &sin, sizeof sin);
return (*res == NULL) ? EAI_MEMORY : 0;
}
#if HAVE_H_ERRNO
h_errno = 0;
#endif
errno = 0;
hp = gethostbyname(nodename);
if (hp == NULL) {
#ifdef EAI_SYSTEM
if (errno != 0) {
return EAI_SYSTEM;
}
#endif
switch (h_errno) {
case HOST_NOT_FOUND:
return EAI_NODATA;
case NO_DATA:
return EAI_NODATA;
#if defined(NO_ADDRESS) && NO_ADDRESS != NO_DATA
case NO_ADDRESS:
return EAI_NODATA;
#endif
case NO_RECOVERY:
return EAI_FAIL;
case TRY_AGAIN:
return EAI_AGAIN;
default:
return EAI_FAIL;
}
return EAI_FAIL;
}
/* Check that the address family is acceptable.
*/
switch (hp->h_addrtype) {
case AF_INET:
if (!(hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET))
return EAI_FAMILY;
break;
#ifndef __OS2__
case AF_INET6:
if (!(hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET6))
return EAI_FAMILY;
break;
#endif
default:
return EAI_FAMILY;
}
/* For each element pointed to by hp, create an element in the
result linked list. */
sai = eai = NULL;
for (addrs = hp->h_addr_list; *addrs != NULL; addrs++) {
struct sockaddr sa;
size_t addrlen;
if (hp->h_length < 1)
continue;
sa.sa_family = hp->h_addrtype;
switch (hp->h_addrtype) {
case AF_INET:
((struct sockaddr_in *) &sa)->sin_port = htons (port);
memcpy (&((struct sockaddr_in *) &sa)->sin_addr,
*addrs, hp->h_length);
addrlen = sizeof (struct sockaddr_in);
break;
#ifndef __OS2__
case AF_INET6:
#if SIN6_LEN
((struct sockaddr_in6 *) &sa)->sin6_len = hp->h_length;
#endif
((struct sockaddr_in6 *) &sa)->sin6_port = htons (port);
memcpy (&((struct sockaddr_in6 *) &sa)->sin6_addr,
*addrs, hp->h_length);
addrlen = sizeof (struct sockaddr_in6);
break;
#endif
default:
continue;
}
result.ai_family = hp->h_addrtype;
ai = dup_addrinfo (&result, &sa, addrlen);
if (ai == NULL) {
freeaddrinfo (sai);
return EAI_MEMORY;
}
if (sai == NULL)
sai = ai;
else
eai->ai_next = ai;
eai = ai;
}
if (sai == NULL) {
return EAI_NODATA;
}
if (hints->ai_flags & AI_CANONNAME) {
sai->ai_canonname = malloc (strlen (hp->h_name) + 1);
if (sai->ai_canonname == NULL) {
freeaddrinfo (sai);
return EAI_MEMORY;
}
strcpy (sai->ai_canonname, hp->h_name);
}
*res = sai;
return 0;
}
void
freeaddrinfo (struct addrinfo *ai)
{
struct addrinfo *next;
while (ai != NULL) {
next = ai->ai_next;
if (ai->ai_canonname != NULL)
free (ai->ai_canonname);
if (ai->ai_addr != NULL)
free (ai->ai_addr);
free (ai);
ai = next;
}
}
const char *
gai_strerror (int ecode)
{
static const char *eai_descr[] = {
"no error",
"address family for nodename not supported", /* EAI_ADDRFAMILY */
"temporary failure in name resolution", /* EAI_AGAIN */
"invalid value for ai_flags", /* EAI_BADFLAGS */
"non-recoverable failure in name resolution", /* EAI_FAIL */
"ai_family not supported", /* EAI_FAMILY */
"memory allocation failure", /* EAI_MEMORY */
"no address associated with nodename", /* EAI_NODATA */
"nodename nor servname provided, or not known", /* EAI_NONAME */
"servname not supported for ai_socktype", /* EAI_SERVICE */
"ai_socktype not supported", /* EAI_SOCKTYPE */
"system error returned in errno", /* EAI_SYSTEM */
"argument buffer overflow", /* EAI_OVERFLOW */
};
if (ecode < 0 || ecode > (int) (sizeof eai_descr/ sizeof eai_descr[0]))
return "unknown error";
return eai_descr[ecode];
}
#endif /* HAVE_GETADDRINFO */

101
src/3rdparty/os2/getaddrinfo.h vendored Normal file
View File

@@ -0,0 +1,101 @@
#ifndef _getaddrinfo_h
#define _getaddrinfo_h
/*
* Shamelessly duplicated from the fetchmail public sources
* for use by the Squid Project under GNU Public License.
*
* Update/Maintenance History:
*
* 15-Aug-2007 : Copied from fetchmail 6.3.8
* - added protection around libray headers
*
* 16-Aug-2007 : Altered configure checks
* Un-hacked slightly to use system gethostbyname()
*
* Original License and code follows.
*/
/*
* This file is part of libESMTP, a library for submission of RFC 2822
* formatted electronic mail messages using the SMTP protocol described
* in RFC 2821.
*
* Copyright (C) 2001,2002 Brian Stafford <brian@stafford.uklinux.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Structure and prototypes taken from RFC 2553 */
/* SG 23/09/2007:
On Windows the following definitions are already available, may be that
this could be needed on some other platform */
typedef int socklen_t;
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
int ai_family; /* PF_xxx */
int ai_socktype; /* SOCK_xxx */
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
socklen_t ai_addrlen; /* length of ai_addr */
char *ai_canonname; /* canonical name for nodename */
struct sockaddr *ai_addr; /* binary address */
struct addrinfo *ai_next; /* next structure in linked list */
};
/* Supposed to be defined in <netdb.h> */
#define AI_ADDRCONFIG 0
#define AI_PASSIVE 1 /* Socket address is intended for `bind'. */
#define AI_CANONNAME 2 /* Request for canonical name. */
#define AI_NUMERICHOST 4 /* Don't use name resolution. */
/* Supposed to be defined in <netdb.h> */
#define EAI_ADDRFAMILY 1 /* address family for nodename not supported */
#define EAI_AGAIN 2 /* temporary failure in name resolution */
#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
#define EAI_FAMILY 5 /* ai_family not supported */
#define EAI_MEMORY 6 /* memory allocation failure */
#define EAI_NODATA 7 /* no address associated with nodename */
#define EAI_NONAME 8 /* nodename nor servname provided, or not known */
#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
#ifndef EAI_SYSTEM
/* Not defined on mingw32. */
#define EAI_SYSTEM 11 /* System error returned in `errno'. */
#endif
#ifndef EAI_OVERFLOW
/* Not defined on mingw32. */
#define EAI_OVERFLOW 12 /* Argument buffer overflow. */
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* RFC 2553 / Posix resolver */
int getaddrinfo (const char *nodename, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
/* Free addrinfo structure and associated storage */
void freeaddrinfo (struct addrinfo *ai);
/* Convert error return from getaddrinfo() to string */
const char *gai_strerror (int code);
#ifdef __cplusplus
}
#endif
#endif /* _getaddrinfo_h */

367
src/3rdparty/os2/getnameinfo.c vendored Normal file
View File

@@ -0,0 +1,367 @@
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* Issues to be discussed:
* - RFC2553 says that we should raise error on short buffer. X/Open says
* we need to truncate the result. We obey RFC2553 (and X/Open should be
* modified). ipngwg rough consensus seems to follow RFC2553. RFC3493 says
* nothing about it, but defines a new error code EAI_OVERFLOW which seems
* to be intended the code for this case.
* - What is "local" in NI_NOFQDN? (see comments in the code)
* - NI_NAMEREQD and NI_NUMERICHOST conflict with each other.
* - (KAME extension) always attach textual scopeid (fe80::1%lo0), if
* sin6_scope_id is filled - standardization status?
* - what should we do if we should do getservbyport("sctp")?
*/
/*
* Considerations about thread-safeness
* The code in this file is thread-safe, and so the thread-safeness of
* getnameinfo() depends on the property of backend functions.
* - getservbyport() is not thread safe for most systems we are targeting.
* - getipnodebyaddr() is thread safe. However, many resolver libraries
* used in the function are not thread safe.
* - gethostbyaddr() is usually not thread safe.
*/
#if !HAVE_GETNAMEINFO
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <resolv.h>
#include <string.h>
#include <stddef.h>
#include <errno.h>
#include <inttypes.h>
#include "getaddrinfo.h"
#include "getnameinfo.h"
static const struct afd {
int a_af;
int a_addrlen;
int a_socklen;
int a_off;
int a_portoff;
} afdl [] = {
#if INET6
{PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6),
offsetof(struct sockaddr_in6, sin6_addr),
offsetof(struct sockaddr_in6, sin6_port)},
#endif
{PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in),
offsetof(struct sockaddr_in, sin_addr),
offsetof(struct sockaddr_in, sin_port)},
{0, 0, 0, 0, 0},
};
#if INET6
static int ip6_parsenumeric __P((const struct sockaddr *, const char *, char *,
size_t, int));
static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int));
#endif
int
getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
const struct sockaddr *sa;
socklen_t salen;
char *host;
size_t hostlen;
char *serv;
size_t servlen;
int flags;
{
const struct afd *afd;
struct servent *sp;
struct hostent *hp;
unsigned short port;
int family, i;
const char *addr;
uint32_t v4a;
char numserv[512];
if (sa == NULL)
return EAI_FAIL;
#if HAVE_SA_LEN /*XXX*/
if (sa->sa_len != salen)
return EAI_FAIL;
#endif
family = sa->sa_family;
for (i = 0; afdl[i].a_af; i++)
if (afdl[i].a_af == family) {
afd = &afdl[i];
goto found;
}
return EAI_FAMILY;
found:
if (salen != afd->a_socklen)
return EAI_FAIL;
/* network byte order */
memcpy(&port, (const char *)sa + afd->a_portoff, sizeof(port));
addr = (const char *)sa + afd->a_off;
if (serv == NULL || servlen == 0) {
/*
* do nothing in this case.
* in case you are wondering if "&&" is more correct than
* "||" here: RFC3493 says that serv == NULL OR servlen == 0
* means that the caller does not want the result.
*/
} else {
if (flags & NI_NUMERICSERV)
sp = NULL;
else {
sp = getservbyport(port,
(flags & NI_DGRAM) ? "udp" : "tcp");
}
if (sp) {
if (strlen(sp->s_name) + 1 > servlen)
return EAI_OVERFLOW;
strncpy(serv, sp->s_name, servlen);
} else {
snprintf(numserv, sizeof(numserv), "%u", ntohs(port));
if (strlen(numserv) + 1 > servlen)
return EAI_OVERFLOW;
strncpy(serv, numserv, servlen);
}
}
switch (sa->sa_family) {
case AF_INET:
v4a = (uint32_t)
ntohl(((const struct sockaddr_in *)sa)->sin_addr.s_addr);
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
flags |= NI_NUMERICHOST;
v4a >>= IN_CLASSA_NSHIFT;
if (v4a == 0)
flags |= NI_NUMERICHOST;
break;
#if INET6
case AF_INET6: {
const struct sockaddr_in6 *sin6;
sin6 = (const struct sockaddr_in6 *)sa;
switch (sin6->sin6_addr.s6_addr[0]) {
case 0x00:
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
;
else if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
;
else
flags |= NI_NUMERICHOST;
break;
default:
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
flags |= NI_NUMERICHOST;
else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
flags |= NI_NUMERICHOST;
break;
}
}
break;
#endif
}
if (host == NULL || hostlen == 0) {
/*
* do nothing in this case.
* in case you are wondering if "&&" is more correct than
* "||" here: RFC3493 says that host == NULL or hostlen == 0
* means that the caller does not want the result.
*/
} else if (flags & NI_NUMERICHOST) {
/* NUMERICHOST and NAMEREQD conflicts with each other */
if (flags & NI_NAMEREQD)
return EAI_NONAME;
goto numeric;
} else {
#if USE_GETIPNODEBY
int h_error = 0;
hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
#else
hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
#if 0 // getnameinfo.c:161:9: error: variable 'h_error' set but not used
#if HAVE_H_ERRNO
h_error = h_errno;
#else
h_error = EINVAL;
#endif
#endif /* 0 */
#endif
if (hp) {
#if 0
if (flags & NI_NOFQDN) {
/*
* According to RFC3493 section 6.2, NI_NOFQDN
* means "node name portion of the FQDN shall
* be returned for local hosts." The following
* code tries to implement it by returning the
* first label (the part before the first
* period) of the FQDN. However, it is not
* clear if this always makes sense, since the
* given address may be outside of "local
* hosts." Due to the unclear description, we
* disable the code in this implementation.
*/
char *p;
p = strchr(hp->h_name, '.');
if (p)
*p = '\0';
}
#endif
if (strlen(hp->h_name) + 1 > hostlen) {
#if USE_GETIPNODEBY
freehostent(hp);
#endif
return EAI_OVERFLOW;
}
strncpy(host, hp->h_name, hostlen);
#if USE_GETIPNODEBY
freehostent(hp);
#endif
} else {
if (flags & NI_NAMEREQD)
return EAI_NONAME;
numeric:
switch (afd->a_af) {
#if INET6
case AF_INET6: {
int error;
if ((error = ip6_parsenumeric(sa, addr, host,
hostlen,
flags)) != 0)
return(error);
break;
}
#endif
default:
if (inet_ntop(afd->a_af, addr, host,
hostlen) == NULL)
return EAI_SYSTEM;
break;
}
}
}
return(0);
}
#if INET6
static int
ip6_parsenumeric(sa, addr, host, hostlen, flags)
const struct sockaddr *sa;
const char *addr;
char *host;
size_t hostlen;
int flags;
{
int numaddrlen;
char numaddr[512];
if (inet_ntop(AF_INET6, addr, numaddr, sizeof(numaddr)) == NULL)
return EAI_SYSTEM;
numaddrlen = strlen(numaddr);
if (numaddrlen + 1 > hostlen) /* don't forget terminator */
return EAI_OVERFLOW;
strncpy(host, numaddr, hostlen);
if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
char zonebuf[SQUIDHOSTNAMELEN];
int zonelen;
zonelen = ip6_sa2str(
(const struct sockaddr_in6 *)(const void *)sa,
zonebuf, sizeof(zonebuf), flags);
if (zonelen < 0)
return EAI_OVERFLOW;
if (zonelen + 1 + numaddrlen + 1 > hostlen)
return EAI_OVERFLOW;
/* construct <numeric-addr><delim><zoneid> */
memcpy(host + numaddrlen + 1, zonebuf,
(size_t)zonelen);
host[numaddrlen] = SCOPE_DELIMITER;
host[numaddrlen + 1 + zonelen] = '\0';
}
return 0;
}
/* ARGSUSED */
static int
ip6_sa2str(sa6, buf, bufsiz, flags)
const struct sockaddr_in6 *sa6;
char *buf;
size_t bufsiz;
int flags;
{
unsigned int ifindex;
const struct in6_addr *a6;
int n;
ifindex = (unsigned int)sa6->sin6_scope_id;
a6 = &sa6->sin6_addr;
#if NI_NUMERICSCOPE
if ((flags & NI_NUMERICSCOPE) != 0) {
n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id);
if (n < 0 || n >= bufsiz)
return -1;
else
return n;
}
#endif
/* if_indextoname() does not take buffer size. not a good api... */
if ((IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6) ||
IN6_IS_ADDR_MC_NODELOCAL(a6)) && bufsiz >= IF_NAMESIZE) {
char *p = if_indextoname(ifindex, buf);
if (p)
return (strlen(p));
}
/* last resort */
n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id);
if (n < 0 || n >= bufsiz)
return -1;
else
return n;
}
#endif /* INET6 */
#endif

29
src/3rdparty/os2/getnameinfo.h vendored Normal file
View File

@@ -0,0 +1,29 @@
#ifndef _getnameinfo_h
#define _getnameinfo_h
/*
* Reconstructed from KAME getnameinfo.c (in lib/)
*/
/* getnameinfo flags */
#define NI_NOFQDN 0x0001
#define NI_NUMERICHOST 0x0002 /* return numeric form of address */
#define NI_NAMEREQD 0x0004 /* request DNS name */
#define NI_NUMERICSERV 0x0008
#define NI_DGRAM 0x0010
#ifdef __cplusplus
extern "C" {
#endif
/* RFC 2553 / Posix resolver */
int getnameinfo(const struct sockaddr *sa,
socklen_t salen,
char *host,
size_t hostlen,
char *serv,
size_t servlen,
int flags );
#ifdef __cplusplus
}
#endif
#endif /* _getnameinfo_h */

View File

@@ -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_ */

View File

@@ -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_*/

View File

@@ -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_*/

View File

@@ -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_*/

View File

@@ -1,8 +1,11 @@
/* see copyright notice in squirrel.h */
#include "../../../stdafx.h"
#include <squirrel.h>
#include <sqstdaux.h>
#include <assert.h>
#include <string.h>
#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);
}
}

View File

@@ -1,9 +1,13 @@
/* see copyright notice in squirrel.h */
#include "../../../stdafx.h"
#include <squirrel.h>
#include <math.h>
#include <stdlib.h>
#include <sqstdmath.h>
#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;

View File

@@ -1,7 +1,5 @@
/* see copyright notice in squirrel.h */
#include <squirrel.h>
#include <string.h>
#include <ctype.h>
#include <exception>
#include "sqstdstring.h"
@@ -12,14 +10,13 @@
#endif
#ifdef _DEBUG
#include <stdio.h>
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)

View File

@@ -1,22 +1,11 @@
/* see copyright notice in squirrel.h */
#include <squirrel.h>
#include <sqstdstring.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <stdarg.h>
#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) {

View File

@@ -1,6 +1,9 @@
/*
see copyright notice in squirrel.h
*/
* see copyright notice in squirrel.h
*/
#include "../../../stdafx.h"
#include <squirrel.h>
#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))

View File

@@ -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 <algorithm>
#include "sqpcheader.h"
#include "sqvm.h"
@@ -12,21 +17,22 @@
#include "sqfuncproto.h"
#include "sqclosure.h"
#include "sqclass.h"
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#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;i<len;i++) sNew[i]=func(sThis[i]); \
v->Push(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}
};

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -1,6 +1,9 @@
/*
see copyright notice in squirrel.h
*/
* see copyright notice in squirrel.h
*/
#include "../../../stdafx.h"
#include <squirrel.h>
#include "sqpcheader.h"
#include <stdarg.h>
@@ -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<ExpState> 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);
scvsnprintf(temp, sizeof(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 <local>)"));
else Error("cannot create a class in a local with the syntax(class <local>)");
}
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;

View File

@@ -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_

View File

@@ -1,14 +1,21 @@
/*
see copyright notice in squirrel.h
*/
* see copyright notice in squirrel.h
*/
#include "../../../stdafx.h"
#include <squirrel.h>
#include "sqpcheader.h"
#include <stdarg.h>
#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<char>(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));
}

View File

@@ -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<SQLineInfo> 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(){

View File

@@ -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<templiterals.size();i++){
scprintf(_SC("[%d] "),n);
printf("[%d] ",n);
DumpLiteral(templiterals[i]);
scprintf(_SC("\n"));
printf("\n");
n++;
}
scprintf(_SC("-----PARAMS\n"));
printf("-----PARAMS\n");
if(_varparams)
scprintf(_SC("<<VARPARAMS>>\n"));
printf("<<VARPARAMS>>\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<func->_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;

View File

@@ -1,30 +1,41 @@
/*
see copyright notice in squirrel.h
*/
* see copyright notice in squirrel.h
*/
#include "../../../stdafx.h"
#include "sqpcheader.h"
#include <ctype.h>
#include <stdlib.h>
#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) {

View File

@@ -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<SQChar> _longstr;
CompilerErrorFunc _errfunc;

View File

@@ -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<char>((size_t)size); }
void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return ReallocT<char>(static_cast<char*>(p), (size_t)size); }
void sq_vm_free(void *p, SQUnsignedInteger size){ free(p); }

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -6,10 +6,6 @@
#include <crtdbg.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <new>
//squirrel stuff
#include <squirrel.h>

View File

@@ -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;

View File

@@ -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_;

View File

@@ -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 );

View File

@@ -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;

View File

@@ -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"

View File

@@ -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

View File

@@ -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_

View File

@@ -1,10 +1,12 @@
/*
see copyright notice in squirrel.h
*/
* see copyright notice in squirrel.h
*/
#include "../../../stdafx.h"
#include <squirrel.h>
#include "sqpcheader.h"
#include <math.h>
#include <stdlib.h>
#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<ci->_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<size;i++){
SQObjectPtr &obj=_stack[i];
if(stackbase==i)scprintf(_SC(">"));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;
}
}

View File

@@ -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;\
}\

View File

@@ -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;

View File

@@ -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;

View File

@@ -40,11 +40,12 @@
#include "../game/game_info.hpp"
#include "../game/game_instance.hpp"
#include "table/strings.h"
#include <vector>
#include "../safeguards.h"
static ScriptConfig *GetConfig(CompanyID slot)
{
if (slot == OWNER_DEITY) return GameConfig::GetConfig();
@@ -107,7 +108,7 @@ struct AIListWindow : public Window {
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
if (widget == WID_AIL_LIST) {
this->line_height = GetMinSizing(NWST_STEP, FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM);
this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
resize->width = 1;
resize->height = this->line_height;
@@ -120,16 +121,16 @@ struct AIListWindow : public Window {
switch (widget) {
case WID_AIL_LIST: {
/* Draw a list of all available AIs. */
int y = Center(r.top, this->line_height);
int y = this->GetWidget<NWidgetBase>(WID_AIL_LIST)->pos_y;
/* First AI in the list is hardcoded to random */
if (this->vscroll->IsVisible(0)) {
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE);
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE);
y += this->line_height;
}
ScriptInfoList::const_iterator it = this->info_list->begin();
for (int i = 1; it != this->info_list->end(); i++, it++) {
if (this->vscroll->IsVisible(i)) {
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y, (*it).second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE);
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, (*it).second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE);
y += this->line_height;
}
}
@@ -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 = GetMinSizing(NWST_STEP, 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;
@@ -367,8 +368,10 @@ struct AISettingsWindow : public Window {
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : SETTING_BUTTON_WIDTH + 8);
uint text_right = r.right - (rtl ? SETTING_BUTTON_WIDTH + 8 : WD_FRAMERECT_RIGHT);
int y = r.top;
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
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);
@@ -410,7 +413,7 @@ struct AISettingsWindow : public Window {
}
}
DrawString(text_left, text_right, Center(y, this->line_height), str, colour);
DrawString(text_left, text_right, y + text_y_offset, str, colour);
y += this->line_height;
}
}
@@ -658,41 +661,39 @@ static const NWidgetPart _nested_ai_config_widgets[] = {
NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND),
NWidget(NWID_HORIZONTAL), SetPIP(7, 7, 7),
NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_AI, STR_NULL), SetPadding(0, 5, 0, 5),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_LIST), SetMinimalSize(288, 112), SetFill(1, 0), SetMatrixDataTip(1, 8, STR_AI_CONFIG_AILIST_TOOLTIP), SetScrollbar(WID_AIC_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIC_SCROLLBAR),
EndContainer(),
NWidget(NWID_VERTICAL), SetPIP(4, 4, 4),
NWidget(NWID_HORIZONTAL), SetPIP(7, 0, 7),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetFill(0, 1), SetDataTip(AWV_DECREASE, STR_NULL),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetFill(0, 1), SetDataTip(AWV_INCREASE, STR_NULL),
NWidget(NWID_SPACER), SetMinimalSize(6, 0),
NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS, STR_NULL), SetFill(1, 0), SetPadding(1, 0, 0, 0),
EndContainer(),
NWidget(NWID_VERTICAL), SetPIP(4, 4, 4),
NWidget(NWID_HORIZONTAL), SetPIP(7, 0, 7),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetFill(0, 1), SetDataTip(AWV_DECREASE, STR_NULL),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetFill(0, 1), SetDataTip(AWV_INCREASE, STR_NULL),
NWidget(NWID_SPACER), SetMinimalSize(6, 0),
NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS, STR_NULL), SetFill(1, 0), SetPadding(1, 0, 0, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_DOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_DOWN, STR_AI_CONFIG_MOVE_DOWN_TOOLTIP),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 9),
NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetPadding(0, 5, 4, 5),
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_GAMELIST), SetSizingType(NWST_STEP), SetMinimalSize(288, 14), SetFill(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_CONFIG_CHANGE, STR_AI_CONFIG_CHANGE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL),
EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 0), SetMinimalSize(279, 12), SetPadding(0, 7, 9, 7), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_DOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_DOWN, STR_AI_CONFIG_MOVE_DOWN_TOOLTIP),
EndContainer(),
EndContainer(),
NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_AI, STR_NULL), SetPadding(0, 5, 0, 5),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_LIST), SetMinimalSize(288, 112), SetFill(1, 0), SetMatrixDataTip(1, 8, STR_AI_CONFIG_AILIST_TOOLTIP), SetScrollbar(WID_AIC_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIC_SCROLLBAR),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 9),
NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetPadding(0, 5, 4, 5),
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_GAMELIST), SetMinimalSize(288, 14), SetFill(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_CONFIG_CHANGE, STR_AI_CONFIG_CHANGE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL),
EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 0), SetMinimalSize(279, 12), SetPadding(0, 7, 9, 7), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
EndContainer(),
};
@@ -757,12 +758,12 @@ struct AIConfigWindow : public Window {
{
switch (widget) {
case WID_AIC_GAMELIST:
this->line_height = GetMinSizing(NWST_STEP, FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM);
size->height = this->line_height;
this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
size->height = 1 * this->line_height;
break;
case WID_AIC_LIST:
this->line_height = GetMinSizing(NWST_STEP, FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM);
this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
size->height = 8 * this->line_height;
break;
}
@@ -800,14 +801,14 @@ struct AIConfigWindow : public Window {
text = STR_JUST_RAW_STRING;
}
DrawString(r.left + 10, r.right - 10, Center(r.top, this->line_height), text,
DrawString(r.left + 10, r.right - 10, r.top + WD_MATRIX_TOP, text,
(this->selected_slot == OWNER_DEITY) ? TC_WHITE : (IsEditable(OWNER_DEITY) ? TC_ORANGE : TC_SILVER));
break;
}
case WID_AIC_LIST: {
int y = Center(r.top, this->line_height);
int y = r.top;
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < MAX_COMPANIES; i++) {
StringID text;
@@ -819,7 +820,7 @@ struct AIConfigWindow : public Window {
} else {
text = STR_AI_CONFIG_RANDOM_AI;
}
DrawString(r.left + 10, r.right - 10, y, text,
DrawString(r.left + 10, r.right - 10, y + WD_MATRIX_TOP, text,
(this->selected_slot == i) ? TC_WHITE : (IsEditable((CompanyID)i) ? TC_ORANGE : TC_SILVER));
y += this->line_height;
}
@@ -969,7 +970,7 @@ struct AIDebugWindow : public Window {
static const int top_offset; ///< Offset of the text at the top of the WID_AID_LOG_PANEL.
static const int bottom_offset; ///< Offset of the text at the bottom of the WID_AID_LOG_PANEL.
static const unsigned int MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string.
static const uint MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string.
static CompanyID ai_debug_company; ///< The AI that is (was last) being debugged.
int redraw_timer; ///< Timer for redrawing the window, otherwise it'll happen every tick.
@@ -1073,7 +1074,7 @@ struct AIDebugWindow : public Window {
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
if (widget == WID_AID_LOG_PANEL) {
resize->height = GetMinSizing(NWST_STEP, FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL);
resize->height = FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
size->height = 14 * resize->height + this->top_offset + this->bottom_offset;
}
}
@@ -1089,8 +1090,6 @@ struct AIDebugWindow : public Window {
bool dirty = false;
Dimension d = GetSpriteSize(SPR_COMPANY_ICON);
uint offset_y = Center(0, GetMinSizing(NWST_STEP, d.height + WD_MATRIX_TOP + WD_MATRIX_BOTTOM + 1), d.height);
/* Paint the company icons */
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
NWidgetCore *button = this->GetWidget<NWidgetCore>(i + WID_AID_COMPANY_BUTTON_START);
@@ -1111,7 +1110,7 @@ struct AIDebugWindow : public Window {
if (!valid) continue;
byte offset = (i == ai_debug_company) ? 1 : 0;
DrawCompanyIcon(i, Center(button->pos_x + offset, button->current_x, d.width), button->pos_y + offset + offset_y);
DrawCompanyIcon(i, button->pos_x + button->current_x / 2 - 7 + offset, this->GetWidget<NWidgetBase>(WID_AID_COMPANY_BUTTON_START + i)->pos_y + 2 + offset);
}
/* Set button colour for Game Script. */
@@ -1190,7 +1189,7 @@ struct AIDebugWindow : public Window {
ScriptLog::LogData *log = this->GetLogPointer();
if (log == NULL) return;
int y = Center(this->top_offset, this->resize.step_height);
int y = this->top_offset;
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) {
int pos = (i + log->pos + 1 - log->used + log->count) % log->count;
if (log->lines[pos] == NULL) break;

View File

@@ -15,8 +15,11 @@
#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.
@@ -62,15 +65,15 @@ template <> const char *GetClassName<AIInfo, ST_AI>() { 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")) {
@@ -92,7 +95,7 @@ template <> const char *GetClassName<AIInfo, ST_AI>() { 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() */
@@ -115,7 +118,7 @@ template <> const char *GetClassName<AIInfo, ST_AI>() { 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);

View File

@@ -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);

View File

@@ -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<AIInfo *>(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<AILibrary *>(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 */

View File

@@ -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"; }

View File

@@ -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 <class T>
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<Aircraft, VEH_AIRCRAFT> {
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;

View File

@@ -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 <class T>
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;
}

View File

@@ -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);
}
}

View File

@@ -15,6 +15,8 @@
#include "table/airport_movement.h"
#include "table/airporttile_ids.h"
#include "safeguards.h"
/**
* Define a generic airport.

View File

@@ -28,10 +28,11 @@
#include "hotkeys.h"
#include "vehicle_func.h"
#include "gui.h"
#include "command_func.h"
#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
@@ -78,10 +79,21 @@ struct BuildAirToolbarWindow : Window {
~BuildAirToolbarWindow()
{
if (_thd.GetCallbackWnd() == this) this->OnPlaceObjectAbort();
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) {
@@ -101,14 +113,13 @@ struct BuildAirToolbarWindow : Window {
}
}
virtual void OnPlaceObject(Point pt, TileIndex tile)
{
switch (this->last_user_action) {
case WID_AT_AIRPORT: {
VpStartPlaceSizing(tile, VPM_SINGLE_TILE, DDSP_BUILD_STATION);
MoveAllWindowsOffScreen();
case WID_AT_AIRPORT:
PlaceAirport(tile);
break;
}
case WID_AT_DEMOLISH:
PlaceProc_DemolishArea(tile);
@@ -125,17 +136,8 @@ struct BuildAirToolbarWindow : Window {
virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
{
if (pt.x == -1) return;
switch (select_proc) {
case DDSP_BUILD_STATION:
assert(start_tile == end_tile);
MoveAllHiddenWindowsBackToScreen();
PlaceAirport(end_tile);
break;
case DDSP_DEMOLISH_AREA:
GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
break;
default: NOT_REACHED();
if (pt.x != -1 && select_proc == DDSP_DEMOLISH_AREA) {
GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
}
}
@@ -145,7 +147,6 @@ struct BuildAirToolbarWindow : Window {
DeleteWindowById(WC_BUILD_STATION, TRANSPORT_AIR);
DeleteWindowById(WC_SELECT_STATION, 0);
ResetObjectToPlace();
}
static HotkeyList hotkeys;
@@ -203,7 +204,7 @@ Window *ShowBuildAirToolbar()
{
if (!Company::IsValidID(_local_company)) return NULL;
DeleteToolbarLinkedWindows();
DeleteWindowByClass(WC_BUILD_TOOLBAR);
return AllocateWindowDescFront<BuildAirToolbarWindow>(&_air_toolbar_desc, TRANSPORT_AIR);
}
@@ -304,7 +305,6 @@ public:
d.width += padding.width;
d.height += padding.height;
*size = maxdim(*size, d);
size->height = GetMinSizing(NWST_STEP, size->height);
break;
}
@@ -316,7 +316,7 @@ public:
size->width = max(size->width, GetStringBoundingBox(as->name).width);
}
this->line_height = GetMinSizing(NWST_STEP, FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM);
this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
size->height = 5 * this->line_height;
break;
}
@@ -368,9 +368,7 @@ public:
if (!as->IsAvailable()) {
GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->line_height - 2, PC_BLACK, FILLRECT_CHECKER);
}
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, Center(y, this->line_height), as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK);
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK);
y += this->line_height;
}
break;
@@ -427,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);
}
}
@@ -556,41 +554,35 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_AIRPORT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
NWidget(NWID_HORIZONTAL),
/* Airport dropdown selector and picture. */
NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(1, 0), SetPIP(2, 0, 2),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetSizingType(NWST_STEP), SetDataTip(STR_STATION_BUILD_AIRPORT_CLASS_LABEL, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_AP_CLASS_DROPDOWN), SetFill(1, 0), SetDataTip(STR_BLACK_STRING, STR_STATION_BUILD_AIRPORT_TOOLTIP),
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_AIRPORT_SPRITE), SetFill(1, 0),
NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(1, 0), SetPIP(2, 0, 2),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_AIRPORT_CLASS_LABEL, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_AP_CLASS_DROPDOWN), SetFill(1, 0), SetDataTip(STR_BLACK_STRING, STR_STATION_BUILD_AIRPORT_TOOLTIP),
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_AIRPORT_SPRITE), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_AP_AIRPORT_LIST), SetFill(1, 0), SetMatrixDataTip(1, 5, STR_STATION_BUILD_AIRPORT_TOOLTIP), SetScrollbar(WID_AP_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_AP_SCROLLBAR),
EndContainer(),
/* Airport parameters and info. */
NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(1, 0), SetPIP(2, 0, 2),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_AP_AIRPORT_LIST), SetFill(1, 0), SetMatrixDataTip(1, 5, STR_STATION_BUILD_AIRPORT_TOOLTIP), SetScrollbar(WID_AP_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_AP_SCROLLBAR),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_AP_LAYOUT_DECREASE), SetSizingType(NWST_STEP), SetMinimalSize(12, 0), SetDataTip(AWV_DECREASE, STR_NULL),
NWidget(WWT_LABEL, COLOUR_GREY, WID_AP_LAYOUT_NUM), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BLACK_STRING, STR_NULL),
NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_AP_LAYOUT_INCREASE), SetSizingType(NWST_STEP), SetMinimalSize(12, 0), SetDataTip(AWV_INCREASE, STR_NULL),
EndContainer(),
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_AP_LAYOUT_DECREASE), SetMinimalSize(12, 0), SetDataTip(AWV_DECREASE, STR_NULL),
NWidget(WWT_LABEL, COLOUR_GREY, WID_AP_LAYOUT_NUM), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BLACK_STRING, STR_NULL),
NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_AP_LAYOUT_INCREASE), SetMinimalSize(12, 0), SetDataTip(AWV_INCREASE, STR_NULL),
EndContainer(),
/* Bottom panel. */
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), SetPIP(2, 2, 2),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DONTHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DOHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0),
EndContainer(),
/* Bottom panel. */
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), SetPIP(2, 2, 2),
NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DONTHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DOHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), SetFill(1, 0),
NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), SetFill(1, 0),
EndContainer(),
};

View File

@@ -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. */

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