author | truelight |
Thu, 15 Mar 2007 22:22:51 +0000 | |
branch | noai |
changeset 9426 | b90c0d1a36b7 |
parent 9425 | 8eec6d10844a |
permissions | -rw-r--r-- |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
1 |
/* $Id$ */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
2 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
3 |
/** @file squirrel.cpp allows loading squirrel scripts to control an AI */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
4 |
|
9413
44ce0147b2c7
(svn r9211) [NoAI] -Fix r9210: of course you can always commit the wrong patch...
truelight
parents:
9412
diff
changeset
|
5 |
#include "../../stdafx.h" |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
6 |
#include "../../debug.h" |
9425
8eec6d10844a
(svn r9227) [NoAI] -Change: renamed SQUIRREL_CLASS to DEFINE_SQUIRREL_CLASS
truelight
parents:
9424
diff
changeset
|
7 |
#include "../../openttd.h" |
9411
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
8 |
#include "../../string.h" |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
9 |
#include "../../fios.h" |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
10 |
#include <sys/types.h> |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
11 |
#include <sys/stat.h> |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
12 |
|
9426
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
13 |
#ifdef _UNICODE |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
14 |
/* Disable unicode for squirrel to allow compilation with MINGW |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
15 |
* and simplify coding for WIN32 (squirrel headers miss a lot of "string" functions) |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
16 |
*/ |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
17 |
#undef _UNICODE |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
18 |
#endif |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
19 |
#include <squirrel.h> |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
20 |
#include "../../squirrel.hpp" |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
21 |
#include "../../squirrel_helper.hpp" |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
22 |
#include "../../squirrel_class.hpp" |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
23 |
#include "../core/ai_factory.hpp" |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
24 |
#include "../core/ai_controller.hpp" |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
25 |
#include "squirrel.hpp" |
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
26 |
|
9425
8eec6d10844a
(svn r9227) [NoAI] -Change: renamed SQUIRREL_CLASS to DEFINE_SQUIRREL_CLASS
truelight
parents:
9424
diff
changeset
|
27 |
/* Convert all AI related classes to Squirrel data */ |
8eec6d10844a
(svn r9227) [NoAI] -Change: renamed SQUIRREL_CLASS to DEFINE_SQUIRREL_CLASS
truelight
parents:
9424
diff
changeset
|
28 |
#define DEFINE_SQUIRREL_CLASS |
9387
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
9386
diff
changeset
|
29 |
#include "../core/ai_base.hpp" |
9407
39201b99bd91
(svn r9204) [NoAI] -Fix r9202: various glitches in Squirrel script/loader
truelight
parents:
9404
diff
changeset
|
30 |
#include "../core/ai_cargo.hpp" |
9426
b90c0d1a36b7
(svn r9229) [NoAI] -Change: move more header-mess from .hpp to .cpp
truelight
parents:
9425
diff
changeset
|
31 |
#include "../core/ai_controller.hpp" |
9387
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
9386
diff
changeset
|
32 |
#include "../core/ai_company.hpp" |
9407
39201b99bd91
(svn r9204) [NoAI] -Fix r9202: various glitches in Squirrel script/loader
truelight
parents:
9404
diff
changeset
|
33 |
#include "../core/ai_industry.hpp" |
9387
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
9386
diff
changeset
|
34 |
#include "../core/ai_map.hpp" |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
9386
diff
changeset
|
35 |
#include "../core/ai_town.hpp" |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
9386
diff
changeset
|
36 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
37 |
static FSquirrel iFSquirrel; ///< Tell the AI-core that we have an AI with which we like to play. |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
38 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
39 |
/** |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
40 |
* Our tiny wrapper between C++ and Squirrel. |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
41 |
*/ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
42 |
class AIFactorySquirrel: public AIFactoryBase { |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
43 |
public: |
9422
33efcc5f1b09
(svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents:
9413
diff
changeset
|
44 |
Squirrel *engine; |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
45 |
HSQOBJECT SQ_instance; |
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
46 |
char *script_name; |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
47 |
|
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
48 |
~AIFactorySquirrel(); |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
49 |
|
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
50 |
/* virtual */ const char *GetAuthor() { return this->engine->CallStringMethod (this->SQ_instance, "GetAuthor"); } |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
51 |
/* virtual */ const char *GetName() { return this->engine->CallStringMethod (this->SQ_instance, "GetName"); } |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
52 |
/* virtual */ const char *GetDescription() { return this->engine->CallStringMethod (this->SQ_instance, "GetDescription"); } |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
53 |
/* virtual */ int GetVersion() { return this->engine->CallIntegerMethod(this->SQ_instance, "GetVersion"); } |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
54 |
/* virtual */ const char *GetDate() { return this->engine->CallStringMethod (this->SQ_instance, "GetDate"); } |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
55 |
/* virtual */ AIController *CreateInstance(); |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
56 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
57 |
/** |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
58 |
* Register Squirrel script to the Factory. |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
59 |
*/ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
60 |
void RegisterSquirrel() { this->RegisterFactory(this->GetName()); } |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
61 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
62 |
/** |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
63 |
* Check if a method exists in the script. |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
64 |
*/ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
65 |
void CheckMethods(AIFactorySquirrel *fbase, SQInteger *res, const char *name); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
66 |
}; |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
67 |
|
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
68 |
AIFactorySquirrel::~AIFactorySquirrel() |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
69 |
{ |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
70 |
free(this->script_name); |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
71 |
} |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
72 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
73 |
void AIFactorySquirrel::CheckMethods(AIFactorySquirrel *fbase, SQInteger *res, const char *name) |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
74 |
{ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
75 |
if (!fbase->engine->MethodExists(fbase->SQ_instance, name)) { |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
76 |
char error[1024]; |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
77 |
snprintf(error, sizeof(error), "Missing method '%s' for FactoryClass", name); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
78 |
fbase->engine->ThrowError(error); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
79 |
*res = SQ_ERROR; |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
80 |
} |
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
81 |
} |
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
82 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
83 |
SQInteger FSquirrel::FactoryConstructor(HSQUIRRELVM vm) |
9385
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
84 |
{ |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
85 |
AIFactorySquirrel *fbase = new AIFactorySquirrel(); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
86 |
SQInteger res = 0; |
9385
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
87 |
|
9422
33efcc5f1b09
(svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents:
9413
diff
changeset
|
88 |
Squirrel::GetInstance(vm, &fbase->SQ_instance); |
33efcc5f1b09
(svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents:
9413
diff
changeset
|
89 |
fbase->engine = ((FSquirrel *)Squirrel::GetGlobalPointer(vm))->engine; |
9385
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
90 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
91 |
/* Check if all needed fields are there */ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
92 |
fbase->CheckMethods(fbase, &res, "GetAuthor"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
93 |
fbase->CheckMethods(fbase, &res, "GetName"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
94 |
fbase->CheckMethods(fbase, &res, "GetDescription"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
95 |
fbase->CheckMethods(fbase, &res, "GetVersion"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
96 |
fbase->CheckMethods(fbase, &res, "GetDate"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
97 |
fbase->CheckMethods(fbase, &res, "CreateInstance"); |
9385
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
98 |
|
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
99 |
/* Abort if one method was missing */ |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
100 |
if (res != 0) return res; |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
101 |
|
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
102 |
fbase->RegisterSquirrel(); |
9422
33efcc5f1b09
(svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents:
9413
diff
changeset
|
103 |
fbase->script_name = strdup(((FSquirrel *)Squirrel::GetGlobalPointer(vm))->current_script); |
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
104 |
|
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
105 |
return 0; |
9385
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
106 |
} |
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
107 |
|
9411
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
108 |
extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
109 |
extern bool FiosIsHiddenFile(const struct dirent *ent); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
110 |
|
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
111 |
|
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
112 |
void FSquirrel::ScanDir(const char *dirname) |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
113 |
{ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
114 |
struct stat sb; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
115 |
struct dirent *dirent; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
116 |
DIR *dir; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
117 |
char d_name[256]; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
118 |
char script_name[256]; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
119 |
dir = ttd_opendir(dirname); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
120 |
/* Dir not found, so do nothing */ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
121 |
if (dir == NULL) return; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
122 |
|
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
123 |
/* Walk all dirs trying to find a dir in which 'main.nut' exists */ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
124 |
while ((dirent = readdir(dir)) != NULL) { |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
125 |
ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name)); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
126 |
|
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
127 |
/* Found file must be directory, but not '.' or '..' */ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
128 |
if (FiosIsValidFile("ai", dirent, &sb) && (sb.st_mode & S_IFDIR) && |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
129 |
(!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) && |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
130 |
strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) { |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
131 |
/* Create the full-length script-name */ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
132 |
strcpy(script_name, dirname); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
133 |
strcat(script_name, PATHSEP); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
134 |
strcat(script_name, d_name); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
135 |
strcat(script_name, PATHSEP); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
136 |
strcat(script_name, "main.nut"); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
137 |
/* If it exists, load it up */ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
138 |
if (FileExists(script_name)) { |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
139 |
DEBUG(ai, 6, "[squirrel] Loading script '%s' for AI handling", script_name); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
140 |
this->current_script = script_name; |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
141 |
this->engine->LoadScript(this->current_script); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
142 |
} |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
143 |
} |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
144 |
} |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
145 |
closedir(dir); |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
146 |
} |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
147 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
148 |
void FSquirrel::Initializer() |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
149 |
{ |
9422
33efcc5f1b09
(svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents:
9413
diff
changeset
|
150 |
this->engine = new Squirrel(); |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
151 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
152 |
/* Create the AIFactory class, and bind the constructor */ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
153 |
this->engine->AddClassBegin("AIFactory"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
154 |
this->engine->AddMethod("constructor", &FSquirrel::FactoryConstructor, 1, "x"); |
9395
4337e022594c
(svn r9187) [NoAI] -Change: renamed SquirrelCore to SquirrelEngine, as it is more
truelight
parents:
9393
diff
changeset
|
155 |
this->engine->AddClassEnd(); |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
156 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
157 |
/* Set a dummy AIController, so script can load */ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
158 |
this->engine->AddClassBegin("AIController"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
159 |
this->engine->AddClassEnd(); |
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
160 |
/* Mark this class as global pointer */ |
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
161 |
this->engine->SetGlobalPointer(this); |
9385
56803dfb2ff6
(svn r9176) [NoAI] -Add: added a RegisterAI() proc, that makes the AI known to the
truelight
parents:
9381
diff
changeset
|
162 |
|
9411
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
163 |
/* Scan the AI dir for scripts */ |
29c9dfcdb8e9
(svn r9209) [NoAI] -Add: added ScanDir(), which scans the 'ai' dir for main.nut scripts
truelight
parents:
9410
diff
changeset
|
164 |
this->ScanDir("ai"); |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
165 |
} |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
166 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
167 |
FSquirrel::~FSquirrel() |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
168 |
{ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
169 |
delete this->engine; |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
170 |
} |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
171 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
172 |
AIController *AIFactorySquirrel::CreateInstance() |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
173 |
{ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
174 |
const char *class_name = this->engine->CallStringMethod(this->SQ_instance, "CreateInstance"); |
9410
286fcd8edc64
(svn r9208) [NoAI] -Add: keep track of which script added which class, so we know
truelight
parents:
9407
diff
changeset
|
175 |
AIControllerSquirrel *controller = new AIControllerSquirrel(this->script_name, class_name); |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
176 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
177 |
return controller; |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
178 |
} |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
179 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
180 |
void AIControllerSquirrel::RegisterClasses() |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
181 |
{ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
182 |
/* Ignore AIFactory if we are really starting an AI */ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
183 |
this->engine->AddClassBegin("AIFactory"); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
184 |
this->engine->AddClassEnd(); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
185 |
|
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
186 |
/* Register all classes */ |
9407
39201b99bd91
(svn r9204) [NoAI] -Fix r9202: various glitches in Squirrel script/loader
truelight
parents:
9404
diff
changeset
|
187 |
SQAIBaseRegister(this->engine); |
39201b99bd91
(svn r9204) [NoAI] -Fix r9202: various glitches in Squirrel script/loader
truelight
parents:
9404
diff
changeset
|
188 |
SQAICargoRegister(this->engine); |
39201b99bd91
(svn r9204) [NoAI] -Fix r9202: various glitches in Squirrel script/loader
truelight
parents:
9404
diff
changeset
|
189 |
SQAICompanyRegister(this->engine); |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
190 |
SQAIControllerRegister(this->engine); |
9407
39201b99bd91
(svn r9204) [NoAI] -Fix r9202: various glitches in Squirrel script/loader
truelight
parents:
9404
diff
changeset
|
191 |
SQAIIndustryRegister(this->engine); |
9396
a05857491d2d
(svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents:
9395
diff
changeset
|
192 |
SQAIMapRegister(this->engine); |
a05857491d2d
(svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents:
9395
diff
changeset
|
193 |
SQAITownRegister(this->engine); |
9387
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
9386
diff
changeset
|
194 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
195 |
this->engine->SetGlobalPointer(this->engine); |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
196 |
} |
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
197 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
198 |
AIControllerSquirrel::AIControllerSquirrel(const char *script, const char *class_name) |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
199 |
{ |
9422
33efcc5f1b09
(svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents:
9413
diff
changeset
|
200 |
this->engine = new Squirrel(); |
9373
d03563181088
(svn r9160) [NoAI] -Add: added AIController for Squirrel; all AIs, C++ or Squirrel, should extend this class
truelight
parents:
9368
diff
changeset
|
201 |
this->RegisterClasses(); |
9395
4337e022594c
(svn r9187) [NoAI] -Change: renamed SquirrelCore to SquirrelEngine, as it is more
truelight
parents:
9393
diff
changeset
|
202 |
this->engine->LoadScript(script); |
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
203 |
/* Create the main-class */ |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
204 |
this->engine->CreateClassInstance(class_name, this, &this->SQ_instance); |
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
205 |
this->engine->CallMethod(this->SQ_instance, "constructor"); |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
206 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
207 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
208 |
AIControllerSquirrel::~AIControllerSquirrel() |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
209 |
{ |
9395
4337e022594c
(svn r9187) [NoAI] -Change: renamed SquirrelCore to SquirrelEngine, as it is more
truelight
parents:
9393
diff
changeset
|
210 |
delete this->engine; |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
211 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
212 |
|
9404
ef9e171617a3
(svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents:
9396
diff
changeset
|
213 |
/* virtual */ void AIControllerSquirrel::GameLoop() |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
214 |
{ |
9395
4337e022594c
(svn r9187) [NoAI] -Change: renamed SquirrelCore to SquirrelEngine, as it is more
truelight
parents:
9393
diff
changeset
|
215 |
this->engine->CallMethod(this->SQ_instance, "GameLoop"); |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
216 |
} |