[colobot] 162/377: Moved standard math and file functions into CBot library
Didier Raboud
odyx at moszumanska.debian.org
Wed Mar 30 13:34:11 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit 51644369cbd3886132da70466202d1b7c99a499e
Author: krzys-h <krzys_h at interia.pl>
Date: Sun Dec 20 18:35:52 2015 +0100
Moved standard math and file functions into CBot library
---
po/colobot.pot | 18 +
po/de.po | 36 +-
po/fr.po | 36 +-
po/pl.po | 36 +-
po/ru.po | 36 +-
src/CBot/CBot.h | 5 +-
src/CBot/CBotDefines.h | 13 +-
src/CBot/CBotProgram.cpp | 17 +-
src/CBot/CMakeLists.txt | 5 +-
src/CBot/StringFunctions.h | 137 -----
src/CBot/stdlib/Compilation.cpp | 217 +++++++
src/CBot/stdlib/Compilation.h | 37 ++
src/CBot/stdlib/FileFunctions.cpp | 375 ++++++++++++
src/CBot/stdlib/MathFunctions.cpp | 189 ++++++
src/CBot/{ => stdlib}/StringFunctions.cpp | 140 +----
src/CBot/stdlib/stdlib.h | 7 +
src/CBot/stdlib/stdlib_public.h | 34 ++
src/common/restext.cpp | 6 +
src/level/robotmain.cpp | 2 +-
src/script/scriptfunc.cpp | 933 ++++++------------------------
src/script/scriptfunc.h | 47 +-
21 files changed, 1171 insertions(+), 1155 deletions(-)
diff --git a/po/colobot.pot b/po/colobot.pot
index 453930a..28315a3 100644
--- a/po/colobot.pot
+++ b/po/colobot.pot
@@ -1712,6 +1712,9 @@ msgstr ""
msgid "Bad argument for \"new\""
msgstr ""
+msgid "\" [ \" expected"
+msgstr ""
+
msgid "String missing"
msgstr ""
@@ -1733,6 +1736,9 @@ msgstr ""
msgid "Negative value rejected by \"throw\""
msgstr ""
+msgid "The function returned no value "
+msgstr ""
+
msgid "No function running"
msgstr ""
@@ -1757,5 +1763,17 @@ msgstr ""
msgid "Illegal object"
msgstr ""
+msgid "Can't open file"
+msgstr ""
+
+msgid "File not open"
+msgstr ""
+
+msgid "Read error"
+msgstr ""
+
+msgid "Write error"
+msgstr ""
+
msgid "Button %1"
msgstr ""
diff --git a/po/de.po b/po/de.po
index ce9cf97..ad1ac8c 100644
--- a/po/de.po
+++ b/po/de.po
@@ -55,6 +55,9 @@ msgstr " Zusammenfassung:"
msgid " or "
msgstr " oder "
+msgid "\" [ \" expected"
+msgstr "Es fehlt eine offene eckige Klammer \" [ \""
+
msgid "\" ] \" missing"
msgstr "Es fehlt eine geschlossene eckige Klammer \" ] \""
@@ -352,6 +355,9 @@ msgstr "Das erforschte Objekt kann nicht produziert werden"
msgid "Can not produce this object in this mission"
msgstr "Das Objekt kann in dieser Mission nicht produziert werden"
+msgid "Can't open file"
+msgstr "Die Datei kann nicht geöffnet werden"
+
msgid "Cancel"
msgstr "Abbrechen"
@@ -548,6 +554,9 @@ msgstr "Brille:"
msgid "Face type:"
msgstr "Kopf:"
+msgid "File not open"
+msgstr "Die Datei wurde nicht geöffnet"
+
msgid "Filename:"
msgstr "Dateiname:"
@@ -1164,6 +1173,9 @@ msgstr "Mission verlassen\\Eine Mission oder Übung verlassen"
msgid "Radar station"
msgstr "Radar"
+msgid "Read error"
+msgstr "Fehler beim Lesezugriff"
+
msgid "Recorder"
msgstr "Recorder"
@@ -1460,6 +1472,9 @@ msgstr ""
msgid "The expression must return a boolean value"
msgstr "Der Ausdruck muss einen boolschen Wert ergeben"
+msgid "The function returned no value "
+msgstr "Die Funktion hat kein Ergebnis zurückgegeben"
+
msgid ""
"The mission is not accomplished yet (press \\key help; for more details)"
msgstr ""
@@ -1664,6 +1679,9 @@ msgstr "Wurm tödlich verwundet"
msgid "Wreckage"
msgstr "Roboterwrack"
+msgid "Write error"
+msgstr "Fehler beim Schreibzugriff"
+
msgid "Wrong type for the assignment"
msgstr "Der Ausdruck ergibt einen falschen Typ für die Zuweisung"
@@ -1799,9 +1817,6 @@ msgstr "www.epsitec.com"
#~ msgid " Missions on this level:"
#~ msgstr " Missionen des Userlevels:"
-#~ msgid "\" [ \" expected"
-#~ msgstr "Es fehlt eine offene eckige Klammer \" [ \""
-
#~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "3D-Geräusche\\Orten der Geräusche im Raum"
@@ -1814,9 +1829,6 @@ msgstr "www.epsitec.com"
#~ msgid "Can not create this; there are too many objects"
#~ msgstr "Kein neues Objekt kann erstellt werden (zu viele vorhanden)"
-#~ msgid "Can't open file"
-#~ msgstr "Die Datei kann nicht geöffnet werden"
-
#~ msgid "Cancel\\Keep current player name"
#~ msgstr "Abbrechen\\Behält den bisherigen Spieler bei"
@@ -1845,9 +1857,6 @@ msgstr "www.epsitec.com"
#~ msgid "Exit film\\Film at the exit of exercises"
#~ msgstr "Zurücksetzen \\Kleine Show beim Zurücksetzen in den Übungen"
-#~ msgid "File not open"
-#~ msgstr "Die Datei wurde nicht geöffnet"
-
#~ msgid "Friendly fire\\Your shooting can damage your own objects "
#~ msgstr "Eigenbeschuss\\Ihre Einheiten werden von Ihren Waffen beschädigt"
@@ -1887,9 +1896,6 @@ msgstr "www.epsitec.com"
#~ msgid "Quit\\Quit COLOBOT"
#~ msgstr "Schließen\\COLOBOT schließen"
-#~ msgid "Read error"
-#~ msgstr "Fehler beim Lesezugriff"
-
#~ msgid "Robbie\\Your assistant"
#~ msgstr "Robby\\Ihr Assistent"
@@ -1908,9 +1914,6 @@ msgstr "www.epsitec.com"
#~ msgid "Textures\\Quality of textures "
#~ msgstr "Qualität der Texturen\\Qualität der Anzeige"
-#~ msgid "The function returned no value "
-#~ msgstr "Die Funktion hat kein Ergebnis zurückgegeben"
-
#~ msgid ""
#~ "The list is only available if a \\l;radar station\\u object\\radar; is "
#~ "working.\n"
@@ -1919,9 +1922,6 @@ msgstr "www.epsitec.com"
#~ msgid "User\\User levels"
#~ msgstr "User\\Userlevels"
-#~ msgid "Write error"
-#~ msgstr "Fehler beim Schreibzugriff"
-
#~ msgid "\\Return to COLOBOT"
#~ msgstr "\\Zurück zu COLOBOT"
diff --git a/po/fr.po b/po/fr.po
index ed5d83d..6ed78e6 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -48,6 +48,9 @@ msgstr " Résumé :"
msgid " or "
msgstr " ou "
+msgid "\" [ \" expected"
+msgstr "\" [ \" attendu"
+
msgid "\" ] \" missing"
msgstr "\" ] \" attendu"
@@ -349,6 +352,9 @@ msgstr "Impossible de créer un objet n'ayant pas été recherché"
msgid "Can not produce this object in this mission"
msgstr "Impossible de créer cet objet dans cette mission"
+msgid "Can't open file"
+msgstr "Ouverture du fichier impossible"
+
msgid "Cancel"
msgstr "Annuler"
@@ -543,6 +549,9 @@ msgstr "Lunettes :"
msgid "Face type:"
msgstr "Type de visage :"
+msgid "File not open"
+msgstr "Le fichier n'est pas ouvert"
+
msgid "Filename:"
msgstr "Nom du fichier :"
@@ -1155,6 +1164,9 @@ msgstr "Quitter la mission en cours\\Terminer un exercice ou une mssion"
msgid "Radar station"
msgstr "Radar"
+msgid "Read error"
+msgstr "Erreur à la lecture"
+
msgid "Recorder"
msgstr "Enregistreur"
@@ -1445,6 +1457,9 @@ msgstr "Textures"
msgid "The expression must return a boolean value"
msgstr "L'expression doit ętre un boolean"
+msgid "The function returned no value "
+msgstr "La fonction n'a pas retourné de résultat"
+
msgid ""
"The mission is not accomplished yet (press \\key help; for more details)"
msgstr ""
@@ -1650,6 +1665,9 @@ msgstr "Ver mortellement touché"
msgid "Wreckage"
msgstr "Epave de robot"
+msgid "Write error"
+msgstr "Erreur à l'écriture"
+
msgid "Wrong type for the assignment"
msgstr "Mauvais type de résultat pour l'assignation"
@@ -1786,9 +1804,6 @@ msgstr "www.epsitec.com"
#~ msgid " Missions on this level:"
#~ msgstr " Missions du niveau :"
-#~ msgid "\" [ \" expected"
-#~ msgstr "\" [ \" attendu"
-
#~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "Bruitages 3D\\Positionnement sonore dans l'espace"
@@ -1801,9 +1816,6 @@ msgstr "www.epsitec.com"
#~ msgid "Can not create this; there are too many objects"
#~ msgstr "Création impossible; il y a trop d'objets"
-#~ msgid "Can't open file"
-#~ msgstr "Ouverture du fichier impossible"
-
#~ msgid "Cancel\\Keep current player name"
#~ msgstr "Annuler\\Conserver le joueur actuel"
@@ -1832,9 +1844,6 @@ msgstr "www.epsitec.com"
#~ msgid "Exit film\\Film at the exit of exercises"
#~ msgstr "Retour animé\\Retour animé dans les exercices"
-#~ msgid "File not open"
-#~ msgstr "Le fichier n'est pas ouvert"
-
#~ msgid "Friendly fire\\Your shooting can damage your own objects "
#~ msgstr "Dégâts à soi-même\\Vos tirs infligent des dommages à vos unités"
@@ -1874,9 +1883,6 @@ msgstr "www.epsitec.com"
#~ msgid "Quit\\Quit COLOBOT"
#~ msgstr "Quitter\\Quitter COLOBOT"
-#~ msgid "Read error"
-#~ msgstr "Erreur à la lecture"
-
#~ msgid "Robbie\\Your assistant"
#~ msgstr "Robbie\\Votre assistant"
@@ -1895,9 +1901,6 @@ msgstr "www.epsitec.com"
#~ msgid "Textures\\Quality of textures "
#~ msgstr "Qualité des textures\\Qualité des images"
-#~ msgid "The function returned no value "
-#~ msgstr "La fonction n'a pas retourné de résultat"
-
#~ msgid ""
#~ "The list is only available if a \\l;radar station\\u object\\radar; is "
#~ "working.\n"
@@ -1906,9 +1909,6 @@ msgstr "www.epsitec.com"
#~ msgid "User\\User levels"
#~ msgstr "Suppl.\\Niveaux supplémentaires"
-#~ msgid "Write error"
-#~ msgstr "Erreur à l'écriture"
-
#~ msgid "\\Return to COLOBOT"
#~ msgstr "\\Retourner dans COLOBOT"
diff --git a/po/pl.po b/po/pl.po
index d457278..4180c41 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -54,6 +54,9 @@ msgstr " Streszczenie:"
msgid " or "
msgstr " lub "
+msgid "\" [ \" expected"
+msgstr "Oczekiwane \" [ \""
+
msgid "\" ] \" missing"
msgstr "Brak \" ] \""
@@ -355,6 +358,9 @@ msgstr "Nie można wyprodukować nie wynalezionego obiektu"
msgid "Can not produce this object in this mission"
msgstr "Nie można utworzyć tego obiektu w tej misji"
+msgid "Can't open file"
+msgstr "Nie można otworzyć pliku"
+
msgid "Cancel"
msgstr "Anuluj"
@@ -549,6 +555,9 @@ msgstr "Okulary:"
msgid "Face type:"
msgstr "Rodzaj twarzy:"
+msgid "File not open"
+msgstr "Plik nie jest otwarty"
+
msgid "Filename:"
msgstr "Nazwa pliku:"
@@ -1163,6 +1172,9 @@ msgstr "Zakończ\\Kończy bieżącą misję lub ćwiczenie"
msgid "Radar station"
msgstr "Stacja radarowa"
+msgid "Read error"
+msgstr "Błąd odczytu"
+
msgid "Recorder"
msgstr "Nagrywanie"
@@ -1453,6 +1465,9 @@ msgstr "Tekstury"
msgid "The expression must return a boolean value"
msgstr "Wyrażenie musi zwrócić wartość logiczną"
+msgid "The function returned no value "
+msgstr "Funkcja nie zwróciła żadnej wartości "
+
msgid ""
"The mission is not accomplished yet (press \\key help; for more details)"
msgstr "Misja nie jest wypełniona (naciśnij \\key help; aby uzyskać szczegóły)"
@@ -1655,6 +1670,9 @@ msgstr "Robal śmiertelnie raniony"
msgid "Wreckage"
msgstr "Wrak"
+msgid "Write error"
+msgstr "Błąd zapisu"
+
msgid "Wrong type for the assignment"
msgstr "Zły typ dla przypisania"
@@ -1784,9 +1802,6 @@ msgstr "www.epsitec.com"
#~ msgid " Drivers:"
#~ msgstr " Sterowniki:"
-#~ msgid "\" [ \" expected"
-#~ msgstr "Oczekiwane \" [ \""
-
#~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "Dźwięk 3D\\Przestrzenne pozycjonowanie dźwięków"
@@ -1796,9 +1811,6 @@ msgstr "www.epsitec.com"
#~ msgid "Can not create this; there are too many objects"
#~ msgstr "Nie można tego utworzyć, za dużo obiektów"
-#~ msgid "Can't open file"
-#~ msgstr "Nie można otworzyć pliku"
-
#~ msgid "Cancel\\Keep current player name"
#~ msgstr "Anuluj\\Zachowuje bieżące imię gracza"
@@ -1823,9 +1835,6 @@ msgstr "www.epsitec.com"
#~ msgid "Exit film\\Film at the exit of exercises"
#~ msgstr "Końcowy film\\Film na zakończenie ćwiczeń"
-#~ msgid "File not open"
-#~ msgstr "Plik nie jest otwarty"
-
#~ msgid "Friendly fire\\Your shooting can damage your own objects "
#~ msgstr "Przyjacielski ogień\\Własne strzały uszkadzają Twoje obiekty"
@@ -1867,9 +1876,6 @@ msgstr "www.epsitec.com"
#~ msgid "Quit the mission?"
#~ msgstr "Opuścić misję?"
-#~ msgid "Read error"
-#~ msgstr "Błąd odczytu"
-
#~ msgid "Robbie\\Your assistant"
#~ msgstr "Robbie\\Twój asystent"
@@ -1885,9 +1891,6 @@ msgstr "www.epsitec.com"
#~ msgid "Textures\\Quality of textures "
#~ msgstr "Tekstury\\Jakość tekstur "
-#~ msgid "The function returned no value "
-#~ msgstr "Funkcja nie zwróciła żadnej wartości "
-
#~ msgid ""
#~ "The list is only available if a \\l;radar station\\u object\\radar; is "
#~ "working.\n"
@@ -1895,9 +1898,6 @@ msgstr "www.epsitec.com"
#~ "Lista jest dostępna jedynie gdy działa \\l;stacja radarowa\\u object"
#~ "\\radar;.\n"
-#~ msgid "Write error"
-#~ msgstr "Błąd zapisu"
-
#~ msgid "\\b;Aliens\n"
#~ msgstr "\\b;Obcy\n"
diff --git a/po/ru.po b/po/ru.po
index dad6905..2248e64 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -53,6 +53,9 @@ msgstr " Итог:"
msgid " or "
msgstr " или "
+msgid "\" [ \" expected"
+msgstr "Ожидалось \" [ \""
+
msgid "\" ] \" missing"
msgstr "Отсутствует \"]\" "
@@ -347,6 +350,9 @@ msgstr ""
msgid "Can not produce this object in this mission"
msgstr ""
+msgid "Can't open file"
+msgstr "Невозможно открыть файл"
+
msgid "Cancel"
msgstr "Отмена"
@@ -542,6 +548,9 @@ msgstr "Очки:"
msgid "Face type:"
msgstr "Лицо:"
+msgid "File not open"
+msgstr "Файл не открыт"
+
msgid "Filename:"
msgstr "Имя файла:"
@@ -1160,6 +1169,9 @@ msgstr "Выход\\Выход из текущей миссии"
msgid "Radar station"
msgstr "Радар"
+msgid "Read error"
+msgstr "Ошибка чтения"
+
msgid "Recorder"
msgstr "Запись"
@@ -1452,6 +1464,9 @@ msgstr ""
msgid "The expression must return a boolean value"
msgstr "Выражение должно возвращать логическое значение"
+msgid "The function returned no value "
+msgstr "Функция не возвратила значения"
+
msgid ""
"The mission is not accomplished yet (press \\key help; for more details)"
msgstr ""
@@ -1655,6 +1670,9 @@ msgstr "Червь смертельно ранен"
msgid "Wreckage"
msgstr "Обломки"
+msgid "Write error"
+msgstr "Ошибка записи"
+
msgid "Wrong type for the assignment"
msgstr "Неверный тип для назначения"
@@ -1790,9 +1808,6 @@ msgstr "www.epsitec.com"
#~ msgid " Missions on this level:"
#~ msgstr " Миссии на этом уровне:"
-#~ msgid "\" [ \" expected"
-#~ msgstr "Ожидалось \" [ \""
-
#~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "3D-звук\\Стерео звук"
@@ -1805,9 +1820,6 @@ msgstr "www.epsitec.com"
#~ msgid "Can not create this; there are too many objects"
#~ msgstr "Не удается это создать, слишком много объектов"
-#~ msgid "Can't open file"
-#~ msgstr "Невозможно открыть файл"
-
#~ msgid "Cancel\\Keep current player name"
#~ msgstr "Отмена\\Отмена"
@@ -1836,9 +1848,6 @@ msgstr "www.epsitec.com"
#~ msgid "Exit film\\Film at the exit of exercises"
#~ msgstr "Ролик при выходе\\Ролик во время выхода из упражнения"
-#~ msgid "File not open"
-#~ msgstr "Файл не открыт"
-
#~ msgid "Friendly fire\\Your shooting can damage your own objects "
#~ msgstr "Огонь по своим\\Вы можете повредить собственные объекты"
@@ -1878,9 +1887,6 @@ msgstr "www.epsitec.com"
#~ msgid "Quit\\Quit COLOBOT"
#~ msgstr "Выход\\Выход из COLOBOT"
-#~ msgid "Read error"
-#~ msgstr "Ошибка чтения"
-
#~ msgid "Robbie\\Your assistant"
#~ msgstr "Робби\\Ваш помощник"
@@ -1899,9 +1905,6 @@ msgstr "www.epsitec.com"
#~ msgid "Textures\\Quality of textures "
#~ msgstr "Текстуры\\Качество текстур "
-#~ msgid "The function returned no value "
-#~ msgstr "Функция не возвратила значения"
-
#~ msgid ""
#~ "The list is only available if a \\l;radar station\\u object\\radar; is "
#~ "working.\n"
@@ -1911,9 +1914,6 @@ msgstr "www.epsitec.com"
#~ msgid "User\\User levels"
#~ msgstr "Польз.\\Пользовательские уровни"
-#~ msgid "Write error"
-#~ msgstr "Ошибка записи"
-
#~ msgid "\\Return to COLOBOT"
#~ msgstr "\\Вернуться в COLOBOT"
diff --git a/src/CBot/CBot.h b/src/CBot/CBot.h
index 4ba45b0..3f59005 100644
--- a/src/CBot/CBot.h
+++ b/src/CBot/CBot.h
@@ -23,7 +23,6 @@
* that should be included by any Colobot files outside of the CBot module.
*/
-// Modules inlcude
#include "CBot/CBotFileUtils.h"
#include "CBot/CBotClass.h"
#include "CBot/CBotToken.h"
@@ -32,6 +31,4 @@
#include "CBot/CBotVar/CBotVar.h"
-// Local include
-
-// Global include
+#include "CBot/stdlib/stdlib_public.h"
diff --git a/src/CBot/CBotDefines.h b/src/CBot/CBotDefines.h
index 93be12b..514e733 100644
--- a/src/CBot/CBotDefines.h
+++ b/src/CBot/CBotDefines.h
@@ -53,6 +53,8 @@
// Error Handling of compilation and execution
////////////////////////////////////////////////////////////////////////
+// TODO: Why are all of those duplicated? This needs to be unified across the source code ~krzys_h
+
// Here are the list of errors that can be returned by the module
// for compilation
@@ -132,6 +134,7 @@
#define TX_BADLEFT 5004
#define TX_ENDOF 5005
#define TX_OUTCASE 5006
+#define TX_NOTERM 5007
#define TX_CLOSEBLK 5008
#define TX_ELSEWITHOUTIF 5009
#define TX_OPENBLK 5010
@@ -162,6 +165,7 @@
#define TX_CLBRK 5035
#define TX_RESERVED 5036
#define TX_BADNEW 5037
+#define TX_OPBRK 5038
#define TX_BADSTRING 5039
#define TX_BADINDEX 5040
#define TX_PRIVATE 5041
@@ -171,6 +175,7 @@
#define TX_DIVZERO 6000
#define TX_NOTINIT 6001
#define TX_BADTHROW 6002
+#define TX_NORETVAL 6003
#define TX_NORUN 6004
#define TX_NOCALL 6005
#define TX_NOCLASS 6006
@@ -179,6 +184,10 @@
#define TX_OUTARRAY 6009
#define TX_STACKOVER 6010
#define TX_DELETEDPT 6011
+#define TX_FILEOPEN 6012
+#define TX_NOTOPEN 6013
+#define TX_ERRREAD 6014
+#define TX_ERRWRITE 6015
-// Max errors
-#define TX_MAX 6012
+// Max errors (NOTE: See above TODO near file errors)
+#define TX_MAX 6016
diff --git a/src/CBot/CBotProgram.cpp b/src/CBot/CBotProgram.cpp
index 0dd62f1..6ac9f43 100644
--- a/src/CBot/CBotProgram.cpp
+++ b/src/CBot/CBotProgram.cpp
@@ -29,9 +29,10 @@
#include "CBot/CBotInstr/CBotFunction.h"
-#include "StringFunctions.h"
#include "CBotKeywordStrings.h"
+#include "CBot/stdlib/stdlib.h"
+
// Local include
// Global include
@@ -482,19 +483,21 @@ void CBotProgram::Init()
CBotToken::DefineNum("CBotErrZeroDiv", TX_DIVZERO); // division by zero
CBotToken::DefineNum("CBotErrNotInit", TX_NOTINIT); // uninitialized variable
CBotToken::DefineNum("CBotErrBadThrow", TX_BADTHROW); // throw a negative value
- //CBotToken::DefineNum("CBotErrNoRetVal", 6003); // function did not return results // TODO: Not used. I'm pretty sure not returning a value crashes the game :P
+ CBotToken::DefineNum("CBotErrNoRetVal", TX_NORETVAL); // function did not return results
CBotToken::DefineNum("CBotErrNoRun", TX_NORUN); // active Run () without a function // TODO: Is this actually a runtime error?
CBotToken::DefineNum("CBotErrUndefFunc", TX_NOCALL); // Calling a function that no longer exists
- CBotToken::DefineNum("CBotErrUndefClass", TX_NOCLASS); // Class no longer exists
- CBotToken::DefineNum("CBotErrNullPointer", TX_NULLPT); // Attempted to use a null pointer
+ CBotToken::DefineNum("CBotErrNotClass", TX_NOCLASS); // Class no longer exists
+ CBotToken::DefineNum("CBotErrNull", TX_NULLPT); // Attempted to use a null pointer
CBotToken::DefineNum("CBotErrNan", TX_OPNAN); // Can't do operations on nan
- CBotToken::DefineNum("CBotErrOutOfBounds", TX_OUTARRAY); // Attempted access out of bounds of an array
- CBotToken::DefineNum("CBotErrStackOverflow", TX_STACKOVER); // Stack overflow
- CBotToken::DefineNum("CBotErrDeletedObject", TX_DELETEDPT); // Attempted to use deleted object
+ CBotToken::DefineNum("CBotErrOutArray", TX_OUTARRAY); // Attempted access out of bounds of an array
+ CBotToken::DefineNum("CBotErrStackOver", TX_STACKOVER); // Stack overflow
+ CBotToken::DefineNum("CBotErrDeletedPtr", TX_DELETEDPT); // Attempted to use deleted object
CBotProgram::AddFunction("sizeof", rSizeOf, cSizeOf );
InitStringFunctions();
+ InitMathFunctions();
+ InitFileFunctions();
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/src/CBot/CMakeLists.txt b/src/CBot/CMakeLists.txt
index 08f8356..62f7d72 100644
--- a/src/CBot/CMakeLists.txt
+++ b/src/CBot/CMakeLists.txt
@@ -11,7 +11,6 @@ set(SOURCES
CBotCallMethode.cpp
CBotTypResult.cpp
CBotKeywordStrings.cpp
- StringFunctions.cpp
CBotInstr/CBotInstr.cpp
CBotInstr/CBotInstrUtils.cpp
CBotInstr/CBotWhile.cpp
@@ -67,6 +66,10 @@ set(SOURCES
CBotVar/CBotVarFloat.cpp
CBotVar/CBotVarInt.cpp
CBotVar/CBotVar.cpp
+ stdlib/FileFunctions.cpp
+ stdlib/StringFunctions.cpp
+ stdlib/MathFunctions.cpp
+ stdlib/Compilation.cpp
)
# Includes
diff --git a/src/CBot/StringFunctions.h b/src/CBot/StringFunctions.h
deleted file mode 100644
index fd3618f..0000000
--- a/src/CBot/StringFunctions.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * This file is part of the Colobot: Gold Edition source code
- * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam
- * http://epsitec.ch; http://colobot.info; http://github.com/colobot
- *
- * This program 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 this program. If not, see http://gnu.org/licenses
- */
-
-#pragma once
-
-// Modules inlcude
-#include "CBot/CBotTypResult.h"
-
-// Local include
-
-// Global include
-
-// Forward declaration
-class CBotVar;
-
-/*!
- * \brief rStrLen Gives the length of a chain execution
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrLen( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief cIntStr int xxx ( string ) compilation
- * \param pVar
- * \param pUser
- * \return
- */
-CBotTypResult cIntStr( CBotVar* &pVar, void* pUser );
-
-/*!
- * \brief rStrLeft Gives the left side of a chain execution
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrLeft( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief cStrStrInt string xxx ( string, int ) compilation
- * \param pVar
- * \param pUser
- * \return
- */
-CBotTypResult cStrStrInt( CBotVar* &pVar, void* pUser );
-
-/*!
- * \brief rStrRight Gives the right of a string execution
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrRight( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief rStrMid Gives the central part of a chain execution
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrMid( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief rStrVal Gives the number stored in a string execution.
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrVal( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief cIntStrStr int xxx ( string, string ) compilation
- * \param pVar
- * \param pUser
- * \return
- */
-CBotTypResult cIntStrStr( CBotVar* &pVar, void* pUser );
-
-/*!
- * \brief rStrUpper Gives a string to uppercase exécution
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrUpper( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief rStrLower Gives a string to lowercase exécution.
- * \param pVar
- * \param pResult
- * \param ex
- * \param pUser
- * \return
- */
-bool rStrLower( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser );
-
-/*!
- * \brief cStrStr String xxx ( string ) compilation
- * \param pVar
- * \param pUser
- * \return
- */
-CBotTypResult cStrStr( CBotVar* &pVar, void* pUser );
-
-/*!
- * \brief InitStringFunctions
- */
-void InitStringFunctions();
diff --git a/src/CBot/stdlib/Compilation.cpp b/src/CBot/stdlib/Compilation.cpp
new file mode 100644
index 0000000..a0174a6
--- /dev/null
+++ b/src/CBot/stdlib/Compilation.cpp
@@ -0,0 +1,217 @@
+#include "CBot/stdlib/Compilation.h"
+
+#include "CBot/CBot.h"
+
+// Compiling a procedure without any parameters.
+
+CBotTypResult cNull(CBotVar* &var, void* user)
+{
+ if ( var != nullptr ) return CBotErrOverParam;
+ return CBotTypResult(CBotTypFloat);
+}
+
+// Compiling a procedure with a single real number.
+
+CBotTypResult cOneFloat(CBotVar* &var, void* user)
+{
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypFloat);
+}
+
+// Compiling a procedure with two real numbers.
+
+CBotTypResult cTwoFloat(CBotVar* &var, void* user)
+{
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+
+ if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypFloat);
+}
+
+
+// Compiling a procedure with a single string.
+
+CBotTypResult cString(CBotVar* &var, void* user)
+{
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() != CBotTypString &&
+ var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypFloat);
+}
+
+// Compiling a procedure with a single string, returning string.
+
+CBotTypResult cStringString(CBotVar* &var, void* user)
+{
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() != CBotTypString &&
+ var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypString);
+}
+
+// compilation of instruction with one int returning int
+
+CBotTypResult cOneInt(CBotVar* &var, void* user)
+{
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() != CBotTypInt ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypInt);
+}
+
+// compilation of instruction with one int returning boolean
+
+CBotTypResult cOneIntReturnBool(CBotVar* &var, void* user)
+{
+ if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() != CBotTypInt ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypBoolean);
+}
+
+
+
+CBotTypResult cStrStr(CBotVar*& var, void* user)
+{
+ // it takes a parameter
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADSTRING );
+
+ // no second parameter
+ if ( var->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
+
+ // the end result is a string
+ return CBotTypResult( CBotTypString );
+}
+
+CBotTypResult cIntStrStr(CBotVar*& var, void* user)
+{
+ // it takes a parameter
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADSTRING );
+
+ // it takes a second parameter
+ var = var->GetNext();
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADSTRING );
+
+ // no third parameter
+ if ( var->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
+
+ // the end result is a number
+ return CBotTypResult( CBotTypInt );
+}
+
+CBotTypResult cFloatStr(CBotVar*& var, void* user)
+{
+ // it takes a parameter
+ if ( var == nullptr ) return CBotTypResult(TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADSTRING );
+
+ // no second parameter
+ if ( var->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
+
+ // the end result is a number
+ return CBotTypResult( CBotTypFloat );
+}
+
+CBotTypResult cStrStrIntInt(CBotVar*& var, void* user)
+{
+ // it takes a parameter
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADSTRING );
+
+ // it takes a second parameter
+ var = var->GetNext();
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // which must be a number
+ if ( var->GetType() > CBotTypDouble )
+ return CBotTypResult( TX_BADNUM );
+
+ // third parameter optional
+ if ( var->GetNext() != nullptr )
+ {
+
+ var = var->GetNext();
+ // which must be a number
+ if ( var->GetType() > CBotTypDouble )
+ return CBotTypResult( TX_BADNUM );
+
+ // no fourth parameter
+ if ( var->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
+ }
+
+ // the end result is a string
+ return CBotTypResult( CBotTypString );
+}
+
+CBotTypResult cStrStrInt(CBotVar*& var, void* user)
+{
+ // it takes a parameter
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADSTRING );
+
+ // it takes a second parameter
+ var = var->GetNext();
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // which must be a number
+ if ( var->GetType() > CBotTypDouble )
+ return CBotTypResult( TX_BADNUM );
+
+ // no third parameter
+ if ( var->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
+
+ // the end result is a string
+ return CBotTypResult( CBotTypString );
+}
+
+CBotTypResult cIntStr(CBotVar*& var, void* user)
+{
+ // it takes a parameter
+ if ( var == nullptr ) return CBotTypResult( TX_LOWPARAM );
+
+ // to be a string
+ if ( var->GetType() != CBotTypString )
+ return CBotTypResult( TX_BADPARAM );
+
+ // no second parameter
+ if ( var->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
+
+ // the end result is an integer
+ return CBotTypResult( CBotTypInt );
+}
\ No newline at end of file
diff --git a/src/CBot/stdlib/Compilation.h b/src/CBot/stdlib/Compilation.h
new file mode 100644
index 0000000..b53519c
--- /dev/null
+++ b/src/CBot/stdlib/Compilation.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "CBot/CBotTypResult.h"
+
+class CBotVar;
+
+// Commonly used functions for parameter compilation
+// type "number" is anything > CBotTypDouble
+
+// float foo()
+CBotTypResult cNull(CBotVar* &var, void* user);
+// float foo(number)
+CBotTypResult cOneFloat(CBotVar* &var, void* user);
+// float foo(number, number)
+CBotTypResult cTwoFloat(CBotVar* &var, void* user);
+// float foo(string)
+CBotTypResult cString(CBotVar* &var, void* user);
+// string foo(string)
+CBotTypResult cStringString(CBotVar* &var, void* user);
+// int foo(int)
+CBotTypResult cOneInt(CBotVar* &var, void* user);
+// bool foo(int)
+CBotTypResult cOneIntReturnBool(CBotVar* &var, void* user);
+
+
+// string foo(string)
+CBotTypResult cStrStr(CBotVar*& var, void* user);
+// int foo(string, string)
+CBotTypResult cIntStrStr(CBotVar*& var, void* user);
+// float foo(string)
+CBotTypResult cFloatStr(CBotVar*& var, void* user);
+// string foo(string, number[, number])
+CBotTypResult cStrStrIntInt(CBotVar*& var, void* user);
+// string foo(string, number)
+CBotTypResult cStrStrInt(CBotVar*& var, void* user);
+// int foo(string)
+CBotTypResult cIntStr(CBotVar*& var, void* user);
\ No newline at end of file
diff --git a/src/CBot/stdlib/FileFunctions.cpp b/src/CBot/stdlib/FileFunctions.cpp
new file mode 100644
index 0000000..26836a9
--- /dev/null
+++ b/src/CBot/stdlib/FileFunctions.cpp
@@ -0,0 +1,375 @@
+#include "CBot/stdlib/stdlib.h"
+
+#include "CBot/CBot.h"
+
+#include <memory>
+#include <unordered_map>
+#include <cassert>
+
+namespace {
+std::unique_ptr<CBotFileAccessHandler> g_fileHandler;
+std::unordered_map<int, std::unique_ptr<CBotFile>> g_files;
+int g_nextFileId = 1;
+}
+
+
+bool FileClassOpenFile(CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception)
+{
+ std::string mode;
+
+ // must be a character string
+ if ( pVar->GetType() != CBotTypString ) { Exception = CBotErrBadString; return false; }
+
+ std::string filename = pVar->GetValString();
+
+ // there may be a second parameter
+ pVar = pVar->GetNext();
+ if ( pVar != nullptr )
+ {
+ // recover mode
+ mode = pVar->GetValString();
+ if ( mode != "r" && mode != "w" ) { Exception = CBotErrBadParam; return false; }
+
+ // no third parameter
+ if ( pVar->GetNext() != nullptr ) { Exception = CBotErrOverParam; return false; }
+ }
+
+ // saves the file name
+ pVar = pThis->GetItem("filename");
+ pVar->SetValString(filename);
+
+ // retrieve the item "handle"
+ pVar = pThis->GetItem("handle");
+ // which must not be initialized
+ if ( pVar->IsDefined()) { Exception = CBotErrFileOpen; return false; }
+
+ if ( !mode.empty() )
+ {
+ // opens the requested file
+ assert(g_fileHandler != nullptr);
+ std::unique_ptr<CBotFile> file = g_fileHandler->OpenFile(filename, mode == "r" ? CBotFileAccessHandler::OpenMode::Read : CBotFileAccessHandler::OpenMode::Write);
+
+ if (!file->Opened()) { Exception = CBotErrFileOpen; return false; }
+
+ int fileHandle = g_nextFileId++;
+ g_files[fileHandle] = std::move(file);
+
+ // save the file handle
+ pVar = pThis->GetItem("handle");
+ pVar->SetValInt(fileHandle);
+ }
+ return true;
+}
+
+// constructor of the class
+// get the filename as a parameter
+
+// execution
+bool rfconstruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // accepts no parameters
+ if ( pVar == nullptr ) return true;
+
+ return FileClassOpenFile(pThis, pVar, pResult, Exception);
+}
+
+// compilation
+CBotTypResult cfconstruct (CBotVar* pThis, CBotVar* &pVar)
+{
+ // accepts no parameters
+ if ( pVar == nullptr ) return CBotTypResult( 0 );
+
+ // must be a character string
+ if ( pVar->GetType() != CBotTypString )
+ return CBotTypResult( CBotErrBadString );
+
+ // there may be a second parameter
+ pVar = pVar->GetNext();
+ if ( pVar != nullptr )
+ {
+ // which must be a string
+ if ( pVar->GetType() != CBotTypString )
+ return CBotTypResult( CBotErrBadString );
+ // no third parameter
+ if ( pVar->GetNext() != nullptr ) return CBotTypResult( CBotErrOverParam );
+ }
+
+ // the result is void (constructor)
+ return CBotTypResult( 0 );
+}
+
+
+// destructor of the class
+
+// execution
+bool rfdestruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // retrieve the item "handle"
+ pVar = pThis->GetItem("handle");
+
+ if (!pVar->IsDefined()) return true; // file not opened
+ g_files.erase(pVar->GetValInt());
+
+ pVar->SetInit(CBotVar::InitType::IS_NAN);
+ return true;
+}
+
+
+// process FILE :: open
+// get the r/w mode as a parameter
+
+// execution
+bool rfopen (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // there must be a parameter
+ if ( pVar == nullptr ) { Exception = CBotErrLowParam; return false; }
+
+ bool result = FileClassOpenFile(pThis, pVar, pResult, Exception);
+ pResult->SetValInt(result);
+ return result;
+}
+
+// compilation
+CBotTypResult cfopen (CBotVar* pThis, CBotVar* &pVar)
+{
+ // there must be a parameter
+ if ( pVar == nullptr ) return CBotTypResult( CBotErrLowParam );
+
+ // which must be a string
+ if ( pVar->GetType() != CBotTypString )
+ return CBotTypResult( CBotErrBadString );
+
+ // there may be a second parameter
+ pVar = pVar->GetNext();
+ if ( pVar != nullptr )
+ {
+ // which must be a string
+ if ( pVar->GetType() != CBotTypString )
+ return CBotTypResult( CBotErrBadString );
+
+ // no third parameter
+ if ( pVar->GetNext() != nullptr ) return CBotTypResult( CBotErrOverParam );
+ }
+
+ // the result is bool
+ return CBotTypResult(CBotTypBoolean);
+}
+
+
+// process FILE :: close
+
+// execeution
+bool rfclose (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // it shouldn't be any parameters
+ if (pVar != nullptr) { Exception = CBotErrOverParam; return false; }
+
+ // retrieve the item "handle"
+ pVar = pThis->GetItem("handle");
+
+ if (!pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
+
+ int fileHandle = pVar->GetValInt();
+
+ const auto handleIter = g_files.find(fileHandle);
+ if (handleIter == g_files.end())
+ {
+ Exception = CBotErrNotOpen;
+ return false;
+ }
+
+ g_files.erase(handleIter);
+
+ pVar->SetInit(CBotVar::InitType::IS_NAN);
+ return true;
+}
+
+// compilation
+CBotTypResult cfclose (CBotVar* pThis, CBotVar* &pVar)
+{
+ // it shouldn't be any parameters
+ if ( pVar != nullptr ) return CBotTypResult( CBotErrOverParam );
+
+ // function returns a result "void"
+ return CBotTypResult( 0 );
+}
+
+// process FILE :: writeln
+
+// execution
+bool rfwrite (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // there must be a parameter
+ if ( pVar == nullptr ) { Exception = CBotErrLowParam; return false; }
+
+ // which must be a character string
+ if ( pVar->GetType() != CBotTypString ) { Exception = CBotErrBadString; return false; }
+
+ std::string param = pVar->GetValString();
+
+ // retrieve the item "handle"
+ pVar = pThis->GetItem("handle");
+
+ if ( !pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
+
+ int fileHandle = pVar->GetValInt();
+
+ const auto handleIter = g_files.find(fileHandle);
+ if (handleIter == g_files.end())
+ {
+ Exception = CBotErrNotOpen;
+ return false;
+ }
+
+ handleIter->second->Write(param + "\n");
+
+ // if an error occurs generate an exception
+ if ( handleIter->second->Errored() ) { Exception = CBotErrWrite; return false; }
+
+ return true;
+}
+
+// compilation
+CBotTypResult cfwrite (CBotVar* pThis, CBotVar* &pVar)
+{
+ // there must be a parameter
+ if ( pVar == nullptr ) return CBotTypResult( CBotErrLowParam );
+
+ // which must be a character string
+ if ( pVar->GetType() != CBotTypString ) return CBotTypResult( CBotErrBadString );
+
+ // no other parameter
+ if ( pVar->GetNext() != nullptr ) return CBotTypResult( CBotErrOverParam );
+
+ // the function returns a void result
+ return CBotTypResult( 0 );
+}
+
+// process FILE :: readln
+
+// execution
+bool rfread(CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // it shouldn't be any parameters
+ if (pVar != nullptr) { Exception = CBotErrOverParam; return false; }
+
+ // retrieve the item "handle"
+ pVar = pThis->GetItem("handle");
+
+ if (!pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
+
+ int fileHandle = pVar->GetValInt();
+
+ const auto handleIter = g_files.find(fileHandle);
+ if (handleIter == g_files.end())
+ {
+ Exception = CBotErrNotOpen;
+ return false;
+ }
+
+ std::string line = handleIter->second->ReadLine();
+
+ // if an error occurs generate an exception
+ if ( handleIter->second->Errored() ) { Exception = CBotErrRead; return false; }
+
+ pResult->SetValString( line.c_str() );
+
+ return true;
+}
+
+// compilation
+CBotTypResult cfread (CBotVar* pThis, CBotVar* &pVar)
+{
+ // it should not be any parameter
+ if ( pVar != nullptr ) return CBotTypResult( CBotErrOverParam );
+
+ // function returns a result "string"
+ return CBotTypResult( CBotTypString );
+}
+// process FILE :: readln
+
+
+// execution
+bool rfeof (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
+{
+ // it should not be any parameter
+ if ( pVar != nullptr ) { Exception = CBotErrOverParam; return false; }
+
+ // retrieve the item "handle"
+ pVar = pThis->GetItem("handle");
+
+ if ( !pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
+
+ int fileHandle = pVar->GetValInt();
+
+ const auto handleIter = g_files.find(fileHandle);
+ if (handleIter == g_files.end())
+ {
+ Exception = CBotErrNotOpen;
+ return false;
+ }
+
+ pResult->SetValInt( handleIter->second->IsEOF() );
+
+ return true;
+}
+
+// compilation
+CBotTypResult cfeof (CBotVar* pThis, CBotVar* &pVar)
+{
+ // it shouldn't be any parameter
+ if ( pVar != nullptr ) return CBotTypResult( CBotErrOverParam );
+
+ // the function returns a boolean result
+ return CBotTypResult( CBotTypBoolean );
+}
+
+// Instruction "deletefile(filename)".
+
+bool rDeleteFile(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ std::string filename = var->GetValString();
+ assert(g_fileHandler != nullptr);
+ return g_fileHandler->DeleteFile(filename);
+}
+
+
+void InitFileFunctions()
+{
+ // create a class for file management
+ // the use is as follows:
+ // file canal( "NomFichier.txt" )
+ // canal.open( "r" ); // open for read
+ // s = canal.readln( ); // reads a line
+ // canal.close(); // close the file
+
+ // create the class FILE
+ CBotClass* bc = CBotClass::Create("file", nullptr);
+ // adds the component ".filename"
+ bc->AddItem("filename", CBotTypString);
+ // adds the component ".handle"
+ bc->AddItem("handle", CBotTypInt, PR_PRIVATE);
+
+ // define a constructor and a destructor
+ bc->AddFunction("file", rfconstruct, cfconstruct);
+ bc->AddFunction("~file", rfdestruct, nullptr);
+
+ // end of the methods associated
+ bc->AddFunction("open", rfopen, cfopen);
+ bc->AddFunction("close", rfclose, cfclose);
+ bc->AddFunction("writeln", rfwrite, cfwrite);
+ bc->AddFunction("readln", rfread, cfread);
+ bc->AddFunction("eof", rfeof, cfeof );
+
+ CBotProgram::AddFunction("deletefile", rDeleteFile, cString);
+
+ //m_pFuncFile = new CBotProgram( );
+ //std::stringArray ListFonctions;
+ //m_pFuncFile->Compile( "public file openfile(string name, string mode) {return new file(name, mode);}", ListFonctions);
+ //m_pFuncFile->SetIdent(-2); // restoreState in special identifier for this function
+}
+
+void SetFileAccessHandler(std::unique_ptr<CBotFileAccessHandler> fileHandler)
+{
+ g_fileHandler = std::move(fileHandler);
+}
\ No newline at end of file
diff --git a/src/CBot/stdlib/MathFunctions.cpp b/src/CBot/stdlib/MathFunctions.cpp
new file mode 100644
index 0000000..9375b92
--- /dev/null
+++ b/src/CBot/stdlib/MathFunctions.cpp
@@ -0,0 +1,189 @@
+#include "CBot/stdlib/stdlib.h"
+
+#include "CBot/CBot.h"
+
+#include <cmath>
+
+// Instruction "sin(degrees)".
+
+bool rSin(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(sinf(value*M_PI/180.0f));
+ return true;
+}
+
+// Instruction "cos(degrees)".
+
+bool rCos(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(cosf(value*M_PI/180.0f));
+ return true;
+}
+
+// Instruction "tan(degrees)".
+
+bool rTan(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(tanf(value*M_PI/180.0f));
+ return true;
+}
+
+// Instruction "asin(degrees)".
+
+bool raSin(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(asinf(value)*180.0f/M_PI);
+ return true;
+}
+
+// Instruction "acos(degrees)".
+
+bool raCos(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(acosf(value)*180.0f/M_PI);
+ return true;
+}
+
+// Instruction "atan(degrees)".
+
+bool raTan(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(atanf(value)*180.0f/M_PI);
+ return true;
+}
+
+// Instruction "atan2(y,x)".
+
+bool raTan2(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float y = var->GetValFloat();
+ var = var->GetNext();
+ float x = var->GetValFloat();
+
+ result->SetValFloat(atan2(y, x) * 180.0f / M_PI);
+ return true;
+}
+
+// Instruction "sqrt(value)".
+
+bool rSqrt(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(sqrtf(value));
+ return true;
+}
+
+// Instruction "pow(x, y)".
+
+bool rPow(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float x, y;
+
+ x = var->GetValFloat();
+ var = var->GetNext();
+ y = var->GetValFloat();
+ result->SetValFloat(powf(x, y));
+ return true;
+}
+
+// Instruction "rand()".
+
+bool rRand(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ result->SetValFloat(static_cast<float>(rand()) / static_cast<float>(RAND_MAX));
+ return true;
+}
+
+// Instruction "abs()".
+
+bool rAbs(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(fabs(value));
+ return true;
+}
+
+// Instruction "floor()"
+
+bool rFloor(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(floor(value));
+ return true;
+}
+
+// Instruction "ceil()"
+
+bool rCeil(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(ceil(value));
+ return true;
+}
+
+// Instruction "round()"
+
+bool rRound(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(round(value));
+ return true;
+}
+
+// Instruction "trunc()"
+
+bool rTrunc(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ float value;
+
+ value = var->GetValFloat();
+ result->SetValFloat(trunc(value));
+ return true;
+}
+
+void InitMathFunctions()
+{
+ CBotProgram::AddFunction("sin", rSin, cOneFloat);
+ CBotProgram::AddFunction("cos", rCos, cOneFloat);
+ CBotProgram::AddFunction("tan", rTan, cOneFloat);
+ CBotProgram::AddFunction("asin", raSin, cOneFloat);
+ CBotProgram::AddFunction("acos", raCos, cOneFloat);
+ CBotProgram::AddFunction("atan", raTan, cOneFloat);
+ CBotProgram::AddFunction("atan2", raTan2, cTwoFloat);
+ CBotProgram::AddFunction("sqrt", rSqrt, cOneFloat);
+ CBotProgram::AddFunction("pow", rPow, cTwoFloat);
+ CBotProgram::AddFunction("rand", rRand, cNull);
+ CBotProgram::AddFunction("abs", rAbs, cOneFloat);
+ CBotProgram::AddFunction("floor", rFloor, cOneFloat);
+ CBotProgram::AddFunction("ceil", rCeil, cOneFloat);
+ CBotProgram::AddFunction("round", rRound, cOneFloat);
+ CBotProgram::AddFunction("trunc", rTrunc, cOneFloat);
+}
\ No newline at end of file
diff --git a/src/CBot/StringFunctions.cpp b/src/CBot/stdlib/StringFunctions.cpp
similarity index 65%
rename from src/CBot/StringFunctions.cpp
rename to src/CBot/stdlib/StringFunctions.cpp
index 7ffe425..91c6362 100644
--- a/src/CBot/StringFunctions.cpp
+++ b/src/CBot/stdlib/StringFunctions.cpp
@@ -18,12 +18,10 @@
*/
// Modules inlcude
-#include "CBot/StringFunctions.h"
+#include "CBot/stdlib/stdlib.h"
-#include "CBot/CBotProgram.h"
-#include "CBot/CBotEnums.h"
+#include "CBot/CBot.h"
-#include "CBot/CBotVar/CBotVar.h"
#include "CBot/CBotUtils.h"
@@ -53,23 +51,6 @@ bool rStrLen( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
}
////////////////////////////////////////////////////////////////////////////////
-CBotTypResult cIntStr( CBotVar* &pVar, void* pUser )
-{
- // it takes a parameter
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADPARAM );
-
- // no second parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
-
- // the end result is an integer
- return CBotTypResult( CBotTypInt );
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool rStrLeft( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// it takes a parameter
@@ -103,31 +84,6 @@ bool rStrLeft( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
}
////////////////////////////////////////////////////////////////////////////////
-CBotTypResult cStrStrInt( CBotVar* &pVar, void* pUser )
-{
- // it takes a parameter
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADSTRING );
-
- // it takes a second parameter
- pVar = pVar->GetNext();
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // which must be a number
- if ( pVar->GetType() > CBotTypDouble )
- return CBotTypResult( TX_BADNUM );
-
- // no third parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
-
- // the end result is a string
- return CBotTypResult( CBotTypString );
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool rStrRight( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// it takes a parameter
@@ -211,41 +167,6 @@ bool rStrMid( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
}
////////////////////////////////////////////////////////////////////////////////
-CBotTypResult cStrStrIntInt( CBotVar* &pVar, void* pUser )
-{
- // it takes a parameter
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADSTRING );
-
- // it takes a second parameter
- pVar = pVar->GetNext();
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // which must be a number
- if ( pVar->GetType() > CBotTypDouble )
- return CBotTypResult( TX_BADNUM );
-
- // third parameter optional
- if ( pVar->GetNext() != nullptr )
- {
-
- pVar = pVar->GetNext();
- // which must be a number
- if ( pVar->GetType() > CBotTypDouble )
- return CBotTypResult( TX_BADNUM );
-
- // no fourth parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
- }
-
- // the end result is a string
- return CBotTypResult( CBotTypString );
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool rStrVal( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// it takes a parameter
@@ -268,23 +189,6 @@ bool rStrVal( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
}
////////////////////////////////////////////////////////////////////////////////
-CBotTypResult cFloatStr( CBotVar* &pVar, void* pUser )
-{
- // it takes a parameter
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADSTRING );
-
- // no second parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
-
- // the end result is a number
- return CBotTypResult( CBotTypFloat );
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool rStrFind( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// it takes a parameter
@@ -317,31 +221,6 @@ bool rStrFind( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
}
////////////////////////////////////////////////////////////////////////////////
-CBotTypResult cIntStrStr( CBotVar* &pVar, void* pUser )
-{
- // it takes a parameter
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADSTRING );
-
- // it takes a second parameter
- pVar = pVar->GetNext();
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADSTRING );
-
- // no third parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
-
- // the end result is a number
- return CBotTypResult( CBotTypInt );
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool rStrUpper( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// it takes a parameter
@@ -387,22 +266,7 @@ bool rStrLower( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
return true;
}
-////////////////////////////////////////////////////////////////////////////////
-CBotTypResult cStrStr( CBotVar* &pVar, void* pUser )
-{
- // it takes a parameter
- if ( pVar == nullptr ) return CBotTypResult( TX_LOWPARAM );
-
- // to be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( TX_BADSTRING );
- // no second parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( TX_OVERPARAM );
-
- // the end result is a string
- return CBotTypResult( CBotTypString );
-}
////////////////////////////////////////////////////////////////////////////////
void InitStringFunctions()
diff --git a/src/CBot/stdlib/stdlib.h b/src/CBot/stdlib/stdlib.h
new file mode 100644
index 0000000..fd75279
--- /dev/null
+++ b/src/CBot/stdlib/stdlib.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "CBot/stdlib/stdlib_public.h"
+
+void InitStringFunctions();
+void InitFileFunctions();
+void InitMathFunctions();
\ No newline at end of file
diff --git a/src/CBot/stdlib/stdlib_public.h b/src/CBot/stdlib/stdlib_public.h
new file mode 100644
index 0000000..0497906
--- /dev/null
+++ b/src/CBot/stdlib/stdlib_public.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include "CBot/stdlib/Compilation.h"
+
+#include <memory>
+
+class CBotFile
+{
+public:
+ virtual ~CBotFile() {}
+
+ virtual bool Opened() = 0;
+ virtual bool Errored() = 0;
+ virtual bool IsEOF() = 0;
+
+ virtual std::string ReadLine() = 0;
+ virtual void Write(const std::string& s) = 0;
+
+ //TODO
+};
+
+class CBotFileAccessHandler
+{
+public:
+ virtual ~CBotFileAccessHandler() {}
+
+ enum class OpenMode : char { Read = 'r', Write = 'w' };
+ virtual std::unique_ptr<CBotFile> OpenFile(const std::string& filename, OpenMode mode) = 0;
+ virtual bool DeleteFile(const std::string& filename) = 0;
+};
+
+void SetFileAccessHandler(std::unique_ptr<CBotFileAccessHandler> fileHandler);
+
+// TODO: provide default implementation of CBotFileAccessHandler
\ No newline at end of file
diff --git a/src/common/restext.cpp b/src/common/restext.cpp
index 8b2cb43..db7a6c4 100644
--- a/src/common/restext.cpp
+++ b/src/common/restext.cpp
@@ -707,6 +707,7 @@ void InitializeRestext()
stringsCbot[TX_CLBRK] = TR("\" ] \" missing");
stringsCbot[TX_RESERVED] = TR("Reserved keyword of CBOT language");
stringsCbot[TX_BADNEW] = TR("Bad argument for \"new\"");
+ stringsCbot[TX_OPBRK] = TR("\" [ \" expected");
stringsCbot[TX_BADSTRING] = TR("String missing");
stringsCbot[TX_BADINDEX] = TR("Incorrect index type");
stringsCbot[TX_PRIVATE] = TR("Private element");
@@ -714,6 +715,7 @@ void InitializeRestext()
stringsCbot[TX_DIVZERO] = TR("Dividing by zero");
stringsCbot[TX_NOTINIT] = TR("Variable not initialized");
stringsCbot[TX_BADTHROW] = TR("Negative value rejected by \"throw\"");
+ stringsCbot[TX_NORETVAL] = TR("The function returned no value ");
stringsCbot[TX_NORUN] = TR("No function running");
stringsCbot[TX_NOCALL] = TR("Calling an unknown function");
stringsCbot[TX_NOCLASS] = TR("This class does not exist");
@@ -722,6 +724,10 @@ void InitializeRestext()
stringsCbot[TX_OUTARRAY] = TR("Access beyond array limit");
stringsCbot[TX_STACKOVER] = TR("Stack overflow");
stringsCbot[TX_DELETEDPT] = TR("Illegal object");
+ stringsCbot[TX_FILEOPEN] = TR("Can't open file");
+ stringsCbot[TX_NOTOPEN] = TR("File not open");
+ stringsCbot[TX_ERRREAD] = TR("Read error");
+ stringsCbot[TX_ERRWRITE] = TR("Write error");
}
diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp
index 5926571..3929cf3 100644
--- a/src/level/robotmain.cpp
+++ b/src/level/robotmain.cpp
@@ -4472,7 +4472,7 @@ std::string CRobotMain::GetNewScriptName(ObjectType type, int rank)
//! Seeks if an object occupies in a spot, to prevent a backup of the game
bool CRobotMain::IOIsBusy()
{
- if (CScriptFunctions::m_numberOfOpenFiles > 0) return true;
+ if (CScriptFunctions::CheckOpenFiles()) return true;
for (CObject* obj : m_objMan->GetAllObjects())
{
diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp
index 060dddc..93e0241 100644
--- a/src/script/scriptfunc.cpp
+++ b/src/script/scriptfunc.cpp
@@ -68,49 +68,14 @@
#include "ui/displaytext.h"
-// Compiling a procedure without any parameters.
-
-CBotTypResult CScriptFunctions::cNull(CBotVar* &var, void* user)
-{
- if ( var != nullptr ) return CBotErrOverParam;
- return CBotTypResult(CBotTypFloat);
-}
-
CBotTypResult CScriptFunctions::cClassNull(CBotVar* thisclass, CBotVar* &var)
{
- return CScriptFunctions::cNull(var, nullptr);
-}
-
-// Compiling a procedure with a single real number.
-
-CBotTypResult CScriptFunctions::cOneFloat(CBotVar* &var, void* user)
-{
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
- if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
- return CBotTypResult(CBotTypFloat);
+ return cNull(var, nullptr);
}
CBotTypResult CScriptFunctions::cClassOneFloat(CBotVar* thisclass, CBotVar* &var)
{
- return CScriptFunctions::cOneFloat(var, nullptr);
-}
-
-// Compiling a procedure with two real numbers.
-
-CBotTypResult CScriptFunctions::cTwoFloat(CBotVar* &var, void* user)
-{
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
-
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
-
- if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
- return CBotTypResult(CBotTypFloat);
+ return cOneFloat(var, nullptr);
}
// Compiling a procedure with a "dot".
@@ -154,53 +119,6 @@ CBotTypResult CScriptFunctions::cOnePoint(CBotVar* &var, void* user)
return CBotTypResult(CBotTypFloat);
}
-// Compiling a procedure with a single string.
-
-CBotTypResult CScriptFunctions::cString(CBotVar* &var, void* user)
-{
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() != CBotTypString &&
- var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
- if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
- return CBotTypResult(CBotTypFloat);
-}
-
-// Compiling a procedure with a single string, returning string.
-
-CBotTypResult CScriptFunctions::cStringString(CBotVar* &var, void* user)
-{
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() != CBotTypString &&
- var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
- if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
- return CBotTypResult(CBotTypString);
-}
-
-// compilation of instruction with one int returning int
-
-CBotTypResult CScriptFunctions::cOneInt(CBotVar* &var, void* user)
-{
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() != CBotTypInt ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
- if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
- return CBotTypResult(CBotTypInt);
-}
-
-// compilation of instruction with one int returning boolean
-
-CBotTypResult CScriptFunctions::cOneIntReturnBool(CBotVar* &var, void* user)
-{
- if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() != CBotTypInt ) return CBotTypResult(CBotErrBadNum);
- var = var->GetNext();
- if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
- return CBotTypResult(CBotTypBoolean);
-}
-
-
// Seeking value in an array of integers.
bool FindList(CBotVar* array, int type)
@@ -259,171 +177,6 @@ bool GetPoint(CBotVar* &var, int& exception, Math::Vector& pos)
}
-// Instruction "sin(degrees)".
-
-bool CScriptFunctions::rSin(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(sinf(value*Math::PI/180.0f));
- return true;
-}
-
-// Instruction "cos(degrees)".
-
-bool CScriptFunctions::rCos(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(cosf(value*Math::PI/180.0f));
- return true;
-}
-
-// Instruction "tan(degrees)".
-
-bool CScriptFunctions::rTan(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(tanf(value*Math::PI/180.0f));
- return true;
-}
-
-// Instruction "asin(degrees)".
-
-bool raSin(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(asinf(value)*180.0f/Math::PI);
- return true;
-}
-
-// Instruction "acos(degrees)".
-
-bool raCos(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(acosf(value)*180.0f/Math::PI);
- return true;
-}
-
-// Instruction "atan(degrees)".
-
-bool raTan(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(atanf(value)*180.0f/Math::PI);
- return true;
-}
-
-// Instruction "atan2(y,x)".
-
-bool raTan2(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float y = var->GetValFloat();
- var = var->GetNext();
- float x = var->GetValFloat();
-
- result->SetValFloat(atan2(y, x) * 180.0f / Math::PI);
- return true;
-}
-
-// Instruction "sqrt(value)".
-
-bool CScriptFunctions::rSqrt(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(sqrtf(value));
- return true;
-}
-
-// Instruction "pow(x, y)".
-
-bool CScriptFunctions::rPow(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float x, y;
-
- x = var->GetValFloat();
- var = var->GetNext();
- y = var->GetValFloat();
- result->SetValFloat(powf(x, y));
- return true;
-}
-
-// Instruction "rand()".
-
-bool CScriptFunctions::rRand(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- result->SetValFloat(Math::Rand());
- return true;
-}
-
-// Instruction "abs()".
-
-bool CScriptFunctions::rAbs(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(fabs(value));
- return true;
-}
-
-// Instruction "floor()"
-
-bool CScriptFunctions::rFloor(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(floor(value));
- return true;
-}
-
-// Instruction "ceil()"
-
-bool CScriptFunctions::rCeil(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(ceil(value));
- return true;
-}
-
-// Instruction "round()"
-
-bool CScriptFunctions::rRound(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(round(value));
- return true;
-}
-
-// Instruction "trunc()"
-
-bool CScriptFunctions::rTrunc(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- float value;
-
- value = var->GetValFloat();
- result->SetValFloat(trunc(value));
- return true;
-}
-
// Compilation of the instruction "endmission(result, delay)"
CBotTypResult CScriptFunctions::cEndMission(CBotVar* &var, void* user)
@@ -3132,391 +2885,6 @@ bool CScriptFunctions::rCameraFocus(CBotVar* var, CBotVar* result, int& exceptio
return true;
}
-// Static variables
-
-int CScriptFunctions::m_numberOfOpenFiles = 0;
-std::unordered_map<int, std::unique_ptr<std::ios>> CScriptFunctions::m_files;
-int CScriptFunctions::m_nextFile = 1;
-
-
-
-// Prepares a file name.
-
-void PrepareFilename(std::string &filename)
-{
- CResourceManager::CreateDirectory("files");
- filename = "files/" + filename;
- GetLogger()->Debug("CBot accessing file '%s'\n", filename.c_str());
-}
-
-
-bool CScriptFunctions::FileClassOpenFile(CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception)
-{
- std::string mode;
-
- // must be a character string
- if ( pVar->GetType() != CBotTypString ) { Exception = CBotErrBadString; return false; }
-
- std::string filename = pVar->GetValString();
- PrepareFilename(filename);
-
- // there may be a second parameter
- pVar = pVar->GetNext();
- if ( pVar != nullptr )
- {
- // recover mode
- mode = pVar->GetValString();
- if ( mode != "r" && mode != "w" ) { Exception = CBotErrBadParam; return false; }
-
- // no third parameter
- if ( pVar->GetNext() != nullptr ) { Exception = CBotErrOverParam; return false; }
- }
-
- // saves the file name
- pVar = pThis->GetItem("filename");
- pVar->SetValString(filename);
-
- // retrieve the item "handle"
- pVar = pThis->GetItem("handle");
- // which must not be initialized
- if ( pVar->IsDefined()) { Exception = CBotErrFileOpen; return false; }
-
- if ( !mode.empty() )
- {
- // opens the requested file
- bool ok = false;
- std::unique_ptr<std::ios> file;
- if (mode == "r")
- {
- auto is = MakeUnique<CInputStream>(filename);
- ok = is->is_open();
- file = std::move(is);
- }
- else if (mode == "w")
- {
- auto os = MakeUnique<COutputStream>(filename);
- ok = os->is_open();
- file = std::move(os);
- }
- if (!ok) { Exception = CBotErrFileOpen; return false; }
-
- m_numberOfOpenFiles ++;
-
- int fileHandle = m_nextFile++;
-
- m_files[fileHandle] = std::move(file);
-
- // save the file handle
- pVar = pThis->GetItem("handle");
- pVar->SetValInt(fileHandle);
- }
- return true;
-}
-
-// constructor of the class
-// get the filename as a parameter
-
-// execution
-bool CScriptFunctions::rfconstruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // accepts no parameters
- if ( pVar == nullptr ) return true;
-
- return FileClassOpenFile(pThis, pVar, pResult, Exception);
-}
-
-// compilation
-CBotTypResult CScriptFunctions::cfconstruct (CBotVar* pThis, CBotVar* &pVar)
-{
- // accepts no parameters
- if ( pVar == nullptr ) return CBotTypResult( 0 );
-
- // must be a character string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( CBotErrBadString );
-
- // there may be a second parameter
- pVar = pVar->GetNext();
- if ( pVar != nullptr )
- {
- // which must be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( CBotErrBadString );
- // no third parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( CBotErrOverParam );
- }
-
- // the result is void (constructor)
- return CBotTypResult( 0 );
-}
-
-
-// destructor of the class
-
-// execution
-bool CScriptFunctions::rfdestruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // retrieve the item "handle"
- pVar = pThis->GetItem("handle");
-
- // don't open? no problem :)
- if ( pVar->IsDefined()) return true;
-
- int fileHandle = pVar->GetValInt();
-
- std::ios* file = m_files[fileHandle].get();
- CInputStream* is = dynamic_cast<CInputStream*>(file);
- if(is != nullptr) is->close();
- COutputStream* os = dynamic_cast<COutputStream*>(file);
- if(os != nullptr) os->close();
-
- m_numberOfOpenFiles--;
-
- pVar->SetInit(CBotVar::InitType::IS_NAN);
-
- m_files.erase(fileHandle);
-
- return true;
-}
-
-
-// process FILE :: open
-// get the r/w mode as a parameter
-
-// execution
-bool CScriptFunctions::rfopen (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // there must be a parameter
- if ( pVar == nullptr ) { Exception = CBotErrLowParam; return false; }
-
- bool result = FileClassOpenFile(pThis, pVar, pResult, Exception);
- pResult->SetValInt(result);
- return result;
-}
-
-// compilation
-CBotTypResult CScriptFunctions::cfopen (CBotVar* pThis, CBotVar* &pVar)
-{
- // there must be a parameter
- if ( pVar == nullptr ) return CBotTypResult( CBotErrLowParam );
-
- // which must be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( CBotErrBadString );
-
- // there may be a second parameter
- pVar = pVar->GetNext();
- if ( pVar != nullptr )
- {
- // which must be a string
- if ( pVar->GetType() != CBotTypString )
- return CBotTypResult( CBotErrBadString );
-
- // no third parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( CBotErrOverParam );
- }
-
- // the result is bool
- return CBotTypResult(CBotTypBoolean);
-}
-
-
-// process FILE :: close
-
-// execeution
-bool CScriptFunctions::rfclose (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // it shouldn't be any parameters
- if (pVar != nullptr) { Exception = CBotErrOverParam; return false; }
-
- // retrieve the item "handle"
- pVar = pThis->GetItem("handle");
-
- if ( !pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
-
- int fileHandle = pVar->GetValInt();
-
- const auto handleIter = m_files.find(fileHandle);
- if (handleIter == m_files.end())
- {
- Exception = CBotErrNotOpen;
- return false;
- }
-
- assert(handleIter->second);
-
- std::ios* file = handleIter->second.get();
- CInputStream* is = dynamic_cast<CInputStream*>(file);
- if(is != nullptr) is->close();
- COutputStream* os = dynamic_cast<COutputStream*>(file);
- if(os != nullptr) os->close();
-
- m_numberOfOpenFiles--;
-
- pVar->SetInit(CBotVar::InitType::IS_NAN);
-
- m_files.erase(handleIter);
-
- return true;
-}
-
-// compilation
-CBotTypResult CScriptFunctions::cfclose (CBotVar* pThis, CBotVar* &pVar)
-{
- // it shouldn't be any parameters
- if ( pVar != nullptr ) return CBotTypResult( CBotErrOverParam );
-
- // function returns a result "void"
- return CBotTypResult( 0 );
-}
-
-// process FILE :: writeln
-
-// execution
-bool CScriptFunctions::rfwrite (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // there must be a parameter
- if ( pVar == nullptr ) { Exception = CBotErrLowParam; return false; }
-
- // which must be a character string
- if ( pVar->GetType() != CBotTypString ) { Exception = CBotErrBadString; return false; }
-
- std::string param = pVar->GetValString();
-
- // retrieve the item "handle"
- pVar = pThis->GetItem("handle");
-
- if ( !pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
-
- int fileHandle = pVar->GetValInt();
-
- const auto handleIter = m_files.find(fileHandle);
- if (handleIter == m_files.end())
- {
- Exception = CBotErrNotOpen;
- return false;
- }
-
- COutputStream* os = dynamic_cast<COutputStream*>(handleIter->second.get());
- if (os == nullptr) { Exception = CBotErrWrite; return false; }
-
- *os << param << "\n";
-
- // if an error occurs generate an exception
- if ( os->bad() ) { Exception = CBotErrWrite; return false; }
-
- return true;
-}
-
-// compilation
-CBotTypResult CScriptFunctions::cfwrite (CBotVar* pThis, CBotVar* &pVar)
-{
- // there must be a parameter
- if ( pVar == nullptr ) return CBotTypResult( CBotErrLowParam );
-
- // which must be a character string
- if ( pVar->GetType() != CBotTypString ) return CBotTypResult( CBotErrBadString );
-
- // no other parameter
- if ( pVar->GetNext() != nullptr ) return CBotTypResult( CBotErrOverParam );
-
- // the function returns a void result
- return CBotTypResult( 0 );
-}
-
-// process FILE :: readln
-
-// execution
-bool CScriptFunctions::rfread(CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // it shouldn't be any parameters
- if (pVar != nullptr) { Exception = CBotErrOverParam; return false; }
-
- // retrieve the item "handle"
- pVar = pThis->GetItem("handle");
-
- if (!pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
-
- int fileHandle = pVar->GetValInt();
-
- const auto handleIter = m_files.find(fileHandle);
- if (handleIter == m_files.end())
- {
- Exception = CBotErrNotOpen;
- return false;
- }
-
- CInputStream* is = dynamic_cast<CInputStream*>(handleIter->second.get());
- if (is == nullptr) { Exception = CBotErrRead; return false; }
-
- std::string line;
- std::getline(*is, line);
-
- // if an error occurs generate an exception
- if ( is->bad() ) { Exception = CBotErrRead; return false; }
-
- pResult->SetValString( line.c_str() );
-
- return true;
-}
-
-// compilation
-CBotTypResult CScriptFunctions::cfread (CBotVar* pThis, CBotVar* &pVar)
-{
- // it should not be any parameter
- if ( pVar != nullptr ) return CBotTypResult( CBotErrOverParam );
-
- // function returns a result "string"
- return CBotTypResult( CBotTypString );
-}
-// process FILE :: readln
-
-
-// execution
-bool CScriptFunctions::rfeof (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user)
-{
- // it should not be any parameter
- if ( pVar != nullptr ) { Exception = CBotErrOverParam; return false; }
-
- // retrieve the item "handle"
- pVar = pThis->GetItem("handle");
-
- if ( !pVar->IsDefined()) { Exception = CBotErrNotOpen; return false; }
-
- int fileHandle = pVar->GetValInt();
-
- const auto handleIter = m_files.find(fileHandle);
- if (handleIter == m_files.end())
- {
- Exception = CBotErrNotOpen;
- return false;
- }
-
- pResult->SetValInt( handleIter->second->eof() );
-
- return true;
-}
-
-// compilation
-CBotTypResult CScriptFunctions::cfeof (CBotVar* pThis, CBotVar* &pVar)
-{
- // it shouldn't be any parameter
- if ( pVar != nullptr ) return CBotTypResult( CBotErrOverParam );
-
- // the function returns a boolean result
- return CBotTypResult( CBotTypBoolean );
-}
-
-// Instruction "deletefile(filename)".
-
-bool CScriptFunctions::rDeleteFile(CBotVar* var, CBotVar* result, int& exception, void* user)
-{
- std::string filename;
-
- filename = var->GetValString();
- PrepareFilename(filename);
- return CResourceManager::Remove(filename);
-}
// Compilation of class "point".
@@ -3608,6 +2976,112 @@ bool CScriptFunctions::rPointConstructor(CBotVar* pThis, CBotVar* var, CBotVar*
return true; // no interruption
}
+class CBotFileAccessHandlerColobot;
+class CBotFileColobot : public CBotFile
+{
+public:
+ static int m_numFilesOpen;
+
+ CBotFileColobot(const std::string& filename, CBotFileAccessHandler::OpenMode mode)
+ {
+ if (mode == CBotFileAccessHandler::OpenMode::Read)
+ {
+ auto is = MakeUnique<CInputStream>(filename);
+ if (is->is_open())
+ {
+ m_file = std::move(is);
+ }
+ }
+ else if (mode == CBotFileAccessHandler::OpenMode::Write)
+ {
+ auto os = MakeUnique<COutputStream>(filename);
+ if (os->is_open())
+ {
+ m_file = std::move(os);
+ }
+ }
+
+ if (Opened())
+ {
+ GetLogger()->Info("CBot open file '%s'\n", filename.c_str());
+ m_numFilesOpen++;
+ }
+ }
+
+ ~CBotFileColobot()
+ {
+ if (Opened())
+ {
+ GetLogger()->Debug("CBot close file\n");
+ m_numFilesOpen--;
+ }
+
+ std::ios* file = m_file.get();
+ CInputStream* is = dynamic_cast<CInputStream*>(file);
+ if(is != nullptr) is->close();
+ COutputStream* os = dynamic_cast<COutputStream*>(file);
+ if(os != nullptr) os->close();
+ }
+
+ virtual bool Opened() override
+ {
+ return m_file != nullptr;
+ }
+
+ virtual bool Errored() override
+ {
+ return m_file->bad();
+ }
+
+ virtual bool IsEOF() override
+ {
+ return m_file->eof();
+ }
+
+ virtual std::string ReadLine() override
+ {
+ CInputStream* is = dynamic_cast<CInputStream*>(m_file.get());
+ assert(is != nullptr);
+
+ std::string line;
+ std::getline(*is, line);
+ return line;
+ }
+
+ virtual void Write(const std::string& s) override
+ {
+ COutputStream* os = dynamic_cast<COutputStream*>(m_file.get());
+ assert(os != nullptr);
+
+ *os << s;
+ }
+
+private:
+ std::unique_ptr<std::ios> m_file;
+};
+int CBotFileColobot::m_numFilesOpen = 0;
+
+class CBotFileAccessHandlerColobot : public CBotFileAccessHandler
+{
+public:
+ virtual std::unique_ptr<CBotFile> OpenFile(const std::string& filename, OpenMode mode) override
+ {
+ return MakeUnique<CBotFileColobot>(PrepareFilename(filename), mode);
+ }
+
+ virtual bool DeleteFile(const std::string& filename) override
+ {
+ GetLogger()->Info("CBot delete file '%s'\n", filename.c_str());
+ return CResourceManager::Remove(PrepareFilename(filename));
+ }
+
+private:
+ static std::string PrepareFilename(const std::string& filename)
+ {
+ CResourceManager::CreateDirectory("files");
+ return "files/" + filename;
+ }
+};
@@ -3705,7 +3179,7 @@ void CScriptFunctions::Init()
bc->AddItem("x", CBotTypFloat);
bc->AddItem("y", CBotTypFloat);
bc->AddItem("z", CBotTypFloat);
- bc->AddFunction("point", CScriptFunctions::rPointConstructor, CScriptFunctions::cPointConstructor);
+ bc->AddFunction("point", rPointConstructor, cPointConstructor);
// Adds the class Object.
bc = CBotClass::Create("object", nullptr);
@@ -3724,123 +3198,77 @@ void CScriptFunctions::Init()
bc->AddItem("id", CBotTypResult(CBotTypInt), PR_READ);
bc->AddItem("team", CBotTypResult(CBotTypInt), PR_READ);
bc->AddItem("velocity", CBotTypResult(CBotTypClass, "point"), PR_READ);
- bc->AddFunction("busy", CScriptFunctions::rBusy, CScriptFunctions::cBusy);
- bc->AddFunction("factory", CScriptFunctions::rFactory, CScriptFunctions::cFactory);
- bc->AddFunction("research", CScriptFunctions::rResearch, CScriptFunctions::cClassOneFloat);
- bc->AddFunction("takeoff", CScriptFunctions::rTakeOff, CScriptFunctions::cClassNull);
- bc->AddFunction("destroy", CScriptFunctions::rDestroy, CScriptFunctions::cClassNull);
-
- // InitClassFILE:
- // create a class for file management
- // the use is as follows:
- // file canal( "NomFichier.txt" )
- // canal.open( "r" ); // open for read
- // s = canal.readln( ); // reads a line
- // canal.close(); // close the file
-
- // create the class FILE
- bc = CBotClass::Create("file", nullptr);
- // adds the component ".filename"
- bc->AddItem("filename", CBotTypString);
- // adds the component ".handle"
- bc->AddItem("handle", CBotTypInt, PR_PRIVATE);
-
- // define a constructor and a destructor
- bc->AddFunction("file", CScriptFunctions::rfconstruct, CScriptFunctions::cfconstruct );
- bc->AddFunction("~file", CScriptFunctions::rfdestruct, nullptr );
-
- // end of the methods associated
- bc->AddFunction("open", CScriptFunctions::rfopen, CScriptFunctions::cfopen );
- bc->AddFunction("close", CScriptFunctions::rfclose, CScriptFunctions::cfclose );
- bc->AddFunction("writeln", CScriptFunctions::rfwrite, CScriptFunctions::cfwrite );
- bc->AddFunction("readln", CScriptFunctions::rfread, CScriptFunctions::cfread );
- bc->AddFunction("eof", CScriptFunctions::rfeof, CScriptFunctions::cfeof );
-
- //m_pFuncFile = new CBotProgram( );
- //std::stringArray ListFonctions;
- //m_pFuncFile->Compile( "public file openfile(string name, string mode) {return new file(name, mode);}", ListFonctions);
- //m_pFuncFile->SetIdent(-2); // restoreState in special identifier for this function
-
- CBotProgram::AddFunction("sin", rSin, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("cos", rCos, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("tan", rTan, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("asin", raSin, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("acos", raCos, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("atan", raTan, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("atan2", raTan2, CScriptFunctions::cTwoFloat);
- CBotProgram::AddFunction("sqrt", rSqrt, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("pow", rPow, CScriptFunctions::cTwoFloat);
- CBotProgram::AddFunction("rand", rRand, CScriptFunctions::cNull);
- CBotProgram::AddFunction("abs", rAbs, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("floor", rFloor, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("ceil", rCeil, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("round", rRound, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("trunc", rTrunc, CScriptFunctions::cOneFloat);
-
- CBotProgram::AddFunction("endmission",rEndMission,CScriptFunctions::cEndMission);
- CBotProgram::AddFunction("playmusic", rPlayMusic ,CScriptFunctions::cPlayMusic);
- CBotProgram::AddFunction("stopmusic", rStopMusic ,CScriptFunctions::cNull);
-
- CBotProgram::AddFunction("getbuild", rGetBuild, CScriptFunctions::cNull);
- CBotProgram::AddFunction("getresearchenable", rGetResearchEnable, CScriptFunctions::cNull);
- CBotProgram::AddFunction("getresearchdone", rGetResearchDone, CScriptFunctions::cNull);
- CBotProgram::AddFunction("setbuild", rSetBuild, CScriptFunctions::cOneInt);
- CBotProgram::AddFunction("setresearchenable", rSetResearchEnable, CScriptFunctions::cOneInt);
- CBotProgram::AddFunction("setresearchdone", rSetResearchDone, CScriptFunctions::cOneInt);
-
- CBotProgram::AddFunction("canbuild", rCanBuild, CScriptFunctions::cOneIntReturnBool);
- CBotProgram::AddFunction("canresearch", rCanResearch, CScriptFunctions::cOneIntReturnBool);
- CBotProgram::AddFunction("researched", rResearched, CScriptFunctions::cOneIntReturnBool);
- CBotProgram::AddFunction("buildingenabled", rBuildingEnabled, CScriptFunctions::cOneIntReturnBool);
-
- CBotProgram::AddFunction("build", rBuild, CScriptFunctions::cOneInt);
-
- CBotProgram::AddFunction("retobject", rGetObject, CScriptFunctions::cGetObject);
- CBotProgram::AddFunction("retobjectbyid", rGetObjectById, CScriptFunctions::cGetObject);
- CBotProgram::AddFunction("delete", rDelete, CScriptFunctions::cDelete);
- CBotProgram::AddFunction("search", rSearch, CScriptFunctions::cSearch);
- CBotProgram::AddFunction("radar", rRadar, CScriptFunctions::cRadar);
- CBotProgram::AddFunction("radarall", rRadarAll, CScriptFunctions::cRadarAll);
- CBotProgram::AddFunction("detect", rDetect, CScriptFunctions::cDetect);
- CBotProgram::AddFunction("direction", rDirection, CScriptFunctions::cDirection);
- CBotProgram::AddFunction("produce", rProduce, CScriptFunctions::cProduce);
- CBotProgram::AddFunction("distance", rDistance, CScriptFunctions::cDistance);
- CBotProgram::AddFunction("distance2d",rDistance2d,CScriptFunctions::cDistance);
- CBotProgram::AddFunction("space", rSpace, CScriptFunctions::cSpace);
- CBotProgram::AddFunction("flatspace", rFlatSpace, CScriptFunctions::cFlatSpace);
- CBotProgram::AddFunction("flatground",rFlatGround,CScriptFunctions::cFlatGround);
- CBotProgram::AddFunction("wait", rWait, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("move", rMove, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("turn", rTurn, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("goto", rGoto, CScriptFunctions::cGoto);
- CBotProgram::AddFunction("grab", rGrab, CScriptFunctions::cGrabDrop);
- CBotProgram::AddFunction("drop", rDrop, CScriptFunctions::cGrabDrop);
- CBotProgram::AddFunction("sniff", rSniff, CScriptFunctions::cNull);
- CBotProgram::AddFunction("receive", rReceive, CScriptFunctions::cReceive);
- CBotProgram::AddFunction("send", rSend, CScriptFunctions::cSend);
- CBotProgram::AddFunction("deleteinfo",rDeleteInfo,CScriptFunctions::cDeleteInfo);
- CBotProgram::AddFunction("testinfo", rTestInfo, CScriptFunctions::cTestInfo);
- CBotProgram::AddFunction("thump", rThump, CScriptFunctions::cNull);
- CBotProgram::AddFunction("recycle", rRecycle, CScriptFunctions::cNull);
- CBotProgram::AddFunction("shield", rShield, CScriptFunctions::cShield);
- CBotProgram::AddFunction("fire", rFire, CScriptFunctions::cFire);
- CBotProgram::AddFunction("aim", rAim, CScriptFunctions::cAim);
- CBotProgram::AddFunction("motor", rMotor, CScriptFunctions::cMotor);
- CBotProgram::AddFunction("jet", rJet, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("topo", rTopo, CScriptFunctions::cTopo);
- CBotProgram::AddFunction("message", rMessage, CScriptFunctions::cMessage);
- CBotProgram::AddFunction("cmdline", rCmdline, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("ismovie", rIsMovie, CScriptFunctions::cNull);
- CBotProgram::AddFunction("errmode", rErrMode, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("ipf", rIPF, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("abstime", rAbsTime, CScriptFunctions::cNull);
- CBotProgram::AddFunction("deletefile",rDeleteFile,CScriptFunctions::cString);
- CBotProgram::AddFunction("pendown", rPenDown, CScriptFunctions::cPenDown);
- CBotProgram::AddFunction("penup", rPenUp, CScriptFunctions::cNull);
- CBotProgram::AddFunction("pencolor", rPenColor, CScriptFunctions::cOneFloat);
- CBotProgram::AddFunction("penwidth", rPenWidth, CScriptFunctions::cOneFloat);
+ bc->AddFunction("busy", rBusy, cBusy);
+ bc->AddFunction("factory", rFactory, cFactory);
+ bc->AddFunction("research", rResearch, cClassOneFloat);
+ bc->AddFunction("takeoff", rTakeOff, cClassNull);
+ bc->AddFunction("destroy", rDestroy, cClassNull);
+
+ CBotProgram::AddFunction("endmission",rEndMission,cEndMission);
+ CBotProgram::AddFunction("playmusic", rPlayMusic ,cPlayMusic);
+ CBotProgram::AddFunction("stopmusic", rStopMusic ,cNull);
+
+ CBotProgram::AddFunction("getbuild", rGetBuild, cNull);
+ CBotProgram::AddFunction("getresearchenable", rGetResearchEnable, cNull);
+ CBotProgram::AddFunction("getresearchdone", rGetResearchDone, cNull);
+ CBotProgram::AddFunction("setbuild", rSetBuild, cOneInt);
+ CBotProgram::AddFunction("setresearchenable", rSetResearchEnable, cOneInt);
+ CBotProgram::AddFunction("setresearchdone", rSetResearchDone, cOneInt);
+
+ CBotProgram::AddFunction("canbuild", rCanBuild, cOneIntReturnBool);
+ CBotProgram::AddFunction("canresearch", rCanResearch, cOneIntReturnBool);
+ CBotProgram::AddFunction("researched", rResearched, cOneIntReturnBool);
+ CBotProgram::AddFunction("buildingenabled", rBuildingEnabled, cOneIntReturnBool);
+
+ CBotProgram::AddFunction("build", rBuild, cOneInt);
+
+ CBotProgram::AddFunction("retobject", rGetObject, cGetObject);
+ CBotProgram::AddFunction("retobjectbyid", rGetObjectById, cGetObject);
+ CBotProgram::AddFunction("delete", rDelete, cDelete);
+ CBotProgram::AddFunction("search", rSearch, cSearch);
+ CBotProgram::AddFunction("radar", rRadar, cRadar);
+ CBotProgram::AddFunction("radarall", rRadarAll, cRadarAll);
+ CBotProgram::AddFunction("detect", rDetect, cDetect);
+ CBotProgram::AddFunction("direction", rDirection, cDirection);
+ CBotProgram::AddFunction("produce", rProduce, cProduce);
+ CBotProgram::AddFunction("distance", rDistance, cDistance);
+ CBotProgram::AddFunction("distance2d",rDistance2d,cDistance);
+ CBotProgram::AddFunction("space", rSpace, cSpace);
+ CBotProgram::AddFunction("flatspace", rFlatSpace, cFlatSpace);
+ CBotProgram::AddFunction("flatground",rFlatGround,cFlatGround);
+ CBotProgram::AddFunction("wait", rWait, cOneFloat);
+ CBotProgram::AddFunction("move", rMove, cOneFloat);
+ CBotProgram::AddFunction("turn", rTurn, cOneFloat);
+ CBotProgram::AddFunction("goto", rGoto, cGoto);
+ CBotProgram::AddFunction("grab", rGrab, cGrabDrop);
+ CBotProgram::AddFunction("drop", rDrop, cGrabDrop);
+ CBotProgram::AddFunction("sniff", rSniff, cNull);
+ CBotProgram::AddFunction("receive", rReceive, cReceive);
+ CBotProgram::AddFunction("send", rSend, cSend);
+ CBotProgram::AddFunction("deleteinfo",rDeleteInfo,cDeleteInfo);
+ CBotProgram::AddFunction("testinfo", rTestInfo, cTestInfo);
+ CBotProgram::AddFunction("thump", rThump, cNull);
+ CBotProgram::AddFunction("recycle", rRecycle, cNull);
+ CBotProgram::AddFunction("shield", rShield, cShield);
+ CBotProgram::AddFunction("fire", rFire, cFire);
+ CBotProgram::AddFunction("aim", rAim, cAim);
+ CBotProgram::AddFunction("motor", rMotor, cMotor);
+ CBotProgram::AddFunction("jet", rJet, cOneFloat);
+ CBotProgram::AddFunction("topo", rTopo, cTopo);
+ CBotProgram::AddFunction("message", rMessage, cMessage);
+ CBotProgram::AddFunction("cmdline", rCmdline, cOneFloat);
+ CBotProgram::AddFunction("ismovie", rIsMovie, cNull);
+ CBotProgram::AddFunction("errmode", rErrMode, cOneFloat);
+ CBotProgram::AddFunction("ipf", rIPF, cOneFloat);
+ CBotProgram::AddFunction("abstime", rAbsTime, cNull);
+ CBotProgram::AddFunction("pendown", rPenDown, cPenDown);
+ CBotProgram::AddFunction("penup", rPenUp, cNull);
+ CBotProgram::AddFunction("pencolor", rPenColor, cOneFloat);
+ CBotProgram::AddFunction("penwidth", rPenWidth, cOneFloat);
CBotProgram::AddFunction("camerafocus", rCameraFocus, CScriptFunctions::cOneObject);
+
+ SetFileAccessHandler(MakeUnique<CBotFileAccessHandlerColobot>());
}
@@ -4016,3 +3444,8 @@ void CScriptFunctions::DestroyObjectVar(CBotVar* botVar, bool permanent)
if (permanent)
CBotVar::Destroy(botVar);
}
+
+bool CScriptFunctions::CheckOpenFiles()
+{
+ return CBotFileColobot::m_numFilesOpen > 0;
+}
\ No newline at end of file
diff --git a/src/script/scriptfunc.h b/src/script/scriptfunc.h
index e739ecd..8746ae5 100644
--- a/src/script/scriptfunc.h
+++ b/src/script/scriptfunc.h
@@ -42,17 +42,13 @@ class CScriptFunctions
{
public:
static void Init();
+
static CBotVar* CreateObjectVar(CObject* obj);
static void DestroyObjectVar(CBotVar* botVar, bool permanent);
+ static bool CheckOpenFiles();
+
private:
- static CBotTypResult cNull(CBotVar* &var, void* user);
- static CBotTypResult cOneFloat(CBotVar* &var, void* user);
- static CBotTypResult cTwoFloat(CBotVar* &var, void* user);
- static CBotTypResult cString(CBotVar* &var, void* user);
- static CBotTypResult cStringString(CBotVar* &var, void* user);
- static CBotTypResult cOneInt(CBotVar* &var, void* user);
- static CBotTypResult cOneIntReturnBool(CBotVar* &var, void* user);
static CBotTypResult cEndMission(CBotVar* &var, void* user);
static CBotTypResult cPlayMusic(CBotVar* &var, void* user);
static CBotTypResult cGetObject(CBotVar* &var, void* user);
@@ -80,22 +76,11 @@ private:
static CBotTypResult cTopo(CBotVar* &var, void* user);
static CBotTypResult cMessage(CBotVar* &var, void* user);
static CBotTypResult cPenDown(CBotVar* &var, void* user);
+
static CBotTypResult cOnePoint(CBotVar* &var, void* user);
static CBotTypResult cPoint(CBotVar* &var, void* user);
static CBotTypResult cOneObject(CBotVar* &var, void* user);
-
- static bool rSin(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rCos(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rTan(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rSqrt(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rPow(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rRand(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rAbs(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rFloor(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rCeil(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rRound(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rTrunc(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rEndMission(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rPlayMusic(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rStopMusic(CBotVar* var, CBotVar* result, int& exception, void* user);
@@ -149,7 +134,6 @@ private:
static bool rErrMode(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rIPF(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rAbsTime(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rDeleteFile(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rPenDown(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rPenUp(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rPenColor(CBotVar* var, CBotVar* result, int& exception, void* user);
@@ -168,37 +152,14 @@ private:
static bool rTakeOff(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rDestroy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception, void* user);
-
- static CBotTypResult cfconstruct (CBotVar* pThis, CBotVar* &pVar);
- static CBotTypResult cfopen (CBotVar* pThis, CBotVar* &pVar);
- static CBotTypResult cfclose (CBotVar* pThis, CBotVar* &pVar);
- static CBotTypResult cfwrite (CBotVar* pThis, CBotVar* &pVar);
- static CBotTypResult cfread (CBotVar* pThis, CBotVar* &pVar);
- static CBotTypResult cfeof (CBotVar* pThis, CBotVar* &pVar);
- static bool rfconstruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
- static bool rfdestruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
- static bool rfopen (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
- static bool rfclose (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
- static bool rfwrite (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
- static bool rfread (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
- static bool rfeof (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception, void* user);
-
static CBotTypResult cPointConstructor(CBotVar* pThis, CBotVar* &var);
static bool rPointConstructor(CBotVar* pThis, CBotVar* var, CBotVar* pResult, int& Exception, void* user);
static void uObject(CBotVar* botThis, void* user);
-public:
- static int m_numberOfOpenFiles;
-
private:
static bool WaitForForegroundTask(CScript* script, CBotVar* result, int &exception);
static bool WaitForBackgroundTask(CScript* script, CBotVar* result, int &exception);
static bool ShouldTaskStop(Error err, int errMode);
static CExchangePost* FindExchangePost(CObject* object, float power);
-
- static bool FileClassOpenFile(CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception);
-
- static std::unordered_map<int, std::unique_ptr<std::ios>> m_files;
- static int m_nextFile;
};
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list