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*)&params[pi].i;
137 				pi++;
138 				break;
139 
140 			case 's':
141 				Ret += *(VStr*)&params[pi].p;
142 				((VStr*)&params[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