|
|
1.1 root 1: BUILD engine Notes (7/20/95):
2:
3: ���������������������������������������������������������������������������Ŀ
4: � IMPORTANT ENGINE FUNCTIONS: �
5: �����������������������������������������������������������������������������
6:
7: initengine(char vidoption, long xdim, long ydim)
8: Sets up interrupt vectors for keyboard, and initializes many variables
9: for the BUILD engine. You should call this once before any other
10: functions of the BUILD engine are used.
11:
12: vidoption can be anywhere from 0-6
13: xdim,ydim can be any mode x resolution if vidoption = 0
14: xdim,ydim can be any vesa resolution if vidoption = 1
15: xdim,ydim must be 320*200 for any other mode.
16: (see graphics mode selection in my setup program)
17: uninitengine();
18: Restores interrupt vectors for keyboard and timer, and frees
19: buffers. You should call this once at the end of the program
20: before quitting to dos.
21: loadboard(char *filename, long *posx, long *posy, long *posz, short *ang, short *cursectnum)
22: Loads the given board file into memory for the BUILD engine.
23: Returns -1 if file not found. If no extension is given, .MAP will
24: be appended to the filename.
25: saveboard(char *filename, long *posx, long *posy, long *posz, short *ang, short *cursectnum)
26: Saves the given board from memory inro the specified filename.
27: Returns -1 if unable to save. If no extension is given, .MAP will
28: be appended to the filename.
29: loadpics(char *filename);
30: Loads the given artwork file into memory for the BUILD engine.
31: Returns -1 if file not found. If no extension is given, .ART will
32: be appended to the filename.
33: setgamemode();
34: This function sets the video mode to 320*200*256color graphics.
35: Since BUILD supports several different modes including mode x,
36: mode 13h, and other special modes, I don't expect you to write
37: any graphics output functions. (Soon I have all the necessary
38: functions) If for some reason, you use your own graphics mode,
39: you must call this function again before using the BUILD drawing
40: functions.
41:
42: drawrooms(long posx, long posy, long posz, short ang, long horiz, short cursectnum)
43: This function draws the 3D screen to the current drawing page,
44: which is not yet shown. This way, you can overwrite some things
45: over the 3D screen such as a gun. Be sure to call the drawmasks()
46: function soon after you call the drawrooms() function. To view
47: the screen, use the nextpage() function. The nextpage() function
48: should always be called sometime after each draw3dscreen()
49: function.
50: drawmasks();
51: This function draws all the sprites and masked walls to the current
52: drawing page which is not yet shown. The reason I have the drawing
53: split up into these 2 routines is so you can animate just the
54: sprites that are about to be drawn instead of having to animate
55: all the sprites on the whole board. Drawrooms() prepares these
56: variables: spritex[], spritey[], spritepicnum[], thesprite[],
57: and spritesortcnt. Spritesortcnt is the number of sprites about
58: to be drawn to the page. To change the sprite's picnum, simply
59: modify the spritepicnum array If you want to change other parts
60: of the sprite structure, then you can use the thesprite array to
61: get an index to the actual sprite number.
62:
63: engineinput();
64: This function allows the engine to adjust your position depending
65: on the status of the arrow keys, and other control keys. It
66: handles timing and clipping.
67: nextpage();
68: After a screen is prepared, use this function to view the screen.
69:
70: draw2dscreen(long posxe, long posye, short ange, long zoome,
71: short gride)
72: Draws the 2d screen - this function is a direct replacement
73: for the drawrooms() and drawmasks() functions. Be sure
74: to call either qsetmode640350() or qsetmode640480()
75: first. When switching back to 3d mode, be sure to call
76: qsetmode320200().
77: IMPORTANT NOTES:
78: 1. The overwritesprite function should only be called in
79: 3D mode. If you do this in 2D mode, junk will be
80: written to the 2D screen and a crash is possible.
81: 2. When you switch back to 3D mode, you should call the
82: permanentwritesprite functions to draw the status bar,
83: or whatever else you have to draw.
84: 3. You must call the nextpage() function in both 2D and
85: 3D modes.
86: qsetmode320200();
87: Set to the game mode and load palette (320*200*256)
88: qsetmode640350();
89: Set to the 2D map mode #1 (640*350*16)
90: qsetmode640480();
91: Set to the 2D map mode #2 (640*480*16)
92:
93: doanimations(long numtics);
94: This function animates anything you use setanimation for (like doors).
95: You should call it for every frame. Pass the number of tics (lockspeed)
96: as a parameter to it to tell how much everything should animate.
97:
98: kenchaintimer(void (__interrupt __far *datimerchainaddress)(),
99: short dachainpersecond)
100: This function makes the engine's timerhandler chain to another timer
101: handler at any specified interrupt rate. This function forces IRQ0 to
102: point to my engine's timerhandler. Clockspeed and totalclock will
103: be fixed at counting 120 per second regardless of the chaining interrupt
104: rate. If you call this function with a NULL pointer, then the engine's
105: timerhandler will not chain anymore.
106:
107: Here's how you should structure your code if you use this function:
108:
109: main()
110: {
111: initengine();
112:
113: musicon(); //Turn music on after engine
114: kenchaintimer(yourtimerhandleraddress,yourtimerrate);
115: //When IRQ0 goes off, it will now go to
116: //Ken's timer handler. Then, Ken's timer
117: (main loop) //handler will make yourtimerhandler
118: //interrupt yourtimerrate times per second
119:
120: kenchaintimer(0,0); //Stop chaining BEFORE music handler dies!
121: musicoff();
122:
123: uninitengine();
124: }
125:
126: ���������������������������������������������������������������������������Ŀ
127: � OTHER ENGINE FUNCTIONS: �
128: �����������������������������������������������������������������������������
129:
130: overwritesprite (long thex, long they, short tilenum,
131: signed char shade, char orientation, char dapalnum)
132:
133: Use this function to draw any sprites that must be drawn to the screen
134: for every single frame, such as a gun or a menu system.
135:
136: If Bit 0 of orientation = 0: (thex, they) is top-left corner
137: If Bit 0 of orientation = 1: (thex, they) is middle
138: If Bit 1 of orientation = 0: no relation to viewing window
139: If Bit 1 of orientation = 1: scale and clip to viewing window
140: If Bit 2 of orientation = 0: normal
141: If Bit 2 of orientation = 1: 50/50 transluscent!
142: If Bit 3 of orientation = 0: normal
143: If Bit 3 of orientation = 1: x-flipped
144: If Bit 4 of orientation = 0: normal
145: If Bit 4 of orientation = 1: y-flipped
146:
147: * If it works at full screen, simply set bit 1 of orientation
148: to 1, and it should automatically scale properly!
149:
150: Use this function to write sprites over the 3d view. For example,
151: you can make a menu system with this function. Be sure
152: that you call this function for every single frame after the 3d
153: view is drawn or else it will be flashed on for only 1 frame.
154: If you want x and y to be the top left corner, set the orientation
155: to 0. If you want x and y to be the middle of the sprite, set the
156: orientation to 1. The reason I included the orienation = 1 option
157: is so that if you want a sprite centered and the size of the tile
158: changes, you don't need to recompile and guess where the new top
159: left corner is. Oh yeah, and I forget to mention that if shade is
160: greater than 32, than overwritesprite does transluscence. (Try it
161: out!) This function will clip the sprite to the startumost and
162: startdmost arrays. Dapalnum refers to a palette lookup list
163: (normally 0).
164:
165: rotatesprite(long sx, long sy, long z, short a, short picnum,
166: signed char dashade, char dapalnum, char dastat)
167: (sx, sy) is the center of the sprite to draw defined as
168: screen coordinates shifted up by 16.
169: (z) is the zoom. Normal size is 65536.
170: Ex: 131072 is zoomed in 2X and 32768 is zoomed out 2X.
171: (a) is the angle (0 is straight up)
172: (picnum) is the tile number
173: if ((dastat&1) == 0) - no transluscence
174: if ((dastat&1) != 0) - transluscence
175: if ((dastat&2) == 0) - don't scale to viewing window
176: if ((dastat&2) != 0) - scale to viewing window
177: if ((dastat&4) == 0) - nuttin' special
178: if ((dastat&4) != 0) - x-flip image
179: if ((dastat&8) == 0) - clip to startumost/startdmost
180: if ((dastat&8) != 0) - don't clip to startumost/startdmost
181:
182: Ex: rotatesprite(160L<<16,100L<<16,65536,totalclock<<4,DEMOSIGN,2);
183: This example will draw the DEMOSIGN tile in the center of the
184: screen and rotate about once per second.
185:
186: permanentwritesprite (long thex, long they, short tilenum, signed char shade,
187: long cx1, long cy1, long cx2, long cy2, char dapalnum)
188: - Added permanentwritesprite function for status bars or other
189: sections of the screen that will not be overwritten by the
190: engine. The format of this function is like overwritesprite
191: except that the x and y are always top left corner, no
192: orientation variable, and no translucence.
193: The 4 last parameters (cx1, cy1) - (cx2, cy2) define a
194: rectangular clipping window of where permanentwritesprite
195: can draw to. Dapalnum refers to a palette lookup list
196: (normally 0).
197:
198: printext(long x, long y, char buffer[42], short tilenum, char invisiblecol);
199: Use this function to print text anywhere on the screen from a font
200: that you can create in EDITART. Please see my example font in
201: TILES.ART to see how I lay out the user-defined font. X ranges
202: from 0-319. Y ranges from 0-199. The buffer is the string to
203: print. Tilenum specifies which font to use. Invisiblecol tells
204: printext what color to draw the transparent pixels. If
205: invisiblecol is 255 then the transpararent pixels are still
206: transparent.
207: printnum(long x, long y, long num, short tilenum, char invisiblecol);
208: Printnum is a function call that will print a long integer (num)
209: starting at top left corner x, y. Please look at the documentation
210: for printext, since internally, printnum simply prepares a buffer
211: and calls the printext function.
212:
213: setvmode(long videomode);
214: If you look at the top of GAME.C, you will see something like this:
215: #pragma aux setvmode =\... This is how you do in-line assembler in
216: WATCOM C. All this function is doing is setting the video mode.
217: showengineinfo();
218: Use this function after setting to text mode to view some statics
219: about the engine, such as frame rate.
220: resettiming();
221: Resets timing, such as setting totalclock = 0. Also resets other
222: timers. This is for use with the showengineinfo function above.
223:
224: ksqrt(long num); returns (long)square root
225: A square root function optimized for integers. Use this function
226: only if you want to.
227: krand()
228: This simply returns a random number. You can easily set the random
229: seed by externing the randomseed variable as a long. This is useful
230: for keeping the random seed the same on multiple computers when playing
231: multi-player mode.
232:
233: getangle(long xvect,long yvect); returns (short)angle;
234: Use this function call to determine the angle between two points.
235: For example, if you want a monster to shoot a bullet towards you,
236: you would get the bullet's angle this way:
237: sprite[bullet].ang = getangle(posx-sprite[monst].x,posy-sprite[monst].y);
238:
239: lastwall(short point);
240: Use this function as a reverse function of wall[].point2. In order
241: to save memory, my walls are only on a single linked list.
242:
243: rotatepoint(long xpivot, long ypivot, long x, long y,
244: short daang, long *x2, long *y2);
245: This function is a very convenient and fast math helper function.
246: Rotate points easily with this function without having to juggle your
247: cosines and sines. Simply pass it:
248:
249: Input: 1. Pivot point (xpivot,ypivot)
250: 2. Original point (x,y)
251: 3. Angle to rotate (0 = nothing, 512 = 90� CW, etc.)
252: Output: 4. Rotated point (*x2,*y2)
253:
254: clipmove(long *x, long *y, long *z, short *sectnum, long xvect, long yvect,
255: long walldist, long ceildist, long flordist, char cliptype)
256: Moves any object (x, y, z) in any direction at any velocity and will
257: make sure the object will stay a certain distance from walls (walldist)
258: Pass the pointers of the starting position (x, y, z). Then
259: pass the starting position's sector number as a pointer also.
260: Also these values will be modified accordingly. Pass the
261: direction and velocity by using a vector (xvect, yvect).
262: If you don't fully understand these equations, please call me.
263: xvect = velocity * cos(angle)
264: yvect = velocity * sin(angle)
265: Walldist tells how close the object can get to a wall. I use
266: 128L as my default. If you increase walldist all of a sudden
267: for a certain object, the object might leak through a wall, so
268: don't do that!
269: If cliptype is 0, then the clipping is normal (Use 0 to clip you
270: and monsters). If the cliptype is 1, then the object is clipped to
271: the same things that hitscan is clipped to (use 1 for all bullets).
272:
273: Clipmove can either return 0 (touched nothing)
274: 32768+wallnum (wall first touched)
275: 49152+spritenum (sprite first touched)
276:
277: getzrange(long x, long y, long z, short sectnum,
278: long *ceilz, long *ceilhit,
279: long *florz, long *florhit,
280: long walldist, char cliptype)
281:
282: Use this in conjunction with clipmove. This function will keep the
283: player from falling off cliffs when you're too close to the edge. This
284: function finds the highest and lowest z coordinates that your clipping
285: BOX can get to. It must search for all sectors (and sprites) that go
286: into your clipping box. This method is better than using
287: sector[cursectnum].ceilingz and sector[cursectnum].floorz because this
288: searches the whole clipping box for objects, not just 1 point.
289: Pass x, y, z, sector normally. Walldist can be 128. Cliptype can be
290: 0, 1, or 2. (just like movesprite and clipmove) This function returns
291: the z extents in ceilz and florz. It will return the object hit in ceilhit
292: and florhit.
293: Ceilhit and florhit will also be either:
294: 16384+sector (sector first touched) or
295: 49152+spritenum (sprite first touched)
296:
297: updatesector(long x, long y, §num);
298: This function updates the sector number according to the x and y values
299: passed to it. Be careful when you use this function with sprites because
300: remember that the sprite's sector number should not be modified directly.
301: If you want to update a sprite's sector, I recomment using the setsprite
302: function described below.
303:
304: inside(long x, long y, short sectnum);
305: Tests to see whether the overhead point (x, y) is inside sector (sectnum)
306: Returns either 0 or 1, where 1 means it is inside, and 0 means it is not.
307:
308: copytilepiece(long tilenume1, long sourcex1, long sourcey1,
309: long xsiz, long ysiz,
310: long tilenume2, long destx1, long desty1)
311:
312: This function simply copies any section of a source tile
313: to any part of a destination tile. It will automatically
314: skip transparent pixels. It will wrap-around in the
315: source but not the destination. If for some reason
316: the destination tile gets removed from the cache, the
317: destination tile will be reset to original form. This
318: is why I had to add this second function:
319:
320: allocatepermanenttile(short tilenume, long xsiz, long ysiz)
321: This function allocates a place on the cache as permanent.
322: Right now, I reset the cache every time you call this
323: function so I would recommend calling this function
324: right after loadpics.
325:
326: makepalookup(long palnum, char *remapbuf,
327: signed char r, signed char g, signed char b,
328: char dastat)
329: This function allows different shirt colors for sprites. First prepare
330: remapbuf, which is a 256 byte buffer of chars which the colors to remap.
331: Palnum can be anywhere from 1-15. Since 0 is where the normal palette is
332: stored, it is a bad idea to call this function with palnum=0.
333: In BUILD.H notice I added a new variable, spritepal[MAXSPRITES].
334: Usually the value of this is 0 for the default palette. But if you
335: change it to the palnum in the code between drawrooms() and drawmasks
336: then the sprite will be drawn with that remapped palette. The last 3
337: parameters are the color that the palette fades to as you get further
338: away. This color is normally black (0,0,0). White would be (63,63,63).
339: if ((dastat&1) == 0) then makepalookup will allocate & deallocate
340: the memory block for use but will not waste the time creating a palookup
341: table (assuming you will create one yourself)
342:
343: copytilepiece(long walnume1, long x1, long y1, long xsiz, long ysiz,
344: long walnume2, long x2, long y2, char shadeoffs);
345: Copies section of tile 1 (walnume1) with top-left corner (x1,y1) and
346: rectangular size (xsiz, ysiz) to top-left corner (x2, y2) of tile 2
347: (walnume). You can animate tiles with this function. For example, with
348: this function, you can make a slot machine like in Ken's Labyrinth or an
349: electronic sign with text sliding from right to left.
350:
351: loadtile(short tilenume);
352: This function will load the tile, tilenum, into the artwork cache. A
353: tile is not in the cache if (waloff[tilenum] == -1). If
354: (waloff[tilenum] >= 0) then it is in the cache, and you don't need to call
355: this function.
356:
357: precache();
358: This function will go through the tilenums of all sectors, walls, and
359: sprites and call loadtile() on them. This function will not cache in some
360: tiles of animations since their tilenums may not all be in the structures.
361:
362: hitscan(long xstart, long ystart, long zstart, short startsectnum,
363: long vectorx, long vectory, long vectorz,
364: short *hitsect, short *hitwall, short *hitsprite,
365: long *hitx, long *hity, long *hitz);
366:
367: Pass the starting 3D position:
368: (xstart, ystart, zstart, startsectnum)
369: Then pass the 3D angle to shoot (defined as a 3D vector):
370: (vectorx, vectory, vectorz)
371: Then set up the return values for the object hit:
372: (hitsect, hitwall, hitsprite)
373: and the exact 3D point where the ray hits:
374: (hitx, hity, hitz)
375:
376: How to determine what was hit:
377: * Hitsect is always equal to the sector that was hit (always >= 0).
378:
379: * If the ray hits a sprite then:
380: hitsect = thesectornumber
381: hitsprite = thespritenumber
382: hitwall = -1
383:
384: * If the ray hits a wall then:
385: hitsect = thesectornumber
386: hitsprite = -1
387: hitwall = thewallnumber
388:
389: * If the ray hits the ceiling of a sector then:
390: hitsect = thesectornumber
391: hitsprite = -1
392: hitwall = -1
393: vectorz < 0
394: (If vectorz < 0 then you're shooting upward which means
395: that you couldn't have hit a floor)
396:
397: * If the ray hits the floor of a sector then:
398: hitsect = thesectornumber
399: hitsprite = -1
400: hitwall = -1
401: vectorz > 0
402: (If vectorz > 0 then you're shooting downard which means
403: that you couldn't have hit a ceiling)
404:
405: neartag(long x, long y, long z, short sectnum, short ang, //Starting position & angle
406: short *neartagsector, //Returns near sector if sector[].tag != 0
407: short *neartagwall, //Returns near wall if wall[].tag != 0
408: short *neartagsprite, //Returns near sprite if sprite[].tag != 0
409: long *neartaghitdist, //Returns actual distance to object (scale: 1024=largest grid size)
410: long neartagrange, //Choose maximum distance to scan (scale: 1024=largest grid size)
411: char tagsearch) //1-lotag only, 2-hitag only, 3-lotag&hitag
412: Neartag works sort of like hitscan, but is optimized to
413: scan only close objects and scan only objects with
414: tags != 0. Neartag is perfect for the first line of your space bar code.
415: It will tell you what door you want to open or what switch you want to
416: flip.
417:
418: cansee(long x1, long y1, long z1, short sectnum1,
419: long x2, long y2, long z2, short sectnum2); returns 0 or 1
420: This function determines whether or not two 3D points can "see" each
421: other or not. All you do is pass it the coordinates of a 3D line defined
422: by two 3D points (with their respective sectors) The function will return
423: a 1 if the points can see each other or a 0 if there is something blocking
424: the two points from seeing each other. This is how I determine whether a
425: monster can see you or not. Try playing DOOM1.DAT to fully enjoy this
426: great function!
427:
428: setanimation(long *animptr, long thegoal, long thevel);
429: This is a function for your convenience that will animate a long
430: variable, such as sector[].floorz for platforms, or sector[].ceilingz
431: for doors. All you do is pass it the long pointer into memory, specifying
432: which long variable is to be animated; you also pass the goal (long value
433: to animate towards), and the velocity at which the variable is animated.
434: Velocity = 128 is a normal speed door. You may also modify the animation
435: arrays directly if you wish:
436:
437: The animation arrays are as follows:
438: long *animateptr[MAXANIMATES], animategoal[MAXANIMATES];
439: long animatevel[MAXANIMATES], animatecnt;
440:
441: getanimationgoal(long animptr);
442: Check to see if a certain variable in memory is already being animated
443: by the engine. If so, an index into the animation arrays is returned,
444: else -1 is returned. This is function is useful when you are press
445: space bar near a door, and it is already animating, you simply want
446: to reverse its direction.
447:
448: dragpoint(short wallnum, long newx, long newy);
449: This function will drag a point in the exact same way a point is dragged
450: in 2D EDIT MODE using the left mouse button. Simply pass it which wall
451: to drag and then pass the new x and y coordinates for that point.
452: Please use this function because if you don't and try to drag points
453: yourself, I can guarantee that it won't work as well as mine and you
454: will get confused. Note: Every wall of course has 2 points. When you
455: pass a wall number to this function, you are actually passing 1 point,
456: the left side of the wall (given that you are in the sector of that wall)
457: Got it?
458:
459: nextsectorneighborz(short sectnum, long thez, short topbottom, short direction);
460: This function searches z-coordinates of neighboring sectors to find the
461: closest (next) ceiling starting at the given z-coordinate (thez).
462: For example, if you want to find the goal z-coordinate when opening a
463: door, you might want the door to stop at the next closest neighboring
464: ceiling z-coordinate. You can get the z-coordinate this way:
465:
466: newz = sector[nextsectorneighborz(sectnum,startz,-1,-1)].ceilingz
467:
468: topbottom (3rd parameter) -1 = search ceilings
469: 1 = search floors
470: direction (4th parameter) -1 = search upwards
471: 1 = search downwards
472:
473: screencapture(char *filename)
474: Capture the screen and save it as a .BMP file. I don't know why my
475: .BMP format isn't compatible with other programs.
476:
477: ���������������������������������������������������������������������������Ŀ
478: � SPRITE FUNCTIONS: �
479: �����������������������������������������������������������������������������
480:
481: insertsprite(short sectnum, short statnum); //returns (short)spritenum;
482: Whenever you insert a sprite, you must pass it the sector
483: number, and a status number (statnum). The status number can be any
484: number from 0 to MAXSTATUS-1. Insertsprite works like a memory
485: allocation function and returns the sprite number.
486:
487: deletesprite(short spritenum);
488: Deletes the sprite.
489:
490: changespritesect(short spritenum, short newsectnum);
491: Changes the sector of sprite (spritenum) to the
492: newsector (newsectnum). This function may become
493: internal to the engine in the movesprite function. But
494: this function is necessary since all the sectors have
495: their own doubly-linked lists of sprites.
496:
497: changespritestat(short spritenum, short newstatnum);
498: Changes the status of sprite (spritenum) to status
499: (newstatus). Newstatus can be any number from 0 to MAXSTATUS-1.
500: You can use this function to put a monster on a list of active sprites
501: when it first sees you.
502:
503: setsprite(short spritenum, long newx, long newy, long newz);
504: This function simply sets the sprite's position to a specified
505: coordinate (newx, newy, newz) without any checking to see
506: whether the position is valid or not. You could directly
507: modify the sprite[].x, sprite[].y, and sprite[].z values, but
508: if you use my function, the sprite is guaranteed to be in the
509: right sector.
510:
511: movesprite(short spritenum, long xchange, long ychange, long zchange,
512: long ceildist, long flordist, char cliptype, long numtics)
513: This function moves the sprite given by spritenum by the 3
514: increments, xchange, ychange, and zchange. If cliptype is 0, then
515: the clipping is normal (Use 0 to clip you and monsters). If the
516: cliptype is 1, then the object is clipped to the same things that
517: hitscan is clipped to (use 1 for all bullets).
518: Movesprite can either return 0 (touched nothing)
519: 16384+sectnum (ceiling/floor first touched)
520: 32768+wallnum (wall first touched)
521: 49152+spritenum (sprite first touched)
522:
523: getspritescreencoord(short spritesortnum, long *scrx, long *scry)
524: This function returns the actual screen coordinates of a sprite. It
525: is useful for locking on to a target. Use this function between
526: drawrooms and drawmasks. Note that spritesortnum is the index into the
527: spritesortcnt arrays, NOT the normal sprite arrays. Scrx and scry are
528: actual screen coordinates ranging from 0-319 and 0-199 respectively.
529:
530: ���������������������������������������������������������������������������Ŀ
531: � MULTIPLAYER FUNCTIONS (multi.obj) �
532: �����������������������������������������������������������������������������
533:
534: initmultiplayers(option[4],option[5]);
535: Call this right after initengine. Pass option[4] and option[5]
536: exactly the way I have it written here. (option[4] is the COM1-COM4,
537: network option and option[5] is the com speed selection option)
538:
539: uninitmultiplayers();
540: Call this right before uninitengine.
541:
542: sendlogon();
543: Use this function after everything's initialized, but before you
544: go into the main game loop. Right after you call sendlogon(), you
545: should run a loop that will wait until a specified number of players.
546: Here's some example code:
547:
548: sendlogon();
549: while (numplayers < waitplayers)
550: {
551: getpackets();
552: }
553: screenpeek = myconnectindex;
554:
555: Getpackets reserves the packet header range from 200-255. If you
556: keep calling getpackets after sendlogon, the numplayers variable will
557: automatically be incremented when other people log on.
558:
559: sendlogoff();
560: Call this before leaving, before uninitializing the multiplayer
561: code.
562:
563: sendpacket (short otherconnectindex, char *bufptr, short bufleng)
564: For COM(modem) communications, the otherconnectindex doesn't matter.
565: For network communcations, you can specify which computer to send
566: to by setting otherconnectindex to the proper index number. You
567: can also do a broadcast by setting otherconnectindex to -1.
568: Also pass the buffer and length parameters.
569:
570: short getpacket (short *otherconnectindex, char *bufptr) returns bufleng
571: When using getpacket, first check the value it returns.
572: If the value is 0, then the buffer length is 0 which means there
573: are no packets available. If the buffer length is greater than
574: 0, then use that value as the length of the buffer. Getpacket also
575: tells you what computer the message was received from -
576: (otherconnectindex).
577:
578: ���������������������������������������������������������������������������Ŀ
579: � DIGITIZED SOUND FUNCTIONS: �
580: �����������������������������������������������������������������������������
581: Note: If you want to write your own digitized sound driver, simply delete
582: these functions from GAME.C.
583:
584: initsb();
585: Initializes the digitized sound routines. You need to call this
586: only once at the beginning of the program. Currently, the
587: sample rate is 11,025 Hz.
588:
589: wsay(char *filename, long freq, char volume);
590: Play the sound file at the given frequency and volume. If you
591: set freq = 4096, the sound will play at normal frequency (given
592: the sound was also recorded at 11025 Hz) To play the sound an
593: octave higher, for example, set freq = 8192. Volume ranges from
594: 0 (silent) to 255 (full volume). Ex: wsay("blowup.wav",4096L,255);
595:
596: uninitsb();
597: Turns the speaker off, so sounds don't continue playing while
598: your back in DOS.
599:
600: ���������������������������������������������������������������������������Ŀ
601: � MUSIC FUNCTIONS: �
602: �����������������������������������������������������������������������������
603: Note: If you want to write your own music driver, simply delete these
604: functions from GAME.C. The BUILD engine uses interrupt vector 0x8 (IRQ0)
605: and that may complicate things. If you like my music, perhaps I can send
606: you my MIDI sequencer program (It requires MPU-401, and TSENG-ET4000 SVGA,
607: but could be standardized if there's enough demand).
608:
609: loadmusic(char *filename);
610: Loads the given song into memory. Be sure INSTS.DAT is in the
611: current directory. If no extension is given, then .KSM will be
612: appended to the filename. You should use this function only when
613: the music is off.
614: musicon();
615: Enable the playing of music. Use this only after loadmusic has
616: been called.
617: musicoff();
618: Disable the playing of music. Be sure to call this before quitting
619: to DOS.
620:
621: ���������������������������������������������������������������������������ͻ
622: ���������������������������������������������������������������������������
623: ���������������������������������������������������������������������������
624: ���������������������������������������������������������������������������
625: ���������������������������������������������������������������������������
626: ���������������������������������������������������������������������������
627: ���������������������������������������������������������������������������
628: ���������������������������������������������������������������������������
629: ���������������������������������������������������������������������������
630: ���������������������������������������������������������������������������ͼ
631:
632: ���������������������������������������������������������������������������Ŀ
633: � BUILD Revision History: �
634: �����������������������������������������������������������������������������
635: 2/6/94 - Added this revision thing.
636: - Setup program.
637: - A faster new mode for standard VGAs called chain mode.
638: ������������������������������������������������������������������������������
639: 2/8/94 - Fixed chain mode with groudraws.
640: - Added sector joining in 2D EDIT MODE - press J on first sector.
641: Then press J again on sector to join with. Attributes will be
642: taken from first sector. Possible bugs.
643: - Improved controls for slower computers.
644: - Made timer interrupt rate 120/second instead of 240/second.
645: ������������������������������������������������������������������������������
646: 2/9/94 - Started to work on status bar in 2D EDIT MODE.
647: - Added special optimization for the Western Digitial (Paradise)
648: chipset just like with TSENG ET4000.
649: ������������������������������������������������������������������������������
650: 2/10/94 - Added a door attribute to sectors. To make a sector a door,
651: press "D" on the ceiling of the sector in 3D EDIT MODE. For
652: the door to work, the ceiling of the door sector must be a
653: tiny bit lower than lowest neighboring ceiling. To open/close
654: the door, you may press the space bar. Note: Space Bar is also
655: used for copy and paste in 3D EDIT MODE. You may have to go
656: into game mode to test out the doors for now.
657: - Added a wall orientation attribute to walls. This attribute is
658: used especially in conjunction with doors. So far, you have
659: been working with walls that are start from the top. For
660: example, if you hold down 2/8 on the keypad in 3D EDIT MODE,
661: the wall always starts from the top. But for doors, you
662: sometimes need walls to start from the bottom. To do this,
663: press "O" (for orientation) on the wall, and it will now
664: start from the bottom.
665: ������������������������������������������������������������������������������
666: 2/12/94 - Fixed some bugs for sprites. Sprites don't disappear anymore.
667: Now you will pick up all sprites when running over them.
668: Monsters will not stop shooting anymore.
669: - Made the sound blaster sounds have a 1-sound cache. That is, if
670: the same sound is to be played several times in a row, it will
671: only be loaded once.
672: - Added *.GIF format support to EDITART for 320*200 size images.
673: - Changed the PASTE key in 3D EDIT MODE from Space bar to Left
674: Enter because the Space bar conflicted with opening doors.
675: - Added music as an option in the setup program. To run the music,
676: you need INSTS.DAT and a song file with a .KSM extension.
677: - Split the editor from the game.
678: BUILD is now the map editor - you don't need BUILD.C anymore.
679: GAME is now the actual game that you will be programming.
680: I am giving you GAME.C to work with. Its code is simpler
681: than before because there are no more editing function
682: calls in it.
683: - Sprites move in a straight line now until they hit walls. When
684: they hit walls, they pick a new angle to travel in.
685: - Remember that tiny little guy with the "Al" on his shirt?
686: Next time you're in DOOM1.DAT, try shooting him. Then look
687: at the code in GAME.C.
688: - In EDITART, when you press, "u", you now select filenames with
689: the arrow keys and enter rather than having to type in
690: the exact filename.
691: - Board maps now have extension .MAP and artwork files now have
692: extension .ART to help distinguish between the different types
693: of files.
694: ������������������������������������������������������������������������������
695: 2/22/94 - Fixed small bug with EDITART not loading right when names.h
696: existed with no names defined.
697: - You can now edit new boards by typing:
698: BUILD <file that doesn't exist> like "BUILD NEWBOARD"
699: - Added ALT-S in 2D EDIT Mode to change a whole white loop inside a
700: sector to a red loop.
701: - When viewing the tiles (pressing "v") you can now use PGUP/PGDN.
702: - Added a message bar in 2D EDIT Mode.
703: - Added TAB and L.ALT-TAB keys to view all the attributes of a
704: sector, wall, or sprite (see above documentation).
705: - Debugged and bullet-proofed ALT-S.
706: - Fixed a bug that doesn't allow you to drag points with number
707: greater than 1023. (There can actually be 4096 walls and 1024
708: sectors, and 4096 sprites currently, an easy thing to increase)
709: - Changed overwritesprite function paramaters. If you are using it
710: in your c file, you must change it! Now it looks like this:
711:
712: overwritesprite (long x, long y, short tilenum, char shade,
713: char orientation);
714:
715: If orientation = 0: x and y are the top left corner.
716: If orientation = 1: x and y are the middle (like before).
717: - Added permanentwritesprite function for status bars or other
718: sections of the screen that will not be overwritten by the
719: engine. When using this function, you may want to modify the
720: STARTUMOST / STARTDMOST arrays. The format of this function is
721: like overwritesprite except that the x and y are always top
722: left corner, no orientation variable, and no translucence.
723:
724: permanentwritesprite (long x, long y, short tilenum, char shade);
725:
726: - Added an attribute to the printext and printnum functions. Please
727: change these function if you use them in your program. The
728: current formats are:
729:
730: printext(long x, long y, char buffer[42], short tilenum,
731: char invisiblecol)
732: printnum(long x, long y, long num, short tilenum,
733: char invisiblecol);
734:
735: Invisiblecol tells printext what color to draw the transparent
736: pixels. If invisiblecol is 255 then the transpararent pixels are
737: still transparent.
738: ������������������������������������������������������������������������������
739: 2/26/94 - Completely reprogrammed EDITART.
740: IMPORTANT: PLEASE RUN CONVART.EXE ON ALL ARTWORK FILES! (If you have not
741: already). It will convert PICS.ART in the old format to
742: TILES.ART in the new format, so you may have to do some
743: renaming when converting artwork and also rename the loadpics
744: line in your C file. BUILD WILL NOT RUN UNLESS YOU DO THIS!
745: With the new artwork file, the tiles can now be any size from
746: 1*1 to 1024*240 and they no longer have to be powers of 2.
747: This feature allows parallaxing skies that are 1024 pixels wide
748: to cover all 360�, or 320 pixel wide status bars. It can also
749: be used to display 320*200 title screens.
750: - When pressing 'U' in EDITART, you can now change directories
751: and the current loading directory will be remembered.
752: - When pressing 'U' in EDITART, you can press the mouse button to
753: readjust the size of the tile.
754: - When pressing 'U' in EDITART, press ENTER for an automatic
755: palette conversion or press SPACE BAR for no conversion.
756: - Walls that are Blocked ('B') in BUILD are now shown in pink.
757: If the wall does not show pink in your board, just press
758: 'B' twice to permanently fix it.
759: - Made smooshiness values easier to work with. Hold down 5 on the
760: keypad with 2/4/6/8 to align the walls to multiples of the
761: tile that is used. Also, when you do Tab and L.Enter for
762: Copy&Paste, the y-repeat values stay the same, and the
763: x-repeat values are adjusted so the pixels of the bitmaps
764: have a square-aspect ratio.
765: - Added masked walls. But since they don't quite work perfectly
766: yet, and they are extremely hard to edit now, so for now, just
767: enjoy the technologiy in DOOM1.MAP. Don't worry - you'll get
768: your hands on this soon!
769: - Fixed the "earthquake" effect on really high walls. The walls
770: will not move up and down, but the pixel fuzzyness bug is
771: still in there.
772: - Put door variables and tile information into BUILD.H for you to
773: play around with.
774: - Made walls, ceilings, and floors also work with the animation
775: attribute in EDITART.
776: ������������������������������������������������������������������������������
777: 3/2/94 - Made power of 2 size tiles work with ceilings & floors.
778: - When using different size ceilings & floors, made an option in
779: 3D EDIT MODE. If you want a tile to be smooshed into the normal
780: 64*64 area, press 'E' to unExpand the tile.
781: - Groudraws now look more cubical than before. (But be careful of
782: crashing with them for now)
783: - IMPORTANT: Changed the Board format. If you tried running BUILD
784: before reading this, and it didn't work, shame on you! You
785: should always look at the history section of BUILD.TXT first!
786: Since from now on, I am writing Board/Art converters, I am
787: giving you CONVMAP.EXE to convert maps. You can type either:
788: C:\BUILD>convmap house.map
789: to convert an individual map or:
790: C:\BUILD>for %i in (*.map) do convmap %i
791: to convert all the maps in a directory.
792:
793: - IMPORTANT: Sprites are now on 2 different sets of doubly-linked
794: lists. The big advantage of this method is that when sprites
795: are deleted, there can be holes in the sprite list with
796: no slow down. Before I used to have linked lists for each
797: sector pointing to all the sprites in it. Well, I have updated
798: that and added more linked lists that tell whether sprites
799: are active or inactive (not a fun thing to progam) But not
800: to worry, you don't have to deal with changing the linked
801: lists, thanks to my very easy function calls. YOU WILL
802: HAVE TO CHANGE YOUR CODE TO SUPPORT THE NEW LINKED LISTS.
803: You should know how to search through each list. See BUILD.H
804: for a detailed description of how the linked lists work, and
805: see the top of this file for description of the new sprite
806: function calls.
807:
808: insertsprite(short sectnum, short statnum);
809: deletesprite(short spritenum);
810: changespritesect(short spritenum, short newsectnum);
811: changespritestat(short spritenum, short newstatnum);
812:
813: In your code, you will have to change the following:
814: firstsprite[spritenum] --> headspritesect[spritenum]
815: sprite[spritenum].point2 --> nextspritesect[spritenum]
816:
817: Also, you should change the part of your main loop that scans
818: through all the active sprites to look more like this:
819:
820:
821: i = headspritestat[1]; //head of active sprite list
822: while (i != -1)
823: {
824: nexti = nextspritestat[i]; //back up next sprite in case current
825: //one is deleted.
826:
827: //your code goes here (use i as the sprite number)
828:
829: spriteisdeletedskip:
830: i = nexti; //go to next sprite
831: }
832:
833:
834:
835: - Added tagging (naming) to any sector, sprite, or wall. That means
836: you can change a tag in the BUILD editor by pressing T with the
837: mouse cursor on the highlighted sector. And in GAME.C, you
838: can access the tag this way:
839: sector[sectnum].tag;
840: sprite[spritenum].tag;
841: wall[wallnum].tag;
842: Note: All 3 types of tags are long integers, but in BUILD.C
843: you can only make them short integers. I am planning to
844: let you use the upper 16 bits of the tag byte as use for
845: you only. (like permanently unreserved bits)
846: - Added serial link. But it doesn't work very well yet. You
847: may have to try going into GAME several times before it works.
848: ������������������������������������������������������������������������������
849: 3/15/94 - Fixed maskable walls - now sort out with sprite better. Easier
850: to edit. Simply press 'M' at a place where a maskable wall
851: should be (like where you normally press 'B' for blocking)
852: - Can flip walls, masked walls, and sprites x-wise by pressing
853: 'F' in 3D EDIT MODE. Also, it is possible to save space in
854: sprite rotations, by flipping it x-wise by programming one of
855: the bits in sprite[].cstat.
856: - A few other minor things, but I forgot what they were.
857: ������������������������������������������������������������������������������
858: 3/19/94 - Fixed one of the many crashing bugs.
859: For Duke Nukem III team:
860: CITY.MAP will not crash anymore with new version. The
861: reason it crashed was because in your TILES.ART, you had
862: either ANMFD:0, ANMBK:0, or OSCI:0. That caused a MOD 0
863: in my animation routine. I bullet-proofed that. How about
864: fixing tiles #34, #112, or #114 in your TILES.ART.
865: - Wrote divide by zero handler. Now if there is a divide by zero,
866: BUILD goes back into text mode and fills the screen with
867: /0/0/0/0/..., then gives a DOS prompt. (In other words, you
868: don't have to type "MODE CO80" anymore for /0 crashes)
869: - Optimized routines in assembly for 486's using my great new
870: Intel 32-bit optimizing techniques book that dad got for me.
871: - Fixed ALT-S in BUILD so ANY white loop can be converted into a
872: red loop except for the 1 and only 1 outermost white loop.
873: - FINALLY! Splitsector bug is fixed! You can now split a very
874: complicated sector with tons of sectors inside it or with
875: plenty of sprites. Also sprites will not get deleted
876: spontaneously with split sector any more.
877: - Ctrl-Enter in 3D EDIT MODE is like the normal Enter paste key,
878: but Ctrl-Enter pastes the attributes to an entire loop of
879: walls (if a wall is highlighted).
880: ������������������������������������������������������������������������������
881: 3/22/94 - Added doors that open left and right. See sector[].tag #9 in the top
882: of this file for details - also look at my board, NUKELAND.MAP,
883: in BUILD to see how to make this type of door.
884: - Increased the number of status lists. You may recall my active /
885: inactive sprite lists called headspritestat, prevspritestat,
886: and nextspritestat. Don't worry - you will NOT have to
887: change any of your code. The only thing I changed is now
888: you can have 1024 different lists of sprites rather than just
889: 2 lists if you want to use them. For example, you might want
890: to run through all the brown monsters on the board. Instead
891: of putting all different types of monsters on the active
892: list, it is faster to have a separate list just for brown
893: monsters. Use your imagination!
894: ������������������������������������������������������������������������������
895: 3/31/94 - Fixed some palette problems with EDITART. Now when you press 'P'
896: in 'U' mode, the palette of all the existing tiles are
897: converted to the new palette. Also the text colors should
898: be similar colors on different palettes now.
899: - Changed bit 0 of sprite[].cstat to the hitscan checking / ignoring
900: bit. You should set this bit to 1 for monsters, 0 for
901: bullets, 0 for pick-upable objects like coins, and 1 for
902: objects like columns. Right now, (Since it's not in the
903: BUILD editor), you must set these bits in your code right
904: after you load the board.
905: - I did not document the neartagsector, neartagwall, and
906: neartagsprite very well, so if you don't know how to use
907: them alreay, please read on. These 3 variables are modified
908: by the engine every time you call draw3dscreen(). These
909: variables are usually -1. These variables will be >= 0 if
910: all of these cases are true:
911: 1. You are looking at a wall, sprite, or sector.
912: 2. You are close enough to the wall, sprite, or sector
913: to be able to use the action key with it.
914: 3. The tag of the wall, sprite, or sector is greater or
915: equal to 1.
916: As you can see, neartagsector makes a perfect variable for
917: detecting whether or not you are opening a door. You can
918: also use neartagwall for switches on walls. Also, you can
919: use neartagsprite for sprites that are switches.
920: - PROGRAMMERS: PLEASE MAKE THESE EASY CODE MODIFICATIONS:
921: I reversed the way variables are stored in BUILD.H.
922: Now the variables will be local to the ENGINE and externed
923: to GAME. Before they were local to GAME and externed to the
924: engine. All you have to do is this:
925: 1. You can remove the #define MAIN if you want to.
926: 2. Delete the externs declarations that I used to have
927: in the beginning of GAME.C, because I put them in
928: BUILD.H. I will try not to put externs in the GAME
929: in the future to save you the time of copying and
930: pasting code. Here is a list of externs I moved:
931:
932: EXTERN short neartagsector, neartagwall, neartagsprite;
933: EXTERN long *animateptr[MAXANIMATES], animategoal[MAXANIMATES];
934: EXTERN long animatevel[MAXANIMATES], animatecnt;
935: EXTERN short tilesizx[MAXTILES], tilesizy[MAXTILES];
936: EXTERN long numtiles, picanm[MAXTILES], waloff[MAXTILES];
937: - Added a global parallaxing sky type variable. Now I have 3
938: different types of parallaxing skies. Here they are:
939:
940: 0 - Totally flat parallaxing sky.
941: 1 - X-only stretching parallaxing sky (This is what DOOM uses).
942: 2 - X- and Y- stretching parallaxing sky. (This is what BUILD
943: uses by default)
944: A good place to set the parallaxing sky is right after you
945: call initengine().
946: - Added local tile selection to the BUILD editor. This means
947: that when you press V on a sprite, you will see only the
948: sprites that are on the level so far. If you want to use
949: a sprite that is not already used on the current board, press
950: V again and you will be able to select from the huge list
951: that you are used to from before. The local tile list will
952: be sorted according to how much each tile is used on the
953: current board. Note that the local tile list will be
954: different depending where the mouse cursor was left when you
955: pressed V (or H).
956: ������������������������������������������������������������������������������
957: 4/4/94 - Changed the way ART files work. YOU MUST READ THIS:
958: There are some two easy things that you must do 2 things before
959: you can use the new engine:
960:
961: 1. Type CONVART1.EXE to convert your ARTWORK to the new
962: format. (If I forgot to send this file to you, please call
963: and torture me.) Now, instead of everything being stored
964: in one huge file, TILES.ART, I am splitting the artwork into
965: several files each holding 256 tiles in it. This will allow
966: you to make infinitely large artwork files in EDITART.
967:
968: 2. In GAME.C, you must change the line,
969: loadpics("tiles.art");
970: to:
971: loadpics("tiles000.art");
972: All you have to give loadpics is the first filename of your
973: artwork, and the engine will automatically know how to
974: modify the 3 digits at the end and load all the artwork
975: files properly.
976: ������������������������������������������������������������������������������
977: 4/5/94 - Fixed the "fuzzy" pixels on high walls. Now you make walls as
978: high as skyscrapers, and when you look at it up close, the
979: pixels will still look like perfect rectangles. Note: This
980: fix may require you to press 'O' in 3D EDIT MODE to put
981: your boards back to normal.
982: - When you pressed ENTER on weird-sized tiles, sometimes in the old
983: version the pixels would not be square aspect ratio. Now
984: when you press ENTER, they will be.
985: - You can now set the starting position in 2D EDIT MODE with the
986: Scroll Lock key. The starting position will look like a
987: brown arrow, and your current position will look like a
988: white arrow. Now you don't have to keep returning to start
989: when you save your board.
990: - Added some new things to the structures - guess what this means?
991: CONVMAP3! THE NEW OBJ'S and BUILD will NOT work until you
992: run CONVMAP3. (Please call if I forgot to give
993: you this file)
994: Notice that I added these things to the structures:
995:
996: sectortype:
997: bit 2 of ceilingstat&floorstat:
998: 1 = North/South panning, 0 = East/West panning
999: char ceilingpanning, floorpanning;
1000: walltype:
1001: bit 6 of cstat
1002: 1 = Vertical panning, 0 = Horizontal panning
1003: char panning;
1004: short overpicnum;
1005: spritetype:
1006: char *extra;
1007:
1008: Now an explanation of each:
1009: To the sector structure, I added the capability to pan
1010: the floors and ceilings. Usually ceilingpanning and
1011: floorpanning are set to 0. For example, a good way to make
1012: an earthquake would be to randomly increment or decrement
1013: to panning values. To allow you to pan the ceilings or
1014: floors at any of the standard 90 degree angles, I made
1015: bit 2 of sectortype's ceilingstat/floorstat byte choose
1016: whether the ceilingpanning/floorpanning byte should move
1017: the ceiling/floor North/South or East/West.
1018: To the wall structure, I added panning also. Bit 6
1019: of cstat and the panning values work in the same as the
1020: ceilings and floors.
1021: To the sprite structure, I added only 1 variable.
1022: The "extra" pointer is intended for your use only, so you
1023: can have the sprite's structure extended if you so desire.
1024: ������������������������������������������������������������������������������
1025: 4/6/94 - In 2D EDIT MODE, you can now press ESC to get a message in the
1026: message bar that says this:
1027:
1028: (N)ew, (L)oad, (S)ave, (Q)uit
1029:
1030: And it all works too. (Press ESC to cancel)
1031: Loading lets you select the file just like 'U' in EDITART.
1032: - The old version of BUILD had the coordinate system all screwed
1033: up in 2D EDIT MODE. I fixed this. Included with
1034: CONVMAP3.EXE is a conversion utility that will make your
1035: boards have the same orientation as in the older BUILD
1036: editors. If you don't care if the whole map gets rotated
1037: in the 2D editor, then press N.
1038: ������������������������������������������������������������������������������
1039: 4/7/94 - Changed the way Orientation works ('O' in 3D EDIT MODE)
1040:
1041: Now, when you draw a normal door in BUILD, you do NOT have to
1042: press 'O' everywhere to make the walls of the door move right.
1043: Now, the default is that everything moves right. Here's a
1044: detailed description of how the new orientation works:
1045:
1046: For white lines (no neighboring sector):
1047:
1048: orientation = 0 (default) means picture is aligned with
1049: sector[].ceilingz.
1050: orientation = 1 means picture aligned with sector[].floorz.
1051:
1052: For red lines (has a neighboring sector):
1053:
1054: orientation = 0 (default) means picture is aligned with
1055: either the ceilingz or floorz of the next sector.
1056: orientation = 1 means picture aligned with
1057: sector[].ceilingz.
1058:
1059: Don't worry if you don't understand the detailed description.
1060: Just know that it's better this way. I have included the
1061: proper conversions in CONVMAP3.EXE.
1062: - Added wall&ceiling x-panning keys to the 3D EDIT MODE. Press
1063: the , or . keys to pan a wall or ceiling left or right. You
1064: can hold down the 5 key on the keypad to align at every eighth
1065: panning value. (Just like with 2,4,6,8).
1066: - Made TAB&ENTER in 3D EDIT MODE also copy the CSTAT byte of
1067: the wall's attributes. This means that attributes such as
1068: the block attribute, 1-way wall attribute, orientation,
1069: and x-flipping attribute are also copied & pasted.
1070: - Added a new function, cansee.
1071:
1072: cansee(long x1, long y1, long z1, short sectnum1,
1073: long x2, long y2, long z2, short sectnum2)
1074:
1075: All you do is pass it the coordinates of a 3D line
1076: and the respective sectors of each point of the line.
1077: The function will return a 1 if the points can see each
1078: other or a 0 if there is something blocking the two points
1079: from seeing each other. This is how I determine whether
1080: a monster can see you or not. Try playing DOOM1.DAT with
1081: digitized sound enabled to fully enjoy this great new
1082: function!
1083: ������������������������������������������������������������������������������
1084: 4/12/94 - Fixed HITSCAN function. Since it works a little differently
1085: and the parameters are different, let me describe how the
1086: new hitscan works:
1087:
1088: hitscan(long xstart, long ystart, long zstart, short startsectnum,
1089: long vectorx, long vectory, long vectorz,
1090: short *hitsect, short *hitwall, short *hitsprite,
1091: long *hitx, long *hity, long *hitz);
1092:
1093: Pass the starting 3D position:
1094: (xstart, ystart, zstart, startsectnum)
1095: Then pass the 3D angle to shoot (defined as a 3D vector):
1096: (vectorx, vectory, vectorz)
1097: Then set up the return values for the object hit:
1098: (hitsect, hitwall, hitsprite)
1099: and the exact 3D point where the ray hits:
1100: (hitx, hity, hitz)
1101:
1102: How to determine what was hit:
1103: * Hitsect is always equal to the sector that was hit
1104: (always >= 0).
1105:
1106: * If the ray hits a sprite then:
1107: hitsect = thesectornumber
1108: hitsprite = thespritenumber
1109: hitwall = -1
1110:
1111: * If the ray hits a wall then:
1112: hitsect = thesectornumber
1113: hitsprite = -1
1114: hitwall = thewallnumber
1115:
1116: * If the ray hits the ceiling of a sector then:
1117: hitsect = thesectornumber
1118: hitsprite = -1
1119: hitwall = -1
1120: vectorz < 0
1121: (If vectorz < 0 then you're shooting upward which means
1122: that you couldn't have hit a floor)
1123:
1124: * If the ray hits the floor of a sector then:
1125: hitsect = thesectornumber
1126: hitsprite = -1
1127: hitwall = -1
1128: vectorz > 0
1129: (If vectorz > 0 then you're shooting downard which means
1130: that you couldn't have hit a ceiling)
1131:
1132: - Added a position window to the bottom of the menu in 2D EDIT
1133: MODE. It shows the posx, posy, and ang variables.
1134: ������������������������������������������������������������������������������
1135: 4/14/94 - Overwritesprite now clips to the startumost / startdmost arrays.
1136: Now the only way to write to the status bar is with
1137: the permanentwritesprite function.
1138:
1139: - ATTENTION PROGRAMMERS! I Split draw3dscreen() into 2 separate
1140: function calls.
1141:
1142: old: draw3dscreen(); //Draws walls, ceilings, floors, p-skies
1143: // groudraws, sprites, and masked walls.
1144:
1145: new: drawrooms(); //Draws walls, ceilings, floors, p-skies
1146: // and groudraws.
1147: drawmasks(); //Draws sprites and masked walls.
1148:
1149: The reason I split draw3dscreen was so you could manipulate only
1150: the sprites that the engine is going to draw to the screen
1151: before the sprites are actually drawn.
1152:
1153: - I think I may have fixed that darn sector line bug! Before, the
1154: bug usually appeared when you were on a (red) sector line where
1155: the ceiling and floor of the sector were very far from each
1156: other. This overflowed some really high positive values into
1157: the negative range and vice versa.
1158: ������������������������������������������������������������������������������
1159: 4/18/94 - Wall clipping now works much better! (You can still VERY RARELY
1160: sneak through walls, however)
1161: ATTENTION PROGRAMMERS:
1162: MOVESPRITE and CLIPMOVE have been changed. They now look
1163: like this:
1164:
1165: clipmove (long *x, long *y, long *z, short *sectnum,
1166: long xvect, long yvect, long walldist,
1167: char cliptype);
1168:
1169: movesprite(short spritenum,
1170: long xchange, long ychange, long zchange,
1171: long walldist, char cliptype);
1172:
1173: To use the new clipmove:
1174: Pass the pointers of the starting position (x, y, z). Then
1175: pass the starting position's sector number as a pointer also.
1176: Also these values will be modified accordingly. Pass the
1177: direction and velocity by using a vector (xvect, yvect).
1178: If you don't fully understand these equations, please call me.
1179: xvect = velocity * cos(angle)
1180: yvect = velocity * sin(angle)
1181: Walldist tells how close the object can get to a wall. I use
1182: 128L as my default. If you increase walldist all of a sudden
1183: for a certain object, the object might leak through a wall, so
1184: don't do that!
1185:
1186: To use the new movesprite:
1187: Works like before, but you also pass walldist (How close the
1188: sprite can get to a wall)
1189:
1190: - New function for sprites:
1191: setsprite(short spritenum, long newx, long newy, long newz);
1192:
1193: This function simply sets the sprite's position to a specified
1194: coordinate (newx, newy, newz) without any checking to see
1195: whether the position is valid or not. You could directly
1196: modify the sprite[].x, sprite[].y, and sprite[].z values, but
1197: if you use my function, the sprite is guaranteed to be in the
1198: right sector.
1199:
1200: - You can now change the angle in 2D EDIT MODE with the
1201: < and > keys. Move the mouse cursor to a sprite first.
1202: Hold down shift with the < and > to get more precise angles.
1203: - You can now press 'B' on sprites in 3D EDIT MODE. This in effect
1204: is xoring bit 0 of sprite[].cstat, which will not only be
1205: sensitive to hitscan, but will also block you from walking
1206: through the sprite. Sprites with the 'B' attribute will
1207: appear pink in 2D EDIT MODE.
1208: - You can now edit the Hi 16 bits of the tag in 2D EDIT MODE.
1209: Just like T and ALT-T, you press H and ALT-H to edit the high
1210: 16-bits. When a structure's attributes are displayed, the tag
1211: will be displayed as 2 unsigned shorts. The first number
1212: represents the hi 16 bits and the second number represents the
1213: lo 16 bits.
1214: ������������������������������������������������������������������������������
1215: 4/23/94 - Added 'G' in Editart to GOTO a tile by typing in the tile number.
1216: - Changed the way masking walls work a little bit. Now the
1217: masking walls use the picture wall[].overpicnum rather than
1218: wall[].picnum.
1219: - Made hitscan hit maskable walls.
1220: ������������������������������������������������������������������������������
1221: 4/24/94 - Made palette.dat support any number of shades up to 64. There
1222: is no change to the palette.dat format. The palette.dat
1223: format is:
1224:
1225: First the palette (768 bytes) Values range from 0-63
1226: Then the lookup shades (256 * number_of_shades) The
1227: shades are stored in groups of 256 bytes.
1228:
1229: - If you use Mark Dochtermann's palette program, then you can
1230: convert his data files (such as palette.pal and colormap.lmp)
1231: to my palette format, palette.dat, with my great Qbasic
1232: program, PALMP.BAS. To run it, first copy the basic program
1233: into the same directory as the 2 source palette files are in.
1234: Then type: "QBASIC PALMP" and then press SHIFT+F5 (to run it).
1235:
1236: - Added a global variable, HORIZ. Horiz usually equals 100.
1237: Modifying horiz will move the whole screen up / down. I
1238: added 2 keys, +/- in my own game.c to demonstrate this. You
1239: can use this variable for looking up and down if you want.
1240: (Even though this is not "truly" looking up and down, if
1241: you're lucky, you might be able to fake out some people!)
1242:
1243: - New Key in 3D EDIT MODE, the forward slash. Use / with the
1244: tile panning keys (, and .) to flip the horizontal / vertical
1245: orientation bits for walls, ceilings or floors.
1246: ������������������������������������������������������������������������������
1247: 4/28/94 - NEW BOARD VERSION! You must run CONVMAP4.EXE on all your boards.
1248: Here's what I changed in the structures:
1249:
1250: Sectors:
1251: I got rid of:
1252: char sector[].ceilingpanning, sector[].floorpanning;
1253: sector[].ceilingstat/floorstat bit 2 zeroed out
1254: and added:
1255: char sector[].ceilingxpanning, sector[].ceilingypanning;
1256: char sector[].floorgxpanning, sector[].floorypanning;
1257:
1258: Walls:
1259:
1260: I got rid of:
1261: char wall[].panning;
1262: wall[].cstat bit 6 zeroed out
1263: and added:
1264: char wall[].xpanning;
1265: char wall[].ypanning;
1266:
1267: Sprites:
1268:
1269: I got rid of:
1270: short sprite[].vel;
1271: and added:
1272: short sprite[].xvel;
1273: short sprite[].yvel;
1274: The reason I did this was so sprites could be moved in
1275: different directions than sprite[].ang. Please make
1276: use of both xvel and yvel. Here's the equation I would
1277: use to convert from the old to new. For example:
1278:
1279: old:
1280: sprite[i].vel = 256;
1281: new:
1282: sprite[i].xvel = (sintable[(sprite[i].ang+512)&2047]>>6);
1283: sprite[i].yvel = (sintable[sprite[i].ang&2047]>>6);
1284:
1285: The reason I am shifting the sines right by 6 is becuase
1286: my sintable ranges from -16384 to 16384. Dividing by
1287: 64 gives a maximum range of -256 to 256.
1288:
1289: CONVMAP4.EXE also attempts to convert the masked walls so
1290: overpicnum is the masked wall's picnum.
1291:
1292: - Changed 3D EDIT MODE panning keys:
1293: Since panning is now all 4 directions, I got rid of the
1294: , and . keys and put the keys on the keypad using 2,4,6,8.
1295: Usually 2,4,6,8 are for x- and y-repeats, but if you hold
1296: down either shift key, then they act as x- and y- panning
1297: values.
1298: The / key now resets the panning values to 0.
1299:
1300: - Please read the updated descriptions of how to make masking walls
1301: in the 3D EDIT MODE KEYS in the top of build.txt. See
1302: the 'M' and 'Shift + M' keys.
1303:
1304: - Also look at the top of this file for a description of dragpoint(), a
1305: great new function that makes it easy to morph sectors.
1306: ������������������������������������������������������������������������������
1307: 4/29/94 - Added some minor keys to 3D EDIT MODE. Alt. +/- change the
1308: visibility variable. It ranges from 5 (darkest) to 17
1309: (lightest) and it starts at 13.
1310:
1311: - Made 1-way walls have more options. Now, for example, you can
1312: make rectangular switches on walls. Please look at my
1313: nukeland.map for an example of how to do switches. (The
1314: switches are close to start - just go through the door and
1315: bear left.)
1316:
1317: - For those who asked, here's how some sample bobbing code:
1318: First, calculate the distance actually moved - because if you
1319: are not moving then you shouldn't bob:
1320:
1321: CODE:
1322: oposx = posx; oposy = posy;
1323: clipmove(&posx,&posy,&posz,&cursectnum,xvect,yvect,128L);
1324: dist = ksqrt((posx-oposx)*(posx-oposx)+(posy-oposy)*(posy-oposy));
1325:
1326: Then modify the horizon value by multiplying the distance
1327: actually moved by a sine wave. (default is horiz = 100).
1328:
1329: CODE:
1330: horiz = 100 + ((dist*sintable[(totalclock<<5)&2047])>>19);
1331:
1332: - Remember that moving block in the slime in NUKELAND.MAP? It
1333: works a lot better now. I am now modifying the floor panning
1334: values to make the floor match up correctly with the block.
1335:
1336: - Fixed the screen capturing (F12) to save captures as PCX files.
1337: This is for BUILD, GAME, and EDITART.
1338:
1339: - Fixed bug in EDITART when you press 'U' on a blank tile. It
1340: should not crash any more.
1341:
1342: - Made Tab & Enter a little smarter in copying the right attributes
1343: to different types of objects.
1344:
1345: - Added ceiling / floor 90� rotation attributes. All 8
1346: rotations are possible. 3 bits have been added to both
1347: the sector[].ceilingstat and sector[].floorstat flags.
1348: If you look in BUILD.H, you will see the new flags
1349: descriptions. You can use the 'F' key in 3D EDIT MODE on
1350: a ceiling or floor to change the rotation.
1351:
1352: ������������������������������������������������������������������������������
1353: 4/30/94 - ATTENTION PROGRAMMERS:
1354: I removed the function, getsector, and added a more expandable
1355: function, updatesector. Also, updatesector is smart enough
1356: to check to see if you are in the same sector OR neighboring
1357: sectors first before going through every single sector.
1358: Getsector used to go though all the sectors every time you
1359: crossed a sector line.
1360:
1361: getsector(); (no arguments, returns nothing - REMOVED)
1362: * used to make sure that CURSECTNUM matched up with
1363: the right sector according to the POSX and POSY values.
1364: updatesector(posx,posy,&cursectnum);
1365: * the new way of writing getsector. You can do a
1366: search&replace on your code. Be careful when you use this
1367: function with sprites because remember that the sprite's
1368: sector number should not be modified directly. For example,
1369: you might want to code it this way:
1370:
1371: tempsectnum = sprite[i].sectnum;
1372: updatesector(sprite[i].x,sprite[i].y,&tempsectnum);
1373: if (tempsectnum != sprite[i].sectnum)
1374: changespritesect(i,tempsectnum);
1375:
1376: Actually, I think the setsprite function is better for
1377: updating a sprite's sector number.
1378:
1379: - Added swinging doors! Look at NUKELAND.MAP in my GAME.EXE for
1380: an example. For swinging doors, I used a new math-helper
1381: function, rotatepoint.
1382:
1383: rotatepoint(long xpivot, long ypivot,
1384: long x, long y,
1385: short deltaang,
1386: long *x2, long *y2);
1387:
1388: Rotatepoint will rotate point(x,y) around point(xpivot,ypivot)
1389: by the deltang value. The resultant point will be s
1390:
1391: - Fixed crashing bug in BUILD when a wall's tile doesn't exist.
1392: ������������������������������������������������������������������������������
1393: 5/02/94 - I improved the pre-level check on the swinging doors, so now
1394: you can have multiple doors in a sector that open any way.
1395: This is how I do my double swinging doors (demonstrated in
1396: NUKELAND.MAP)
1397:
1398: - I added a revolving door! See NUKELAND.MAP for an example. (The
1399: revolving door is beyond the bouncing platforms in the slime
1400: pit)
1401:
1402: - Fixed bug with joining sectors in 2D EDIT MODE. The sprites
1403: don't get deleted any more.
1404: ������������������������������������������������������������������������������
1405: 5/04/94 - Optimized the masked walls.
1406:
1407: - Cleaned up the sprite drawing code (and many bugs that that came
1408: along with it.)
1409: ������������������������������������������������������������������������������
1410: 5/05/94 - Made cylindrical walls with any number of points VERY easy to
1411: make in BUILD. Here's how you do it: Highlight a wall and
1412: press 'C' on it. Then move the mouse to the proper position
1413: to make a nice circle. You can press '+' or '-' to change
1414: the number of points on the circle. Press 'C' again to cancel
1415: or press space bar to actually change the map.
1416: ������������������������������������������������������������������������������
1417: 5/07/94 - Made a fully-operational subway! Look at subway.map.
1418:
1419: - Made a new type of door - a sliding door where the door doesn't
1420: get "x-smooshed" when it is opened. (See description of
1421: sector tag 16 & wall tag 6)
1422:
1423: - Also note that I my first subroutine in game.c! It is:
1424: operatesector(short dasector)
1425: All the door code is now in this function (with a few
1426: exceptions, such as parts of the swinging doors and revolving
1427: door)
1428: ������������������������������������������������������������������������������
1429: 5/08/94 - Made EDITART and BUILD support different tile sizes in 'V' mode.
1430: Here are the three possible sizes:
1431: 0. 64*64 - 5*3 grid - views 15 tiles (old default)
1432: 1. 32*32 - 10*6 grid - views 60 tiles (new default)
1433: 2. 16*16 - 20*12 grid - views 240 tiles
1434: Press the '*' and '/' keys in 'V' mode if you want to change
1435: the grid resolution.
1436:
1437: - Added/fixed up a new key in 3D EDIT MODE, the dot key (. or >)
1438: This key attempts to match up all the tiles along a wall. It
1439: scans along the walls towards the right as long as the picture
1440: number of the next wall is the same as the original picture
1441: number. Note that some walls may not work right, especially
1442: floor / ceiling steps.
1443:
1444: - Made 2D EDIT MODE default to this when inserting sprites:
1445: 1. Sprite clipping = on for sprites taller than 32 pixels
1446: 2. Sprite clipping = off for sprites shorter than 32 pixels.
1447:
1448: - Fixed sprite clipping with Z-coordinates
1449: ������������������������������������������������������������������������������
1450: 5/10/94 - Fixed some sprite dragging bugs
1451:
1452: - Made neartag? maximum sensing distance a global variable called
1453: neartagdist. See build.h.
1454: ������������������������������������������������������������������������������
1455: 5/11/94 - Added sector / groups of sectors selection. When selecting
1456: sectors, hold down the right ALT key. It works just like
1457: right shift. You must completely surround any sector you
1458: wish to select. Once selected, you can drag the mess of
1459: sectors with the mouse. This is great for separating sectors
1460: from each other.
1461:
1462: - Added sector duplication. First select a bunch of sectors. Then
1463: press the insert key. (with the select sectors flashing) Then
1464: This duplication is like stamping. So, you must drag
1465: the sector bunch somewhere else after stamping to see your
1466: great accomplishments.
1467: ������������������������������������������������������������������������������
1468: 5/12/94 - Added group-sector PGUP / PGDN. Here's a neat trick that will
1469: let you move a whole section of a board up / down quickly.
1470: First you select a bunch of sectors with the right ALT key in
1471: 2D mode. Then flip to 3D mode and if you press PGUP / PGDN
1472: on any of the highlighted sectors, the rest of the highlighted
1473: sectors will move also.
1474:
1475: - Added group-sector rotation. Once you do a sector select (right
1476: ALT), you can press the , or . keys to rotate the selected
1477: sectors. Hold down the shift key with the keys to get fine
1478: angle rotation (WARNING: You will get distortion with fine
1479: angle rotation in this version)
1480:
1481: - Added sector count and wall count information at the bottom of
1482: the 2D edit mode status bar.
1483:
1484: - Fixed some stupid bug that you probably wouldn't have found if
1485: you made boards with BUILD for the rest of your life.
1486:
1487: - You can now press 'B' to block / unblock a wall or sprite in
1488: 2D edit mode.
1489:
1490: - Made Ctrl-Shift Enter auto-shade a sector. First make any
1491: wall of the loop as light as the lightest shade you want.
1492: Then make any other wall of the loop as dark as the darkest
1493: shade you want. Finally press Ctrl-Shift Enter on the wall
1494: that should be lightest. Now the loop should be smoothly
1495: shaded. If it is not smoothly shaded, you may need to insert
1496: more points on the walls.
1497:
1498: - Fixed my .PCX format bug. My screen captures now load properly
1499: in Deluxe programs.
1500: ������������������������������������������������������������������������������
1501: 5/13/94 - Made my serial code in Game.c work better. I fixed the bullet
1502: shooting and made all types of doors work. Unfortunately, you
1503: still may have to run at slower COM speeds.
1504: ������������������������������������������������������������������������������
1505: 5/14/94 - Fixed deadly bug with sector copy & sprites.
1506:
1507: - Added hitscan sensitivity bit. It is bit 6 (64) of wall[].cstat.
1508: In 3D edit mode, you can press 'H' to toggle the bit. (H used
1509: to be like 'V' for choosing height tile numbers for groudraws -
1510: I change the 'H' key to Alt-V since I don't think anybody was
1511: using it anyway) By default, hitscan CAN go through maskable
1512: walls. If a hitscan is set to not go through a maskable wall,
1513: The wall will appear BRIGHT pink in 2D edit mode.
1514: ������������������������������������������������������������������������������
1515: 5/15/94 - Made more subroutines in game.c and moved documentation from the
1516: end of game.c into this text file. Added some more comments
1517: also. Game.c is so much easier to read now! The main loop is
1518: less than 50 lines long!
1519:
1520: - Made some optimizations to my serial code now that everything
1521: is in functions.
1522:
1523: - ATTENTION PROGRAMMERS:
1524: I added one new paramater (cliptype) to both the movesprite
1525: and clipmove functions. If the new parameter is a 0, then
1526: the clipping is normal (Use 0 to clip you and monsters).
1527: If the new parameter is a 1, then the object is clipped to
1528: the same things that hitscan is clipped to (use 1 for all
1529: bullets).
1530: See the above documentation for a detailed description of the
1531: parameters. (Remember that I moved the documentation from
1532: GAME.C into the middle BUILD.TXT)
1533: Finally, you can have sprites and bullets going where you
1534: want them to go!
1535: ������������������������������������������������������������������������������
1536: 5/18/94 - Added support for the Spaceplayer (6-degree of freedom Space ball)
1537: Try out the SETUP program now.
1538:
1539: - Fixed some bugs with the 'E' key in 3D EDIT MODE. As long as both
1540: dimensions of the tile are powers of 2, then the picture should
1541: be visible. It should not be a solid color with a few weird
1542: lines any more.
1543:
1544: - Fixed some bugs with the Z control in 3D EDIT MODE. In normal
1545: operation, BUILD attempts to keep your Z constant even if
1546: you cross sector lines. Then I added a special new mode that
1547: locks your heightofffloor to a certain value. You Z will
1548: change instantly if you cross sector lines. To use this mode,
1549: press the Caps Lock key. Press Caps Lock key again for normal
1550: operation.
1551:
1552: - ATTENTION PROGRAMMERS! I put all of engineinput into GAME.C
1553: This means you have absolutely total control of the Z's. (The
1554: only thing left is some key code I still have in my timer
1555: handler)
1556:
1557: OK, now read carefully! Here's how to convert to the new OBJ's:
1558:
1559: 1. First of all, the Spaceball code is now also in game.c.
1560: A. You will need to put this line in game.c:
1561: include "spw_int.h"
1562: B. And make sure to add spwint.obj your makefile.
1563: 2. Heightoffceiling, heightofffloor, and gravity have been
1564: removed from BUILD.H. If you still want to use them
1565: then you should defined them as globals in your own code.
1566: 3. You should go through every single key of my gameinput()
1567: function in game.c and copy any code you want.
1568: ������������������������������������������������������������������������������
1569: 5/23/94 - GREAT NEW STUFF!
1570:
1571: Be sure to check out GAME.EXE and try out these new keys!
1572:
1573: Rt. Enter = Switch between 3D / 2D modes
1574: Lt. +/- = Zoom in 2D mode
1575:
1576: Added 2D map display with auto-mapping! The 2D maps use a
1577: higher resolution 16-color mode. You have a choice of either
1578: using a 640*350*16 screen or a 640*480*16 screen with a 144-high
1579: status bar (remember that 640*480*16 cannot fit in 256K with 2
1580: screen pages so I have to cheat with a status bar).
1581:
1582: NEW FUNCTIONS:
1583:
1584: draw2dscreen(long posxe, long posye, short ange, long zoome,
1585: short gride)
1586: Draws the 2d screen - this function is a direct replacement
1587: for the drawrooms() and drawmasks() functions. Be sure
1588: to call either qsetmode640350() or qsetmode640480()
1589: first. When switching back to 3d mode, be sure to call
1590: qsetmode320200().
1591:
1592: IMPORTANT NOTES:
1593: 1. The overwritesprite function should only be called in
1594: 3D mode. If you do this in 2D mode, junk will be
1595: written to the 2D screen and a crash is possible.
1596: 2. When you switch back to 3D mode, you should call the
1597: permanentwritesprite functions to draw the status bar,
1598: or whatever else you have to draw.
1599: 3. You must call the nextpage() function in both 2D and
1600: 3D modes.
1601:
1602: qsetmode320200();
1603: Set to the game mode and load palette (320*200*256)
1604: qsetmode640350();
1605: Set to the 2D map mode #1 (640*350*16)
1606: qsetmode640480();
1607: Set to the 2D map mode #2 (640*480*16)
1608:
1609: NEW VARIABLES (see description in build.h):
1610:
1611: EXTERN char show2dwall[MAXWALLS>>3];
1612: EXTERN char show2dsprite[MAXSPRITES>>3];
1613: EXTERN char automapping;
1614:
1615: - Added parallaxing floors! Works like the parallaxing skies, but
1616: the other side. In 3D EDIT MODE, press P on ceiling for
1617: parallaxing sky, or press P on floor for parallaxing floor.
1618:
1619: ������������������������������������������������������������������������������
1620: 5/24/94 - There is a new function that I forgot to document in the last
1621: version. Oops!
1622:
1623: doanimations() is this function.
1624: It's not really new, but I split it off of the
1625: drawrooms/drawmasks functions. This function animates anything
1626: that you use setanimation with. Please stick it in your code
1627: somewhere after you draw the screen.
1628: ������������������������������������������������������������������������������
1629: 5/26/94 - You can now do TRANSLUSCENT sprites! I am using bit 1 of
1630: sprite[].cstat to detemine whether or not the sprite is
1631: transluscent or not. In 3D EDIT MODE, you can press 'T' to
1632: toggle the transluscence bit.
1633: IMPORTANT: Transluscence WILL NOT WORK until you run my
1634: TRANSPAL.EXE program. On the command line, simply type:
1635: C:\BUILD>transpal [filename]
1636: If you do not specify a filename, the default will be
1637: palette.dat. If your palette.dat file is now around 40K long,
1638: then you are ready for transluscence!
1639:
1640: - Added TRANSLUSCENCE to masked walls. See bit 7 of wall[].cstat.
1641: Press 'T' on wall to toggle the transluscence bit.
1642:
1643: - In this BUILD update, I have collected many different palettes
1644: for comparison purposes. Try running TRANSPAL.EXE on each of
1645: them and see for yourself which palettes work the best with
1646: transluscence!
1647:
1648: ������������������������������������������������������������������������������
1649: 5/29/94 - ATTENTION PROGRAMMERS: I completely rewrote the neartag code.
1650: Here's what you have to do to convert your game.c files:
1651:
1652: 1. You should move the neartag variables that I used to
1653: have in BUILD.H into your C code.
1654: 2. You must call the neartag function yourself if you want
1655: to see if you're near a tagged object. Neartag is NOT
1656: automatically updated by the engine any more.
1657: 3. I highly recommend that you put your neartag function
1658: call at the first line in your space bar code. This way,
1659: you can optimize the neartag calculations by only doing
1660: them when you press the space bar. (Exception: For
1661: ladders, I think you'll have to call neartag every single
1662: frame)
1663:
1664: Here's a description of the new neartag function:
1665: Neartag works sort of like hitscan, but is optimized to
1666: scan only close objects and scan only objects with
1667: tags != 0.
1668:
1669: neartag(long x, long y, long z, short sectnum, short ang, //Starting position & angle
1670: short *neartagsector, //Returns near sector if sector[].tag != 0
1671: short *neartagwall, //Returns near wall if wall[].tag != 0
1672: short *neartagsprite, //Returns near sprite if sprite[].tag != 0
1673: long *neartaghitdist, //Returns actual distance to object (scale: 1024=largest grid size)
1674: long neartagrange) //Choose maximum distance to scan (scale: 1024=largest grid size)
1675:
1676: ������������������������������������������������������������������������������
1677: 5/31/94 - Added a function to get a sprite's screen coordinates. I put
1678: some sample code in my GAME in the analyzesprites function.
1679: Simply hold down the CAPS LOCK key in my GAME.EXE, and the
1680: screen will be centered around the sprite closest to the
1681: center of the screen.
1682:
1683: Here's a new function in the engine I used to do this:
1684:
1685: getspritescreencoord(short spritesortnum, long *scrx, long *scry)
1686:
1687: Note that spritesortnum is the index into the spritesortcnt
1688: arrays, NOT the normal sprite arrays. Scrx and scry are actual
1689: screen coordinates ranging from 0-319 and 0-199 respectively.
1690: ������������������������������������������������������������������������������
1691: 6/6/94 - Made EDITART support sprite centering and animation speed.
1692:
1693: Now when you press 'A' in EDITART, the animation speed is
1694: actually saved to disk and runs the same speed in BUILD
1695: and your GAME. Press + and - to change the animation speed.
1696: There are 16 different animation speeds.
1697: (Speed is proportional to (totalclock>>animspeed))
1698:
1699: To center a sprite, press the weird ~` key (located just above
1700: the TAB key). You will see some cross hairs. Simply use
1701: the arrow keys to the desired position.
1702:
1703: For both the 'A' and ~` keys, you can press Enter to accept
1704: the new values or ESC to cancel.
1705:
1706: - Added a variable to BUILD.H, lockclock. Lockclock is to
1707: totalclock as lockspeed is to clockspeed.
1708: ������������������������������������������������������������������������������
1709: 6/7/94 - Made 3 different Z coordinate modes in BUILD.
1710:
1711: Mode 0: Game mode (default)
1712: Mode 1: Height lock mode
1713: Mode 2: Float mode
1714:
1715: Press Caps Lock to switch between the 3 modes.
1716: A and Z move up and down for all 3 modes.
1717: ������������������������������������������������������������������������������
1718: 6/10/94 - Added a new function that should solve all your sound problems.
1719:
1720: kenchaintimer(void (__interrupt __far *datimerchainaddress)(),
1721: short dachainpersecond)
1722:
1723: Please look at the IMPORTANT ENGINE FUNCTIONS section above for
1724: a full description.
1725: ������������������������������������������������������������������������������
1726: 6/20/94 - Got rid of the comsend / comgetchar functions. Replaced them
1727: with sendpacket and getpacket.
1728:
1729: - Added network support.
1730:
1731: - Got rid of qsetmode320200(). Just replace it with setgamemode().
1732: The 2 are exactly the same.
1733:
1734: - Got rid of clockspeed variables. Just replace it with lockspeed.
1735:
1736: - Adjusted my z directions of shooting depending on the horizon.
1737: You may want to readjust your code for this.
1738:
1739: - You now pass the number of tics as a long to doanimations.
1740: doanimations(long numtics);
1741:
1742: - FIXED DEADLY BUG! This may have been causing bigtime crash-city
1743: bugs! The problem was with show2dsprite and show2dwall. In
1744: my engine.c I forgot that they were BIT arrays, not BYTE arrays.
1745: When I initialized the arrays to 0, I initialized 8 times the
1746: length, possibly overwriting your precious data! I initialize
1747: these arrays in the initengine and loadboard functions.
1748:
1749: - ATTENTION PROGRAMMERS: In order to get rid of the posx, posy,
1750: posz, ang, posz, and horiz variables from BUILD.H, I added some
1751: parameters to a few functions. YOU MUST REWRITE YOUR CODE
1752: TO SUPPORT THESE:
1753: loadboard(char *filename, long *posx, long *posy, long *posz,
1754: short *ang, short *cursectnum)
1755: saveboard(char *filename, long *posx, long *posy, long *posz,
1756: short *ang, short *cursectnum)
1757: drawrooms(long posx, long posy, long posz,
1758: short ang, long horiz, short *cursectnum)
1759:
1760: THESE VARIABLES SHOULD BE MOVED INTO GAME.C:
1761: long posx, posy, posz, horiz;
1762: short ang, cursectnum;
1763: long hvel;
1764: ������������������������������������������������������������������������������
1765: 6/22/94 - ATTENTION PROGRAMMERS: Added 1 parameter to movesprite, the
1766: number of tics (such as lockspeed).
1767:
1768: movesprite(short spritenum, long xchange, long ychange,
1769: long zchange, long walldist,
1770: char cliptype, long numtics)
1771:
1772: - ATTENTION PROGRAMMERS: At one time, I used to have 4 timing
1773: variable in the engine. (totalclock, clockspeed,
1774: lockclock, lockspeed). I got rid of all of them except
1775: totalclock. If you want to use the other 3 variables, you
1776: must simulate them yourself. Here's how you do it:
1777:
1778: Step 1. Define clockspeed, lockclock, and lockspeed as global
1779: longs in your code.
1780:
1781: Step 2. Be sure to zero out all 3 variables just before
1782: starting to play each level. (You could zero out
1783: totalclock also.)
1784:
1785: Step 3. Right after every time you call the nextpage()
1786: function, insert this code line for line:
1787:
1788: lockspeed = totalclock-lockclock;
1789: lockclock += lockspeed;
1790: clockspeed = lockspeed;
1791:
1792: You really don't need clockspeed if you have lockspeed.
1793: You should replace all clockspeed's with lockspeed's.
1794: Before, I had both because both totalclock and clockspeed used
1795: to be incremented in the timer handler and could be changed
1796: at any time.
1797:
1798: - I added my own optional random function, krand() which returns
1799: a pseudo-random number as a long from 0 to 65535. Notice that
1800: I put a randomseed variable in BUILD.H called randomseed.
1801:
1802: ������������������������������������������������������������������������������
1803: 6/24/94 - I just want to try to explain how all of my multiplayer code
1804: works. Theory: Think of the whole program as 2 functions:
1805:
1806: Function 1. Draw the screen (could be 2D / 3D)
1807: Function 2. Move things. (sprites, walls, sectors, and you!)
1808:
1809: My communications in GAME.C work on a MASTER/SLAVE
1810: system where it would be nice if the faster computer was the
1811: MASTER. (Right now, the first computer in is the MASTER).
1812: The big trick to keeping everything in sync (and I do mean
1813: everything- even moving platforms, revolving doors, & subways)
1814: is to call function #2 with the exact same parameters as input
1815: on all computers the same number of times and in the same
1816: order. Now this might seem like a lot of information but it
1817: really isn't! Let me explain the role of the MASTER and SLAVE:
1818:
1819: The MASTER's job:
1820: 1. Read in own input changes
1821: 2. Read in any slave player input changes
1822: (getpackets function - reads in foreign vel, svel,
1823: angvel, & the bits)
1824:
1825: 3. Just before calling the movethings function, send the
1826: input to the movethings function:
1827: A. Master's tic cnt (synctics)
1828: B. Every player's velocities (syncvel, svel, angvel)
1829: C. Every player's status bits (Space, Ctrl, Shift, etc.)
1830: 4. Call the movethings function
1831: 5. Draw screen
1832:
1833: The SLAVE's job:
1834: 1. Read in own input changes
1835: 2. Send own input changes to master.
1836: 3. Read in all master movethings input parameters and
1837: call movethings function for each packet. This may
1838: mean calling the movethings function more than once
1839: between calling the drawscreen functions. This is
1840: waste, but it's the price you have to pay to keep
1841: things in sync.
1842: 4. Draw screen
1843:
1844:
1845: You may ask how do monsters stay in sync even if you are
1846: not sending any monster information over the line. The
1847: answer to this is simple.
1848: 1. You make sure that a random seed starts the same on
1849: both computers.
1850: 2. Only call the rand() or krand() function in the
1851: movethings function.
1852:
1853: Before you try my demo, I wanted to say that, I have
1854: ABSOLUTELY NO ERROR CORRECTION in my code at this point. It
1855: is most certainly my next project. For serial link, I would
1856: recommend a rate of about 14400 baud. In the future, I think
1857: I can optimize the code enough to work at rates as low at 2400
1858: baud! Let me explain how well certain setups should work
1859: without error correction:
1860: Ken's guesses on how badly it will crash WITH NO ERROR
1861: CORRECTION (Build the way it is now):
1862:
1863: 1. Serial link using 8250 chips - out of sync after 15
1864: seconds because a few bytes were missed.
1865: 2. Serial link using 16550 chips - out of sync after 10
1866: minutes because 16550 chips have a 16 byte FIFO and
1867: therefore don't lose bytes as often as the 8250.
1868: 3. Modem - out of sync after less than 5 seconds.
1869: 4. Network - out of sync after 1 minute. Networks love to
1870: lose full packets here and there.
1871:
1872: I will be working on error correction for all of the above
1873: situations. Any error correction techniques I use will be
1874: internal to the engine and completely transparent to you (so
1875: you can start coding now!) If the demo actually works multi-
1876: player, then you may want to look at my GAME keys at the top
1877: of this file again. There are some significant changes.
1878:
1879: * I replaced the old COM functions section at the top of
1880: BUILD.TXT with a COMMUNICATIONS FUNCTIONS section. Please
1881: look through it for descriptions of at least these 2
1882: functions:
1883:
1884: sendpacket(short otherconnectnum, char *bufptr, short bufleng)
1885: getpacket(short *otherconnectnum, char *bufptr)
1886:
1887: * Another rule to keep in mind while testing: (as if there
1888: aren't enough already) Always make sure you have the
1889: same EXE's and MAP'S or else the games will get out of sync.
1890:
1891: * Connection numbers and Index numbers:
1892: For networks, each computer has a given connection number.
1893: Connection numbers range from 1 to 100. Player number 1
1894: might have connection number 5 and player number 2 might have
1895: connection number 17. Since a player's connection number
1896: can be anything between 1 and 100, I don't want you to
1897: allocate 100 of every variable such as posx[100]. My
1898: solution was to make index numbers. So in this case:
1899:
1900: connectnum[0] = 5; connectindex[5] = 0;
1901: connectnum[1] = 17; connectindex[17] = 1;
1902:
1903: * Now I'll will describe some new variables at the top of GAME.C
1904:
1905: myconnectnum - connection number of your computer
1906: myconnectindex - index number of your computer
1907: masterconnectnum - connection number of the MASTER computer
1908: screenpeek - index number of which player's eyes you are
1909: looking through.
1910: numplayers - if numplayers >= 2 then multiplayer mode is
1911: enabled, else single player game.
1912:
1913: connecthead, connectpoint2[MAXPLAYERS] - These 2 variables
1914: form a linked list of all the index numbers.
1915: Here's some example code that traverses the list of
1916: players:
1917:
1918: p = connecthead;
1919: while (p != -1)
1920: {
1921: printf("Player index %d has connection number %d\n",p,connectnum[p]);
1922: p = connectpoint2[p];
1923: }
1924:
1925: * These variables are used to record / playback a demo. (This
1926: is like POSCAPT.DAT, but with everything in sync!) In my
1927: GAME, i single player mode, I have it so if you press the
1928: Left ENTER, then it will playback everything. These are
1929: the only variables necessary to store a demo run:
1930:
1931: static long reccnt; //Number of frames
1932: static short recsyncvel[16384]; //Vel for each frame
1933: static short recsyncsvel[16384]; //Svel for each frame
1934: static short recsyncangvel[16384]; //Angvel for each frame
1935: static short recsyncbits[16384]; //Bits for each frame
1936: static short recsynctics[16384]; //Tics for each frame
1937:
1938: * These variables are used for communications syncing:
1939:
1940: static short syncvel[MAXPLAYERS+1]; //Vel of each player
1941: static short syncsvel[MAXPLAYERS+1]; //Svel of each player
1942: static short syncangvel[MAXPLAYERS+1]; //Angvel of each player
1943: static short syncbits[MAXPLAYERS+1]; //Bits for each player
1944: static short synctics; //Number of tics of MASTER ONLY
1945:
1946: * Unless I suddenly make BUILD a 6-degree of freedom engine
1947: tomorrow, this should be the most difficult update in a long
1948: time! Good Luck in programming! I'm sure I left a lot of
1949: things out, so I'll be expecting plenty of phone calls!
1950: ������������������������������������������������������������������������������
1951: 6/27/94 - I scaled the vel, svel and angvel variabile down 1 bit so they
1952: fit into a signed char. (Before they ranged from -256 to 256)
1953: Now they range from (-128 to 127).
1954: ������������������������������������������������������������������������������
1955: 6/28/94 - Optimized the size of my COM(modem)/network packets in game.c.
1956: I made the tics into a char. I also use some new buffers called
1957: osyncvel, osyncsvel, osyncangvel, and osyncbits. Now I send
1958: extra byte with bit fields that tell whether I need to update
1959: the syncvel, syncsvel, syncangvel, or syncbits variables. If
1960: the bit field of the extra byte is off then I don't send the
1961: byte(s) it represents. You can now play my GAME at 4800 baud.
1962:
1963: static signed char syncvel[MAXPLAYERS+1], osyncvel[MAXPLAYERS+1];
1964: static signed char syncsvel[MAXPLAYERS+1], osyncsvel[MAXPLAYERS+1];
1965: static signed char syncangvel[MAXPLAYERS+1], osyncangvel[MAXPLAYERS+1];
1966: static short syncbits[MAXPLAYERS+1], osyncbits[MAXPLAYERS+1];
1967: static unsigned char synctics;
1968:
1969: - There was an crashing error with transluscence palette on low
1970: memory configurations. When you exit the BUILD editor,
1971: you normally get some numbers like this.
1972: Memory status: 788979(788979) bytes
1973: If the first number (art memory cache size) was less than the
1974: second number (art file size), then the whole art file did
1975: not fit in memory. The reason for the crashing was because
1976: loadpics() sucks all memory up to the size of the art file.
1977: The 64K transluscent palette is malloc'd when you call the
1978: setgamemode() function for the first time. The was no memory
1979: left to allocate the palette. I fixed this by making the
1980: transluscent palette take 64K of the art memory cache if
1981: it could not malloc the 64K.
1982:
1983: - I programmed some error correction for the COM(modem). Here is
1984: my new of Ken's guesses on how badly it will crash (assuming
1985: that it will always crash eventually.) You will be seeing new
1986: and better correction methods in the future.
1987:
1988: ERROR CORRECTION METHOD #1:
1989: 1. Serial link using 8250 chips - out of sync after 5 minutes.
1990: 2. Serial link using 16550 chips - out of sync after 10 minutes.
1991: 3. Modem - out of sync after 3 minutes - try it!
1992: 4. Network - out of sync after 1 minute. Networks love to
1993: lose full packets here and there. (not changed)
1994: ������������������������������������������������������������������������������
1995: 6/29/94 - Added some code to my GAME.C that will let you type in messages
1996: and send them to all remote players. Press Tab (or T for
1997: those people who play that other, very bad, game too much)
1998: to start typing in a message. Press either Enter key to send
1999: the message to the other player.
2000: ������������������������������������������������������������������������������
2001: 6/30/94 - ATTENTION PROGRAMMERS: I changed the values that clipmove and
2002: movesprite return! Here's how they work now:
2003: If you did not hit anything, then they return 0.
2004: Movesprite only: If the object hits a ceiling / floor
2005: then movesprite returns 16384+(sectornum hit).
2006: If the first object you hit before sliding was a wall,
2007: then they return the 32768+(wallnum hit).
2008: If the first object you hit before sliding was a sprite,
2009: then they return the 49152+(spritenum hit).
2010:
2011: Be careful when adding these changes to your code since the
2012: return value are sort of reversed:
2013:
2014: return values: � Hit nothing: � Hit something:
2015: ���������������������������������������������������������
2016: Old functions: � 1 � 0
2017: ��������������������������������������������������������-
2018: � � 16384+sectnum (Movesprite only)
2019: New functions: � 0 � or 32768+wallnum
2020: � � or 49152+spritenum
2021:
2022: ������������������������������������������������������������������������������
2023: 7/1/94 - Made getangle always return an angle from 0 to 2047. Before I
2024: forgot to and it 2047 and sometimes the angle was negative.
2025:
2026: - Made overwritesprite when using the centering option be sensitive
2027: to the Editart centering tool. (The ~` key.)
2028:
2029: - Made Ctrl+Rt.Shift highlight points on a loop rather than points
2030: inside a rectangle.
2031: ������������������������������������������������������������������������������
2032: 7/2/94 - Added some neat features to my GAME.C to make multi-player mode
2033: even more fun. I added a portable bowling ball/bomb-thrower.
2034: kills instantly! (similar to rocket launcher) I also added
2035: water fountains. If you hold the space bar down on them,
2036: you slowly get more life.
2037:
2038: - O.K. I think I actually got the syncronization working perfectly
2039: for COM(modem) play. I haven't had all day to test it out yet!
2040: (Still no error correction with networks)
2041:
2042: Here are some steps in playing over the modem:
2043: 1. Be sure that both people have the exact same version of
2044: the EXEs, ART, and MAPs.
2045: 2. Then go into SETUP and set the COM port to the com port
2046: of your modem. Even though 9600 baud should work, I
2047: would recommend going at 4800 baud because:
2048: A. It works fine at 4800 baud so there is really
2049: no need to go any faster.
2050: B. Fewer errors over the modem so less time
2051: spent re-sending packets.
2052: 3. Then type: MODEM [mapname] (must be same mapname!)
2053: This will bring you into my terminal program. You can
2054: set the modem initialization string in MODEM.BAT by
2055: changing the first command line option of the TERM
2056: line. Please disable modem compression and
2057: correction for least jerky play. Then connect with
2058: the other modem using various methods, such as one
2059: person typing ATA and the other typing ATD or one
2060: person typing ATS0=1 and the other typing
2061: ATDT(phone #).
2062: 4. Wait through the beeps and buzzes until it says CONNECT
2063: on the bottom window.
2064: 5. If you can now chat with each other then things are
2065: going well. When the first person presses ESC, both
2066: computers will automatically quit to DOS and go right
2067: into the GAME.
2068: 6. Play!
2069: ������������������������������������������������������������������������������
2070: 7/5/94 - Serial moder over COM(modem) should work perfectly now.
2071:
2072: - Added scaredfallz to BUILD.H. It is a global variable that
2073: tells monsters what height is too high to fall through. You
2074: can set cliptype parameter to 2 for movesprite and clipmove.
2075: ������������������������������������������������������������������������������
2076: 7/6/94 - Fixed clipping bug that used to let you go through certain concave
2077: corners.
2078:
2079: - Added new function which works well with clipmove. Ever notice
2080: was when you're at the edge of a cliff and you go just a tiny
2081: bit over, you fall, but shouldn't yet? Unlike what you have
2082: been doing, this new function finds the highest and lowest z
2083: coordinates that your clipping BOX can get to. It must search
2084: for all sectors (and sprites) that go into your clipping box.
2085: Currently, you were searching the z's at the center point only
2086: by simply using the sector[].ceilingz and sector[].floorz
2087: variables.
2088:
2089: getzrange(long x, long y, long z, short sectnum,
2090: long *ceilz, long *florz,
2091: long walldist, char cliptype)
2092:
2093: Pass x, y, z, sector normally. Walldist can be 128. Cliptype
2094: can be 0, 1, or 2. (just like movesprite and clipmove)
2095: This function returnes the 2 z maxes in ceilz and florz.
2096: See GAME.C for an example.
2097:
2098: - Fixed bug with weird vertical lines in transluscent masked walls
2099: in chain mode.
2100: ������������������������������������������������������������������������������
2101: 7/10/94 - Made screen capture (F12) work in 2D modes also. It always
2102: saves to a 256 color PCX file.
2103:
2104: - Made screen re-sizeable. Use this easy new function to re-size
2105: the screen:
2106:
2107: setview(long scrx1, long scry1, long scrx2, long scry2);
2108:
2109: It is TOO easy to use. You simply pass is the Upper-left hand
2110: corner and the bottom-right corner in screen coordinates of the
2111: rectangular region you want the engine to draw to. The engine
2112: automatically centers the horizon at the middle of the window and
2113: scales everything properly.
2114:
2115: Notes:
2116: - Since the engine does extra scaling calculations for
2117: window sizes that are not 320 pixels wide, I do not
2118: recommend making the default mode with a window size
2119: just under 320 pixels wide since the engine can
2120: actually run a little slower. (such as 312-319
2121: pixels wide) Keep them 320 wide.
2122: - Feel free to modify the startumost / startdmost arrays
2123: AFTER a setview call if you want weird window shapes.
2124: Keep in mind that startumost[0] and startdmost[0] are
2125: always refer to the left edge of the viewing window.
2126: (NOT left edge of screen.)
2127: ������������������������������������������������������������������������������
2128: 7/19/94 - Finally got around to writing the number-of-tiles-per-file
2129: resizer. Simply type rsizeart. All instructions will be
2130: displayed when running the program before the actual
2131: conversion.
2132:
2133: - Fixed a few bugs in Editart. I hope I fixed those evil bugs that
2134: rarely come by. I'm pretty sure I fixed the bug that made the
2135: screen go blank in 'V' mode, and the bug where a few pixels
2136: in the top left corners of tiles sometimes get overwritten.
2137:
2138: - Added a key in Build 2D edit mode. Press 'E' on a sprite to
2139: change its status list number.
2140:
2141: - Fixed those lousy Editart subdirectory colors in 'U' for those
2142: teams with great color palettes, but don't have my ugly shade
2143: of pink.
2144:
2145: - Fixed bug with non-200 high P-skies. The p-skies are now (by
2146: default) centered on the horizon no matter what the height is.
2147:
2148: - Added multiple size PCX and GIF support in Editart. You can now
2149: load pictures up to 1024*256. (That's all that can fit in VGA
2150: video memory) If you need to load a bigger picture than that,
2151: it will be chopped off at the bottom, but will still load the
2152: top piece.
2153:
2154: - I know that I have introduced some wonderful new bugs with the
2155: sprite drawing. I know why they're happening, but I am
2156: looking for a good solution so as to not make you change
2157: any code. I will put another upload with these bugs fixed
2158: soon.
2159: ������������������������������������������������������������������������������
2160: 7/20/94 - Added TRUE ornamented walls. Right now the actual ornamentation
2161: must be programmed by you with 2 simple functions:
2162:
2163: copytilepiece(long tilenume1, long sourcex1, long sourcey1,
2164: long xsiz, long ysiz,
2165: long tilenume2, long destx1, long desty1)
2166:
2167: * This function simply copies any section of a source tile
2168: to any part of a destination tile. It will automatically
2169: skip transparent pixels. It will wrap-around in the
2170: source but not the destination. If for some reason
2171: the destination tile gets removed from the cache, the
2172: destination tile will be reset to original form. This
2173: is why I had to add this second function:
2174:
2175: allocatepermanenttile(short tilenume, long xsiz, long ysiz)
2176:
2177: * This function allocates a place on the cache as permanent.
2178: Right now, I reset the cache every time you call this
2179: function so I would recommend calling this function
2180: right after loadpics.
2181:
2182: I have an example of both of these functions in GAME.C. Try
2183: playing GAME DOOM1.MAP and go into the secret room with
2184: the pictures of Ken. Shoot some walls there. The pictures
2185: with Ken and the Explosion over it were done with
2186: copytilepiece and allocated permanently at tile 4095. A
2187: good idea for allocating permanent tiles would be to start
2188: at 4095 and decrement. You can also allocate a permanent
2189: tile over the original tile itself.
2190:
2191: - Tile panning matching keys work a lot better. They now work
2192: well with bottom steps. Also, it works well with matching
2193: up windows.
2194: ������������������������������������������������������������������������������
2195: 7/25/94 - A week ago, I uploaded a version of BUILD which unfortunately
2196: had more bugs than the previous version. This upload should
2197: have those bugs fixed - especially the sprite bugs. (I hope)
2198:
2199: - I think I may actually have the sprite feet behind stairs bug
2200: working perfectly.
2201:
2202: - The engine should now be even faster the before last week. (A
2203: week ago, I temporarily changed the parallaxing sky algorithm,
2204: making the engine slower in those areas)
2205:
2206: - Added a variable, parallaxyoffs in BUILD.H. It defaults to 0.
2207: If you set it to 100, then all parallaxing skies will be
2208: properly moved 100 pixels higher.
2209:
2210: - Fixed some weird drawing bug related to parallaxing skies and
2211: sprites.
2212: ������������������������������������������������������������������������������
2213: 7/26/94 - Made sprite's sectors dependent on the z coordinates in the BUILD
2214: editor. (Helpful if you use overlapping in your maps)
2215: ������������������������������������������������������������������������������
2216: 7/29/94 - Made precache function. Simply call:
2217: precache() (no parameters)
2218: right after you call loadboard(?,?,...) and it will load
2219: all tiles in the current board into the cache. Note that
2220: animations of sprites after the first one will not be
2221: precached. I have included my precacheing code at the
2222: end of game.c for those interested in making the precaching
2223: fancy.
2224:
2225: - Fixed bug in editart which made it sometimes save the art files
2226: and names.h in the wrong directory (the last directory you
2227: were in when you were in 'U' mode). You may want to search
2228: your artwork directories to see if you were a victim of this
2229: bug.
2230: ������������������������������������������������������������������������������
2231: 7/30/94 - Made Ctrl-Enter paste parallaxing sky tiles to all neighboring
2232: parallaxing sky areas also.
2233: ������������������������������������������������������������������������������
2234: 7/31/94 - Fixed (most) crashing bugs - Doesn't even crash on the highest
2235: skyscrapers now! Since I can never be SURE that the crashing
2236: is gone, I need you to test it for me - compare the number
2237: of times it crashes per second since the last version. It
2238: should be much better.
2239:
2240: - Fixed sector line bug! Get close to a step, hold down Shift+Z
2241: and the edges of the step will NOT jitter like before AND you
2242: will not get random walls going through the screen.
2243: ������������������������������������������������������������������������������
2244: 8/1/94 - Got rid of the OLD transluscent stuff from overwritesprite and
2245: permanentwritesprite. (Before it used the 8K shading table
2246: which didn't work very well)
2247:
2248: - Added new true 50/50 transluscence option to overwritesprite.
2249: See bit 2 in the next comment.
2250:
2251: - Fixed overwritesprite so it works with different screen sizes.
2252: You don't need to do any scaling calculations! Should be
2253: compatible with old function. Added new bit 1 to orientation
2254: parameter to determine whether or not the sprite should be
2255: scaled and clipped to the viewing window.
2256:
2257: overwritesprite (long thex, long they, short tilenum,
2258: signed char shade, char orientation)
2259:
2260: If Bit 0 of orientation = 0: (thex, they) is top-left corner
2261: If Bit 0 of orientation = 1: (thex, they) is middle
2262: If Bit 1 of orientation = 0: no relation to viewing window
2263: If Bit 1 of orientation = 1: scale and clip to viewing window
2264: If Bit 2 of orientation = 0: normal
2265: If Bit 2 of orientation = 1: 50/50 transluscent!
2266:
2267: * If it works at full screen, simply set bit 1 of orientation
2268: to 1, and it should automatically scale properly!
2269:
2270: - Made it so 2/4/6/8 keys in 3D EDIT MODE now only move the objects
2271: 1 step rather than continuously, giving more control over the
2272: repeat/panning values of things.
2273:
2274: - Made the / key not only reset the repeats of walls, but also for
2275: sprites. It will set both repeats of the sprite to the default
2276: size of 64. If you hold down shift with / on a sprite, it
2277: will give the sprite a square aspect ratio by setting the
2278: xrepeat to equal the yrepeat value.
2279: ������������������������������������������������������������������������������
2280: 8/2/94 - Doubled the board size from: (0 to 65536, 0 to 65536) to
2281: (-65536 to 65536, -65536 to 65536) Notice that the grid in
2282: 2D EDIT MODE is much bigger than before. Since it is very easy
2283: to double the maximum board size, just tell me if you need
2284: a larger board. The only bad thing about allowing larger
2285: boards is that the map designer is more likely to make some
2286: sectors too large and cause overflow bugs. 32 bits can only
2287: go so far you know!
2288:
2289: - I think I MAY have fixed a bug in BUILD that used to make it crash
2290: when quitting. It had something to do with the vertical grid
2291: lines in 2D EDIT MODE when zoomed way in around the upper left
2292: corner of the map (I think).
2293: ������������������������������������������������������������������������������
2294: 8/3/94 - Optimized Editart loading and saving.
2295:
2296: - Made 'V' screen in Editart 320*400 instead of 320*200.
2297:
2298: - Before I said I fixed the bug in EDITART where a few pixels in the
2299: top left corners of tiles sometimes got overwritten. Well I
2300: lied. This time I really fixed it. (I hope)
2301: ������������������������������������������������������������������������������
2302: 8/7/94 - Made x&y repeats, x&y pannings easier to adjust. It now works
2303: like the default keyboard handler. It moves once when you
2304: first press the key. A little later, it starts to move fast.
2305: ������������������������������������������������������������������������������
2306: 8/11/94 - Added great new sprite rotation function which works like
2307: overwritesprite (like 2DRAW sprites)
2308:
2309: rotatesprite(long sx, long sy, long z, short a, short picnum)
2310:
2311: (sx, sy) is the center of the sprite to draw defined as
2312: screen coordinates shifted up by 16.
2313: (z) is the zoom. Normal size is 65536.
2314: Ex: 131072 is zoomed in 2X and 32768 is zoomed out 2X.
2315: (a) is the angle (0 is straight up)
2316: (picnum) is the tile number
2317:
2318: Ex: rotatesprite(160L<<16,100L<<16,65536,lockclock<<4,DEMOSIGN);
2319: This example will draw the DEMOSIGN tile in the center of the
2320: screen and rotate about once per second.
2321:
2322: Rotatesprite clips to the same area as overwritesprite but does
2323: not scale or do transluscence yet.
2324:
2325: - Please look at the new permanentwritesprite documentation at the
2326: top of this file!
2327:
2328: - Network should now work again - It now works great on my network
2329: with 3 players! It may possibly also work with 4 or 5 players
2330: too, but I didn't feel like running between 2 rooms to test it!
2331: I never thought the day would come when I would get NET, COM,
2332: and MODEM all working respectably!
2333:
2334: - Changed setup program so you can select 2, 3, 4, or 5 players in
2335: a network game. (The 5 is just to annoy people who like that
2336: other lousy game)
2337:
2338: - ATTENTION BUILDERS! Added TILE MOVING to EDITART! For now, it
2339: will only work WITHIN THE SAME ART FILE. Do the tile moving
2340: all in 'V' mode. Here are the new keys in 'V' mode:
2341:
2342: To swap 2 tiles:
2343: Simply press space bar on the first tile, then space
2344: bar on the second.
2345: To swap a group of tiles:
2346: Press 1 on the first tile, press 2 to remember the region
2347: between where you pressed 1 and 2. Press 3 at the
2348: place to where you want to swap all the tiles.
2349:
2350: Don't forget that this is all SWAPPING, tiles will (should)
2351: NOT be overwritten using these keys.
2352:
2353: - ATTENTION PROGRAMMERS! Added ceildist and flordist parameters to
2354: both clipmove and movesprite. I always had them all set to
2355: (4<<8) by default.
2356:
2357: clipmove(long *x, long *y, long *z, short *sectnum,
2358: long xvect, long yvect,
2359: long walldist, long ceildist, long flordist,
2360: char cliptype)
2361:
2362: movesprite(short spritenum, long xchange, long ychange, long zchange,
2363: long walldist, long ceildist, long flordist,
2364: char cliptype, long numtics)
2365:
2366: - Moved some com/network code from the getpackets function in game
2367: into the engine.
2368: ������������������������������������������������������������������������������
2369: 8/15/94 - Fixed some network initialization code and it now works with 4
2370: players. (I tested it.)
2371: ������������������������������������������������������������������������������
2372: 8/16/94 - Added different shirt color support. Here's how you do it:
2373:
2374: allocatespritepalookup(long palnum, char *remapbuf)
2375:
2376: See more documentation of allocatespritepalookup at the top of
2377: this file.
2378: ������������������������������������������������������������������������������
2379: 8/18/94 - I made it so you can redefine the keys in the setup program under
2380: the input devices menu.
2381:
2382: - ATTENTION EVERYONE - for this new version, you MUST go into my
2383: new SETUP program, and SAVE CHANGES AND QUIT once. The arrow
2384: key code will not work if you don't do this! If you are
2385: one of those people who actually read BUILD.TXT, give yourself
2386: 1 point. I wonder who will get "caught" for not reading this!
2387: ������������������������������������������������������������������������������
2388: 8/22/94 - Added pixel height and wall length information to 2D EDIT MODE
2389: when you press Tab or Alt-Tab on a sector or wall.
2390:
2391: - Now show the actual number of sprites in 2D EDIT MODE.
2392:
2393: - Improved digitized sound routines. Just thought I'd mention it.
2394:
2395: - Added a "save As" feature to 2D EDIT MODE.
2396:
2397: - Now show all lo and hi tags in 2D EDIT MODE on the map itself!
2398: Note that position of the sector tag's text is put at the
2399: average point of all the points of the sector, so if you have
2400: a weird shape tagged sector, the text might show up at an
2401: inconvenient place.
2402:
2403: - You can turn the tag boxes on or off by pressing CTRL-T or by
2404: zooming out.
2405:
2406: - ATTENTION EVERYONE - for the new BUILD.EXE and OBJ's, you will
2407: need to copy my new TABLES.DAT over your old one. Also, you
2408: must go into SETUP and SAVE&QUIT. I have split the TABLES.DAT
2409: file into 2 separate files. They are:
2410:
2411: TABLES.DAT - 10880 bytes - sin tables, fonts, etc.
2412: SETUP.DAT - 23 bytes - (6 options) + (17 custom keys)
2413:
2414: The SETUP.DAT file is the only file SETUP.EXE accesses now.
2415: This means that from now on, if I want to add something to
2416: TABLES.DAT, you won't have to go into the setup program and reset
2417: the options again.
2418: ������������������������������������������������������������������������������
2419: 8/24/94 - Relative alignment now fully works with ROTATION! Relative
2420: alignment will allow ceilings and floors to align with the
2421: first 2 points of a sector. This will relieve you of
2422: programming special ceiling and floor panning code for moving
2423: sectors.
2424: In 3D EDIT MODE, simply press 'R' on a ceiling / floor to switch
2425: between relative alignment mode and normal mode. Notice that
2426: bit 6 of both sector[].ceilingstat and sector[].floorstat are
2427: relative alignment bits.
2428: I have an example of relative alignment in nukeland.map in the
2429: high blue room off the main octagonal room. Also note that my
2430: subways and dragsectors now use relative alignment for panning.
2431: ������������������������������������������������������������������������������
2432: 8/25/94 - I added a new parameter to printext256 and printext16. I need
2433: to document this stuff!
2434: ������������������������������������������������������������������������������
2435: 8/27/94 - Made it so you can't shrink sprites so much you can't grab them
2436: any more in 3D EDIT MODE.
2437:
2438: - Added (G)oto feature into Build 'V' mode. Simply press G, type
2439: the tile number and it will go there.
2440: ������������������������������������������������������������������������������
2441: 9/7/94 - Fixed relative alignment bugs I noticed. My subway.map won't
2442: crash anymore and the relatively aligned ceilings and floors
2443: should not pan crazily anymore when looking from a far
2444: distance.
2445: ������������������������������������������������������������������������������
2446: 9/9/94 - ATTENTION PROGRAMMERS: I added a new parameter to
2447: overwritesprite. Dapalnum can be from 0-15 depending on
2448: what palette lookup table is being used. Dapalnum is normally
2449: 0. Overwritesprite now looks like this:
2450:
2451: overwritesprite (long thex, long they, short tilenum,
2452: signed char shade, char orientation, char dapalnum)
2453: ������������������������������������������������������������������������������
2454: 9/13/94 - ATTENTION PROGRAMMERS: I changed the last parameter of drawrooms
2455: (sector number) to be passed as a value, NOT a pointer anymore.
2456:
2457: drawrooms(long daposx, long daposy, long daposz,
2458: short daang, long dahoriz, short dacursectnum)
2459: ������������������������������������������������������������������������������
2460: 9/15/94 - ATTENTION PROGRAMMERS: I took out the COM(modem)/network code
2461: from my engine.obj and put it into a separate .obj called
2462: multi.obj. (I also removed the sound from my engine and stuck
2463: it in kdmeng.obj) Please include it in your makefile. Here is
2464: a list of ALL of the variables and functions you will need to
2465: know to program for multiple players:
2466:
2467: VARIABLES: (You should extern these in your game.c)
2468: extern short numplayers, myconnectindex;
2469: extern short connecthead, connectpoint2[MAXPLAYERS];
2470: extern long *lastpacket2clock;
2471:
2472: FUNCTIONS:
2473: initmultiplayers(option[4],option[5]);
2474: uninitmultiplayers();
2475:
2476: sendlogon();
2477: sendlogoff();
2478:
2479: sendpacket(connecthead,tempbuf,j);
2480: sendpacket(-1,tempbuf,j);
2481: leng = getpacket(&otherconnectindex,tempbuf);
2482:
2483: Please see detailed descriptions of these functions at the top
2484: of this file.
2485:
2486: - Multiplayer code is now MUCH cleaner!
2487:
2488: - Please try my game on your networks again! My game now works
2489: perfectly with 3 players on a network that used to crash at
2490: the DOS4GW prompt just a week ago! My game needs only IPX,
2491: no server to run.
2492: ������������������������������������������������������������������������������
2493: 9/16/94 - ATTENTION PROGRAMMERS: CONVMAP5!!! YOU MUST RUN CONVMAP5 ON
2494: ALL OF YOUR MAPS IF YOU WANT THEM TO WORK WITH THE NEW
2495: BUILD.EXE OR OBJ'S! Following are the exact changes I made
2496: to the new map format:
2497:
2498: * Added numextras
2499: * Added sector[].ceilingpal
2500: * Added sector[].floorpal
2501: * Added sector[].visibility
2502: * Split sector[].tag to sector[].lotag and sector[].hitag
2503: * Added sector[].extra
2504: * Expanded wall[].cstat to a short
2505: * Split wall[].tag to wall[].lotag and wall[].hitag
2506: * Added wall[].extra
2507: * Split sprite[].tag to sprite[].lotag and sprite[].hitag
2508: * Got rid of sprite[].extra (the void * mess)
2509: * Added sprite[].extra
2510:
2511: The only thing programmers have to worry about when converting
2512: are the tags. I split them into lo and hi tags.
2513: (See BUILD.H for new structure formats)
2514:
2515: I got rid of the (void *)extra thing from the sprite
2516: structure. I know I may have made some promises it
2517: wouldn't change and it was for your use only, but what
2518: can I say - it's not needed anymore (in other words,
2519: if you're already using it, TOUGH LUCK). I have my
2520: own, new, method for extending sector, wall, or
2521: sprite structures. You will be able to extend any
2522: structure as much as you want AND be able to edit it
2523: all in the BUILD editor to be saved in the permanent
2524: map format. Notice I added a (short)extra to all 3
2525: main structures. They default to -1. But if they
2526: are >= 0 then they form a linked list out of the
2527: extra structure. NOTE: THIS EXTRA STUFF IS NOT
2528: PROGRAMMED YET! I'm just mentioning it becuase the
2529: new map format has this extendability. I'll try to
2530: get it done soon though. (9/21/94) - Actually just
2531: ignore the fact that this paragraph ever existed.
2532: I'm just keeping it here for history purposes.
2533:
2534: - Renamed my allocatespritepalookup function to makepalookup since
2535: it now also applies to walls, ceilings, floors, p-skies and
2536: masked walls.
2537: ������������������������������������������������������������������������������
2538: 9/20/94 - Added rotated sprites. These new rotated sprites rotate in the
2539: same way as masked walls. Sounds like a waste since the
2540: engine already has masked walls? NOT AT ALL! With rotated
2541: sprites, you can EASILY do TRUE ornamented walls FULLY inside
2542: the BUILD editor with even MORE versatility than that other
2543: game out there. For example, you can place the ornamentation
2544: anywhere on the wall, with sizing control using 2,4,6,8 on the
2545: keypad, and even ornament with transluscence! In 3D EDIT
2546: MODE, simply press 'R' on a sprite to make it a rotated
2547: sprite (Programmers see bit 4 of sprite[].cstat)
2548:
2549: - Fixed crashing bug with sector (Rt. ALT) copy/paste in 2D EDIT
2550: MODE.
2551:
2552: - You can now copy groups of sectors from 1 map to another! Here's
2553: how you do it:
2554:
2555: Step 1: Capture a bunch of sectors with the Rt. ALT selection
2556: tool.
2557: Step 2: With the sectors still highlighted, you can now load
2558: another map and the highlighted sectors will
2559: automatically be inserted into the new map. (They
2560: will still be highlighted)
2561: ������������������������������������������������������������������������������
2562: 9/21/94 - Fixed bug with cursectnum not always being right after loading
2563: the board. I now check it and make sure it's right when
2564: saving in BUILD now.
2565:
2566: - Added 'O' key in 2D/3D EDIT MODES. It will push a rotated sprite
2567: backwards (using hitscan) into the first wall and
2568: automatically adjust the angle to make the sprite appear
2569: as if it was part of the wall.
2570:
2571: - You can now press 'S' to insert a sprite in 3D EDIT MODE. Press
2572: 'S' on a ceiling or floor.
2573:
2574: - You can now press delete to delete a sprite in 3D EDIT MODE.
2575: ������������������������������������������������������������������������������
2576: 9/22/94 - Programmed Nick & Peter's BUILD stub to their EXACT
2577: specifications. See WSTUB.C for code & documentation.
2578: ������������������������������������������������������������������������������
2579: 9/27/94 - Fixed Rt. Alt block copying nextsector1 pointer bug.
2580: ������������������������������������������������������������������������������
2581: 9/29/94 - Added special bitmapped effect which I either call lava or
2582: boiling slime. See my initlava and movelava functions
2583: inside GAME.C.
2584:
2585: - I added a bit array call gotpic. The engine will set the
2586: respective gotpic bit for each picnum drawn to the screen,
2587: including ceilings, floors, walls, sprites, masked walls -
2588: even overwritesprites, etc. This array is mainly for
2589: making the game only calculate special bitmapped effects
2590: when that certain picnum is on the screen.
2591:
2592: Note 1: The engine does NOT automatically clear the gotpic
2593: bits for you. If you want to test gotpic for a certain
2594: picnum, you should clear it if you want to test it again.
2595:
2596: Note 2: It is not necessary to use permanentwritesprite
2597: for bitmapped special effects - after all, if you see it,
2598: it MUST be in the cache.
2599:
2600: Added to BUILD.H:
2601: EXTERN char gotpic[MAXTILES>>3];
2602:
2603: Example code in GAME.C:
2604: if ((gotpic[SLIME>>3]&(1<<(SLIME&7))) > 0) //test bit
2605: {
2606: gotpic[SLIME>>3] &= ~(1<<(SLIME&7)); //clear bit
2607:
2608: if (waloff[SLIME] != -1) //if in cache
2609: movelava((char *)waloff[SLIME]); //calculate!
2610: }
2611:
2612: - Added what some people call gamma correction. I think
2613: brightness is a better description though.
2614:
2615: setbrightness(char brightness);
2616:
2617: Simply call this function where brightness ranges from
2618: 0 to 4. Brightness defaults to 0. Levels 1-4 are all brighter
2619: than 0. If you switch between 2D & 3D modes, the engine will
2620: remember the current brightness level.
2621: ������������������������������������������������������������������������������
2622: 9/30/94 - Added a few keys to fake a multiplayer game all on 1 computer.
2623: In my game, press Insert to add a new player at the starting
2624: position, and Delete to delete the last player. Press
2625: scroll lock to get control of the other players. In the same
2626: way Lt. Enter lets you view other players, Scroll lock will
2627: let you control other players (single player game only)
2628: ������������������������������������������������������������������������������
2629: 10/2/94 - Moved all doanimations code from engine into game.c. If you
2630: are using the doanimations code, here's exactly what you
2631: need to do to make it work with your code again:
2632:
2633: Step 1: Copy these 3 functions which you should find at
2634: the end of my Game.c:
2635:
2636: doanimations(long numtics)
2637: getanimationgoal(long animptr)
2638: setanimation(long *animptr, long thegoal, long thevel)
2639:
2640: Step 2: Move these variables out of BUILD.H and into your
2641: game.c:
2642:
2643: #define MAXANIMATES 512
2644: static long *animateptr[MAXANIMATES], animategoal[MAXANIMATES];
2645: static long animatevel[MAXANIMATES], animatecnt = 0;
2646:
2647: * If you copied my door code, you will probably have to convert
2648: some parameters to longs. (oops!)
2649:
2650: - Got rid of printnum from the engine. It is an outdated function.
2651: Use either printext256 or printext16 instead.
2652:
2653: - Added y-flipping for both normal and rotated sprites. (see bit
2654: 3 of sprite[].cstat in BUILD.H.
2655:
2656: - Added y-flipping for walls. (see bit 8 of wall[].cstat in
2657: BUILD.H.
2658:
2659: - Fixed bug with initialization of Master and Slave for
2660: COM(Modem) only. If both computers went in at the same
2661: time, it used to sometimes think both were Masters.
2662: ������������������������������������������������������������������������������
2663: 10/4/94 - Alt-C in 3D EDIT MODE changes all picnums on the whole map
2664: from the picnum in tab to the picnum under the mouse cursor.
2665: ������������������������������������������������������������������������������
2666: 10/6/94 - Fixed y-flipping bug on walls and masked walls.
2667: ������������������������������������������������������������������������������
2668: 10/16/94 - Fixed bug in editart that didn't convert the maps right after
2669: swapping tiles.
2670:
2671: - Added excellent function to my multi.obj.
2672:
2673: long getoutputcirclesize();
2674: This function returns the number of bytes that have not
2675: yet been copied. If there are still more than say, 16 bytes,
2676: then you may be sending too many bytes per second. This can
2677: happen if the frame rate of a computer is faster than the
2678: speed of the serial mode (Ex: Try 2400 baud with a Pentium 90!)
2679: this function will tell you how many bytes are left to copy
2680: In other words, if getoutputcirclesize() < 16 then it is safe
2681: to send a packet. If you already have serial mode working
2682: all you have to do to update your code is to copy the lines
2683: in my sync() function the deal with the getoutputcirclesize
2684: function. Everything else in sync() and getpackets() is
2685: pretty much the same.
2686:
2687: - Programmed some example code in my game that will allow players
2688: to change masters and slaves during the game without losing
2689: sync. Simply press 'M' in my multiplayer game, and that
2690: computer will become the master! It is interesting how
2691: the frame rate and controllability changes.
2692: ������������������������������������������������������������������������������
2693: 10/31/94 - Added basic scripting to EDITART. Don't expect it to be
2694: everything you ever dreamed of (yet).
2695:
2696: Scripts are saved in a file called CAPFIL.TXT. You can edit the
2697: text file, but be careful not to screw it up too badly (such
2698: as extra commas, spaces in weird places, etc.) since I am
2699: parsing it in EDITART.
2700:
2701: Whenever you select a box in 'U' mode, a line will be appended to
2702: the CAPFIL.TXT file.
2703:
2704: WRITING THE CAPFIL.TXT FILE:
2705: In 'U' mode, you can press 'O' instead of ENTER to select a tile.
2706: What 'O' does that is different from ENTER is that it takes
2707: the center point of the highlighted rectangle, and searches
2708: outward until a total rectangle of transparent pixels (255)
2709: is reached. This is useful for grabbing sprites - not only
2710: will you not have fine adjust to the exact borders of a
2711: sprite now, but when you re-grab from the pcx's you can
2712: change the size of the sprite freely.
2713:
2714: READING THE CAPFIL.TXT FILE:
2715: There are 2 ways to re-grab from the CAPFIL.TXT file. If you
2716: press ALT-U in the main screen, everything will be re-grabbed.
2717: If you press ALT-U in 'V' mode, then you should first select
2718: the range by pressing '1' and '2' on the range boundaries.
2719:
2720: Format of CAPFIL.TXT lines:
2721: Tile #, Full path/file name, x1, y1, xsize, ysize
2722:
2723: Note: If xsize and ysize are 0, then that means you did
2724: an 'O' grab and EDITART will search from point (x1, y1)
2725: when you do a re-grab.
2726:
2727: Example CAPFIL.TXT file:
2728: 31,D:\CAPTUR00.PCX,220,98,64,64
2729: 110,D:\CAPTUR00.PCX,49,72,0,0
2730:
2731: The first line says that tile #31 is a 64*64 tile and the
2732: second line says that tile #110 is unknown size tile (grabbed
2733: with the 'O' key)
2734:
2735: Note: You can only do 1 grab per tile with my scripting system.
2736: You may have done your parallaxing skies with several grabs.
2737: If so then try to make the tile into 1 large PCX and do 1
2738: grab. (The largest grabbing size right now is 1024*256)
2739:
2740: -------------------------------------------------------------------
2741:
2742: - Made Editart's screen capture (F12) save to PCX's the exact size
2743: of the tile and not include the status bar at the bottom. It
2744: will also save large tiles to large PCX's - Now it's easy and
2745: lossless to extract a tile from Editart!
2746:
2747: - ATTENTION PROGRAMMES! Added 2 new parameters to getzrange for
2748: returning the objects hit on top and bottom.
2749: (sectors / sprites) See my updated documentation at the top
2750: of this file.
2751:
2752: - Fixed clipping bugs with sprites near sector lines. (I hope)
2753:
2754: - Got 3D Red-Blue glasses mode working for all VGA cards. First
2755: set the graphics mode to red-blue mode in the setup program.
2756: The left eye is red and the right eye is blue. There are
2757: 4 keys that let you adjust the 3D view:
2758: [,] = Adjust width between eyes (3D width)
2759: Shift [,] = Adjust width of parallax (2D width)
2760: ������������������������������������������������������������������������������
2761: 11/1/94 - Guess what? I turned 19 today. Doesn't that just suck. Now,
2762: if you play my build game on my birthday, all the extemely
2763: evil and scary brown monsters will be replaced with super
2764: happy fun dogs that throw smiley red jelly coconuts at you.
2765: Also, my incredibly evil and scary music will be replaced
2766: with super happy music. Actually this whole paragraph is
2767: a joke (except for the birthday part).
2768:
2769: - Made centering work with rotated sprites.
2770:
2771: - Fix centering with x and y flipped sprites.
2772:
2773: - Rotated sprites now get chopped off by the ceiling or floor in
2774: the same way normal sprites get chopped. Sprites do not get
2775: chopped if there is a parallaxing sky / floor.
2776:
2777: - Made Shift + F12 is BUILD 2D mode inverse black and white.
2778:
2779: - If SETUP.DAT is not found then default options are loaded
2780: instead of quitting to DOS.
2781:
2782: - ATTENTION PROGRAMMERS! Added 3 parameters to makepalookup that
2783: allow you to do FOG effects. The first 2 parameters are the
2784: same as before. The last 3 are the color that the palette
2785: fades to as you get further away. Before, this color was
2786: always black (0,0,0). White would be (63,63,63).
2787:
2788: makepalookup(long palnum, char *remapbuf,
2789: char redvalue, char greenvalue, char bluevalue)
2790:
2791: - ATTENTION PROGRAMMERS! Moved 2 things into BUILD.H. Please
2792: make sure to update it:
2793:
2794: #define MAXPALOOKUPS 256
2795: and
2796: EXTERN char *palookup[MAXPALOOKUPS];
2797:
2798: The palookup array is an array of pointers that point to the
2799: first byte of each 8K palette lookup table. All 256 pointers
2800: are initialized to NULL by initengine() except for palookup[0]
2801: which is the default 8K palette. This will allow you to modify
2802: the palette lookup table directly for non-snowy fading effects,
2803: etc. Each palette lookup table has 32 shades. Each shade has
2804: 256 bytes. Shade 0 is closest (actual palette brightness) and
2805: shade 31 is farthest (dark usually). (256*32 = 8192 or 8K)
2806: ������������������������������������������������������������������������������
2807: 11/3/94 - Now show white lines in 'V' mode of EDITART at ART file tile
2808: boundaries.
2809:
2810: - Added Insert and Delete commands to EDITART! These Insert and
2811: Delete keys WILL shift all tiles after the one being inserted
2812: or deleted just like a regular text editor. To insert or
2813: delete tiles, simply go the 'V' screen in EDITART and bang
2814: away! Don't worry these keys are fully multi-tile file
2815: compatible (unlike swapping right now).
2816: You will notice that the white line boundaries that
2817: I just added will actually move if you press Insert or Delete.
2818: This changes the number of tiles per art file. But that's
2819: ok. If the art files ever get too unbalanced, you can run
2820: the RSIZEART.EXE utility to fix it.
2821: Ken's lesson of the day: For the final release of your
2822: games, you only need 1 art file. The reason I spent my time
2823: programming multiple art files was because of EDITART.
2824: Since EDITART need to READ & WRITE to the art files, it must
2825: hold a whole art file in memory at a time. Since Build and
2826: Game only READ the art files, a caching system can be made
2827: and only 1 art file is necessary even for lo-memory systems.
2828: ������������������������������������������������������������������������������
2829: 11/4/94 - ATTENTION MAP DESIGNERS! Added a long-awaited feature to BUILD
2830: which I call "loop joining". Have you ever gotten this
2831: frustrating message in 2D EDIT MODE before?
2832:
2833: "You can't split sector by connecting different loops."
2834:
2835: Well, you're not going to see it any more because I fixed
2836: it! Yup. You can now split a sector along a line connecting
2837: different loops of the sector.
2838:
2839: Try this - Convert the sector on the left to the sector
2840: on the right:
2841:
2842: Split #1 Split #2
2843: �������Ŀ �������Ŀ �������Ŀ
2844: � ���Ŀ � � ���Ŀ � � ���Ŀ �
2845: � � � � � � � � � � � �
2846: � ����� � � ����� � � ����� �
2847: ��������� ��������� ���������
2848: (Given) (Half done) (Result)
2849: (1 sector) (Still 1 sector) (2 sectors)
2850:
2851: Before the only was to do this was to delete all the
2852: sectors and then redraw them again.
2853:
2854: I'm sure loop joining has its share of tricks, as most
2855: BUILD functions do, so you may want to spend some time just
2856: playing around with this new function.
2857:
2858: - Removed my own profiler stuff - Hline calculations, etc. code.
2859: Watcom's sampler and profiler is much better anyway.
2860:
2861: - Fixed neartag divide by zero bug with walls (I hope).
2862: Anyone calling neartag for every player per movethings?
2863: I would try not to - How much is that unnoticable extra 0.02
2864: frames per second worth to you anyway?
2865: ������������������������������������������������������������������������������
2866: 11/9/94 - Added new array to BUILD.H called gotsector. It works a lot
2867: like the gotpic array, but this array determines which sectors
2868: were considered during the drawrooms function. Note that
2869: gotsector, unlike gotpic IS cleared to 0 during every call
2870: to drawrooms.
2871:
2872: - Fixed Editart 'U' mode mouse control bug. I typed too fast this
2873: time.
2874:
2875: - Fixed Build split sector bug of accidently deleting sprites. It
2876: should not delete any sprites when splitting sectors now.
2877: ������������������������������������������������������������������������������
2878: 11/15/94 - ATTENTION PROGRAMMERS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2879: I moved ALL my timer code and arrow key code into GAME.C.
2880: Here are the exact instructions that you need to follow to
2881: upgrade your code to the new obj's:
2882:
2883: 1. From the end of my GAME.C, take the code from these 4
2884: functions:
2885:
2886: ---> inittimer();
2887: ---> uninittimer();
2888: ---> void __interrupt __far timerhandler();
2889: ---> keytimerstuff();
2890:
2891: 2. After each initengine, call inittimer right AFTER:
2892:
2893: initengine();
2894: ---> inittimer();
2895:
2896: After each uninitengine, call uninittimer right BEFORE:
2897:
2898: ---> uninittimer();
2899: uninitengine();
2900:
2901: 3. You may need to include this (if not already included):
2902:
2903: ---> #include <dos.h>
2904:
2905: 4. Add these 2 lines to declare the timerhandler:
2906:
2907: ---> void (__interrupt __far *oldtimerhandler)();
2908: ---> void __interrupt __far timerhandler(void);
2909:
2910: 5. Since BUILD.H NO LONGER has vel, svel, and angvel, you
2911: must add the following line to your game:
2912: (These variables are modified inside keytimerstuff())
2913:
2914: ---> static long vel, svel, angvel;
2915:
2916: 6. Let me list some variables that I recently removed from my
2917: GAME. This may or may not affect you:
2918:
2919: oposx[], oposy[], oang[], etc.. - GONE!
2920: lastpacket2clock - GONE!
2921: lastsynctics - GONE!
2922: drawscreen's smoothratio parameter & related code - GONE!
2923: kenchaintimer - GONE! (Don't think anybody was using it
2924: because it didn't solve sound compatibility problems)
2925: ������������������������������������������������������������������������������
2926: 11/16/94 - Made swinging door clipping work MUCH better! It is much more
2927: difficult to "sneak" through the door now. With the swinging
2928: door clipping working much better, I made it possible to open
2929: doors even if you are in the same sector as the door itself.
2930: Now you won't have to stand back a certain distance to open
2931: the doors. (It is much less annoying this way) Since neartag
2932: does not normally scan cursectnum's sector tags, you will
2933: need to check cursectnum's tags yourself (if you so desire)
2934:
2935: Example: (extracted from my GAME.C)
2936:
2937: neartag(posx[snum],posy[snum],posz[snum],cursectnum[snum],
2938: ang[snum],&neartagsector,&neartagwall,&neartagsprite,
2939: &neartaghitdist,1024L);
2940: if (neartagsector == -1) //If no neartagsector found...
2941: {
2942: i = cursectnum[snum]; //Test current sector for tagging
2943: if ((sector[i].lotag|sector[i].hitag) != 0)
2944: neartagsector = i; //Cursectnum is the neartagsector!
2945: }
2946:
2947: - Improved my gamma correction algorithm. Since it now uses a new
2948: 1K at the end of my TABLES.DAT, be sure to update all your
2949: TABLES.DAT files! My new gamma correction supports 16 levels
2950: of brightness (0-15). You need not change any code in your
2951: game if you already have gamma correction programmed.
2952: ������������������������������������������������������������������������������
2953: 11/17/94 - Made swinging door clipping code work even better. The bug was:
2954: it only tested the clipping if you were in the same sector as
2955: the door. So I put this handy little function in GAME.C which
2956: simply tests if 2 sectors are neighbors or not:
2957: testneighborsectors(short sect1, short sect2)
2958: Check it out!
2959:
2960: - Rewrote my clipinsidebox function. You probably don't use this
2961: function, but if you copied my swinging door code, then you
2962: will need to update this. Clipinsidebox is used for clipping
2963: to determine whether a player or sprite is too close to a
2964: wall.
2965:
2966: clipinsidebox(long x, long y, short wallnum, long walldist)
2967: X and y are the position of the sprite or player. Wallnum
2968: is the wall to test, and walldist is the fatness of the sprite
2969: or player (same as clipmove). It returns a 1 if the sprite or
2970: player's clipping square intersects the wall or 0 if not.
2971:
2972: Example - You can test all 4 walls of a swinging door and make
2973: sure the door doesn't run you over:
2974:
2975: short swingwall[4]; //4 wall indeces of a swinging door
2976: for (i=0;i<4;i++)
2977: if (clipinsidebox(posx,posy,swingwall[i],128L) == 1)
2978: {
2979: //Swinging door swung into player, so move door back to
2980: //its old position / inverse swinging direction.
2981:
2982: break;
2983: }
2984: ������������������������������������������������������������������������������
2985: 11/22/94 - Made build posx, posy, posz, ang, cursectnum, and horiz variables
2986: nonstatic.
2987:
2988: - Made hi-res screen capture work.
2989:
2990: - Fixed some of those evil view-clipping bugs with rotated sprites
2991: on red sector lines. I think it should work with rotated
2992: sprites on horizontal or vertical red lines. I'm not sure
2993: about weird angled lines.
2994: ������������������������������������������������������������������������������
2995: 11/23/94 - ATTENTION PROGRAMMERS: Made parallaxing skies tileable in any
2996: equal size chunk where the chunk x size is a power of 2
2997: from 16-1024. You can now make a 2048 wide parallaxing sky
2998: with 2 chunks of 1024 (gobble gobble).
2999:
3000: These lines were added to BUILD.H:
3001:
3002: #define MAXPSKYTILES 256
3003: EXTERN short pskyoff[MAXPSKYTILES], pskybits;
3004:
3005: pskyoff[MAXPSKYTILES] is an array of OFFSETS of each tile
3006: from the picnum of the parallaxing sky.
3007:
3008: pskybits is NOT the actual number of tiles, but the
3009: log (base 2) of the number of tiles. Look at this table:
3010:
3011: For 1 tile, pskybits = 0
3012: For 2 tiles, pskybits = 1
3013: For 4 tiles, pskybits = 2
3014: For 8 tiles, pskybits = 3
3015: For 16 tiles, pskybits = 4
3016: etc.
3017:
3018:
3019: I know that most teams have a 1024 wide parallaxing sky that
3020: wraps all the way around. Don't worry - this is the
3021: default now. When initengine is called, the variables
3022: default to this:
3023:
3024: pskyoff[0] = 0;
3025: pskybits = 0;
3026:
3027: You may have used a 512 wide parallaxing sky (like in my game)
3028: that repeated every 180 degrees. To make this work with
3029: the new version, set these variables like this right after
3030: initengine is called:
3031:
3032: pskyoff[0] = 0;
3033: pskyoff[1] = 0;
3034: pskybits = 1;
3035:
3036: Note that both pskyoff variables are 0 here. This will
3037: make the parallaxing sky repeat.
3038:
3039: With the new tiling, you can save memory by making small
3040: chuck sizes, such as 64 or 128, and repeating certain
3041: sections.
3042: ������������������������������������������������������������������������������
3043: 11/25/94 - Fixed some really stupid keyboard problem in Build.
3044: ������������������������������������������������������������������������������
3045: 11/29/94 - Added FLOOR SPRITES!!! Here are some things that floor sprites
3046: can do for you:
3047:
3048: * Make bridges and balconies
3049: * Use them for ceiling and floor ornamentation
3050: * Use them in place of a rotating sector - modifying 1 angle
3051: is much faster than rotating tons of points.
3052: * Weapon such as a spinning saw blade or, of course, a smiley
3053: red jelly coconut. (?)
3054: * How about a "walking" hole like in Ken's Labyrinth
3055: * You could throw a footstep on the floor every time you make a
3056: step. The steps would go away after awhile. Maybe if you
3057: step in mud, the next 16 or so footsteps will be plotted.
3058: * You could even fake radial shading with a transluscent floor
3059: sprite. (Transluscent floor sprites not yet programmed)
3060:
3061: Just imagine all the great stuff you can do with floor
3062: sprites combined with wall sprites! I can't wait to see what
3063: you all come up with!
3064:
3065: ��� To clear some confusion, and to shorten conversations, let
3066: � me give official names to my 3 kinds of sprites:
3067: �
3068: � Normal stupid sprites - "FACE SPRITES"
3069: � Rotated / masked wall sprites - "WALL SPRITES"
3070: � New ceiling & floor sprites - "FLOOR SPRITES"
3071: �
3072: � Also let me clear up the 2 kinds of clipping:
3073: �
3074: � Clipping when moving something - "MOVEMENT CLIPPING"
3075: ��� Clipping when drawing something - "VIEW CLIPPING"
3076:
3077: To make a floor sprite in BUILD, simply press 'R' on any
3078: sprite until it becomes a floor sprite. The xrepeat and
3079: yrepeat values should work perfectly with floor sprites.
3080: Floor sprites can be rotated at any of 2048 degrees, using
3081: the sprite[].ang. Press < / > for course angle adjustment
3082: or < / > with shift for fine angle adjustment. Also, you
3083: can press 'F' on a floor sprite to flip it over like a
3084: mirror. I am using another bit in sprite[].cstat to determine
3085: the type of sprite. See the documentation in BUILD.H.
3086:
3087: Now for the bad news:
3088:
3089: * Floor sprite textures have similar restrictions as normal
3090: ceilings and floors - both dimensions must be a power of 2.
3091: This will most likely not change.
3092:
3093: And some known problems which I will have to fix:
3094: * Transluscence doesn't work yet
3095: * Sorting with other sprites
3096: * View clipping with walls
3097: * Doesn't work too well in hi-res mode
3098:
3099: See NUKELAND.MAP for some examples of floor sprites. I have both
3100: a bridge and a balcony on the level. Please find them!
3101: Remember that floor sprites don't work in mode x or hi-res
3102: mode YET!
3103: ������������������������������������������������������������������������������
3104: 11/30/94 - Made WALL SPRITE and FLOOR SPRITE correctly do movement clipping.
3105: ������������������������������������������������������������������������������
3106: 12/1/94 - Made new map called BRIDGES.MAP. It is excellent! It has 3
3107: bridges all crossing each other. Enjoy!
3108:
3109: - For Editart, I added re-centering after delete and / to reset
3110: centering while in centering mode.
3111:
3112: - Debugged more of the floor sprite stuff.
3113: ������������������������������������������������������������������������������
3114: 12/2/94 - Made transluscence with floor sprites work. Check out my fake
3115: radial shading under the lights of SUBWAY.MAP.
3116:
3117: - Optimized floor sprites in assembler. Transluscent floor sprites
3118: are a bit slower than normal floor sprites.
3119: ������������������������������������������������������������������������������
3120: 12/6/94 - Made a special 1-way mode for WALL and FLOOR sprites
3121: (not FACE sprites). In BUILD 3D mode, you can press '1' on
3122: a wall or floor sprite to make it only draw if you are on
3123: 1 side of it. This method of back-face culling will not only
3124: make non-masking objects with thickness draw twice as fast,
3125: but will also make fewer drawing bugs due to sprite drawing
3126: order. Try out my BRIDGES.MAP. There's a new section at the
3127: top and it's not another "ugly Ken's face n' slime" room.
3128: ������������������������������������������������������������������������������
3129: 12/8/94 - Editart and Build now capture with capt#### rather than captur##
3130: allowing 10000 captured pictures.
3131: ������������������������������������������������������������������������������
3132: 12/23/94 - Increased Maximum number of walls to 8192.
3133: ������������������������������������������������������������������������������
3134: 12/28/94 - Made BUILD stub keys F5-F8 work in 3D mode also. See top
3135: of BSTUB.C for full documentation of some new useful
3136: variables that can be used inside the stub:
3137:
3138: extern long qsetmode;
3139: extern short searchsector, searchwall, searchstat;
3140:
3141: In 3D mode, F5 and F6 do the exact same thing and F7 and F8
3142: do the exact same thing (you don't need the extra key to
3143: distinguish between sectors, walls and sprites, since the
3144: mouse cursor can only be on 1 of the 3 objects in 3D mode.
3145:
3146: Note: Since F5-F8 are called in 3D mode, you must be sure
3147: NOT to use any 2D routines during those calls! This means
3148: you will have to put the 3D/2D case check in all six
3149: subroutines:
3150: ExtShowSectorData, ExtShowWallData, ExtShowSpriteData,
3151: ExtEditSectorData, ExtEditWallData, ExtEditSpriteData
3152:
3153: - KEN'S PROPOSAL (NOT YET DONE) I am thinking of making a new
3154: (and maybe final) map format. But before I do it, I am going
3155: to ask all of you for any suggestions on new fields to add to
3156: my 3 big structures (sector, wall, sprite):
3157:
3158: Here are a few things already on my list to add:
3159:
3160: * char sprite[].clipdist - THIS IS FOR SURE
3161: This will be a sprite's clipping distance. My default
3162: walldist is 128. With this field, you will finally be
3163: able to make a unique fatness for each sprite with no
3164: clipping bugs. I will probably shift this field up 2-4
3165: bits to give it a range of more than just 0-255.
3166:
3167: * char wall[].pal, sprite[].pal - PRETTY SURE
3168: It should have been this way the whole time. Currently
3169: the wall's palookup number is sector[].floorpal. While
3170: it may save some memory, It has too many limitations.
3171: I can make my map converter automatically convert all
3172: walls of a sector to equal the sector[].floorpal so
3173: don't worry about that type of conversion. If I do
3174: this, I can get rid of the spritepal[] hack.
3175:
3176: * I have decided that the sector[].extra, wall[].extra, and
3177: sprite[].extra will remain in the structures as little
3178: gifts for your use only. That's right! ALL YOURS!
3179: ENJOY!!!
3180:
3181: * char sprite[].xoffset, sprite[].yoffset - NOT SURE YET
3182: Some have asked for monster animations using the same
3183: frame at 2 different times of an animation sequence having
3184: different centers.
3185: These will be signed chars. I'm not sure whether to
3186: make these offsets as offsets to the centering information
3187: from Editart or just make them the absolute offsets where
3188: Editart's data is the default offset. I wonder if there's
3189: a better way to do this without having to waste 8K.
3190:
3191: * Do I have your permission to remove nextsector2 and
3192: nextwall2? Anybody using them? If so, can you use the
3193: extra variable instead? This will save 16K since both
3194: are shorts. (MAXWALLS*short + MAXWALLS*short = 16384)
3195: They were originally intended for 2 stories
3196: but it would be totally ridiculous for me even to think
3197: about programming that now. Besides, you can use wall
3198: and floor sprites to fake 2 story areas. KEN PROMISE:
3199: I will fix those darn view-clipping bugs eventually!
3200:
3201:
3202: Please send any comments/suggestions to my internet address
3203: ([email protected]) I will consider each suggestion
3204: carefully, because everything you suggest now won't have
3205: to be an ugly hack like spritepal[] later.
3206: ������������������������������������������������������������������������������
3207: 1/1/95 - ����� ������ ��� �� �� �� �� �� ������ ������ ������ ��
3208: �� �� �� ���� �� �� �� �������� �� �� �� �� �� ��
3209: �� �� �� ������� ��� ��� �������� ������ ������ ������ ��
3210: �� �� �� �� ���� ����� �� �� �� �� �� �� ��
3211: ����� ������ �� ��� ��� �� �� �� �� �� ������ ��
3212:
3213: CONVMAP6! Here is what I changed in the structures:
3214:
3215: * Added wall[].pal, sprite[].pal
3216: * Added sprite[].clipdist
3217: * Expanded sprite[].cstat to a short
3218: * Added sprite[].xoffset, sprite[].yoffset
3219: * Removed wall[].nextsector2, wall[].nextwall2
3220: * Renamed wall[].nextsector1 to just wall[].nextsector
3221: * Renamed wall[].nextwall1 to just wall[].nextwall
3222: * Scrapped numextras and extratype structure - Don't confuse
3223: this with sector[].extra, wall[].extra, sprite[].extra
3224: which ARE in map version 6.
3225:
3226: Probably the only change above that will affect programmers is
3227: getting rid of the '1' in wall[].nextsector1&wall[].nextwall1.
3228: All the following changes were possible because of the new
3229: map format.
3230:
3231: - Got rid of the spritepal array in BUILD.H. With my grea
3232: new map version 6, you can simply modify sprite[].pal!
3233:
3234: - Made all .pal fields editable in 3D EDIT MODE. Press ALT-P
3235: and simply edit the number as you would in 2D mode.
3236:
3237: - Made sprite[].xoffset and sprite[].yoffset work as
3238: offsets to the offsets that are already in EDITART.
3239: Simple addition. They should work for all 3 types
3240: of sprites.
3241:
3242: - Made BUILD Tab&Enter also copy tags&extra if copying similar
3243: structures. Also fixed some other attributes when
3244: copying between structure types.
3245:
3246: - Made sprites highlighted with Rt. Shift duplicate and stamp
3247: when the insert key is pressed in 2D EDIT MODE.
3248:
3249: - Made sprite[].clipdist work as the FACE SPRITE'S clipping
3250: fatness. NOTE: Sprite[].clipdist is shifted up 2 to
3251: allow a range from 0-1020, so if the sprite[].clipdist
3252: is set to 32, then the clipping radius is actually 128.
3253:
3254: - Removed the walldist parameter from movesprite. Movesprite
3255: now just uses the sprite[spritenum].clipdist field of
3256: whatever sprite is passed (shifted up 2).
3257:
3258: movesprite(short spritenum, long xchange, long ychange,
3259: long zchange, long ceildist, long flordist,
3260: char cliptype, long numtics)
3261:
3262: If you use clipmove or getzrange, you should check that you
3263: are passing the correct walldist parameters. I'm saying
3264: you may want to change some of the 128s to
3265: (sprite[spritenum].clipdist<<2).
3266: ������������������������������������������������������������������������������
3267: 1/3/95 - Made startumost[], startdmost[] into shorts.
3268:
3269: - Optimized and fixed gamma correction in Stereo Red-Blue mode.
3270:
3271: - Made weapons or anything using overwritesprite in Stereo Red-Blue
3272: mode be at screen depth.
3273: ������������������������������������������������������������������������������
3274: 1/4/95 - Not that anybody would care (except for some crazed mega-hackers)
3275: but I am just mentioning the fact that I did this:
3276:
3277: animateoffs(short tilenum, short fakevar);
3278: where fakevar is sectnum+0
3279: or wallnum+16384
3280: or spritenum+32768
3281: or 49152 (just ignore-it's for rotatesprite)
3282:
3283: Also: I changed one: "mov al, 0" instruction into an
3284: "xor al, al", a net savings of
3285: ONE LOUSY BYTE! Let's not get TOO
3286: excited! (By the way, just kidding)
3287: ������������������������������������������������������������������������������
3288: 1/5/95 - Fixed the sprite centering with x-flipped FACE SPRITES.
3289:
3290: - Found a bug with my swinging door clipping code. There are 2
3291: types of swinging doors, forwards (opens CCW) and
3292: backwards (opens CW). The bug was that you could sneak
3293: through a backwards door from the back side. Well, I fixed
3294: it, so now I challenge you to sneak through my swinging doors
3295: now! If you are using my swinging door code, please make
3296: these changes which you should find in my new GAME.C:
3297:
3298: 1. Changed declaration at beginning of GAME.C:
3299: static short swingwall[32][5];
3300:
3301: 2. Added new line in prepareboard:
3302: swingwall[swingcnt][4] = lastwall(swingwall[swingcnt][3]);
3303:
3304: 3. Modified some stuff in tagcode:
3305: //swingangopendir is -1 if forwards, 1 is backwards
3306: l = (swingangopendir[i] > 0);
3307: for(k=l+3;k>=l;k--)
3308: if...
3309:
3310: - Here are some more functions that have been in the engine for
3311: a while, but I forgot to document...
3312: precache, loadtile, lastwall, rotatepoint
3313: They are now documented at the top of this file.
3314: ������������������������������������������������������������������������������
3315: 1/6/95 - Optimized loading/saving of maps by using fewer read/write calls.
3316: ������������������������������������������������������������������������������
3317: 1/14/95 - Fixed evil crashing bug that I accidently introduced in the
3318: 1/3/95 version of Build. This crashing bug happened mostly
3319: in tall rooms with lots of FACE SPRITES. It used to crash
3320: very infrequently when you were standing almost exactly, but
3321: NOT on the same x & y coordinates of a FACE SPRITE where the
3322: z-distance was high.
3323: ������������������������������������������������������������������������������
3324: 1/15/95 - Fixed up network code so now you can miss 4 packets in row safely
3325: over the network rather than just 2.
3326: ������������������������������������������������������������������������������
3327: 1/16/95 - Added strafe left / strafe right keys to my SETUP.DAT file and
3328: char keys[19] array. If you actually use my keys array for
3329: custom keys, here's what to do: I inserted the new strafing
3330: keys at keys[12] & keys[13], so just add 2 to any keys with
3331: an index >= 12.
3332:
3333: - Made the sprites in 2D EDIT MODE of Build highlight properly
3334: again.
3335:
3336: - Added another parameter to permanentwritesprite, palookup number:
3337:
3338: permanentwritesprite(long thex, long they, short tilenum,
3339: signed char shade, long cx1, long cy1,
3340: long cx2, long cy2, char dapalnum);
3341: ������������������������������������������������������������������������������
3342: 1/17/95 - You can now select a bunch of sprites in 2D EDIT MODE with
3343: Rt. shift, then go to 3D mode and change the z's of all the
3344: highlighted sprites.
3345: ������������������������������������������������������������������������������
3346: 1/20/95 - Made Tab&Enter in 3D EDIT MODE copy .pal also whenever .shade is
3347: normally copied. Shift+Enter will now copy just
3348: .pal and .shade.
3349: ������������������������������������������������������������������������������
3350: 1/21/95 - Made Splitsector work with overlapping better.
3351:
3352: - In Editart 'U' mode, it now goes automatically to the PCX and
3353: coordinates of a tile if it is already in capfil.txt.
3354:
3355: - In Editart, made capt????.PCX not get overwritten if they already
3356: exist.
3357:
3358: - Fixed Build tab on masked walls.
3359:
3360: - Made zmode and kensplayerheight variables public in BUILD/BSTUB
3361: so you can now compile BUILD to start out with your own
3362: preferred settings. Kensplayerheight defaults to 32 and
3363: zmode defaults to 0. You can over-ride these settings in
3364: the new ExtInit function.
3365:
3366: - Made Editart tiles much easier to center by showing all tiles
3367: in the center of the screen instead of at the top-left corner.
3368: (Editart will not allow you to center tiles larger than
3369: 320*200 right now)
3370:
3371: - Made 'O' (optimize) key in Editart automatically preserve
3372: the centering information.
3373:
3374: - ATTENTION BSTUB PROGRAMMERS! Added ExtInit, ExtUnInit, and
3375: ExtCheckKeys to BSTUB.C. Please just copy mine into your
3376: current BSTUB. ExtInit and ExtUnInit are called only once.
3377: ExtInit is called before loadpics() and after initengine().
3378: ExtCheckKeys() is called just before nextpage in both 2D
3379: and 3D modes. In 3D mode, you must call editinput inside
3380: ExtCheckKeys just like my example in BSTUB.
3381: ������������������������������������������������������������������������������
3382: 1/24/95 - Fixed vertical line chained mode bug with permanentwritesprites.
3383: ������������������������������������������������������������������������������
3384: 1/31/95 - Fixed parallaxing sky tiling bug.
3385: ������������������������������������������������������������������������������
3386: 2/1/95 - Fixed network crashing bug when call interrupt 0x1c. You call
3387: this interrupt when you chain to the old timer handler. Now
3388:
3389: - Rewrote multiplayer code in game.c a bit. Moved both sync()
3390: and getpackets() into the main program. The master code and
3391: single player game code are now the same. Slaves need to
3392: drawscreen and send packets only when a packet is received
3393: from the master. Got rid of fake sync[MAXPLAYERS] slot by
3394: using a local sync buffers. Rewrote checkmasterslaveswitch().
3395: If you don't get what I did, it doesn't matter because you
3396: already have working network code!
3397:
3398: - Added new key in EDITART 'V' mode. Press ALT-R to generate
3399: a tile frequency report. It will scan all MAP files in the
3400: same directory as the ART files. The frequency count will
3401: show up as text in the top-left corner of the boxes in
3402: 'V' mode. Press ALT-R again to turn off text.
3403:
3404: - Perfected NCOPY! Copies about 150K / second which is 10 times
3405: faster than a 115200bps serial cable. Since NCOPY already
3406: links with multi.obj, it should not be too difficult to make
3407: joining work in the middle of a network game. Please wait
3408: until I make some sample code for you!
3409: Receiver types: NCOPY (Ex: "NCOPY")
3410: Sender types: NCOPY [filespec] (Ex: "NCOPY *.ART")
3411:
3412: Ken's formula:
3413: NCOPY + Loading&Saving GAMES = joining in middle
3414: of network game!
3415:
3416: - Made a DOOM to BUILD converter. Right now it only converts
3417: ceilings, floors, and walls now, and some of the wall
3418: textures are screwed up. Just because I converted some
3419: lousy stinkin' maps DOES NOT MEAN I AM GOING TO PROGRAM DOOM!
3420: Unfortunately, the converter is programmed in QuickBasic right
3421: now, it won't compile, and I didn't feel like putting up the
3422: 7 MEG converted ART file up. When I convert it to C, I'll
3423: upload it for all!
3424: ������������������������������������������������������������������������������
3425: 2/7/95 - Fixed overwritesprite bugs with translucence in chained mode
3426: and above top of screen.
3427:
3428: - Made bit 3 of overwritesprite x-flip the picture if set.
3429:
3430: - Optimized various parts of engine.
3431: ������������������������������������������������������������������������������
3432: 2/8/95 - Fixed shading of all sprite types so they match perfectly with
3433: their surroundings. Floor sprites now shade in the exact same
3434: way as ceilings and floors. (Before, the whole floor sprite
3435: had the same shade throughout)
3436: ������������������������������������������������������������������������������
3437: 2/9/95 - Started on loading and saving game code so I could give some
3438: sample code for joining network games, but none of it works
3439: yet, so just ignore it for now!
3440:
3441: - Added frame rate in BSTUB.C. It averages the last 16 frames.
3442: ������������������������������������������������������������������������������
3443: 2/16/95 - Added another bit to sprite[].cstat for y-centering control. If
3444: bit 7 is set then the sprite's center will be the actual
3445: center rather then at the default position which is at the
3446: bottom of the sprite. If you use this centering bit,
3447: you finally get "WYSIWYG" centering contol in EDITART.
3448: ������������������������������������������������������������������������������
3449: 2/24/95 - Made floor sprites now support any x size by a power of 2 y size.
3450: (That's better than before!) These are the same restrictions
3451: on walls.
3452: ������������������������������������������������������������������������������
3453: 2/25/95 - Got loading / saving code to work with my game. Press Ctrl-L to
3454: load game and Ctrl-S to save game. Saved games are called
3455: SAVE0000.GAME and are about 300K. Don't worry about the large
3456: sizes of the saved game files since they can be easily
3457: compressed to less than 50K.
3458: ������������������������������������������������������������������������������
3459: 2/26/95 - I Finally made my multiplayer code run with fast frame rates AND
3460: pefect controls on ALL computers of a multiplayer game. I am
3461: now sending keystrokes of all computers at a constant rate of
3462: 40 times per second. All computers interpolate between frames
3463: to get screen frame rates of higher or lower than 40 fps
3464: (even in single player mode).
3465:
3466: Here are the exact steps you will need to follow if you want to
3467: update your code:
3468:
3469: 1. WHAT'S THE FAKETIMERHANDLER()?
3470:
3471: To send packets exactly 40 times a second, it would
3472: sure be nice to send them right from the timer interrupt
3473: handler. Too bad network packets just won't get sent
3474: from the interrupt handler. (It may work from the
3475: interrupt handler in Serial/Modem mode) So the solution
3476: is to make a "fake" timer handler that must be called
3477: at least 40 times a second even on the slowest computer.
3478: Throughout my engine, I call faketimerhandler(). If you
3479: have any slow parts in your game code, you may want to
3480: called faketimerhandler() also.
3481: Besides the very first few lines, the rest of the code
3482: was taken directly from my old sync and getpackets
3483: functions.
3484:
3485: 2. BYE BYE SYNCTICS!
3486:
3487: Now that all computers are calling movethings a
3488: constant number of times a second, you don't need any
3489: synctics variables anymore. You can convert all the
3490: synctics variables to a define such as:
3491: "#define TICSPERFRAME 3"
3492: Doing this will guarantee that a game runs the same on
3493: all speed computers.
3494:
3495: 3. FRAME INTERPOLATION (optional):
3496:
3497: static long ototalclock = 0, gotlastpacketclock = 0;
3498: static long oposx[MAXPLAYERS], cposx[MAXPLAYERS];
3499: static long oposy[MAXPLAYERS], cposy[MAXPLAYERS];
3500: static long oposz[MAXPLAYERS], cposz[MAXPLAYERS];
3501: static long ohoriz[MAXPLAYERS], choriz[MAXPLAYERS];
3502: static long ozoom[MAXPLAYERS], czoom[MAXPLAYERS];
3503: static short oang[MAXPLAYERS], cang[MAXPLAYERS];
3504:
3505: Add to prepareboard:
3506: for(i=connecthead;i>=0;i=connectpoint2[i])
3507: {
3508: oposx[i] = posx[i];
3509: oposy[i] = (etc.)
3510: }
3511: ototalclock = 0;
3512: gotlastpacketclock = 0;
3513:
3514: Even though you may be getting more than 40fps, you will
3515: only be seeing 40fps unless you interpolate between frames.
3516: The oposx[], etc. variables back up the last posx[], etc.
3517: variables so you can interpolate your actually drawing
3518: position as some fraction between the two. This fraction
3519: is smoothratio.
3520: See beginning of drawscreen code. Here's where I actually
3521: calculate the interpolated position to draw the screen.
3522:
3523: for(i=connecthead;i>=0;i=connectpoint2[i])
3524: {
3525: cposx[i] = oposx[i]+mulscale(posx[i]-oposx[i],smoothratio,16);
3526: cposy[i] = oposy[i]+mulscale(posy[i]-oposy[i],smoothratio,16);
3527: cposz[i] = oposz[i]+mulscale(posz[i]-oposz[i],smoothratio,16);
3528: choriz[i] = ohoriz[i]+mulscale(horiz[i]-ohoriz[i],smoothratio,16);
3529: czoom[i] = ozoom[i]+mulscale(zoom[i]-ozoom[i],smoothratio,16);
3530: cang[i] = oang[i]+mulscale(((ang[i]+1024-oang[i])&2047)-1024,smoothratio,16);
3531: }
3532:
3533: Draw the screen using cposx[], etc. instead of posx[], etc.
3534:
3535: #pragma aux mulscale =\
3536: "imul ebx",\
3537: "shrd eax, edx, cl",\
3538: parm [eax][ebx][ecx]\
3539: modify [edx]\
3540:
3541: It reads: eax = (eax*ebx)>>cl. Unlike C, this will
3542: not overflow even if eax*ebx > 2^31, making full use of
3543: the 64-bit result of the imul instruction.
3544:
3545: 4. MOVETHINGS FIFO:
3546:
3547: static long movefifoplc, movefifoend;
3548: static signed char baksyncvel[64][MAXPLAYERS];
3549: static signed char baksyncsvel[64][MAXPLAYERS];
3550: static signed char baksyncangvel[64][MAXPLAYERS];
3551: static short baksyncbits[64][MAXPLAYERS];
3552:
3553: Add to prepareboard: movefifoplc = 0; movefifoend = 0;
3554:
3555: It is bad to call movethings inside faketimerhandler
3556: because you don't want things to move while you're drawing
3557: the screen. To solve this, I made movethings just save
3558: away the parameters it was called with using a circular
3559: buffer, and when I'm actually ready to DO the movement code,
3560: I call domovethings.
3561: Rename movethings to domovethings and see my new
3562: movethings. This code is all for the fifo.
3563:
3564: Put this line in movethings:
3565: gotlastpacketclock = totalclock;
3566:
3567: At the top of domovethings, copy my code for loading off
3568: of the fifo. Also set oposx[] = posx[], etc. here.
3569:
3570: 5. You may want to add a global variable that controls whether
3571: you are in continuous packet sending mode or not. Only
3572: in the main loop should ready2send be != 0.
3573: static long ready2send = 0;
3574:
3575: 6. The new main loop can be as short as this, with no case
3576: checking for masters and slaves.
3577:
3578: ready2send = 1;
3579: while (keystatus[1] == 0) //Main loop starts here
3580: {
3581: //Actaully move everything here.
3582: while (movefifoplc != movefifoend) domovethings();
3583:
3584: //Second parameter is for frame interpolation,
3585: //A fraction that ranges from 0-65536.
3586: drawscreen(screenpeek,(totalclock-gotlastpacketclock)*(65536/TICSPERFRAME));
3587: }
3588: ready2send = 0;
3589: ������������������������������������������������������������������������������
3590: 3/6/95 - New key in BUILD. Now when you use relative alignment mode on
3591: ceiling and floor textures, you can press Alt-F on the ceiling
3592: or floor to choose a new wall to align to. It actually
3593: rotates the walls of a sector by 1.
3594:
3595: - Fixed screen capture PCX saving bug in both EDITART and BUILD.
3596:
3597: - Added a parameter to screencapture, a filename.
3598: screencapture(char *filename)
3599: Ex: screencapture("captxxxx.pcx");
3600: Please specify the full filename. Screencapture will modify
3601: the 4 x's of the string to be a number starting at 0000.
3602: ������������������������������������������������������������������������������
3603: 3/8/95 - Made my rotatesprite function use Editart centering information.
3604: The center is the pivot point of rotation.
3605:
3606: - Added y-flipping to overwritesprite. See above documentation.
3607:
3608: - Added 2 new parameters to rotatesprite, shade and pal
3609:
3610: rotatesprite (long sx, long sy, long z, short a,
3611: short picnum, signed char shade, char pal);
3612:
3613: ������������������������������������������������������������������������������
3614: 3/10/95 - Fixed sprite showing through closed sectors bug.
3615:
3616: - Made it possible to draw the overhead map in 3D mode by adding
3617: a line drawing function in 3D mode called drawline256. It
3618: draws a line clipped to the viewing rectangle last set in
3619: setview(). Here are the parameters:
3620:
3621: drawline256(long x1, long y1, long x2, long y2, char col);
3622:
3623: Note: The coordinates are all shifted up 12.
3624: Example: drawline256(0L,0L,319L<<12,199L<<12,31);
3625: ������������������������������������������������������������������������������
3626: 3/11/95 - Made drawline256 draw in a cleaner way, making use of the full
3627: 12 bits of precision.
3628: ������������������������������������������������������������������������������
3629: 3/14/95 - Optimized / cleaned up parts of hitscan, neartag, cansee.
3630: Gee, I hope they all still work!
3631: ������������������������������������������������������������������������������
3632: 3/18/95 - I'm back in RI!
3633:
3634: - Fixed recently added movesprite z parameter bug that may have
3635: done strange things with monsters, such as stuck in sectors
3636: I thought the following expression: !(cstat&128)
3637: would be true if bit 7 was a 0, but I WAS WRONG!
3638: Get this straight:
3639: ! - logical NOT, returns 0 if != 0 else 1 (!2457=0, !0=1)
3640: ~ - bitwise NOT, xor's it with 0xffffffff (~0x5f=0xa0)
3641: ������������������������������������������������������������������������������
3642: 3/21/95 - Gave access to some more variables in BSTUB.
3643:
3644: - Made clipmove return a valid sector even if you're not between
3645: its ceiling and floor. If you use overlapping sectors,
3646: clipmove will find the sector closest to your z.
3647: ������������������������������������������������������������������������������
3648: 3/28/95 - Optimized transluscence for masked walls and wall sprites.
3649:
3650: - Today is the day I declare my serial/modem error correction code
3651: perfect! Sure, I may have bragged over and over again about
3652: how perfect my correction method is each time, but this time
3653: I mean it. This is ship-it quality error correction. The old
3654: method had a few dark, evil, and ugly bugs that sometimes
3655: totally screwed up bigtime.
3656: ������������������������������������������������������������������������������
3657: 4/5/95 - Got Master/Slave switching to stay in sync again with new
3658: multiplayer code. Right after the master sends a packet
3659: where a switch is made, I disable the master from sending
3660: any more packets by setting ready2send to 0. Ready2send
3661: will be set back to 1 only after the actual switch in
3662: checkmasterslaveswitch. Here's what I added to movethings:
3663:
3664: //Do this for Master/Slave switching
3665: for(i=connectpoint2[connecthead];i>=0;i=connectpoint2[i])
3666: if (syncbits[i]&512) ready2send = 0;
3667: ������������������������������������������������������������������������������
3668: 4/10/95 - Optimized continuous setview calls between 2 different window
3669: sizes.
3670:
3671: - ATTENTION PROGRAMMERS: Moved movesprite code into game.c. It
3672: no longer exists in the engine. It is a "cover-up" function
3673: and it should be yours.
3674:
3675: - Added a circular keyboard buffer to my keyboard handler. It is
3676: fully compatible with the keystatus arrays. Use this buffer
3677: for typing in messages or cheat codes. If you do not use this
3678: buffer (or you wrote your own interrupt handler), you will miss
3679: keys and it is very annoying.
3680:
3681: I added these variables to build.h:
3682:
3683: #define KEYFIFOSIZ 64
3684: EXTERN volatile char keyfifo[KEYFIFOSIZ],
3685: keyfifoplc, keyfifoend;
3686:
3687: Every time a key is pressed and released, I add 2 bytes to the
3688: circular buffer. The first byte is the scan code. The second
3689: byte is a 1 for key pressed or 0 for key released. You can
3690: ignore the key releases if you wish. You must read 2 bytes at
3691: a time from this buffer.
3692: (scancode,keystat),(scancode,keystat),...
3693:
3694: Here's how you read the keyboard fifo:
3695: while (keyfifoplc != keyfifoend) //More characters to read
3696: {
3697: ch = keyfifo[keyfifoplc];
3698: keystate = keyfifo[(keyfifoplc+1)&(KEYFIFOSIZ-1)];
3699: //Increment buffer pointer
3700: keyfifoplc = ((keyfifoplc+2)&(KEYFIFOSIZ-1));
3701:
3702: printf("Scancode: %d, status: %d\n",ch,keystate);
3703: }
3704:
3705: The interrupt handler does the same as above but writes and
3706: increments using keyfifoend as the index.
3707: You can easily clear the buffer this way:
3708: keyfifoplc = keyfifoend
3709:
3710: - Made clipmove/getzrange not clip on the back side of a 1-sided
3711: wall/floor sprite. It makes the clipping a little faster
3712: and seems to fix a few minor clipping bugs. Don't get too
3713: excited.
3714:
3715: - Fixed getzrange's ceilz/florz mismatch with floor sprites against
3716: normal ceilings and floors.
3717:
3718: - Made Build default to y-centered centering mode when sprites
3719: are inserted (bit 7 of sprite[].cstat)
3720:
3721: - Fixed clipmove bugs with y-centered centering mode.
3722:
3723: - Made it so you don't get stuck sliding along multiple properly
3724: aligned wall/floor sprites.
3725:
3726: - Please update to my new tables.dat.
3727: ������������������������������������������������������������������������������
3728: 4/11/95 - Optimized parts of clipmove / getzrange. Is it faster? Did I
3729: make more bugs?
3730:
3731: - Made the movesprite code in GAME.C now use getzrange. This
3732: allows sprites to walk on floor sprites and bombs roll across
3733: bridges. I will include the original movesprite code that
3734: came from the engine in case you want to start with things
3735: the way they used to be.
3736:
3737: - Made ornamentation in BUILD 3D mode much easier. Now you can
3738: press 'S' to insert a sprite on walls (not just ceilings
3739: and floors). When you insert a sprite on a wall, it will
3740: automatically be set to a wall sprite at the wall's angle.
3741: Also it will be 1-sided with blocking off (The optimal
3742: options for a decorative sprite on a wall).
3743:
3744: - Added ALT-D to BUILD 3D mode. It lets you type in clipdist
3745: for sprites. It works in the same way as ALT-P for palookup
3746: changing.
3747:
3748: ������������������������������������������������������������������������������
3749: 4/15/95 - Fixed return value bug in setanimation and cleaned up these 3
3750: functions: doanimations, getanimationgoal, setanimation.
3751: Since they are now in game.c, you will need to copy them to
3752: update.
3753: ������������������������������������������������������������������������������
3754: 4/16/95 - Fixed hitscan not passing through loops bug.
3755:
3756: - Fixed hitscan so it hits wall and floor sprites in the right
3757: places.
3758:
3759: - ATTENTION PROGRAMMERS!!! Made bit 8 of sprite[].cstat the
3760: hitscan clipping bit. It works like the hitscan bit for walls.
3761: Note that both the wall and sprite cstat variables now have
3762: 2 separate bits for clipping, where:
3763: 1 is for use with the clipmove/getzrange function and
3764: 1 is for use with the hitscan function only.
3765: Before, hitscan used to use 1 bit for all sprite clipping.
3766: In your maps, the sprite hitscan bits are all zeros. That's bad!
3767: To make things work like they used to, the sprite hitscan bit
3768: must be set equal to the old sprite blocking bit. So I was nice
3769: enough to make a program, FIXSPRBT.EXE, which will do just that.
3770:
3771: PLEASE RUN FIXSPRBT.EXE ON ALL YOUR MAPS. You don't HAVE to
3772: run it on all your maps since the map format hasn't changed, but
3773: it will save you annoying attribute setting time if you do.
3774:
3775: - Did a few things to make these blocking bits easier to edit:
3776: Since H and ALT-H were already used, I made CTRL-H toggle the
3777: hitscan bit for both walls and sprites in 2D mode. B toggles
3778: the blocking bit. B also now sets the hitscan bit to its
3779: default value when you press it. For sprites, the hitscan bit
3780: default is equal to the clipmove bit. For walls, the hitscan
3781: bit default is always 0.
3782:
3783: - Added new map mode! Check it out in my game. I now have 3 map
3784: modes. Not that this really matters to you game programmers, but
3785: this is how my game works:
3786: dimensionmode[snum] == 1 3D MODE + junky line map
3787: dimensionmode[snum] == 2 SUPER MAP!
3788: dimensionmode[snum] == 3 3D MODE
3789:
3790: I added show2dsector to BUILD.H which controls which works
3791: like the other show2d... bit arrays. It tells which sectors
3792: to show.
3793: EXTERN char show2dsector[MAXSECTORS>>3];
3794:
3795: I rewrote parts of drawoverheadmap to accommodate this new
3796: mode - so it would be nice if you updated to my new code.
3797:
3798: Added a new function that clears full screen to a specified
3799: color:
3800: clearview(0L);
3801:
3802: Oh and did I forget to mention the big function! Parameters
3803: are the exact same my drawoverheadmap function:
3804: drawmapview(cposx,cposy,czoom,cang);
3805:
3806: Note: The new map mode right now is slowed down bigtime by
3807: the face sprites using the rotatesprite function. The
3808: rotatesprite right now is using a worse than awful
3809: algorithm. When I optimize rotatesprite, the frame rate
3810: of the new map mode will fly!
3811: ������������������������������������������������������������������������������
3812: 4/18/95 - Added default sprite cstat variable when you insert new sprites.
3813: Set it to 0 if you hate the new centering mode in ExtInit
3814: or 128 if you like the new centering mode.
3815: Add this line to your Bstub if you wish:
3816: extern short defaultspritecstat;
3817:
3818: - If a wall & sprite are same distance away using hitscan, hitscan
3819: now chooses the sprite.
3820:
3821: - Optimized rotatesprite.
3822:
3823: - ATTENTION PROGRAMMERS: Added new paramater at end of
3824: rotatesprite: A char where the first bit tells it to use
3825: transluscence mode or not.
3826:
3827: rotatesprite(long sx, long sy, long z, short a, short picnum,
3828: signed char dashade, char dapalnum, char dastat)
3829:
3830: if ((dastat&1) == 0) - no transluscence
3831: if ((dastat&1) != 0) - transluscence
3832:
3833: - Cleaned up drawmapview further by making ALL floor sprite draw
3834: with the texture in the right place and made the polygon
3835: filling algorithm use higher screen coordinate precision.
3836: ������������������������������������������������������������������������������
3837: 4/19/95 - Added parameter to makepalookup:
3838:
3839: makepalookup(long palnum, char *remapbuf,
3840: signed char r, signed char g, signed char b,
3841: char dastat)
3842:
3843: if ((dastat&1) == 0) then makepalookup will allocate & deallocate
3844: the memory block for use but will not waste the time creating
3845: a palookup table (assuming you will create one yourself)
3846: if ((dastat&1) != 0) then makepalookup will allocate & deallocate
3847: the memory block AND create a palookup table using the rgb
3848: values you pass.
3849:
3850: - Made my ceiling&floor update the self-modified palookup pointers
3851: when palookup[sector[].?pal] changes, not just when
3852: sector[].?pal] changes. Watching for changing pointers rather
3853: than changing indeces should solve the problem with screwy
3854: palookup selection for ceilings&floors. Ignore what I said
3855: before. You should now be able to change palookup pointers
3856: freely.
3857:
3858: - Optimized relative alignment. It should be the same speed as
3859: all other ceilings & floors now.
3860:
3861: - Warning: Since I added the new bit in sprite[].cstat, there are
3862: now 9 bits in use. Make sure to treat it as a short. In my
3863: code, I had some bugs where I did this:
3864: sprite[].cstat &= (255-4); BAD! Cstat's a short! Please
3865: check your code and make sure you clear the bits this way:
3866: sprite[].cstat &= ~4;
3867: ������������������������������������������������������������������������������
3868: 4/21/95 - Fixed bug with flipping textures on ceilings & floors. In
3869: BUIL0419.ZIP I had a bug whenever a ceiling or floor texture
3870: had bit 4 set. It drew the texture backwards. Well, I
3871: fixed it. Hope you didn't "Build" on this bug!
3872: ������������������������������������������������������������������������������
3873: 4/22/95 - Fixed really really stupid hitscan returning sector < 0 bug. If
3874: you were calling hitscan from the top-left triangular region
3875: of the board it stupidly returned a -1 for the sector. Well,
3876: I fixed it.
3877:
3878: - ATTENTION EVERYBODY!!! Moved setup.dat loading from the engine
3879: into GAME.C and BSTUB.C. If you copy this code from game.c
3880: into your game / bstub, they will work like it used to:
3881:
3882: ----- NEW GLOBAL VARIABLES: -----
3883:
3884: #define NUMOPTIONS 8
3885: #define NUMKEYS 19
3886: static long chainxres[4] = {256,320,360,400};
3887: static long chainyres[11] = {200,240,256,270,300,350,
3888: 360,400,480,512,540};
3889: static long vesares[7][2] = {320,200,640,400,640,480,
3890: 800,600,1024,768,
3891: 1280,1024,1600,1200};
3892: static char option[NUMOPTIONS] = {0,0,0,0,0,0,1,0};
3893: static char keys[NUMKEYS] =
3894: {
3895: 0xc8,0xd0,0xcb,0xcd,0x2a,0x9d,0x1d,0x39,
3896: 0x1e,0x2c,0xd1,0xc9,0x47,0x49,
3897: 0x9c,0x1c,0xd,0xc,0xf,
3898: };
3899:
3900: ----- Put this where you call initengine -----
3901:
3902: long fil;
3903:
3904: if ((fil = open("setup.dat",O_BINARY|O_RDWR,S_IREAD)) != -1)
3905: {
3906: read(fil,&option[0],NUMOPTIONS);
3907: read(fil,&keys[0],NUMKEYS);
3908: close(fil);
3909: }
3910: if (option[3] != 0) moustat = initmouse();
3911:
3912: switch(option[0])
3913: {
3914: case 0: initengine(0,chainxres[option[6]&15],chainyres[option[6]>>4]); break;
3915: case 1: initengine(1,vesares[option[6]&15][0],vesares[option[6]&15][1]); break;
3916: case 2: initengine(2,320L,200L); break;
3917: case 3: initengine(3,320L,200L); break;
3918: case 4: initengine(4,320L,200L); break;
3919: case 5: initengine(5,320L,200L); break;
3920: case 6: initengine(6,320L,200L); break;
3921: }
3922:
3923: ----- That's it! -----
3924:
3925: Initengine now has 3 parameters:
3926: initengine(char davidoption, long daxdim, long daydim)
3927: See revised initengine description at the top of this file.
3928:
3929: Now that engine.c doesn't use setup.dat, you can use your
3930: own setup program.
3931:
3932: Don't forget to update BSTUB!
3933:
3934: NOTE!!! While MY setup program allows you select many different
3935: video modes, no new modes are supported yet in BUILD!
3936: (It's on my list.)
3937:
3938:
3939: - Fixed keyboard repeating.
3940: ������������������������������������������������������������������������������
3941: 4/26/95 - Hi-res now works in all modes! The code I gave in the 4/22/95
3942: description is still perfectly valid, so please copy it if
3943: you haven't already looked at it. Here are some important
3944: new variables I put in BUILD.H:
3945:
3946: EXTERN char vidoption;
3947: EXTERN long xdim, ydim, ylookup[MAXYDIM+1];
3948:
3949: Vidoption is simply the first parameter you pass to
3950: initengine. Xdim and Ydim are the screen sizes you pass to
3951: initengine, such as 320*200 or 640*480.
3952: Ylookup is a lookup table that works like this:
3953: If (vidoption == 0) ylookup[i] = ((i*xdim)>>2);
3954: if (vidoption != 0) ylookup[i] = i*xdim;
3955: There is 1 exception: If you are using a chained mode which
3956: can only fit only 1 viewing page, then the engine actually
3957: does a screen-buffer mode and blits to the chained screen
3958: so for this case, ylookup[i] = i*xdim.
3959:
3960: - Added bit to the dastat parameter of rotatesprite.
3961: if ((dastat&2) != 0) - align to screen size so the gun or
3962: whatever is always over the same relative spot of the screen.
3963: Works like bit 2 of the flags parameter in overwritesprite.
3964:
3965: - Added pixel writing and reading that will work in all BUILD
3966: graphics modes. They work just like you think they should.
3967:
3968: plotpixel(long x, long y, char col);
3969: char getpixel(long x, long y);
3970:
3971: Please do not overuse these functions! They are NOT intended
3972: for fast drawing!
3973:
3974: - Changed tables.dat so parallaxing skies at high resolutions
3975: work accurately.
3976:
3977: - I made bit 15 of sprite[].cstat the invisible bit. If it is
3978: set, then the sprite won't even be considered for sorting and
3979: there is absolutely no speed loss due to its existence. It is
3980: faster to use this bit then manually set thesprite[] to -1.
3981:
3982: Since drawrooms collects the list of sprites drawmasks is about
3983: to sort, make sure the bit is set before drawrooms. If you use
3984: frame interpolation, you usually want to tell drawmasks somehow
3985: to not draw yourself. Before you used to use the
3986: thesprite[] = -1 trick. Now you do it like this:
3987:
3988: sprite[i].cstat |= 0x8000; //Set invisible bit
3989: drawrooms(posx,posy,etc.);
3990: sprite[i].cstat &= ~0x8000; //Restore invisible bit
3991:
3992: - Fixed distance overflow bug (the one that showed garbage
3993: textures if a wall was really far away).
3994: ������������������������������������������������������������������������������
3995: 4/27/95 - Made an example board, MONWALK.MAP, where monsters walk along
3996: a bridge with no railing, onto a sector, and even up and down
3997: a stairway without falling off it. If you shoot a brown so
3998: it's almost dead, it will turn transluscent. If it's
3999: transluscent, it won't shoot bullets. It is much easier to
4000: test the monsters' walking when they don't shoot!
4001:
4002: - Try my new and improved fake network player mode! Each fake
4003: network player now gets their own window. Use insert and
4004: delete to add or remove players. Use Scroll lock to switch
4005: which window you control. If you have a Pentium, I would
4006: recommend trying this out in 640*480 mode.
4007:
4008: - Noticed a bug with my movesprite code:
4009: For clipmove, I was getting the z-coordinate right, but for
4010: getzrange I forgot to subtract half the sprite's height if
4011: the sprite was using the real centered centering mode.
4012:
4013: These lines set daz to the actual center of sprite i no matter
4014: what centering mode is used:
4015:
4016: daz = sprite[i].z;
4017: if ((sprite[i].cstat&128) == 0)
4018: daz -= ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
4019: ������������������������������������������������������������������������������
4020: 4/28/95 - ATTENTION PROGRAMMERS! When a tile is not in the cache:
4021: Before it used to be this:
4022:
4023: if (waloff[tilenum] == -1) loadtile(tilenum);
4024: or
4025: if (waloff[tilenum] < 0) loadtile(tilenum);
4026:
4027: Now it's this:
4028:
4029: if (waloff[tilenum] == 0) loadtile(tilenum);
4030:
4031: PLEASE MODIFY YOUR CODE IF YOU USE WALOFF!
4032:
4033: Windows can allocate memory with addresses so high, they
4034: are negative. That makes the (waloff[tilenum] < 0)
4035: method totally stupid and attempt to reload from disk
4036: the tile constantly! I can think of 3 reasons why I
4037: originally designed my system in this fashion:
4038: mestupid, mestinx, and merottts.
4039:
4040: - Fixed visibility for different screen sizes.
4041:
4042: - ATTENTION PROGRAMMERS! Now multiply by visibility rather than
4043: shift right by visiblity so you get a broader range of
4044: visibility. If you want the visiblity to work like before,
4045: use this conversion table:
4046:
4047: Old visibility New visibility
4048: 8 -> 16384
4049: 9 -> 8192
4050: 10 -> 4096
4051: 11 -> 2048
4052: 12 -> 1024
4053: 13 -> 512
4054: 14 -> 256
4055: 15 -> 128
4056:
4057: - Made Alt-F make the selected wall the first wall of a sector.
4058: This is useful for quick relative alignment adjustments.
4059: Alt-F for 2D and 3D modes may not work for sectors with loops
4060: inside of them.
4061: ������������������������������������������������������������������������������
4062: 5/1/95 - Optimized horizontal line setup code from 9 multiplies to
4063: 7 multiplies.
4064:
4065: - Fixed dark vertical lines in parallaxing skies bug I recently
4066: introduced.
4067:
4068: - Optimized horizontal line assembly code so it doesn't use the
4069: awful SHLD instruction any more. This is a good speed
4070: improvement for Pentiums only.
4071: ������������������������������������������������������������������������������
4072: 5/2/95 - Added some code to my GAME.C which detects when a computer gets
4073: out of sync in a multiplayer game. It's not as easy as you
4074: may think with all the faketimerhandler and fifo crap. If
4075: you want to put this code in your game, search all areas in
4076: my code with the keyword "syncval".
4077:
4078: - Fixed palookup crashing bug.
4079: ������������������������������������������������������������������������������
4080: 5/6/95 - Moved windowx1, windowy1, windowx2, windowy2 variables into
4081: BUILD.H. They are the exact parameters you passed to the
4082: last setview call. Please DO NOT modify them directly.
4083: Use setview to modify them.
4084: ������������������������������������������������������������������������������
4085: 5/10/95 - Fixed makepalookup bug when shading to non 0.
4086:
4087: - Fixed palookup pointer setting bug.
4088:
4089: - ATTENTION PROGRAMMERS! I made a new cacheing system which allows
4090: any type of object to be allocated in my cache, such as
4091: artwork tiles and sounds or whatever else you may want to
4092: put on the cache. This may or may not affect you. If you
4093: haven't been hacking into my code, then you shouldn't have to
4094: change your code. The cacheing routines have been moved into
4095: a separate module, cache1d.obj. If you link engine.obj, then
4096: you must also link cache1d.obj. Please update your makefiles.
4097:
4098: For anybody who may want to re-write my cacheing system, here's
4099: how it now works: (I have only 3 functions in cache1d.obj
4100: right now, initcache, uninitcache, and allocache)
4101:
4102: Allocate a nice BIG buffer, like from 1MB-4MB and
4103: call initcache(long cachestart, long cachesize) where
4104:
4105: cachestart = (long)(pointer to start of BIG buffer)
4106: cachesize = length of BIG buffer
4107:
4108: Ex: initcache(FP_OFF(pic),cachesize);
4109:
4110: Loadpics calls this function for you so you don't normally
4111: need to call it.
4112:
4113: call allocache(long ptr, long siz) whenever you need to
4114: allocate a temporary buffer, where
4115:
4116: ptr = (long)(pointer to (4-byte pointer to thing))\
4117: siz = number of bytes
4118:
4119: Ex: if (waloff[tilenume] == 0)
4120: allocache((long)&waloff[tilenume],walsiz[tilenume]);
4121:
4122: Allocache is totally tile independent. To allocate a sound
4123: on the cache, you can call allocache.
4124:
4125: There are 3 functions in the engine which help manage the
4126: cache for you: loadpics - calls initcache
4127: loadtile - calls allocache
4128: allocatepermanenttile - special function
4129: that allocates permanent memory
4130: from the cache.
4131:
4132: - Fixed clipmove crashing bug when passing a sectnum < 0. Whenever
4133: you moved in BUILD and you weren't in a valid sector, memory
4134: was getting trashed.
4135: ������������������������������������������������������������������������������
4136: 5/12/95 - Added ExtPreCheckKeys(void) to BSTUB.C. It is called before
4137: drawrooms / drawmasks in 3D mode, whereas ExtCheckKeys(void)
4138: is called after drawrooms / drawmasks (and before nextpage).
4139:
4140: - Added bit to flags of rotatesprite to allow x-flipping. See
4141: updated documentation.
4142: ������������������������������������������������������������������������������
4143: 5/17/95 - Added aspect ratio for those weird modes like 320*400, etc.
4144: You could call setaspect to properly adjust a mode that is
4145: not exactly correct, or for special effect that stretch
4146: the screen.
4147:
4148: In ENGINE.OBJ, I added a function, setaspect(long daaspect),
4149: where you pass the Y/X aspect ratio scaled up 16 bits, so
4150: 65536 would be normal. You don't need to call this if you
4151: don't want to. By default, in setview, I call setaspect
4152: with these parameters:
4153:
4154: setaspect(divscale16(ydim*320,xdim*200));
4155: (also written as:)
4156: setaspect(((ydim*320)<<16)/(xdim*200));
4157:
4158: Note that in 320*200 mode the value passed would be 65536
4159: which is a 1:1 aspect ratio.
4160:
4161: In BUILD.H, I added yxaspect and xyaspect.
4162:
4163: When you call setaspect(daaspect),
4164:
4165: yxaspect = daaspect;
4166: xyaspect = (1<<32) / yxaspect; //reciprocal
4167: and other internal variables, so DON'T MODIFY YXASPECT
4168: AND XYASPECT DIRECTLY!
4169:
4170: Since drawmapview is also affect by the aspect ratio, you
4171: will need to make sure drawoverheadmap is affected so
4172: the map modes match up. Please look at and copy my updated
4173: drawoverheadmap function into your GAME.C if you use it.
4174: ������������������������������������������������������������������������������
4175: 5/18/95 - Revised caching system so it supports locking.
4176: Here are the new parameters to allocache:
4177:
4178: allocache(long *bufptr, long bufsiz, char *lockptr)
4179: *bufptr = pointer to 4-byte pointer to buffer
4180: bufsiz = number of bytes to allocate
4181: *lockptr = pointer to 1-byte locking char. 1=locked, 0=not
4182:
4183: And uninitcache works a little differently too:
4184: Call uninitcache(0) to remove all UNLOCKED items or
4185: Call uninitcache(1) to remove ALL items.
4186: After calling uninitcache, you do not need to call
4187: initcache to use the cache again.
4188: ������������������������������������������������������������������������������
4189: 5/21/95 - Made changespritesect and changespritestat return 0 instead of -1
4190: when changing to same value.
4191: ������������������������������������������������������������������������������
4192: 5/25/95 - Added relative visibility for sectors. In 3D EDIT MODE, use
4193: ALT+(keyp.)+/- to change an individual sector's visibility.
4194: Press Shift in addition for fine visibility changine. By
4195: default you change it by 16. Press CTRL+ALT+(keyp.)+/- to
4196: change the global visibility. The global visibility is not
4197: saved in the map.
4198:
4199: - Can now delete many sectors at a time. Select sectors with the
4200: rt. Alt. Then press Ctrl-delete on any highlighted sector to
4201: delete all the highlighted sectors.
4202:
4203: - Fixed build sometimes not saving when quitting from 2D mode bug.
4204: ������������������������������������������������������������������������������
4205: 5/27/95 - Fixed bugs in network work that should make it miss packets
4206: much less often than before.
4207:
4208: - Fixed bug in ncopy so it shouldn't halt or crash anymore.
4209:
4210: - Added spritecstat[] the thesprite arrays. Please use my
4211: thesprite arrays rather than modifying the sprite directly
4212: since hitscan and clipmove use bits 4 and 8 of sprite[].cstat.
4213:
4214: - ATTENTION PROGRAMMERS: Added 1 parameter to neartag that will
4215: allow you to search only lotags or only hitags. See updated
4216: documentation above.
4217:
4218: neartag (long xs, long ys, long zs, short sectnum, short ange,
4219: short *neartagsector, short *neartagwall, short *neartagsprite,
4220: long *neartaghitdist, long neartagrange, char tagsearch)
4221:
4222: If tagsearch = 1, neartag searches lotag only
4223: If tagsearch = 2, neartag searches hitag only
4224: If tagsearch = 3, neartag searches lotag&hitag
4225:
4226: Neartag used to always search both lotag&hitag.
4227: ������������������������������������������������������������������������������
4228: 5/30/95 - Added ExtAnalyzeSprites(void) to BSTUB and a spriteshade array
4229: to BUILD.H.
4230:
4231: - Made circle drawing in 2D EDIT MODE work better at large sizes.
4232: ������������������������������������������������������������������������������
4233: 6/5/95 - Added shareware / registered artwork version control to EDITART.
4234: In 'V' mode, when you press ALT-R to get a report of tile
4235: frequencies of tiles on all the maps in the current directory,
4236: you can toggle the shareware/registered bit with the space bar.
4237: This bit is saved in the top bit of the picanm bits so it is
4238: stored permanently in the art file. Press ALT-D in this mode
4239: to automatically delete all registered tiles. Please before
4240: you do the deleting phase, copy all artwork to a temporary
4241: directory!!! It is safe, however, the toggle the new bit in
4242: the full version.
4243: ������������������������������������������������������������������������������
4244: 6/7/95 - Made 3 main structures defined with typedef so struct prefix
4245: is no longer needed with sectortype, walltype, and spritetype.
4246:
4247: - Added new function to engine:
4248:
4249: short sectorofwall(short dawall);
4250:
4251: It returns the sector of a given wall. It is well optimized
4252: including sector[sector[].nextwall].nextsector if a red wall
4253: and a binary search on the sector[].wallptr's if it is a
4254: white wall. On average, sectorofwall should have to scan
4255: through only 10 different sector indeces to find the right
4256: sector (not 1024!).
4257:
4258: - ATTENTION PROGRAMMERS! Made all the separate thesprite arrays
4259: into a single array of sprite structures call tsprite. See
4260: BUILD.H!!! This means:
4261:
4262: spritepicnum[i] is now tsprite[i].picnum
4263: spritex[i] is now tsprite[i].x
4264: spritey[i] is now tsprite[i].y
4265: spritez[i] is now tsprite[i].z
4266: spriteshade[i] is now tsprite[i].shade
4267: spritecstat[i] is now tsprite[i].cstat
4268: spritepal[i] is now tsprite[i].pal
4269: thesprite[i] is now tsprite[i].owner <<<============
4270:
4271: Everything above is straight forward, except for thesprite,
4272: which has been renamed to owner.
4273:
4274: All other tsprite parameters, such as .xrepeat, .yoffset,
4275: etc. can also be modified without changing the real
4276: sprite structure so the game won't out of sync.
4277:
4278: - Made tsprite[].statnum be a priority variable for sorting sprites
4279: that are the exact same distance from you. I think higher
4280: means more in front.
4281:
4282: - Made clipmove allow you to cross any red sector line when the z's
4283: of the next sector are farther apart. This may solve clipping
4284: bugs such as when you're in water. You may be able to remove
4285: some work-arounds you may have programmed previously.
4286:
4287: - NEW FILE GROUPING SYSTEM!!!
4288: My system will first search for the stand-alone file in the
4289: directory. If it doesn't find it, then it will search for it
4290: in the group file. If it still doesn't find it then -1 city.
4291: Use KGROUP.EXE to create a grouped file from a lot of other
4292: files. Type KGROUP [grouped filename][filespec][filespec][...]
4293: For example this line will create the new grouped file,
4294: stuff.dat, including all the following files specified:
4295: kgroup stuff.dat *.art *.map tables.dat palette.dat
4296: Feel free to make your own batch files. If there is demand,
4297: I can make kgroup support appending, replacing, and extraction.
4298:
4299: Here is the file format of a grouped file:
4300: �����������������������������������������������������������������Ŀ
4301: � 12 bytes - File grouping ID �
4302: � 4 bytes - Number of files �
4303: �����������������������������������������������������������������Ĵ
4304: �For each file: (16 bytes per file) �
4305: � 12 bytes - Filename with extension (13th byte would be a 0) �
4306: � 4 bytes - Length of file �
4307: �����������������������������������������������������������������Ĵ
4308: � Pure, raw file data, ordered just like you think it would be �
4309: �������������������������������������������������������������������
4310: There just couldn't be a simpler format. This format is so
4311: hacker happy that when you view it in a hex editor, all the
4312: filenames line up perfectly since they're multiples of 16.
4313: Anybody who can't figure this out, of course, not only rots,
4314: but is probably one of those really stupid people who would
4315: actually "pay" to get the full version of a game.
4316:
4317: The engine currently supports grouping for:
4318: *.ART, *.MAP, TABLES.DAT and PALETTE.DAT. If you want
4319: to group your own files, you will have to use my loading
4320: routines rather than the standard ones for those files. My
4321: file routines are basically an extra layer around the standard
4322: lo-level functions. Look at these 5 routines I currently
4323: support:
4324:
4325: Welcome to the K-routines!
4326: open -> kopen4load(char *filename)
4327: read -> kread(long handle, void *buffer, long leng)
4328: lseek -> klseek(long handle, long offset, long whence)
4329: filelength -> kfilelength(long handle)
4330: close -> kclose(long handle)
4331:
4332: Note that you only pass the filename to my kopen4load function.
4333:
4334: Here are 2 other routines that you MUST use, whether you like
4335: my file grouping system or not:
4336:
4337: initgroupfile(char *groupfilename)
4338: Call this with the name of your grouped file before
4339: any possible file loading will the k-routines. Note that
4340: tables.dat uses the k-routines and it is in initengine().
4341: Please don't give your grouped filename an extension that
4342: starts with W, ends with D, and has a vowel in between.
4343: And don't even bother to write your own file grouping
4344: system because even if you do, people still have to write
4345: their own new utilities to read the ART and MAP files.
4346:
4347: uninitgroupfile()
4348: Call before quitting to DOS.
4349: ------------------------------------------------------
4350: - ATTENTION PROGRAMMERS! Changed kopen4load from:
4351:
4352: kopen4load(char *filename)
4353: to:
4354: kopen4load(char *filename, char searchfirst)
4355:
4356: where:
4357: if searchfirst = 0 then search stand alone first then group file
4358: if searchfirst = 1 then search group file only
4359: ������������������������������������������������������������������������������
4360: 6/12/95 - Tracked down an OUT OF SYNC bug with my multiplayer code!
4361: In my GAME.C, the way I had my sync arrays organized were
4362: wrong. The problem was that if faketimerhandler was
4363: called during domovethings, the sync arrays may have been
4364: changed, getting the game out of sync. The solution is
4365: to keep the sync arrays in domovethings totally separate
4366: from the sync arrays in faketimerhandler. I split my sync
4367: arrays into 2 separate arrays, sync and fsync, where fsync
4368: and osync are for use BEFORE the FIFO only (such as
4369: faketimerhandler and getpackets), and sync is used AFTER
4370: the FIFO only (such as domovethings). PLEASE SPLIT YOUR
4371: SYNC ARRAYS AS I DESCRIBED!
4372:
4373: - The OUT OF SYNC message doesn't flicker any more. See the
4374: section of code in GAME.C where I set syncstat.
4375:
4376: - Fixed up a waitforeverybody function for network games which
4377: waits for everybody to be at a certain part of the game.
4378: Waitforeverybody also uses getpackets message number 5.
4379:
4380: - Added new clipping function that will push players away from
4381: walls that are too close. It solves A LOT of movement
4382: clipping problems. It can be pretty darn slow if it detects
4383: that you're too close to a wall, so I'd recommend using it
4384: only for players.
4385:
4386: pushmove (long *x, long *y, long *z, short *sectnum,
4387: long walldist, long ceildist, long flordist, char cliptype)
4388:
4389: The parameters are exactly the same as clipmove but with no
4390: xvect or yvect. Pushmove returns either a 0 or -1. If
4391: it returns a -1, then that means that it could not push
4392: the player away from the offending wall after 256 tries.
4393: When this happens, then you should kill the player
4394: instantly, because this only happens when the player is
4395: getting smooshed.
4396: ������������������������������������������������������������������������������
4397: 6/13/95 - Made clipinsidebox and clipinsideboxline return 0 if line doesn't
4398: intersect box, 1 if line intersects box and center of box
4399: is in front of line, or 2 if line intersects box and center
4400: of box is behind line.
4401:
4402: - Cansee should now work properly with overlapping.
4403: ������������������������������������������������������������������������������
4404: 6/19/95 - ATTENTION! Remove work-arounds!!! Found nasty getzrange bug.
4405: Getzrange used to let you fall through red sector line cracks
4406: when you were near more multiple red sector line sharing the
4407: same 2 sectors. Sound familiar anybody?
4408:
4409: - Made pushmove return the sector of whatever x and y end up in.
4410: ������������������������������������������������������������������������������
4411: 6/22/95 - I included cache1d.c renamed to cache1d.txt in this upload.
4412: ������������������������������������������������������������������������������
4413: 6/26/95 - Made face and wall sprites of clipmove, getzrange, hitscan, and
4414: neartag sensitive to the y-offset that you set in Editart.
4415:
4416: - Made one sprite sorting case work perfectly: where multiple
4417: sprites have the same x and y location (and priority). The
4418: sorting still doesn't work perfectly, but this one case can
4419: solve many of the current sprite sorting bugs, such as
4420: inserting a floor sprite of blood below a dead body.
4421:
4422: - Fixed some sprite drawing clipping bugs for wall and floor
4423: sprites. Now, wall sprites and floor sprites should not
4424: show through walls, ceilings, or floors when they're not
4425: supposed to. Also, I fixed a case where wall sprites
4426: disappeared when they happened to be between 2 white walls
4427: that clipped it.
4428: ������������������������������������������������������������������������������
4429: 6/27/95 - Fixed even more sprite drawing clipping bugs for wall sprites.
4430:
4431: - BONUS!!! Wall sprites now clip to white walls! (not red walls)
4432: If you ornament a wall, make sure that neither endpoint of the
4433: wall sprite is behind the wall or else it will get clipped.
4434: Please run lookatme.map from my game.exe which demonstrates
4435: some of the things you can do in build now without bugs.
4436: ������������������������������������������������������������������������������
4437: 6/30/95 - Made drawline256 clip with startumost/startdmost.
4438:
4439: - Moved keyboard handler into GAME.C. Here's what you need to do
4440: to use my keyboard handler (see my GAME.C):
4441:
4442: 1. Some global variables:
4443:
4444: #define KEYFIFOSIZ 64
4445: void (__interrupt __far *oldkeyhandler)();
4446: void __interrupt __far keyhandler(void);
4447: volatile char keystatus[256], keyfifo[KEYFIFOSIZ];
4448: volatile char keyfifoplc, keyfifoend;
4449: volatile char readch, oldreadch, extended, keytemp;
4450:
4451: 2. initkeys()
4452:
4453: 3. uninitkeys()
4454:
4455: 4. keyhandler()
4456:
4457: 5. Make sure to call initkeys and uninitkeys. A good place
4458: would be next to where you call inittimer / uninittimer.
4459:
4460: I didn't put my keyboard handler into BSTUB since I am using
4461: keystatus throughout build.obj. Besides I didn't want to anybody
4462: too bad of a headache for one upload.
4463:
4464: - Did you know that screencapture inverses black and white if you
4465: hold either shift key down? This option is useful for
4466: printing out board maps. Since I don't own the keyboard
4467: any more, I had to make screencapture take inverseit as the
4468: second parameter.
4469:
4470: screencapture(char *filename, char inverseit);
4471:
4472: Ex: screencapture("captxxxx.pcx",keystatus[0x2a]|keystatus[0x36]);
4473:
4474: If (inverseit == 0) then nuttin' special
4475: If (inverseit == 1) then super-reverso blacko-whiteo mode!
4476:
4477: I also had to move the stereo adjustment keys into game.c
4478: Just search for the "stereo" keyword in GAME.C. It'll take
4479: through all the necessary places.
4480: ������������������������������������������������������������������������������
4481: 7/5/95 - Moved my keytimerstuff from my timerhandler into getinput.
4482: (which is where it should be)
4483: ������������������������������������������������������������������������������
4484: 7/10/95 - Added a loadtilelockmode variable to BUILD.H. It's a global
4485: variable that makes future loadtile calls allocate their
4486: buffers on the cache as unlocked (0-default) or locked (1).
4487: I decided to make this a global variable rather than a
4488: parameter to save some people from rewriting code.
4489:
4490: EXTERN char loadtilelockmode;
4491:
4492: - Made my 2D EDIT MODE space bar code clear out new sectors and
4493: wall structures to 0. (except for the extras which are -1)
4494: ������������������������������������������������������������������������������
4495: 7/20/95 - I forgot to documenent rotatesprite bit 3, which controls
4496: whether or not the sprite will be clipped to the startumost
4497: /startdmost arrays. If the bit is a 1, then the sprite will
4498: not be clipped. This mode is useful for doing status bars
4499: at variable resolutions. What you do is instead of calling
4500: permanentwritesprite, you call rotatesprite with the scaling
4501: bit and startumost/startdmost clipping bit off. For non
4502: screen-buffer modes, be sure to call rotatesprite for each
4503: page of the mode. Use the numpages variable in BUILD.H to
4504: get the number of video pages used.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.