a4dcc0afbf82de2c2c7543b62bd60bad97afc9ec
1 (* Copyright (C) Doom 2D: Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *)
15 {$INCLUDE ../shared/a_modes.inc}
18 interface
20 uses
25 type
33 public
43 //TexturePanelType: Word;
57 //ShotPanelType: Word;
75 {$INCLUDE ../shared/mapdef_tgc_def.inc}
77 public
81 function g_Triggers_Create (aTrigger: TTrigger; trec: TDynRecord; forceInternalIndex: Integer=-1): DWORD;
87 procedure g_Triggers_PressC(CX, CY: Integer; Radius: Word; UID: Word; ActivateType: Byte; IgnoreTrigger: Integer = -1);
95 var
102 implementation
104 uses
105 {$IFDEF ENABLE_GFX}
106 g_gfx,
107 {$ENDIF}
108 {$IFDEF ENABLE_SHELLS}
109 g_shells,
110 {$ENDIF}
111 Math,
116 ;
118 const
122 {$INCLUDE ../shared/mapdef_tgc_impl.inc}
125 // ////////////////////////////////////////////////////////////////////////// //
126 type
128 private
133 public
136 public
146 // ////////////////////////////////////////////////////////////////////////// //
147 type
149 public
155 // ////////////////////////////////////////////////////////////////////////// //
157 begin
158 //writeln('CHECK: ''', cname, '''');
159 result :=
166 var
169 begin
170 //if (cname = 'answer') then begin v := LongInt(42); result := true; exit; end;
174 begin
177 begin
178 //writeln('FOUND: ''', cname, '''');
181 exit;
187 // ////////////////////////////////////////////////////////////////////////// //
189 begin
198 begin
207 begin
215 begin
217 begin
219 end
221 begin
223 begin
232 begin
234 begin
236 end
238 begin
240 begin
243 begin
246 exit;
254 // ////////////////////////////////////////////////////////////////////////// //
255 var
260 // ////////////////////////////////////////////////////////////////////////// //
262 begin
268 var
270 begin
274 begin
282 begin
295 var
299 begin
306 begin
308 begin
311 begin
313 begin
321 end
322 else
323 begin
328 begin
330 begin
332 begin
334 break;
342 begin
344 begin
350 begin
352 begin
354 begin
356 begin
360 break;
366 begin
368 begin
378 var
385 begin
390 begin
392 {
393 if (pan = nil) then
394 begin
395 e_LogWritefln('tr_CloseTrap: pguid=%s; NO PANEL!', [PanelGUID], MSG_WARNING);
396 end
397 else
398 begin
399 e_LogWritefln('tr_CloseTrap: pguid=%s; isGWall=%s; arrIdx=%s', [PanelGUID, pan.isGWall, pan.arrIdx]);
400 end;
401 }
406 begin
408 begin
410 begin
422 begin
424 begin
426 begin
428 begin
434 //g_Mons_ForEach(monsDamage);
439 end
440 else
441 begin
446 begin
448 begin
450 begin
452 break;
460 begin
462 begin
464 begin
466 begin
470 Break;
476 begin
483 begin
485 begin
487 begin
489 begin
495 //g_Mons_ForEach(monsDamage);
497 (*
498 if gMonsters <> nil then
499 for a := 0 to High(gMonsters) do
500 if (gMonsters[a] <> nil) and gMonsters[a].alive and
501 g_Obj_Collide(X, Y, Width, Height, @gMonsters[a].Obj) then
502 gMonsters[a].Damage(TRAP_DAMAGE, 0, 0, 0, HIT_TRAP);
503 *)
513 var
517 begin
524 begin
526 begin
528 begin
530 begin
537 end
538 end
539 else
540 begin
545 begin
547 begin
549 begin
551 break;
559 begin
561 begin
563 begin
565 begin
569 break;
575 begin
577 begin
587 var
592 begin
598 if (gLifts[PanelID].PanelType = PANEL_LIFTUP) or (gLifts[PanelID].PanelType = PANEL_LIFTDOWN) then
599 begin
604 end
605 end
606 else if (gLifts[PanelID].PanelType = PANEL_LIFTLEFT) or (gLifts[PanelID].PanelType = PANEL_LIFTRIGHT) then
607 begin
616 begin
618 begin
620 begin
622 //if not NoSound then g_Sound_PlayExAt('SOUND_GAME_SWITCH0', X, Y);
626 end
628 begin
633 begin
635 begin
637 begin
639 break;
646 {if not NoSound then
647 for b := 0 to High(gLiftMap[c]) do
648 if gLifts[gLiftMap[c, b]].LiftType <> t then
649 begin
650 with gLifts[PanelID] do
651 g_Sound_PlayExAt('SOUND_GAME_SWITCH0', X, Y);
652 Break;
653 end;}
656 begin
658 begin
660 begin
670 function tr_SpawnShot (ShotType: Integer; wx, wy, dx, dy: Integer; ShotSound: Boolean; ShotTarget: Word): Integer;
671 var
674 begin
680 TRIGGER_SHOT_PISTOL:
681 begin
686 begin
687 {$IFDEF ENABLE_SHELLS}
689 {$ENDIF}
694 TRIGGER_SHOT_BULLET:
695 begin
701 begin
702 {$IFDEF ENABLE_SHELLS}
704 {$ENDIF}
709 TRIGGER_SHOT_SHOTGUN:
710 begin
715 begin
716 {$IFDEF ENABLE_SHELLS}
718 {$ENDIF}
723 TRIGGER_SHOT_SSG:
724 begin
729 begin
730 {$IFDEF ENABLE_SHELLS}
733 {$ENDIF}
738 TRIGGER_SHOT_IMP:
739 begin
744 TRIGGER_SHOT_PLASMA:
745 begin
750 TRIGGER_SHOT_SPIDER:
751 begin
756 TRIGGER_SHOT_CACO:
757 begin
762 TRIGGER_SHOT_BARON:
763 begin
768 TRIGGER_SHOT_MANCUB:
769 begin
774 TRIGGER_SHOT_REV:
775 begin
780 TRIGGER_SHOT_ROCKET:
781 begin
786 TRIGGER_SHOT_BFG:
787 begin
792 TRIGGER_SHOT_EXPL:
793 begin
794 {$IFDEF ENABLE_GFX}
796 {$ENDIF}
802 TRIGGER_SHOT_BFGEXPL:
803 begin
804 {$IFDEF ENABLE_GFX}
806 {$ENDIF}
812 TRIGGER_SHOT_FLAME:
813 begin
822 begin
826 else
827 begin
841 begin
843 begin
845 begin
847 begin
860 end
861 else
862 begin
864 begin
872 procedure tr_MakeEffect (X, Y, VX, VY: Integer; T, ST, CR, CG, CB: Byte; Silent, Send: Boolean);
873 begin
874 {$IFDEF ENABLE_GFX}
876 begin
878 TRIGGER_EFFECT_SLIQUID:
879 begin
881 else if (CR = 0) and (CG = 255) and (CB = 0) then g_GFX_SimpleWater(X, Y, 1, VX, VY, 2, 0, 0, 0)
882 else if (CR = 0) and (CG = 0) and (CB = 255) then g_GFX_SimpleWater(X, Y, 1, VX, VY, 3, 0, 0, 0)
892 {$ENDIF}
895 begin
899 {$IFDEF ENABLE_GFX}
901 {$ENDIF}
902 if Send and g_Game_IsServer and g_Game_IsNet then MH_SEND_Effect(X, Y, Byte(not Silent), NET_GFX_TELE);
906 {$IFDEF ENABLE_GFX}
908 {$ENDIF}
909 if Send and g_Game_IsServer and g_Game_IsNet then MH_SEND_Effect(X-16, Y-16, Byte(not Silent), NET_GFX_RESPAWN);
913 {$IFDEF ENABLE_GFX}
915 {$ENDIF}
916 if Send and g_Game_IsServer and g_Game_IsNet then MH_SEND_Effect(X-32, Y-128, Byte(not Silent), NET_GFX_FIRE);
923 function tr_Teleport (ActivateUID: Integer; TX, TY: Integer; TDir: Integer; Silent: Boolean; D2D: Boolean): Boolean;
924 var
927 begin
931 UID_PLAYER:
932 begin
936 begin
937 if p.TeleportTo(TX-(p.Obj.Rect.Width div 2), TY-p.Obj.Rect.Height, Silent, TDir) then result := true;
938 end
939 else
940 begin
944 UID_MONSTER:
945 begin
949 begin
950 if m.TeleportTo(TX-(m.Obj.Rect.Width div 2), TY-m.Obj.Rect.Height, Silent, TDir) then result := true;
951 end
952 else
953 begin
962 var
965 begin
969 UID_PLAYER:
970 begin
975 begin
985 UID_MONSTER:
986 begin
991 begin
1004 function tr_Message (MKind: Integer; MText: string; MSendTo: Integer; MTime: Integer; ActivateUID: Integer): Boolean;
1005 var
1009 begin
1015 begin
1017 begin
1019 begin
1022 end
1023 else
1024 begin
1027 begin
1029 else if MKind = TRIGGER_MESSAGE_KIND_GAME then MH_SEND_GameEvent(NET_EV_BIGTEXT, MTime, msg, p.FClientID);
1036 begin
1038 begin
1041 begin
1047 begin
1049 begin
1051 begin
1052 if MKind = TRIGGER_MESSAGE_KIND_CHAT then MH_SEND_Chat(msg, NET_CHAT_SYSTEM, gPlayers[i].FClientID)
1053 else if MKind = TRIGGER_MESSAGE_KIND_GAME then MH_SEND_GameEvent(NET_EV_BIGTEXT, MTime, msg, gPlayers[i].FClientID);
1061 begin
1063 begin
1066 begin
1072 begin
1074 begin
1076 begin
1077 if MKind = TRIGGER_MESSAGE_KIND_CHAT then MH_SEND_Chat(msg, NET_CHAT_SYSTEM, gPlayers[i].FClientID)
1078 else if MKind = TRIGGER_MESSAGE_KIND_GAME then MH_SEND_GameEvent(NET_EV_BIGTEXT, MTime, msg, gPlayers[i].FClientID);
1086 begin
1088 begin
1094 begin
1096 begin
1098 begin
1099 if MKind = TRIGGER_MESSAGE_KIND_CHAT then MH_SEND_Chat(msg, NET_CHAT_SYSTEM, gPlayers[i].FClientID)
1100 else if MKind = TRIGGER_MESSAGE_KIND_GAME then MH_SEND_GameEvent(NET_EV_BIGTEXT, MTime, msg, gPlayers[i].FClientID);
1107 begin
1109 begin
1115 begin
1117 begin
1119 begin
1120 if MKind = TRIGGER_MESSAGE_KIND_CHAT then MH_SEND_Chat(msg, NET_CHAT_SYSTEM, gPlayers[i].FClientID)
1121 else if MKind = TRIGGER_MESSAGE_KIND_GAME then MH_SEND_GameEvent(NET_EV_BIGTEXT, MTime, msg, gPlayers[i].FClientID);
1128 begin
1133 begin
1143 begin
1146 begin
1151 begin
1161 var
1176 begin
1179 begin
1188 begin
1191 begin
1200 begin
1203 begin
1211 var
1213 begin
1222 begin
1223 //conwritefln('exocheck: [%s]', [Trigger.exoCheck.toString()]);
1224 try
1230 begin
1233 exit;
1243 begin
1244 //conwritefln('exoactivate: [%s]', [Trigger.exoAction.toString()]);
1245 try
1250 begin
1253 exit;
1259 begin
1261 TRIGGER_EXIT:
1262 begin
1270 Exit;
1273 TRIGGER_TELEPORT:
1274 begin
1278 tgcD2d);
1282 TRIGGER_OPENDOOR:
1283 begin
1288 TRIGGER_CLOSEDOOR:
1289 begin
1295 begin
1298 begin
1300 begin
1303 end
1304 else
1305 begin
1314 begin
1318 begin
1321 end
1322 else
1323 begin
1332 begin
1339 TRIGGER_SECRET:
1341 begin
1348 begin
1354 TRIGGER_LIFTUP:
1355 begin
1370 TRIGGER_LIFTDOWN:
1371 begin
1386 TRIGGER_LIFT:
1387 begin
1391 begin
1406 TRIGGER_TEXTURE:
1407 begin
1409 begin
1412 end
1413 else
1416 else
1423 TRIGGER_SOUND:
1424 begin
1426 begin
1432 end
1435 begin
1437 SoundPlayCount := tgcPlayCount
1446 TRIGGER_SPAWNMONSTER:
1448 begin
1451 begin
1454 // Àâòîñïàâíåð ïåðåêëþ÷åí - ìåíÿåì òåêñòóðó
1461 begin
1465 Break;
1473 // Çäîðîâüå:
1476 // Óñòàíàâëèâàåì ïîâåäåíèå:
1481 // Èäåì èñêàòü öåëü, åñëè íàäî:
1488 begin
1497 EFFECT_TELEPORT:
1498 begin
1500 {$IFDEF ENABLE_GFX}
1502 R_GFX_TELEPORT_FAST,
1505 );
1506 {$ENDIF}
1510 NET_GFX_TELE);
1512 EFFECT_RESPAWN:
1513 begin
1515 {$IFDEF ENABLE_GFX}
1517 R_GFX_ITEM_RESPAWN,
1520 );
1521 {$ENDIF}
1525 NET_GFX_RESPAWN);
1527 EFFECT_FIRE:
1528 begin
1530 {$IFDEF ENABLE_GFX}
1532 R_GFX_FIRE,
1535 );
1536 {$ENDIF}
1540 NET_GFX_FIRE);
1545 begin
1552 else
1554 // Åñëè àêòèâèðîâàí àâòîñïàâíåðîì, íå ìåíÿåì òåêñòóðó
1559 TRIGGER_SPAWNITEM:
1561 begin
1564 begin
1567 // Àâòîñïàâíåð ïåðåêëþ÷åí - ìåíÿåì òåêñòóðó
1576 begin
1580 Break;
1592 EFFECT_TELEPORT:
1593 begin
1596 {$IFDEF ENABLE_GFX}
1598 R_GFX_TELEPORT_FAST,
1601 );
1602 {$ENDIF}
1606 NET_GFX_TELE);
1608 EFFECT_RESPAWN:
1609 begin
1612 {$IFDEF ENABLE_GFX}
1614 R_GFX_ITEM_RESPAWN,
1617 );
1618 {$ENDIF}
1622 NET_GFX_RESPAWN);
1624 EFFECT_FIRE:
1625 begin
1628 {$IFDEF ENABLE_GFX}
1630 R_GFX_FIRE,
1633 );
1634 {$ENDIF}
1638 NET_GFX_FIRE);
1648 else
1650 // Åñëè àêòèâèðîâàí àâòîñïàâíåðîì, íå ìåíÿåì òåêñòóðó
1655 TRIGGER_MUSIC:
1656 begin
1657 // Ìåíÿåì ìóçûêó, åñëè åñòü íà ÷òî:
1659 begin
1677 else
1683 TRIGGER_PUSH:
1684 begin
1689 tgcResetVelocity);
1693 TRIGGER_SCORE:
1694 begin
1696 // Ïðèáàâèòü èëè îòíÿòü î÷êî
1697 if (tgcScoreAction in [TRIGGER_SCORE_ACTION_ADD, TRIGGER_SCORE_ACTION_SUB]) and (tgcScoreCount > 0) then
1698 begin
1699 // Ñâîåé èëè ÷óæîé êîìàíäå
1700 if (tgcScoreTeam in [TRIGGER_SCORE_TEAM_MINE_RED, TRIGGER_SCORE_TEAM_MINE_BLUE]) and (g_GetUIDType(ActivateUID) = UID_PLAYER) then
1701 begin
1703 if ((tgcScoreAction = TRIGGER_SCORE_ACTION_ADD) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_RED) and (p.Team = TEAM_RED))
1704 or ((tgcScoreAction = TRIGGER_SCORE_ACTION_ADD) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_BLUE) and (p.Team = TEAM_BLUE)) then
1705 begin
1709 begin
1711 begin
1712 g_Console_Add(Format(_lc[I_PLAYER_SCORE_ADD_OWN], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1715 end else
1716 begin
1717 g_Console_Add(Format(_lc[I_PLAYER_SCORE_ADD_ENEMY], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1724 begin
1730 if ((tgcScoreAction = TRIGGER_SCORE_ACTION_SUB) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_RED) and (p.Team = TEAM_RED))
1731 or ((tgcScoreAction = TRIGGER_SCORE_ACTION_SUB) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_BLUE) and (p.Team = TEAM_BLUE)) then
1732 begin
1736 begin
1738 begin
1739 g_Console_Add(Format(_lc[I_PLAYER_SCORE_SUB_OWN], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1742 end else
1743 begin
1744 g_Console_Add(Format(_lc[I_PLAYER_SCORE_SUB_ENEMY], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1751 begin
1757 if ((tgcScoreAction = TRIGGER_SCORE_ACTION_ADD) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_RED) and (p.Team = TEAM_BLUE))
1758 or ((tgcScoreAction = TRIGGER_SCORE_ACTION_ADD) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_BLUE) and (p.Team = TEAM_RED)) then
1759 begin
1763 begin
1765 begin
1766 g_Console_Add(Format(_lc[I_PLAYER_SCORE_ADD_OWN], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
1769 end else
1770 begin
1771 g_Console_Add(Format(_lc[I_PLAYER_SCORE_ADD_ENEMY], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
1778 begin
1784 if ((tgcScoreAction = TRIGGER_SCORE_ACTION_SUB) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_RED) and (p.Team = TEAM_BLUE))
1785 or ((tgcScoreAction = TRIGGER_SCORE_ACTION_SUB) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_MINE_BLUE) and (p.Team = TEAM_RED)) then
1786 begin
1790 begin
1792 begin
1793 g_Console_Add(Format(_lc[I_PLAYER_SCORE_SUB_OWN], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
1796 end else
1797 begin
1798 g_Console_Add(Format(_lc[I_PLAYER_SCORE_SUB_ENEMY], [p.Name, tgcScoreCount, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
1805 begin
1813 // Êàêîé-òî êîíêðåòíîé êîìàíäå
1815 begin
1816 if (tgcScoreAction = TRIGGER_SCORE_ACTION_ADD) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_FORCE_RED) then
1817 begin
1821 begin
1822 g_Console_Add(Format(_lc[I_PLAYER_SCORE_ADD_TEAM], [_lc[I_PLAYER_SCORE_RED], tgcScoreCount]), True);
1828 begin
1834 if (tgcScoreAction = TRIGGER_SCORE_ACTION_SUB) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_FORCE_RED) then
1835 begin
1839 begin
1840 g_Console_Add(Format(_lc[I_PLAYER_SCORE_SUB_TEAM], [_lc[I_PLAYER_SCORE_RED], tgcScoreCount]), True);
1846 begin
1852 if (tgcScoreAction = TRIGGER_SCORE_ACTION_ADD) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_FORCE_BLUE) then
1853 begin
1857 begin
1858 g_Console_Add(Format(_lc[I_PLAYER_SCORE_ADD_TEAM], [_lc[I_PLAYER_SCORE_BLUE], tgcScoreCount]), True);
1864 begin
1870 if (tgcScoreAction = TRIGGER_SCORE_ACTION_SUB) and (tgcScoreTeam = TRIGGER_SCORE_TEAM_FORCE_BLUE) then
1871 begin
1875 begin
1876 g_Console_Add(Format(_lc[I_PLAYER_SCORE_SUB_TEAM], [_lc[I_PLAYER_SCORE_BLUE], tgcScoreCount]), True);
1882 begin
1891 // Âûèãðûø
1893 begin
1894 // Ñâîåé èëè ÷óæîé êîìàíäû
1895 if (tgcScoreTeam in [TRIGGER_SCORE_TEAM_MINE_RED, TRIGGER_SCORE_TEAM_MINE_BLUE]) and (g_GetUIDType(ActivateUID) = UID_PLAYER) then
1896 begin
1900 begin
1902 begin
1906 begin
1908 begin
1909 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_OWN], [p.Name, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1912 end else
1913 begin
1914 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_ENEMY], [p.Name, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1925 begin
1927 begin
1931 begin
1933 begin
1934 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_OWN], [p.Name, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
1937 end else
1938 begin
1939 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_ENEMY], [p.Name, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
1949 // Êàêîé-òî êîíêðåòíîé êîìàíäû
1951 begin
1953 begin
1955 begin
1961 begin
1963 begin
1970 // Ïðîèãðûø
1972 begin
1973 // Ñâîåé èëè ÷óæîé êîìàíäû
1974 if (tgcScoreTeam in [TRIGGER_SCORE_TEAM_MINE_RED, TRIGGER_SCORE_TEAM_MINE_BLUE]) and (g_GetUIDType(ActivateUID) = UID_PLAYER) then
1975 begin
1980 begin
1985 begin
1986 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_ENEMY], [p.Name, _lc[I_PLAYER_SCORE_TO_RED]]), True);
1989 end else
1990 begin
1991 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_OWN], [p.Name, _lc[I_PLAYER_SCORE_TO_RED]]), True);
2001 begin
2006 begin
2007 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_ENEMY], [p.Name, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
2010 end else
2011 begin
2012 g_Console_Add(Format(_lc[I_PLAYER_SCORE_WIN_OWN], [p.Name, _lc[I_PLAYER_SCORE_TO_BLUE]]), True);
2020 // Êàêîé-òî êîíêðåòíîé êîìàíäû
2022 begin
2024 begin
2026 begin
2032 begin
2034 begin
2044 else
2047 MH_SEND_GameStats;
2051 TRIGGER_MESSAGE:
2052 begin
2055 ActivateUID);
2060 begin
2064 begin
2068 begin
2069 // Âñïîìèíàåì, àêòèâèðîâàë ëè îí ìåíÿ ðàíüøå
2072 begin
2074 Break;
2078 // Çàïîìèíàåì åãî
2082 end else
2084 // Åñëè èíòåðâàë îòêëþ÷¸í, íî îí âñ¸ åù¸ â çîíå ïîðàæåíèÿ, äà¸ì åìó âðåìÿ
2087 // Òàéìàóò ïðîø¸ë - ðàáîòàåì
2093 begin
2095 UID_PLAYER:
2096 begin
2099 Exit;
2101 // Íàíîñèì óðîí èãðîêó
2103 begin
2104 // Êèñëîòíûé óðîí íå íàíîñèòñÿ êîãäà åñòü êîñòþì
2105 // "Âîäÿíîé" óðîí íå íàíîñèòñÿ êîãäà åñòü êèñëîðîä
2112 // Ëå÷èì èãðîêà
2115 begin
2122 UID_MONSTER:
2123 begin
2126 Exit;
2128 // Íàíîñèì óðîí ìîíñòðó
2130 begin
2135 // Ëå÷èì ìîíñòðà
2138 begin
2145 // Íàçíà÷àåì âðåìÿ ñëåäóþùåãî âîçäåéñòâèÿ
2150 else
2157 TRIGGER_SHOT:
2158 begin
2160 Exit;
2162 // put this at the beginning so it doesn't trigger itself
2174 //TODO: accelerate this!
2182 begin
2186 break;
2195 begin
2199 break;
2208 begin
2212 break;
2216 begin
2217 //TODO: accelerate this!
2224 begin
2228 break;
2233 begin
2238 begin
2242 break;
2245 begin
2246 //TODO: accelerate this!
2251 else begin
2260 begin
2266 else
2267 begin
2271 begin
2280 TRIGGER_EFFECT:
2281 begin
2285 begin
2287 TRIGGER_EFFECT_POS_CENTER:
2288 begin
2292 TRIGGER_EFFECT_POS_AREA:
2293 begin
2297 else begin
2320 begin
2321 g_Map_SwitchTextureGUID({Trigger.TexturePanelType,} Trigger.TexturePanelGUID, IfThen(animonce, 2, 1));
2327 var
2329 begin
2332 if (mapidx < 0) or (mapidx >= triggers.count) then raise Exception.Create('LOAD: invalid map trigger index');
2338 function g_Triggers_Create (aTrigger: TTrigger; trec: TDynRecord; forceInternalIndex: Integer=-1): DWORD;
2339 var
2344 begin
2348 // Íå ñîçäàâàòü âûõîä, åñëè èãðà áåç âûõîäà
2351 begin
2355 // Åñëè ìîíñòðû çàïðåùåíû, îòìåíÿåì òðèããåð
2359 begin
2363 // Ñ÷èòàåì êîëè÷åñòâî ñåêðåòîâ íà êàðòå
2367 begin
2369 end
2370 else
2371 begin
2374 begin
2377 begin
2406 // clone trigger data
2408 begin
2410 //HACK!
2412 begin
2413 e_LogWritefln('trigger of type %s has no triggerdata; wtf?!', [ptg.TriggerType], TMsgType.Warning);
2415 end
2416 else
2417 begin
2422 begin
2424 // if this type of trigger exists both on the client and on the server
2425 // use an uniform numeration
2428 begin
2445 // update cached trigger variables
2450 try
2452 except
2454 begin
2455 conwritefln('*** ERROR parsing exoma_think (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_think'])]);
2458 else
2461 try
2463 except
2465 begin
2466 conwritefln('*** ERROR parsing exoma_check (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_check'])]);
2469 else
2472 try
2474 except
2476 begin
2477 conwritefln('*** ERROR parsing exoma_action (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_action'])]);
2480 else
2483 try
2485 except
2487 begin
2488 conwritefln('*** ERROR parsing exoma_init (%s,%s): %s [%s]', [e.tokLine, e.tokCol, e.message, VarToStr(trec.user['exoma_init'])]);
2491 else
2496 begin
2497 //conwritefln('executing trigger init: [%s]', [gTriggers[find_id].exoInit.toString()]);
2498 try
2502 except
2505 exit;
2509 // Çàãðóæàåì çâóê, åñëè ýòî òðèããåð "Çâóê"
2511 begin
2512 // Åùå íåò òàêîãî çâóêà
2514 begin
2516 //e_LogWritefln('loading trigger sound ''%s''', [fn]);
2518 begin
2523 // Ñîçäàåì îáúåêò çâóêà
2525 begin
2528 begin
2535 // Çàãðóæàåì ìóçûêó, åñëè ýòî òðèããåð "Ìóçûêà"
2537 begin
2538 // Åùå íåò òàêîé ìóçûêè
2540 begin
2543 begin
2549 // Çàãðóæàåì äàííûå òðèããåðà "Òóðåëü"
2551 begin
2553 begin
2568 // sorry; grid doesn't support recursive queries, so we have to do this
2569 type
2572 var
2576 var
2581 begin
2583 {
2584 gTriggers[a].ActivateUID := mon.UID;
2585 ActivateTrigger(gTriggers[a], ACTIVATE_MONSTERCOLLIDE);
2586 }
2590 var
2593 begin
2603 // Åñòü òðèããåð:
2605 begin
2606 // Óìåíüøàåì âðåìÿ äî çàêðûòèÿ äâåðè (îòêðûòèÿ ëîâóøêè)
2608 // Óìåíüøàåì âðåìÿ îæèäàíèÿ ïîñëå íàæàòèÿ
2610 // Ïðîâåðÿåì èãðîêîâ è ìîíñòðîâ, êîòîðûõ ðàíåå çàïîìíèëè:
2612 begin
2614 begin
2615 // Óìåíüøàåì âðåìÿ äî ïîâòîðíîãî âîçäåéñòâèÿ:
2617 begin
2619 end
2620 else
2621 begin
2622 continue;
2624 // Ñ÷èòàåì, ÷òî îáúåêò ïîêèíóë çîíó äåéñòâèÿ òðèããåðà
2629 // Îáðàáàòûâàåì ñïàâíåðû
2631 begin
2633 begin
2634 // Åñëè ïðèøëî âðåìÿ, ñïàâíèì ìîíñòðà
2636 begin
2640 // Åñëè ïðèøëî âðåìÿ, ñïàâíèì ïðåäìåò
2642 begin
2646 end
2647 else
2648 begin
2649 // Óìåíüøàåì âðåìÿ îæèäàíèÿ
2654 // Îáðàáàòûâàåì ñîáûòèÿ òðèããåðà "Òóðåëü"
2656 begin
2658 begin
2663 begin
2668 begin
2673 begin
2679 // Òðèããåð "Çâóê" óæå îòûãðàë, åñëè íóæíî åùå - ïåðåçàïóñêàåì
2681 begin
2683 begin
2687 else
2691 end
2694 // Òðèããåð "Ëîâóøêà" - ïîðà îòêðûâàòü
2695 if (TriggerType = TRIGGER_TRAP) and (DoorTime = 0) and (g_Map_PanelByGUID(trigPanelGUID) <> nil) then
2696 begin
2701 // Òðèããåð "Äâåðü 5 ñåê" - ïîðà çàêðûâàòü
2702 if (TriggerType = TRIGGER_DOOR5) and (DoorTime = 0) and (g_Map_PanelByGUID(trigPanelGUID) <> nil) then
2703 begin
2706 begin
2707 // Óæå çàêðûòà
2709 begin
2711 end
2712 else
2713 begin
2714 // Ïîêà îòêðûòà - çàêðûâàåì
2720 // Òðèããåð - ðàñøèðèòåëü èëè ïåðåêëþ÷àòåëü, è ïðîøëà çàäåðæêà, è íàæàëè íóæíîå ÷èñëî ðàç:
2723 begin
2724 // Ñáðàñûâàåì çàäåðæêó àêòèâàöèè:
2726 // Ñáðàñûâàåì ñ÷åò÷èê íàæàòèé:
2729 // Îïðåäåëÿåì èçìåíÿåìûå èì òðèããåðû:
2731 begin
2737 begin
2744 //HACK!
2745 // if we have panelid, assume that it will switch the moving platform
2748 begin
2756 begin
2762 // Âûáèðàåì îäèí èç òðèããåðîâ äëÿ ðàñøèðèòåëÿ, åñëè âêëþ÷åí ðàíäîì:
2764 begin
2766 begin
2771 end
2773 begin
2775 begin
2778 TRIGGER_PRESS:
2779 begin
2783 TRIGGER_ON:
2784 begin
2787 TRIGGER_OFF:
2788 begin
2792 begin
2797 TRIGGER_ONOFF:
2798 begin
2801 begin
2804 begin
2816 // Óìåíüøàåì âðåìÿ äî âîçìîæíîñòè ïîâòîðíîé àêòèâàöèè:
2818 begin
2823 // Íèæå èäóò òèïû àêòèâàöèè, åñëè òðèããåð îòêëþ÷¸í - èä¸ì äàëüøå
2825 Continue;
2827 // "Èãðîê áëèçêî":
2834 // Æèâ, åñòü íóæíûå êëþ÷è è îí ðÿäîì:
2837 begin
2841 PlayerCollide then
2842 { Don't activate sound/music again if player is here }
2843 else
2847 { TODO 5 : àêòèâàöèÿ ìîíñòðàìè òðèããåðîâ ñ êëþ÷àìè }
2852 begin
2853 // Åñëè "Ìîíñòð áëèçêî" è "Ìîíñòðîâ íåò",
2854 // çàïóñêàåì òðèããåð íà ñòàðòå êàðòû è ñíèìàåì îáà ôëàãà
2858 end else
2859 begin
2860 // "Ìîíñòð áëèçêî"
2863 begin
2864 //g_Mons_ForEach(monsNear);
2865 //Alive?!
2867 g_Mons_ForEachAt(gTriggers[a].X, gTriggers[a].Y, gTriggers[a].Width, gTriggers[a].Height, monsNear);
2869 begin
2876 // "Ìîíñòðîâ íåò"
2880 begin
2891 begin
2899 var
2903 begin
2910 UID_PLAYER:
2911 begin
2915 else
2930 begin
2933 begin
2941 var
2945 begin
2950 UID_PLAYER:
2951 begin
2955 else
2968 begin
2974 procedure g_Triggers_PressC(CX, CY: Integer; Radius: Word; UID: Word; ActivateType: Byte; IgnoreTrigger: Integer = -1);
2975 var
2980 begin
2982 Exit;
2986 UID_PLAYER:
2987 begin
2991 else
3013 (CY > Y) and (CY < (Y+Height)) ) or // Öåíòð êðóãà íåäàëåêî îò âåðòèêàëüíûõ ãðàíèö ïðÿìîóãîëüíèêà
3015 (CX > X) and (CX < (X+Width)) ) then // Öåíòð êðóãà íåäàëåêî îò ãîðèçîíòàëüíûõ ãðàíèö ïðÿìîóãîëüíèêà
3016 begin
3023 var
3026 begin
3031 begin
3033 begin
3037 begin
3049 begin
3051 begin
3053 begin
3058 begin
3066 var
3068 begin
3070 begin
3072 begin
3074 begin
3080 begin
3098 var
3104 begin
3105 // Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ òðèããåðîâ
3108 // Êîëè÷åñòâî òðèããåðîâ
3113 begin
3114 // Ñèãíàòóðà òðèããåðà
3117 // Òèï òðèããåðà
3120 // Ñïåöèàëüíûå äàííûå òðèããåðà: ïîòîì èç êàðòû îïÿòü âûòàùèì; ñîõðàíèì òîëüêî èíäåêñ
3122 // Êîîðäèíàòû ëåâîãî âåðõíåãî óãëà
3125 // Ðàçìåðû
3128 // Âêëþ÷åí ëè òðèããåð
3130 // Òèï àêòèâàöèè òðèããåðà
3132 // Êëþ÷è, íåîáõîäèìûå äëÿ àêòèâàöèè
3134 // ID ïàíåëè, òåêñòóðà êîòîðîé èçìåíèòñÿ
3136 // Òèï ýòîé ïàíåëè
3137 //Mem.WriteWord(gTriggers[i].TexturePanelType);
3138 // Âíóòðåííèé íîìåð äðóãîé ïàíåëè (ïî ñ÷àñòëèâîé ñëó÷àéíîñòè îí áóäåò ñîâïàäàòü ñ òåì, ÷òî ñîçäàíî ïðè çàãðóçêå êàðòû)
3140 // Âðåìÿ äî âîçìîæíîñòè àêòèâàöèè
3142 // UID òîãî, êòî àêòèâèðîâàë ýòîò òðèããåð
3144 // Ñïèñîê UID-îâ îáúåêòîâ, êîòîðûå íàõîäèëèñü ïîä âîçäåéñòâèåì
3148 begin
3149 // UID îáúåêòà
3151 // Âðåìÿ îæèäàíèÿ
3154 // Ñòîèò ëè èãðîê â îáëàñòè òðèããåðà
3156 // Âðåìÿ äî çàêðûòèÿ äâåðè
3158 // Çàäåðæêà àêòèâàöèè
3160 // Ñ÷åò÷èê íàæàòèé
3162 // Ñïàâíåð àêòèâåí
3164 // Çàäåðæêà ñïàâíåðà
3166 // Ñ÷åò÷èê ñîçäàíèÿ îáúåêòîâ
3168 // Ñêîëüêî ðàç ïðîèãðàí çâóê
3170 // Ïðîèãðûâàåòñÿ ëè çâóê?
3174 begin
3175 // Ïîçèöèÿ ïðîèãðûâàíèÿ çâóêà
3177 // Ãðîìêîñòü çâóêà
3180 //Mem.WriteSingle(sg);
3182 // Ñòåðåî ñìåùåíèå çâóêà
3184 //Mem.WriteSingle(sg);
3187 // uservars
3189 begin
3191 end
3192 else
3193 begin
3196 begin
3197 //writeln('<', kv.key, '>:<', VarToStr(kv.value), '>');
3207 //varInt64: Mem.WriteInt(Integer(kv.value));
3211 //varQWord:
3221 var
3235 begin
3240 // Êîëè÷åñòâî òðèããåðîâ
3246 begin
3247 // Ñèãíàòóðà òðèããåðà
3248 if not utils.checkSign(st, 'TRGX') then raise XStreamError.Create('invalid trigger signature');
3250 // Òèï òðèããåðà
3253 // Ñïåöèàëüíûå äàííûå òðèããåðà: èíäåêñ â gCurrentMap.field['triggers']
3256 // Êîîðäèíàòû ëåâîãî âåðõíåãî óãëà
3259 // Ðàçìåðû
3262 // Âêëþ÷åí ëè òðèããåð
3264 // Òèï àêòèâàöèè òðèããåðà
3266 // Êëþ÷è, íåîáõîäèìûå äëÿ àêòèâàöèè
3268 // ID ïàíåëè, òåêñòóðà êîòîðîé èçìåíèòñÿ
3270 // Òèï ýòîé ïàíåëè
3271 //Mem.ReadWord(gTriggers[i].TexturePanelType);
3272 // Âíóòðåííèé íîìåð äðóãîé ïàíåëè (ïî ñ÷àñòëèâîé ñëó÷àéíîñòè îí áóäåò ñîâïàäàòü ñ òåì, ÷òî ñîçäàíî ïðè çàãðóçêå êàðòû)
3274 // Âðåìÿ äî âîçìîæíîñòè àêòèâàöèè
3276 // UID òîãî, êòî àêòèâèðîâàë ýòîò òðèããåð
3278 // Ñïèñîê UID-îâ îáúåêòîâ, êîòîðûå íàõîäèëèñü ïîä âîçäåéñòâèåì
3280 if (actCount < 0) or (actCount > 1024*1024) then raise XStreamError.Create('invalid activated object count');
3282 begin
3285 begin
3286 // UID îáúåêòà
3288 // Âðåìÿ îæèäàíèÿ
3292 // Ñòîèò ëè èãðîê â îáëàñòè òðèããåðà
3294 // Âðåìÿ äî çàêðûòèÿ äâåðè
3296 // Çàäåðæêà àêòèâàöèè
3298 // Ñ÷åò÷èê íàæàòèé
3300 // Ñïàâíåð àêòèâåí
3302 // Çàäåðæêà ñïàâíåðà
3304 // Ñ÷åò÷èê ñîçäàíèÿ îáúåêòîâ
3306 // Ñêîëüêî ðàç ïðîèãðàí çâóê
3308 // Ïðîèãðûâàåòñÿ ëè çâóê?
3311 begin
3312 // Ïîçèöèÿ ïðîèãðûâàíèÿ çâóêà
3314 // Ãðîìêîñòü çâóêà
3315 //Mem.ReadSingle(vol);
3317 // Ñòåðåî ñìåùåíèå çâóêà
3318 //Mem.ReadSingle(pan);
3320 // Çàïóñêàåì çâóê, åñëè åñòü
3322 begin
3326 end
3328 // uservars
3332 if (uvcount < 0) or (uvcount > 1024*1024) then raise XStreamError.Create('invalid number of user vars in trigger');
3334 begin
3338 begin