1 //**************************************************************************
2 //**
3 //** ## ## ## ## ## #### #### ### ###
4 //** ## ## ## ## ## ## ## ## ## ## #### ####
5 //** ## ## ## ## ## ## ## ## ## ## ## ## ## ##
6 //** ## ## ######## ## ## ## ## ## ## ## ### ##
7 //** ### ## ## ### ## ## ## ## ## ##
8 //** # ## ## # #### #### ## ##
9 //**
10 //** $Id: pr_cmds.cpp 4339 2010-12-14 12:07:27Z dj_jl $
11 //**
12 //** Copyright (C) 1999-2006 Jānis Legzdiņš
13 //**
14 //** This program is free software; you can redistribute it and/or
15 //** modify it under the terms of the GNU General Public License
16 //** as published by the Free Software Foundation; either version 2
17 //** of the License, or (at your option) any later version.
18 //**
19 //** This program is distributed in the hope that it will be useful,
20 //** but WITHOUT ANY WARRANTY; without even the implied warranty of
21 //** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 //** GNU General Public License for more details.
23 //**
24 //**************************************************************************
25 //**
26 //** Builtins.
27 //**
28 //**************************************************************************
29
30 // HEADER FILES ------------------------------------------------------------
31
32 #include "gamedefs.h"
33 #include "network.h"
34 #include "sv_local.h"
35 #include "cl_local.h"
36 #include "drawer.h"
37
38 // MACROS ------------------------------------------------------------------
39
40 // TYPES -------------------------------------------------------------------
41
42 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
43
44 VClass* SV_FindClassFromEditorId(int Id, int GameFilter);
45 VClass* SV_FindClassFromScriptId(int Id, int GameFilter);
46
47 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
48
49 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
50
51 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
52
53 // PUBLIC DATA DEFINITIONS -------------------------------------------------
54
55 // PRIVATE DATA DEFINITIONS ------------------------------------------------
56
57 // CODE --------------------------------------------------------------------
58
59 //==========================================================================
60 //
61 // PR_PushStr
62 //
63 //==========================================================================
64
PR_PushStr(const VStr & value)65 void PR_PushStr(const VStr& value)
66 {
67 pr_stackPtr->p = NULL;
68 *(VStr*)&pr_stackPtr->p = value;
69 pr_stackPtr++;
70 }
71
72 //==========================================================================
73 //
74 // PR_PopStr
75 //
76 //==========================================================================
77
PR_PopStr()78 VStr PR_PopStr()
79 {
80 --pr_stackPtr;
81 VStr Ret = *(VStr*)&pr_stackPtr->p;
82 ((VStr*)&pr_stackPtr->p)->Clean();
83 return Ret;
84 }
85
86 //**************************************************************************
87 //
88 // Vararg strings
89 //
90 //**************************************************************************
91
PF_FormatString()92 VStr PF_FormatString()
93 {
94 guard(PF_FormatString);
95 VStr Ret;
96 VStack params[16];
97 int pi;
98
99 P_GET_INT(count);
100 for (pi = count - 1; pi >= 0; pi--)
101 {
102 params[pi] = *(--pr_stackPtr);
103 }
104 P_GET_STR(str);
105
106 const char* src = *str;
107 pi = 0;
108 while (*src)
109 {
110 if (*src == '%')
111 {
112 src++;
113 switch (*src)
114 {
115 case '%':
116 Ret += *src;
117 break;
118
119 case 'i':
120 case 'd':
121 Ret += va("%d", params[pi].i);
122 pi++;
123 break;
124
125 case 'x':
126 Ret += va("%x", params[pi].i);
127 pi++;
128 break;
129
130 case 'f':
131 Ret += va("%f", params[pi].f);
132 pi++;
133 break;
134
135 case 'n':
136 Ret += *(VName*)¶ms[pi].i;
137 pi++;
138 break;
139
140 case 's':
141 Ret += *(VStr*)¶ms[pi].p;
142 ((VStr*)¶ms[pi].p)->Clean();
143 pi++;
144 break;
145
146 case 'p':
147 Ret += va("%p", params[pi].p);
148 pi++;
149 break;
150
151 case 'v':
152 Ret += va("(%f,%f,%f)", params[pi].f,
153 params[pi + 1].f, params[pi + 2].f);
154 pi += 3;
155 break;
156
157 default:
158 GCon->Logf(NAME_Dev, "PF_FormatString: Unknown format identifier %s", *src);
159 src--;
160 Ret += *src;
161 break;
162 }
163 }
164 else
165 {
166 Ret += *src;
167 }
168 src++;
169 }
170 if (pi < count)
171 {
172 GCon->Log(NAME_Dev, "PF_FormatString: Not all params were used");
173 }
174 if (pi > count)
175 {
176 GCon->Log(NAME_Dev, "PF_FormatString: Param count overflow");
177 }
178 return Ret;
179 unguard;
180 }
181
182 #ifdef SERVER
183
184 //**************************************************************************
185 //
186 // Map utilites
187 //
188 //**************************************************************************
189
190 //==========================================================================
191 //
192 // PF_LineOpenings
193 //
194 //==========================================================================
195
IMPLEMENT_FUNCTION(VObject,LineOpenings)196 IMPLEMENT_FUNCTION(VObject, LineOpenings)
197 {
198 P_GET_VEC(point);
199 P_GET_PTR(line_t, linedef);
200 RET_PTR(SV_LineOpenings(linedef, point, 0xffffffff));
201 }
202
203 //==========================================================================
204 //
205 // PF_P_BoxOnLineSide
206 //
207 //==========================================================================
208
IMPLEMENT_FUNCTION(VObject,P_BoxOnLineSide)209 IMPLEMENT_FUNCTION(VObject, P_BoxOnLineSide)
210 {
211 P_GET_PTR(line_t, ld);
212 P_GET_PTR(float, tmbox);
213 RET_INT(P_BoxOnLineSide(tmbox, ld));
214 }
215
216 //==========================================================================
217 //
218 // PF_FindThingGap
219 //
220 //==========================================================================
221
IMPLEMENT_FUNCTION(VObject,FindThingGap)222 IMPLEMENT_FUNCTION(VObject, FindThingGap)
223 {
224 P_GET_FLOAT(z2);
225 P_GET_FLOAT(z1);
226 P_GET_VEC(point);
227 P_GET_PTR(sec_region_t, gaps);
228 RET_PTR(SV_FindThingGap(gaps, point, z1, z2));
229 }
230
231 //==========================================================================
232 //
233 // PF_FindOpening
234 //
235 //==========================================================================
236
IMPLEMENT_FUNCTION(VObject,FindOpening)237 IMPLEMENT_FUNCTION(VObject, FindOpening)
238 {
239 P_GET_FLOAT(z2);
240 P_GET_FLOAT(z1);
241 P_GET_PTR(opening_t, gaps);
242 RET_PTR(SV_FindOpening(gaps, z1, z2));
243 }
244
245 //==========================================================================
246 //
247 // PF_PointInRegion
248 //
249 //==========================================================================
250
IMPLEMENT_FUNCTION(VObject,PointInRegion)251 IMPLEMENT_FUNCTION(VObject, PointInRegion)
252 {
253 P_GET_VEC(p);
254 P_GET_PTR(sector_t, sector);
255 RET_PTR(SV_PointInRegion(sector, p));
256 }
257
258 //**************************************************************************
259 //
260 // Sound functions
261 //
262 //**************************************************************************
263
264 //==========================================================================
265 //
266 // PF_GetSoundPlayingInfo
267 //
268 //==========================================================================
269
IMPLEMENT_FUNCTION(VObject,GetSoundPlayingInfo)270 IMPLEMENT_FUNCTION(VObject, GetSoundPlayingInfo)
271 {
272 P_GET_INT(id);
273 P_GET_REF(VEntity, mobj);
274 #ifdef CLIENT
275 RET_BOOL(GAudio->IsSoundPlaying(mobj->SoundOriginID, id));
276 #else
277 RET_BOOL(false);
278 #endif
279 }
280
281 //==========================================================================
282 //
283 // PF_GetSoundID
284 //
285 //==========================================================================
286
IMPLEMENT_FUNCTION(VObject,GetSoundID)287 IMPLEMENT_FUNCTION(VObject, GetSoundID)
288 {
289 P_GET_NAME(Name);
290 RET_INT(GSoundManager->GetSoundID(Name));
291 }
292
293 //==========================================================================
294 //
295 // PF_SetSeqTrans
296 //
297 //==========================================================================
298
IMPLEMENT_FUNCTION(VObject,SetSeqTrans)299 IMPLEMENT_FUNCTION(VObject, SetSeqTrans)
300 {
301 P_GET_INT(SeqType);
302 P_GET_INT(Num);
303 P_GET_NAME(Name);
304 GSoundManager->SetSeqTrans(Name, Num, SeqType);
305 }
306
307 //==========================================================================
308 //
309 // PF_GetSeqTrans
310 //
311 //==========================================================================
312
IMPLEMENT_FUNCTION(VObject,GetSeqTrans)313 IMPLEMENT_FUNCTION(VObject, GetSeqTrans)
314 {
315 P_GET_INT(SeqType);
316 P_GET_INT(Num);
317 RET_NAME(GSoundManager->GetSeqTrans(Num, SeqType));
318 }
319
320 //==========================================================================
321 //
322 // PF_GetSeqTrans
323 //
324 //==========================================================================
325
IMPLEMENT_FUNCTION(VObject,GetSeqSlot)326 IMPLEMENT_FUNCTION(VObject, GetSeqSlot)
327 {
328 P_GET_NAME(Name);
329 RET_NAME(GSoundManager->GetSeqSlot(Name));
330 }
331
332 //==========================================================================
333 //
334 // PF_P_GetThingFloorType
335 //
336 //==========================================================================
337
IMPLEMENT_FUNCTION(VObject,TerrainType)338 IMPLEMENT_FUNCTION(VObject, TerrainType)
339 {
340 P_GET_INT(pic);
341 RET_PTR(SV_TerrainType(pic));
342 }
343
344 //==========================================================================
345 //
346 // PF_SB_Start
347 //
348 //==========================================================================
349
IMPLEMENT_FUNCTION(VObject,SB_Start)350 IMPLEMENT_FUNCTION(VObject, SB_Start)
351 {
352 #ifdef CLIENT
353 // SB_Start();
354 #endif
355 }
356
357 //==========================================================================
358 //
359 // PF_FindClassFromEditorId
360 //
361 //==========================================================================
362
IMPLEMENT_FUNCTION(VObject,FindClassFromEditorId)363 IMPLEMENT_FUNCTION(VObject, FindClassFromEditorId)
364 {
365 P_GET_INT(GameFilter);
366 P_GET_INT(Id);
367 RET_PTR(SV_FindClassFromEditorId(Id, GameFilter));
368 }
369
370 //==========================================================================
371 //
372 // PF_FindClassFromScriptId
373 //
374 //==========================================================================
375
IMPLEMENT_FUNCTION(VObject,FindClassFromScriptId)376 IMPLEMENT_FUNCTION(VObject, FindClassFromScriptId)
377 {
378 P_GET_INT(GameFilter);
379 P_GET_INT(Id);
380 RET_PTR(SV_FindClassFromScriptId(Id, GameFilter));
381 }
382
383 #endif
384 #ifdef CLIENT
385
386 //**************************************************************************
387 //
388 // Graphics
389 //
390 //**************************************************************************
391
392 //==========================================================================
393 //
394 // PF_SetVirtualScreen
395 //
396 //==========================================================================
397
IMPLEMENT_FUNCTION(VObject,SetVirtualScreen)398 IMPLEMENT_FUNCTION(VObject, SetVirtualScreen)
399 {
400 P_GET_INT(Height);
401 P_GET_INT(Width);
402 SCR_SetVirtualScreen(Width, Height);
403 }
404
405 //==========================================================================
406 //
407 // PF_R_RegisterPic
408 //
409 //==========================================================================
410
IMPLEMENT_FUNCTION(VObject,R_RegisterPic)411 IMPLEMENT_FUNCTION(VObject, R_RegisterPic)
412 {
413 P_GET_NAME(name);
414 RET_INT(GTextureManager.AddPatch(name, TEXTYPE_Pic));
415 }
416
417 //==========================================================================
418 //
419 // PF_R_RegisterPicPal
420 //
421 //==========================================================================
422
IMPLEMENT_FUNCTION(VObject,R_RegisterPicPal)423 IMPLEMENT_FUNCTION(VObject, R_RegisterPicPal)
424 {
425 P_GET_NAME(palname);
426 P_GET_NAME(name);
427 RET_INT(GTextureManager.AddRawWithPal(name, palname));
428 }
429
430 //==========================================================================
431 //
432 // PF_R_GetPicInfo
433 //
434 //==========================================================================
435
IMPLEMENT_FUNCTION(VObject,R_GetPicInfo)436 IMPLEMENT_FUNCTION(VObject, R_GetPicInfo)
437 {
438 P_GET_PTR(picinfo_t, info);
439 P_GET_INT(handle);
440 GTextureManager.GetTextureInfo(handle, info);
441 }
442
443 //==========================================================================
444 //
445 // PF_R_DrawPic
446 //
447 //==========================================================================
448
IMPLEMENT_FUNCTION(VObject,R_DrawPic)449 IMPLEMENT_FUNCTION(VObject, R_DrawPic)
450 {
451 P_GET_INT(handle);
452 P_GET_INT(y);
453 P_GET_INT(x);
454 R_DrawPic(x, y, handle);
455 }
456
457 //==========================================================================
458 //
459 // PF_R_InstallSprite
460 //
461 //==========================================================================
462
IMPLEMENT_FUNCTION(VObject,R_InstallSprite)463 IMPLEMENT_FUNCTION(VObject, R_InstallSprite)
464 {
465 P_GET_INT(index);
466 P_GET_STR(name);
467 R_InstallSprite(*name, index);
468 }
469
470 //==========================================================================
471 //
472 // PF_R_DrawSpritePatch
473 //
474 //==========================================================================
475
IMPLEMENT_FUNCTION(VObject,R_DrawSpritePatch)476 IMPLEMENT_FUNCTION(VObject, R_DrawSpritePatch)
477 {
478 P_GET_INT(Colour);
479 P_GET_INT(TranslEnd);
480 P_GET_INT(TranslStart);
481 P_GET_INT(rot);
482 P_GET_INT(frame);
483 P_GET_INT(sprite);
484 P_GET_INT(y);
485 P_GET_INT(x);
486 R_DrawSpritePatch(x, y, sprite, frame, rot, TranslStart, TranslEnd,
487 Colour);
488 }
489
490 //==========================================================================
491 //
492 // PF_InstallModel
493 //
494 //==========================================================================
495
IMPLEMENT_FUNCTION(VObject,InstallModel)496 IMPLEMENT_FUNCTION(VObject, InstallModel)
497 {
498 P_GET_STR(name);
499 if (FL_FileExists(name))
500 {
501 RET_PTR(Mod_FindName(name));
502 }
503 else
504 {
505 RET_PTR(0);
506 }
507 }
508
509 //==========================================================================
510 //
511 // PF_R_DrawModelFrame
512 //
513 //==========================================================================
514
IMPLEMENT_FUNCTION(VObject,R_DrawModelFrame)515 IMPLEMENT_FUNCTION(VObject, R_DrawModelFrame)
516 {
517 P_GET_INT(Colour);
518 P_GET_INT(TranslEnd);
519 P_GET_INT(TranslStart);
520 P_GET_STR(skin);
521 P_GET_INT(frame);
522 P_GET_INT(nextframe);
523 P_GET_PTR(VModel, model);
524 P_GET_FLOAT(angle);
525 P_GET_VEC(origin);
526 R_DrawModelFrame(origin, angle, model, frame, nextframe, *skin,
527 TranslStart, TranslEnd, Colour, 0);
528 }
529
530 //==========================================================================
531 //
532 // PF_R_FillRect
533 //
534 //==========================================================================
535
IMPLEMENT_FUNCTION(VObject,R_FillRect)536 IMPLEMENT_FUNCTION(VObject, R_FillRect)
537 {
538 P_GET_INT(coulor);
539 P_GET_INT(height);
540 P_GET_INT(width);
541 P_GET_INT(y);
542 P_GET_INT(x);
543 Drawer->FillRect(x * fScaleX, y * fScaleY, (x + width) * fScaleX,
544 (y + height) * fScaleY, coulor);
545 }
546
547 //**************************************************************************
548 //
549 // Client side sound
550 //
551 //**************************************************************************
552
553 //==========================================================================
554 //
555 // PF_LocalSound
556 //
557 //==========================================================================
558
IMPLEMENT_FUNCTION(VObject,LocalSound)559 IMPLEMENT_FUNCTION(VObject, LocalSound)
560 {
561 P_GET_NAME(name);
562 GAudio->PlaySound(GSoundManager->GetSoundID(name), TVec(0, 0, 0),
563 TVec(0, 0, 0), 0, 0, 1, 0, false);
564 }
565
566 //==========================================================================
567 //
568 // PF_IsLocalSoundPlaying
569 //
570 //==========================================================================
571
IMPLEMENT_FUNCTION(VObject,IsLocalSoundPlaying)572 IMPLEMENT_FUNCTION(VObject, IsLocalSoundPlaying)
573 {
574 P_GET_NAME(name);
575 RET_BOOL(GAudio->IsSoundPlaying(0, GSoundManager->GetSoundID(name)));
576 }
577
578 //==========================================================================
579 //
580 // PF_StopLocalSounds
581 //
582 //==========================================================================
583
IMPLEMENT_FUNCTION(VObject,StopLocalSounds)584 IMPLEMENT_FUNCTION(VObject, StopLocalSounds)
585 {
586 GAudio->StopSound(0, 0);
587 }
588
589 //==========================================================================
590 //
591 // PF_InputLine_SetValue
592 //
593 //==========================================================================
594
IMPLEMENT_FUNCTION(VObject,TranslateKey)595 IMPLEMENT_FUNCTION(VObject, TranslateKey)
596 {
597 P_GET_INT(ch);
598 RET_STR(VStr((char)GInput->TranslateKey(ch)));
599 }
600
601 //==========================================================================
602 //
603 // Temporary menu stuff
604 //
605 //==========================================================================
606
IMPLEMENT_FUNCTION(VObject,P_GetMapName)607 IMPLEMENT_FUNCTION(VObject, P_GetMapName)
608 {
609 P_GET_INT(map);
610 RET_STR(P_GetMapName(map));
611 }
612
IMPLEMENT_FUNCTION(VObject,P_GetMapLumpName)613 IMPLEMENT_FUNCTION(VObject, P_GetMapLumpName)
614 {
615 P_GET_INT(map);
616 RET_NAME(P_GetMapLumpName(map));
617 }
618
IMPLEMENT_FUNCTION(VObject,P_TranslateMap)619 IMPLEMENT_FUNCTION(VObject, P_TranslateMap)
620 {
621 P_GET_INT(map);
622 RET_NAME(P_TranslateMap(map));
623 }
624
IMPLEMENT_FUNCTION(VObject,P_GetNumEpisodes)625 IMPLEMENT_FUNCTION(VObject, P_GetNumEpisodes)
626 {
627 RET_INT(P_GetNumEpisodes());
628 }
629
IMPLEMENT_FUNCTION(VObject,P_GetEpisodeDef)630 IMPLEMENT_FUNCTION(VObject, P_GetEpisodeDef)
631 {
632 P_GET_INT(Index);
633 RET_PTR(P_GetEpisodeDef(Index));
634 }
635
IMPLEMENT_FUNCTION(VObject,P_GetNumSkills)636 IMPLEMENT_FUNCTION(VObject, P_GetNumSkills)
637 {
638 RET_INT(P_GetNumSkills());
639 }
640
IMPLEMENT_FUNCTION(VObject,P_GetSkillDef)641 IMPLEMENT_FUNCTION(VObject, P_GetSkillDef)
642 {
643 P_GET_INT(Index);
644 RET_PTR(const_cast<VSkillDef*>(P_GetSkillDef(Index)));
645 }
646
IMPLEMENT_FUNCTION(VObject,KeyNameForNum)647 IMPLEMENT_FUNCTION(VObject, KeyNameForNum)
648 {
649 P_GET_INT(keynum);
650 RET_STR(GInput->KeyNameForNum(keynum));
651 }
652
IMPLEMENT_FUNCTION(VObject,IN_GetBindingKeys)653 IMPLEMENT_FUNCTION(VObject, IN_GetBindingKeys)
654 {
655 P_GET_PTR(int, key2);
656 P_GET_PTR(int, key1);
657 P_GET_STR(name);
658 GInput->GetBindingKeys(name, *key1, *key2);
659 }
660
IMPLEMENT_FUNCTION(VObject,IN_SetBinding)661 IMPLEMENT_FUNCTION(VObject, IN_SetBinding)
662 {
663 P_GET_STR(onup);
664 P_GET_STR(ondown);
665 P_GET_INT(keynum);
666 GInput->SetBinding(keynum, ondown, onup);
667 }
668
IMPLEMENT_FUNCTION(VObject,SV_GetSaveString)669 IMPLEMENT_FUNCTION(VObject, SV_GetSaveString)
670 {
671 P_GET_PTR(VStr, buf);
672 P_GET_INT(i);
673 #ifdef SERVER
674 RET_INT(SV_GetSaveString(i, *buf));
675 #else
676 RET_INT(0);
677 #endif
678 }
679
IMPLEMENT_FUNCTION(VObject,GetSlist)680 IMPLEMENT_FUNCTION(VObject, GetSlist)
681 {
682 RET_PTR(GNet->GetSlist());
683 }
684
IMPLEMENT_FUNCTION(VObject,LoadTextLump)685 IMPLEMENT_FUNCTION(VObject, LoadTextLump)
686 {
687 P_GET_NAME(name);
688 RET_STR(W_LoadTextLump(name));
689 }
690
IMPLEMENT_FUNCTION(VObject,StartSearch)691 IMPLEMENT_FUNCTION(VObject, StartSearch)
692 {
693 P_GET_BOOL(Master);
694 GNet->StartSearch(Master);
695 }
696
697 #endif
698