[go: up one dir, main page]

Menu

[cb92cd]: / cc / vpacc.pas  Maximize  Restore  History

Download this file

376 lines (326 with data), 10.1 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
{
VPA / PCC Glue
Some definitions to make PCC source code work inside VPA. Not
all of this is actually used.
}
UNIT VPACC;
INTERFACE
USES Screen, VPAData;
CONST NUM_SHIPS = 999;
CONST NUM_PLANETS = 500;
CONST MaxHulls = 105;
CONST HullCnt = 105;
{ type aliases }
TYPE Str15 = STRING[15];
Str63 = STRING[63];
{ VCR record. This one's needed for PHost instant battle result }
TYPE TWho = LRType;
TYPE TVCRObject=RECORD
Name : ARRAY[1..20] OF CHAR; { Name }
Damage : INTEGER; { Damage % }
Crew : INTEGER; { Crew }
Id : INTEGER; { ID }
Owner : INTEGER; { Owner (PHost/PlayerRace encoding is resolved during load) }
Pic : BYTE; { Picture }
Hull : BYTE; { Hull or 0 }
BeamType : INTEGER; { Beam ID }
BeamCount : INTEGER; { Beam Type }
FighterCount : INTEGER; { # Fighterbays }
TorpType : INTEGER; { Torpedo type }
TFCount : INTEGER; { # Torps/Fighters }
TLauncherCount : INTEGER; { # Torp launchers }
END;
{--- Full VCR Record ---}
TVCR=RECORD
PsRandSeedInit : WORD; { Randomizer initial value }
Magic : WORD; { PHost magic number }
PlanetTemp : INTEGER; { Planet Temp }
BattleType : INTEGER; { Battle type (0=s/s, 1=s/p) }
Mass : ARRAY[Left..Right] OF INTEGER; { Masses (kt) }
Objs : ARRAY[Left..Right] OF TVCRObject; { Warriors }
Shield : ARRAY[Left..Right] OF INTEGER; { Shields % }
END;
{ Variable name aliases }
VAR gr : BOOLEAN ABSOLUTE GrMode;
VAR GameDir : STRING[Sizeof(addir)-1] ABSOLUTE addir;
VAR PlayerStr : STRING[Sizeof(plstr)-1] ABSOLUTE plstr;
VAR PlayerId : INTEGER ABSOLUTE player;
{ some string literals }
CONST Leerstring : STRING[1] = '';
CONST Kilotons : STRING[3] = ' kt';
CONST LetterH : STRING[1] = 'H';
CONST PlusStr : STRING[1] = '+';
CONST MinusStr : STRING[1] = '-';
CONST ClosePar : STRING[1] = ')';
CONST StartIdStr : STRING[3] = ' (#';
CONST YesStr : STRING[3] = 'Yes';
CONST NoStr : STRING[2] = 'No';
CONST DATExt : STRING[4] = '.dat';
CONST DISExt : STRING[4] = '.dis';
CONST CCExt : STRING[3] = '.cc';
CONST Percent : STRING[1] = '%';
CONST OutOfMemory: STRING[13] = 'Out of memory';
CONST SpacerStr : STRING[3] = ' - ';
CONST Lightyears : STRING[3] = ' ly';
CONST Megacredits: STRING[3] = ' mc';
CONST ColonSP : STRING[2] = ': ';
CONST Elf : STRING[11] = '123456789AB';
{ was there an error? }
CONST Error : BOOLEAN = FALSE;
PROCEDURE CatChar(VAR s:STRING; c:CHAR);
PROCEDURE Strip1(VAR s:STRING);
PROCEDURE RedrawScreen;
FUNCTION Malloc(size:WORD):POINTER;
FUNCTION Realloc(count:WORD; old:POINTER; oldsz:WORD):POINTER;
FUNCTION itoa(l:LONGINT):Str15;
(*PROCEDURE AddListItem(value:INTEGER; CONST text:STRING);*)
FUNCTION SimpleListbox(CONST title:STRING; wi,he:INTEGER; val:INTEGER):INTEGER;
{ Simple version of TDosStream }
CONST stCreate = $3C00; { Create file }
stOpenRead = $3D00; { Read only }
stOpenWrite = $3D01; { Write only }
stOpen = $3D02; { Random access }
TYPE TDosStream = OBJECT
handle : INTEGER;
status : INTEGER;
CONSTRUCTOR Init(CONST fn : STRING; mode : WORD);
DESTRUCTOR Done;
FUNCTION PRead(VAR buf; size : WORD):WORD;
FUNCTION PWrite(VAR buf; size : WORD):WORD;
PROCEDURE Seek(pos:LONGINT);
FUNCTION GetPos:LONGINT;
FUNCTION GetSize:LONGINT;
PROCEDURE Read(VAR buf; size : WORD);
PROCEDURE Write(VAR buf; size : WORD);
PRIVATE
FUNCTION LSeek(pos:LONGINT; whence:INTEGER):LONGINT;
END;
PDosStream = ^TDosStream;
{ originally, TStream was the base class of TDosStream }
PStream = PDosStream;
PROCEDURE OpenFile(CONST Name:Str15; ResID:INTEGER);
PROCEDURE CloseFile;
VAR ofStream : PDosStream;
VAR RaceIDs : ARRAY[1..11] OF INTEGER ABSOLUTE Race;
IMPLEMENTATION
USES StrF, VPA2, Graph;
PROCEDURE CatChar(VAR s:STRING; c:CHAR);
BEGIN
s := s + c;
END;
PROCEDURE Strip1(VAR s:STRING);
BEGIN
Trim(s);
END;
PROCEDURE RedrawScreen;
BEGIN
DrawMap(True);
END;
FUNCTION Malloc(size:WORD):POINTER;
VAR p : POINTER;
BEGIN
IF MaxAvail < size THEN Malloc := NIL ELSE BEGIN
GetMem(p, size);
Fillchar(p^, size, 0);
Malloc := p;
END;
END;
FUNCTION Realloc(count:WORD; old:POINTER; oldsz:WORD):POINTER;
VAR p : POINTER;
BEGIN
p := Malloc(count);
IF p<>NIL THEN BEGIN
IF count>oldsz THEN count:=oldsz;
IF count<>0 THEN Move(old^, p^, count);
FreeMem(old, oldsz);
END;
Realloc := p;
END;
{*** TDosStream **********************************************************}
{
Cut & paste & hacked from the library used by PCC. Which in turn stole
it years ago from Turbo Vision.
}
CONSTRUCTOR TDosStream.Init(CONST fn : STRING; mode : WORD); ASSEMBLER;
VAR NameBuf:ARRAY[0..79] OF CHAR;
ASM
PUSH DS
LDS SI,fn { zero-terminate filename }
LEA DI,NameBuf
MOV DX,DI
PUSH SS
POP ES
CLD
LODSB
CMP AL,79 { 79 = max length of DOS file name }
JB @Kurz
MOV AL,79
@Kurz:CBW
XCHG AX,CX
REP MOVSB
XCHG AX,CX
STOSB
PUSH SS
POP DS
XOR CX,CX
MOV AX,Mode { Mode = DOS Function number + access mode }
INT 21H
POP DS
LES DI,Self
MOV ES:[DI].TDosStream.Status,0
JNC @OK
MOV ES:[DI].TDosStream.Status,AX
MOV AX,-1
@OK: LES DI,Self
MOV ES:[DI].TDosStream.Handle,AX
END;
DESTRUCTOR TDosStream.Done; ASSEMBLER;
ASM
les di, Self
mov ah, 3Eh
mov bx, es:[di].TDosStream.Handle
or bx, bx
js @no
int 21h
@no:
END;
FUNCTION TDosStream.PRead(VAR buf; size : WORD):WORD; ASSEMBLER;
ASM
LES DI,Self
CMP ES:[DI].TDosStream.Status,0
JNE @Fehler { refuse read when there was an error }
PUSH DS
LDS DX,Buf
MOV CX,size
MOV BX,ES:[DI].TDosStream.Handle
MOV AH,3FH
INT 21H
POP DS
jnc @ok
LES DI,Self
mov es:[di].TDosStream.Status,ax
@Fehler:xor ax, ax { 0 Bytes read }
@OK:
END;
FUNCTION TDosStream.PWrite(VAR buf; size : WORD):WORD; ASSEMBLER;
ASM
LES DI,Self
xor ax, ax
CMP ES:[DI].TDosStream.Status,0
JNE @Nix { go on holiday after error }
PUSH DS
LDS DX,Buf
MOV CX,size
MOV BX,ES:[DI].TDosStream.Handle
MOV AH,40H
INT 21H
POP DS
jnc @nix
@Fehler:LES DI,Self
mov es:[di].TDosStream.Status, ax
xor ax, ax
@Nix:
END;
PROCEDURE TDosStream.Seek(pos:LONGINT);
BEGIN
IF Status=0 THEN LSeek(pos, 0);
END;
FUNCTION TDosStream.GetPos:LONGINT;
BEGIN
IF Status=0 THEN GetPos:=LSeek(0, 1) ELSE GetPos := -1;
END;
FUNCTION TDosStream.GetSize:LONGINT;
VAR L : LONGINT;
BEGIN
IF Status=0 THEN BEGIN
L := LSeek(0, 1);
GetSize := LSeek(0, 2);
LSeek(L, 0);
END ELSE GetSize := -1;
END;
PROCEDURE TDosStream.Read(VAR buf; size : WORD);
BEGIN
IF PRead(Buf, Size)<>Size THEN BEGIN
FillChar(Buf, Size, 0);
IF Status=0 THEN Status:=1;
END;
END;
PROCEDURE TDosStream.Write(VAR buf; size : WORD);
BEGIN
IF PWrite(Buf, Size)<>Size THEN BEGIN
IF Status=0 THEN Status:=1;
END;
END;
FUNCTION TDosStream.LSeek(pos:LONGINT; whence:INTEGER):LONGINT; ASSEMBLER;
ASM
les di, Self
mov bx, es:[di].TDosStream.Handle
mov ah, 42h
mov al, whence.byte
mov cx, pos.word.2
mov dx, pos.word.0
int 21h
jnc @ok
xor ax,ax { unclean, but who cares. }
cbw
@ok:
END;
(*
{ NOTE: VPA assumes that the values come in in order 1..N, so be
careful with this one. }
CONST MenuItemCount : INTEGER = 0;
PROCEDURE AddListItem(value:INTEGER; CONST text:STRING);
BEGIN
AddMenuItem(text, 7, FALSE);
Inc(MenuItemCount);
END;*)
FUNCTION SimpleListbox(CONST title:STRING; wi,he:INTEGER; val:INTEGER):INTEGER;
BEGIN
MouseOff;
SetColor(White);
SetLineStyle(SolidLn, 0, 1);
SetFillStyle(SOLIDFILL, 0);
Bar(5, 100, wi+11, 112);
Rectangle(5, 100, wi+11, 112);
SetTextJustify(0, 2);
OutTextXY(10, 102, title);
ChooseMenu(8, 124, 10, 8+wi, he, White, White, val, FALSE, FALSE,-1);
NewMenu;
IF MenuKey<>27 THEN SimpleListbox:=MenuValue ELSE SimpleListbox:=-1;
DrawMap(True);
MouseOn;
END;
FUNCTION itoa(L:LONGINT):Str15;
VAR s:Str15;
BEGIN
Str(L,s);
itoa:=s;
END;
{
Open a (specification) file. Check game dir first, then
current directory. In PCC, this also tries the resource file.
}
PROCEDURE OpenFile(CONST Name:Str15; ResID:INTEGER);
VAR PS:PStream;
BEGIN
PS := New(PDosStream, Init(addir + Name, stOpenRead));
IF PS^.Status<>0 THEN BEGIN
Dispose(PS, Done);
PS := New(PDosStream, Init(Name, stOpenRead));
IF PS^.Status<>0 THEN BEGIN
Dispose(PS, Done);
IF ResID<>0 THEN BEGIN Writeln(#13#10'Can''t read file ',name); Halt END;
PS := NIL;
END ELSE Writeln('Reading ', name, '...');
END ELSE Writeln('Reading ', addir, name, '...');
ofStream:=PS;
END;
{
Close file opened with last OpenFile
}
PROCEDURE CloseFile;
BEGIN
IF (ofStream<>NIL) THEN Dispose(ofStream,Done);
ofStream:=NIL;
END;
END.