Hoofdcategorieën
Topicacties

OpenTTD Programmeer Challenge

Pagina: 1 2 3 4 5 last

Reageer Nieuw Topic
Berichten: 17
Reg. datum: 03 mei 2007

De volgende dag kreeg ik een mail erover. Ben er ook geweest. Was gezellig en het was ook koel dat 2 van de ontwikkelaars van openttd er waren (en laten we vooral niet de heerlijke broodjes vergeten ;-)) Viel me wel op dat wij de enige studenten waren van een andere uni dan Delft.
 
De wereld is gek!

Zoals ik afgelopen zaterdag al beloofde, een stukje code dat A* implementeert voor OpenTTD. Geschreven door mijn collega Morloth.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
/**
 * This class will take care of all pathfinding features.
 */

class RoadPathFinding 
{
    road = null;    // We'll use AIRoad to manage building / managing roads
    map = null;    // The map we're currently playing
    
    constructor(maproad) {
        this.map = map;
        this.road = road;
    }

    /**
     * We need functions to calibrate penalties and stuff. We want functions
     * to build the *fastest*, *cheapest*, *optimal throughput*, etc. We aren't
     * allowed to write C++ so we need to script this information :).
     */

    function CreateRoad(roadList);        // Create the best road from start to end
    function GetCostForRoad(roadList);    // Give the cost for the best road from start to end
    function FindFastestRoad(startendallowenceSavingsexcludeListai);
}

/**
 * Store important info about a path we found! :)
 */

class PathInfo
{
    roadList = null;        // List of all road tiles the road needs to follow
    travelDistance = null;        // The total number of squares of road (multipy by 429 to get km)
    speedModifier = null;        // The 'cost' of the road (taking into account all the slopes, etc) 
                    // <-- The average velocity can be calculated by multiplying this value with 
                    // the speed of the vehicle...
    roadCost = null;        // The cost to create this road

    constructor(roadListtravelDistancespeedModifierroadCost) {
        this.roadList = roadList;
        this.travelDistance = travelDistance;
        this.speedModifier = speedModifier;
        this.roadCost = roadCost;
    }
}

/**
 * Create the fastest road from start to end, without altering
 * the landscape. We use the A* pathfinding algorithm. 
 *
 * The allowenceSavings is used to specify how much longer a road 
 * may be if it saves on the costs of building roads. The value 
 * must be between [0..1], 0 meaning NO detour may be made to 
 * lower the costs, 1 means that any means must be exploited to 
 * lower the cost as much as possible (existing roads are 
 * considered to be free).
 */

function RoadPathFinding::CreateRoad(roadListai)
{
    if(roadList == null || roadList.len() < 2)
        return false;

    // Build the entire tile list! :)
    local i = roadList[0];
    local j = roadList[1];

    // Check the initial direction
    local currentDirection = j - i;

    // We want to build entire segments at once. So if our road goes North
    // 5 times we want to build it with one command, instead of calling
    // BuildRoad 5 times (saves time! :)). So we keep track of the direction.
    local direction = null;
    local lastChecked = null;

    /**
     * We use an iterating process. We monitor if each sequential tile
     * heads in the same direction as the previous tile, if not we 
     * construct the road found so far and continue the process in 
     * the new direction.
     */


    // Skip list till we find a tile with an other direction
    for(local a = 2a < roadList.len(); a++)        
    {
        lastChecked = j;
        j = roadList[a];

        // If the road changes direction, create that part of the road
        // and change the direction we're heading
        if(j != lastChecked + currentDirection)
        {
            local result = road.BuildRoad(ilastChecked);


            // You may want to do some fixing if the road couldn't be build.

            // Update new direction information for the next
            // iteration
            currentDirection = j - lastChecked;
            i = lastChecked;
        }
    }

    
    // Build the last part (if any)!
    if(i && j)
        road.BuildRoad(ij);
    
    return true;            
}

/**
 * Plan and check how much it cost to create the fastest route
 * from start to end.
 */

function RoadPathFinding::GetCostForRoad(roadListai)
{
    local test = AITestMode();        // Switch to test mode...

    local accounting = AIAccounting();    // Start counting costs

    this.CreateRoad(roadListai);        // Fake the construction

    return accounting.GetCosts();        // Automatic memory management will kill accounting and testmode! :)
}

/**
 * A* pathfinder to find the fastest path from start to end. The allowenceSavings
 * is used to specify how much longer a road may be if it saves on the costs of
 * building roads. The value must be between [0..1], 1 meaning NO detour may be
 * made to lower the costs, 0 mean that any means must be exploited to lower the
 * cost as much as possible (existing roads are considered to be free).
 * Update X and Y values! :)
 * start and end are always an AIAbstractList.
 * The excludeList contain tiles that mustn't be evaluated during pathfinding.
 */

function RoadPathFinding::FindFastestRoad(startendallowenceSavingsexcludeListai)
{
    // Now, for the interresting part... :)
    // Road can only be build from North to South and from West to East, we
    // use the Manhattan distance as heuristic (faster and as good as squared
    // distance) for our algorithm. Every tile is stored in a priority queue.

    local pq = null;
    local expectedEnd = null;

    // Calculate the central point of the end array
    local x = 0;
    local y = 0;

    for(local i = end.Begin(); end.HasNext(); i = end.Next()) {
        x += AIMap.GetTileX(i);
        y += AIMap.GetTileY(i);
    }

    expectedEnd = AIMap.GetTileIndex(x / end.Count(), y / end.Count());
    print("Found: " + expectedEnd);
    
    // We must also keep track of all tiles we've already processed, we use
    // a table for that purpose.
    local closedList = {};

    // We keep a seperate list for start tiles
    local startList = {};

    if(excludeList
        foreach(val in excludeList)
            closedList[val] <- val;
    
    // Start by constructing a priority queue and by adding all start
    // nodes to it.
    pq = PriorityQueue(start.Count() * 2);
    for(local i = start.Begin(); start.HasNext(); i = start.Next()) {

        // Check if we can actually start here!
        if(!Tile.IsBuildable(i))
            continue;
 
        AISign.BuildSign(i"START");
        local annotatedTile = AnnotatedTile(inull0AIMap.DistanceManhattan(iexpectedEnd), null);
        pq.insert(annotatedTile);
        closedList[i] <- i;
        startList[i] <- i;
        AISign.BuildSign(i"Start");
    }


    // Now with the open and closed list we're ready to do some grinding!!!
    while(pq.nrElements != 0
    {
        local at = pq.remove();

        // Why is this needed!? Don't know but for some reason tiles are put in the priority queue without
        // me wanting it. May want to refactor this code....
        if(closedList.rawin(at.tile) && !startList.rawin(at.tile))
            continue;

        // Check if this is the end already!!
        if(end.HasItem(at.tile)) {

            // Check we can actually end here...
            if(!Tile.IsBuildable(at.tile))
                continue;

            // determine size...
            local tmp = at;
            local tmp_size = 1;
            while(tmp.parentTile != null) {
                tmp = tmp.parentTile;
                tmp_size++;
            }

            // Create the result list
            local resultList = array(tmp_size);
            resultList[0] = at.tile;

            // We want to return a PathInfo object, we need it for later
            // assesments! :)
            local avg_speed = 0;
            local lastDirection = at.direction;

            tmp_size = 1;
            // Construct result list! :)
            while(at.parentTile != null) {
                at = at.parentTile;
                resultList[tmp_size] = at.tile;
                tmp_size++;

                // Check speed,
                // TODO: FIX SLOPES!
                if(lastDirection == at.direction)
                    avg_speed += 1;
                else
                    avg_speed += 0.5;
            }

            return PathInfo(resultListtmp_sizeavg_speed / tmp_sizenull);
        }
        
        // Get all possible tiles from this annotated tile (North, South, West,
        // East) and check if we're already at the end or if new roads are possible
        // from those tiles.
        local directions = Tile.GetTilesAround(at.tilefalsenull);

        // Squirrel doesn't support inline functions? :(
        // Check if we can access those directions and add them to the list! :)
        for(local i = 0i < directions.len(); i++) {

            // Check if we can actually build here and if we haven't checked this
            // tile already. If we've already checked it, we know there is a already
            // faster route to this tile (else it wouldn't have come first).
            if(closedList.rawin(directions[i])) {

                // Don't include tiles we can't build on anyways.
                if(!AITile.IsBuildable(directions[i])) {
                    closedList[directions[i]] <- directions[i];
                }
                continue;
            }

            // Try to build it, slopes or other obstacles may prevent this...
            // TODO: Need NoAI extention to catch WHY a road couldn't be
            // build. (ie. because of vehicles, wrong slopes?)
            if(!AIRoad.AreRoadTilesConnected(at.tiledirections[i]))
            {
                local testAI = AITestMode();
                if(!AIRoad.BuildRoadFull(at.tiledirections[i]) ||
                    !AIRoad.BuildRoadFull(directions[i], at.tile))
                    continue;
            }

            // Calculate the cost for building this road
            /**
             * We want to build roads as straight as possible, because bends slow
             * verhicles down 50%. So they are 2 times as 'expensive' for the
             * heuristic function.
             * TODO: Take slopes into account
             */

            local roadCostFromStart = 0;

            // No direction choosen or we're traveling in the same direction
            if(at.direction == i || at.direction == null)
                roadCostFromStart = 1;
            // We're heading in an other direction so make the cost twice as expensive
            else
                roadCostFromStart = 2;
            
            // If it's a road, we might add a discount! :)
            if(!road.IsRoadTile(directions[i]))
                roadCostFromStart *= 1 + (1 - allowenceSavings);
            roadCostFromStart += at.distanceFromStart;

            // Add the tile to the queue! (remove the * 2 later when we've completed regions! :)
            pq.insert(AnnotatedTile(directions[i], atroadCostFromStartAIMap.DistanceManhattan(directions[i], expectedEnd), i));
        }

        // Done! Don't forget to put at into the closed list
        closedList[at.tile] <- at.tile;
    }

    // Oh oh... No result found :(
    print("No path found!");
    return null;
}

/**
 * Util class to hold a tile and the heuristic value for
 * pathfinding.
 */

class AnnotatedTile 
{
    tile = null;            // Instance of AITile
    parentTile = null;        // Needed for backtracking!
    distanceToEnd = null;        // Distance from this tile to the end tile
    distanceFromStart = null;    // Distance already travelled from start tile
    direction = null;        // Which way is this road going to?

    // A Tile is 429km on a side :)

    constructor(tileparentTiledistanceFromStartdistanceToEnddirection)
    {
        this.tile = tile;
        this.parentTile = parentTile;
        this.distanceFromStart = distanceFromStart;
        this.distanceToEnd = distanceToEnd;
        this.direction = direction;
    }

    function getHeuristic() {
        return distanceToEnd + distanceFromStart;
    }
}

Hij heeft e.a. ook toegelicht op devs.openttd.org. Let wel, er wordt geen rekening gehouden met heuvels/hellingen.

Ik probeer deze week ook nog een geschreven samenvatting te geven van m'n verhaaltje van afgelopen zaterdag. Maar eerst moet er weer gewerkt worden.

while (me.Alive) {
me.KickAss();
}

Berichten: 17
Reg. datum: 08 februari 2006

quote:
Horeamus schreef op zondag 08 juni 2008 @ 10:03:
(..)

Viel me wel op dat wij de enige studenten waren van een andere uni dan Delft.
ik ga ook meedoen en op het moment dat ik besloot mee te doen nog net student in Utrecht (nu afgestudeerd), telt dat ook? ;)


weet iemand hoe je in het noai framework iets kunt wegschrijven naar/uitlezen van een bestand? Ik kon het nergens vinden, en evenmin in squirrel zelf.
 
De wereld is gek!

quote:
wilcomoerman schreef op maandag 09 juni 2008 @ 16:50:
weet iemand hoe je in het noai framework iets kunt wegschrijven naar/uitlezen van een bestand?
Wellicht dat je het hier kan vinden: Squirrel Library: 2. The Input/Output library.

while (me.Alive) {
me.KickAss();
}

Berichten: 17
Reg. datum: 08 februari 2006

quote:
had ik al naar gekeken, maar ik kwam er niet echt uit. Volgens iemand op het ottd forum heeft het NOAI framework geen file io. (zie hier)


wat ik me afvroeg, is of 10 spel-jaren niet wat kort is? Met zo'n korte periode hoef je je bv. niet druk te maken over vervanging van voertuigen.

wilcomoerman wijzigde dit bericht 10-06-2008 14:11 (13%)

 
Berichten: 17
Reg. datum: 03 mei 2007

Dat was volgens mij juist een van de redenen om er voor te kiezen om een spel 10 jaar te laten duren :-)

Wat ik mij eigenlijk afvraag is of je wel naar bestanden mag schrijven/lezen volgens de regels van de challenge. Valt dat (het lezen iig) dan niet onder het gebruik maken van externe resources?

En ja, wat mij betreft telt dat ook als UU. Jeuj :p Kijken of we delft kunnen verslaan

Horeamus wijzigde dit bericht 12-06-2008 11:35 (13%)

 
Berichten: 17
Reg. datum: 08 februari 2006

quote:
Horeamus schreef op donderdag 12 juni 2008 @ 11:33:
Dat was volgens mij juist een van de redenen om er voor te kiezen om een spel 10 jaar te laten duren :-)
ja, dat bedacht ik me later ook..scheelt een hoop werk. (Nu maar hopen dat de leiding niet ineens op verkeerde gedachten gebracht is :-) )
quote:
Wat ik mij eigenlijk afvraag is of je wel naar bestanden mag schrijven/lezen volgens de regels van de challenge. Valt dat (het lezen iig) dan niet onder het gebruik maken van externe resources?
ik heb het niet nodig tijdens de challenge, maar voor die tijd, om het ontwikkelen te vergemakkelijken. Tijdens de challenge kan ik alles wat ik nodig heb gewoon in m'n AI source code zetten. Zo kan je bv. een look-up tabel eerst genereren en dan copy-pasten naar je code, om maar een voorbeeld te noemen.
quote:
En ja, wat mij betreft telt dat ook als UU. Jeuj :p Kijken of we delft kunnen verslaan
mooi, ik zie uit naar de overwinning 8)

(ik laat tactisch in het midden wiens overwinning)

als jullie ook studenten zijn uit Utrecht, dan ken ik jullie wellicht. Wat studeren jullie, en waar?

wilcomoerman wijzigde dit bericht 12-06-2008 15:46 (8%)

 
Berichten: 17
Reg. datum: 03 mei 2007

Beiden informatica aan de UU. Ook beiden eerstejaars dus denk eerlijk gezegd dat je ons niet kent ;-)
 
Berichten: 17
Reg. datum: 08 februari 2006

quote:
Horeamus schreef op donderdag 12 juni 2008 @ 21:41:
Beiden informatica aan de UU. Ook beiden eerstejaars dus denk eerlijk gezegd dat je ons niet kent ;-)
nee, inderdaad niet. Ik ben net afgestudeerd CKI'er
 
quote:
wilcomoerman schreef op dinsdag 10 juni 2008 @ 14:08:
[...]


had ik al naar gekeken, maar ik kwam er niet echt uit. Volgens iemand op het ottd forum heeft het NOAI framework geen file io. (zie hier)
Het is niet mogelijk om in het bestaande framework van NoAI library functies aan te roepen van Squirrel. Want om dit te kunnen doen moeten deze libraries in de VM geladen worden en dat gebeurd momenteel niet. De functie waar het om gaat is 'sqstd_register_iolib', maar gezien dit een open source project is en jullie uitstekende programmeurs kunnen jullie dit natuurlijk zelf inbouwen als jullie deze functionaliteit nodig hebben tijdens de ontwikkelfase (vergeet deze echter niet eruit te slopen, het is een beetje jammer als je AI in de eerst 10 seconden zelfmoord pleegt ;)).

Succes!
- Bram
 
Berichten: 17
Reg. datum: 08 februari 2006

quote:
_Morloth_ schreef op zondag 15 juni 2008 @ 11:40:
[...]


Het is niet mogelijk om in het bestaande framework van NoAI library functies aan te roepen van Squirrel. Want om dit te kunnen doen moeten deze libraries in de VM geladen worden en dat gebeurd momenteel niet. De functie waar het om gaat is 'sqstd_register_iolib', maar gezien dit een open source project is en jullie uitstekende programmeurs kunnen jullie dit natuurlijk zelf inbouwen als jullie deze functionaliteit nodig hebben tijdens de ontwikkelfase
ik ben niet zo'n C-held en zie het ook niet zo zitten om helemaal in de noai code te duiken, maar ik heb al een andere --zeer cratieve-- omweg gevonden m.b.v. Java.

Maar nu loop ik tegen het maffe probleem aan, dat elke willekeurige AI (bv. de standaard "wrightai") crasht als ik "reload AI" indruk. Op het openttd forum zijn ze er nog niet helemaal over uit waar het nu precies door komt, helaas (http://www.tt-forums.net/viewtopic.php?f=65&t=37947). En het gekste is, dat juist de binaries die gemaakt waren om het probleem te onderzoeken, nu juist net niet de crash opleveren.
quote:
(vergeet deze echter niet eruit te slopen, het is een beetje jammer als je AI in de eerst 10 seconden zelfmoord pleegt ;)).
If I'm going out, I'm going out with style :)

een heel andere vraag: er komt steeds meer voorbeeldmateriaal beschikbaar (zoals Convoy en wrightai en de recent toegevoegde libraries). Hoe zit het met het gebruiken van die code? Gelden Convoy en WrightAI als materiaal dat je gewoon kan gebruiken in de tjip-wedstrijd?
 
quote:
wilcomoerman schreef op zondag 15 juni 2008 @ 12:18:
[...]


ik ben niet zo'n C-held en zie het ook niet zo zitten om helemaal in de noai code te duiken, maar ik heb al een andere --zeer cratieve-- omweg gevonden m.b.v. Java.
Hmmz... klinkt interessant, hoe heb je dat opgelost dan als ik vragen mag? :)
quote:
Maar nu loop ik tegen het maffe probleem aan, dat elke willekeurige AI (bv. de standaard "wrightai") crasht als ik "reload AI" indruk. Op het openttd forum zijn ze er nog niet helemaal over uit waar het nu precies door komt, helaas (http://www.tt-forums.net/viewtopic.php?f=65&t=37947). En het gekste is, dat juist de binaries die gemaakt waren om het probleem te onderzoeken, nu juist net niet de crash opleveren.
Geen idee wat hier gaande is, ik ben momenteel op vakantie dus ben bang dat ik volgende week pas weer up-to-date ben met de laatste gang van zaken.
quote:
een heel andere vraag: er komt steeds meer voorbeeldmateriaal beschikbaar (zoals Convoy en wrightai en de recent toegevoegde libraries). Hoe zit het met het gebruiken van die code? Gelden Convoy en WrightAI als materiaal dat je gewoon kan gebruiken in de tjip-wedstrijd?
Waarom niet? Al deze code valt onder de GPL licentie dus wie zijn wij om dat te verbieden? ;)
 
Berichten: 17
Reg. datum: 08 februari 2006

quote:
_Morloth_ schreef op donderdag 19 juni 2008 @ 11:09:
[...]

Hmmz... klinkt interessant, hoe heb je dat opgelost dan als ik vragen mag? :)
na de wedstrijd vertel ik je al de geheimen van mijn code 8)
quote:
[...]

Waarom niet? Al deze code valt onder de GPL licentie dus wie zijn wij om dat te verbieden? ;)
da's mooi.
 
Berichten: 333
Reg. datum: 23 november 2001

Lijkt mij leuk om mee te doen, alhoewel ik hier weinig kaas van gegeten heb. Ik ben een beetje bezig om te verkennen hoe je het beste een bedrijf op kan bouwen met alleen maar vrachtwagens/bussen.

the more you drink, the wc

De wereld is gek!

FAQ toegevoegd.

Verder belooft een kort verslagje van mijn bevindingen tijden de kick-off. Ik vond het gezellig! het was idd leuk dat er twee OpenTTD (NoAI) developers waren.

Zelf hield ik een presentatie:
quote:
  1. OpenTTD, olé, olé
    • Clone van Transport Tycoon Deluxe
    • Grotere kaarten
    • Multiplayer mode (LAN & internet)
    • Betere/krachtigere pathfinding
    • Betere gameplay
    • Extra graphics
    • Het NoAI-Framework
  2. Transport Tycoon for Dummies
    • Een zeer beknopte introductie (..)
  3. Slimme jongens, die computers - Sterke & zwakke punten
    • Rekenkracht (+)
    • Consequent (+)
    • Perfect geheugen (+)
    • Onbenullig (-)
    • Voorspelbaar (-)
    • Leercurve (-)
  4. Van A naar B(eter)
    • A*
    • Dijkstra’s algorithme e.a.
    • Penalties
    • Aanleg
    • Reistijd
  5. Big brother is watching you
    • Wat is er gaande
    • Resources
    • Opponenten
    • Subsidies
    • Routes
    • Voertuigen
    • Cashflow
  6. Regeren is vooruitzien
    • Wat doe je wel en wat niet
    • Onderhoud voertuigen
    • Tegenstanders blocken
    • Nieuwe routes
    • Aflossen schuld
De liefhebbers kan ik de daadwerkelijke PP wel doen toekomen. Moraal van het verhaal: Zorg dat je een goede PathFinder gebruikt. Ga niet het wiel opnieuw zitten uitvinden, er zijn genoeg goede implementaties. De crux zit hem in het waarderen van de mogelijkheden en het kiezen welke daarvan uitgevoerd dienen te worden. Sommige combinaties leveren 'extra' op, andere juist minder.

Volgende week ga ik zelf ook maar eens aan de implemantatie van NoCab werken.

while (me.Alive) {
me.KickAss();
}

Berichten: 17
Reg. datum: 08 februari 2006

ik zag op het openTTD forum iemand spreken over trams. Ik wist niet dat die in openTTD zaten, en heb eigenlijk ook geen idee hoe je die tevoorschijn tovert.

Mogen trams wel of niet meedoen bij de TJIP wedstrijd?
 
quote:
wilcomoerman schreef op vrijdag 20 juni 2008 @ 18:16:
ik zag op het openTTD forum iemand spreken over trams. Ik wist niet dat die in openTTD zaten, en heb eigenlijk ook geen idee hoe je die tevoorschijn tovert.

Mogen trams wel of niet meedoen bij de TJIP wedstrijd?
Zit ook niet standaard in OpenTTD. Mensen kunnen eigen dingen maken op het NewGRF systeem ofzo en daar zijn trams voor gemaakt.
Ruud Ruudjah = new Ruudjah();
Berichten: 1.650
Reg. datum: 24 november 1999

quote:
Zit ook niet standaard in OpenTTD. Mensen kunnen eigen dingen maken op het NewGRF systeem ofzo en daar zijn trams voor gemaakt.
Vanaf 0.6 wel. Je kan trams bouwen (mits de server dat toestaat) door de wegenbouw knop ingedrukt te houden. Net als je dat doet bij rail, lectrified, monorail en maglev.

Note dat trams allemaal een ro-ro (roll on, roll off) station nodig hebben, en niet kunnen werken met 'eindstations'. Dat kan bij bussen en treinen wel.

Ruudjah wijzigde dit bericht 20-06-2008 20:34 (20%)

Compile error: circular reflection detected | TweakBlog

Berichten: 17
Reg. datum: 08 februari 2006

quote:
Ruudjah schreef op vrijdag 20 juni 2008 @ 20:33:
[...]

Vanaf 0.6 wel. Je kan trams bouwen (mits de server dat toestaat) door de wegenbouw knop ingedrukt te houden. Net als je dat doet bij rail, lectrified, monorail en maglev.
In dat geval is het even de vraag of ze wel of niet meedoen in de wedstrijd?
 
Berichten: 81
Reg. datum: 05 februari 2006

quote:
wilcomoerman schreef op zaterdag 21 juni 2008 @ 13:55:
[...]


In dat geval is het even de vraag of ze wel of niet meedoen in de wedstrijd?
Er mogen uitsluitend wegen gebouwd worden. Gebruik van (tram)rails en boeien is niet toegestaan.
 
De wereld is gek!

Los van of het zou mogen, kan het niet. NoAI ondersteund geen treinen, laat staan trams.

while (me.Alive) {
me.KickAss();
}

Berichten: 81
Reg. datum: 05 februari 2006

quote:
Corniel schreef op maandag 23 juni 2008 @ 14:40:
Los van of het zou mogen, kan het niet. NoAI ondersteund geen treinen, laat staan trams.
NoAI ondersteund gewoon trams. Treinen worden nog niet ondersteund, maar zullen wel worden toegevoegd in de toekomst.
 
Berichten: 1.112
Reg. datum: 31 oktober 2004

Als jullie testen gaan jullie dan ook flimpjes er van maken? Zal wel leuk zijn om te zien hoe goed het gaat. En hoeveel teams doen er aan mee?
 
De wereld is gek!

Natuurlijk gaan treinen ondersteund worden, maar de ontwikkelaars verwachten niet dat dát op korte termijn gaat lukken. (Het is namelijk zeer complex om een trein te laten rijden ivm seinen e.d.)

En de reden dat we nu alleen oto's doen is omdat schepen en vliegtuigen te 'makkelijk' zijn, en veel meer winst genereren.

En die fimpjes, dat lag wel in de bedoeling.

Corniel wijzigde dit bericht 23-06-2008 15:25 (22%)

while (me.Alive) {
me.KickAss();
}

quote:
wilcomoerman schreef op vrijdag 20 juni 2008 @ 13:05:
[...]


na de wedstrijd vertel ik je al de geheimen van mijn code 8)


[...]


da's mooi.
Voor hen die nog wel behoefte hebben aan IO functionaliteit in Squirrel: kijk niet verder dan op deze pagina:

http://devs.openttd.org/~noai/morloth/samples/squirrel_io/

Ik heb er ook een voorbeeld bij geschreven dat 5 integers in een bestand zet en vervolgens weer uit leest.

Note: Nogmaals, wees er zeker van dat er geen IO code achterblijft in je uiteindelijke oplossing!

Succes!
 

Pagina: 1 2 3 4 5 last



VNU Media logo Powered by True

© 1998 - 2009 Tweakers.net - Alle rechten voorbehouden - Uw Privacy - Algemene Voorwaarden

Uitgever van: