DEADSOFTWARE

more holmes code
[d2df-sdl.git] / src / game / g_holmes.pas
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, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE ../shared/a_modes.inc}
17 unit g_holmes;
19 interface
21 uses
22 e_log,
23 g_textures, g_basic, e_graphics, g_phys, g_grid, g_player, g_monsters,
24 g_window, g_map, g_triggers, g_items, g_game, g_panel, g_console,
25 xprofiler;
28 type
29 THMouseEvent = record
30 public
31 const
32 // both for but and for bstate
33 Left = $0001;
34 Right = $0002;
35 Middle = $0004;
36 WheelUp = $0008;
37 WheelDown = $0010;
39 // event types
40 Motion = 0;
41 Press = 1;
42 Release = 2;
44 public
45 kind: Byte; // motion, press, release
46 x, y: Integer;
47 dx, dy: Integer; // for wheel this is wheel motion, otherwise this is relative mouse motion
48 but: Word; // current pressed button or 0
49 bstate: Word; // button state
50 kstate: Word; // keyboard state (see THKeyEvent);
51 end;
53 THKeyEvent = record
54 public
55 const
56 ModCtrl = $0001;
57 ModAlt = $0002;
58 ModShift = $0004;
59 end;
62 procedure g_Holmes_VidModeChanged ();
63 procedure g_Holmes_WindowFocused ();
64 procedure g_Holmes_WindowBlured ();
66 procedure g_Holmes_Draw ();
68 function g_Holmes_mouseEvent (var ev: THMouseEvent): Boolean; // returns `true` if event was eaten
69 function g_Holmes_KeyEvent (var ev: THKeyEvent): Boolean; // returns `true` if event was eaten
71 // hooks for player
72 procedure g_Holmes_plrView (viewPortX, viewPortY, viewPortW, viewPortH: Integer);
73 procedure g_Holmes_plrLaser (ax0, ay0, ax1, ay1: Integer);
76 implementation
78 uses
79 SysUtils, GL,
80 MAPDEF, g_options;
83 var
84 //globalInited: Boolean = false;
85 msX: Integer = -666;
86 msY: Integer = -666;
87 msB: Word = 0; // button state
88 kbS: Word = 0; // keyboard modifiers state
91 // ////////////////////////////////////////////////////////////////////////// //
92 {$INCLUDE g_holmes.inc}
94 // ////////////////////////////////////////////////////////////////////////// //
95 procedure g_Holmes_VidModeChanged ();
96 begin
97 e_WriteLog(Format('Inspector: videomode changed: %dx%d', [gScreenWidth, gScreenHeight]), MSG_NOTIFY);
98 // texture space is possibly lost here, idc
99 curtexid := 0;
100 font6texid := 0;
101 font8texid := 0;
102 prfont6texid := 0;
103 prfont8texid := 0;
104 //createCursorTexture();
105 end;
107 procedure g_Holmes_WindowFocused ();
108 begin
109 msB := 0;
110 kbS := 0;
111 end;
113 procedure g_Holmes_WindowBlured ();
114 begin
115 end;
118 // ////////////////////////////////////////////////////////////////////////// //
119 var
120 vpSet: Boolean = false;
121 vpx, vpy: Integer;
122 vpw, vph: Integer;
123 laserSet: Boolean = false;
124 laserX0, laserY0, laserX1, laserY1: Integer;
125 monMarkedUID: Integer = -1;
127 procedure g_Holmes_plrView (viewPortX, viewPortY, viewPortW, viewPortH: Integer);
128 begin
129 vpSet := true;
130 vpx := viewPortX;
131 vpy := viewPortY;
132 vpw := viewPortW;
133 vph := viewPortH;
134 end;
136 procedure g_Holmes_plrLaser (ax0, ay0, ax1, ay1: Integer);
137 begin
138 laserSet := true;
139 laserX0 := ax0;
140 laserY0 := ay0;
141 laserX1 := ax1;
142 laserY1 := ay1;
143 end;
146 function pmsCurMapX (): Integer; inline; begin result := msX+vpx; end;
147 function pmsCurMapY (): Integer; inline; begin result := msY+vpy; end;
150 procedure plrDebugMouse (var ev: THMouseEvent);
152 function wallToggle (pan: TPanel; tag: Integer): Boolean;
153 begin
154 result := false; // don't stop
155 if pan.Enabled then g_Map_DisableWall(pan.arrIdx) else g_Map_EnableWall(pan.arrIdx);
156 end;
158 function monsAtDump (mon: TMonster; tag: Integer): Boolean;
159 begin
160 result := false; // don't stop
161 e_WriteLog(Format('monster #%d; UID=%d', [mon.arrIdx, mon.UID]), MSG_NOTIFY);
162 monMarkedUID := mon.UID;
163 //if pan.Enabled then g_Map_DisableWall(pan.arrIdx) else g_Map_EnableWall(pan.arrIdx);
164 end;
166 begin
167 //e_WriteLog(Format('mouse: x=%d; y=%d; but=%d; bstate=%d', [msx, msy, but, bstate]), MSG_NOTIFY);
168 if (gPlayer1 = nil) then exit;
169 if (ev.kind <> THMouseEvent.Press) then exit;
171 if (ev.but = THMouseEvent.Left) then
172 begin
173 mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, wallToggle, (GridTagWall or GridTagDoor));
174 exit;
175 end;
177 if (ev.but = THMouseEvent.Right) then
178 begin
179 monMarkedUID := -1;
180 e_WriteLog('===========================', MSG_NOTIFY);
181 monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, monsAtDump);
182 e_WriteLog('---------------------------', MSG_NOTIFY);
183 exit;
184 end;
185 end;
188 procedure plrDebugDraw ();
190 function monsCollector (mon: TMonster; tag: Integer): Boolean;
191 var
192 ex, ey: Integer;
193 mx, my, mw, mh: Integer;
194 begin
195 result := false;
196 mon.getMapBox(mx, my, mw, mh);
197 e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 255, 0, 96);
198 if lineAABBIntersects(laserX0, laserY0, laserX1, laserY1, mx, my, mw, mh, ex, ey) then
199 begin
200 e_DrawPoint(8, ex, ey, 0, 255, 0);
201 end;
202 end;
204 procedure drawMonsterInfo (mon: TMonster);
205 var
206 mx, my, mw, mh: Integer;
207 begin
208 if (mon = nil) then exit;
209 mon.getMapBox(mx, my, mw, mh);
210 //mx += mw div 2;
212 //fillRect(mx-4, my-7*8-6, 110, 7*8+6, 0, 0, 94, 250);
213 shadeRect(mx-4, my-7*8-6, 110, 7*8+6, 128);
214 my -= 8;
215 my -= 2;
217 // type
218 drawText6(mx, my, Format('%s(U:%u)', [monsTypeToString(mon.MonsterType), mon.UID]), 255, 127, 0); my -= 8;
219 // beh
220 drawText6(mx, my, Format('Beh: %s', [monsBehToString(mon.MonsterBehaviour)]), 255, 127, 0); my -= 8;
221 // state
222 drawText6(mx, my, Format('State:%s (%d)', [monsStateToString(mon.MonsterState), mon.MonsterSleep]), 255, 127, 0); my -= 8;
223 // health
224 drawText6(mx, my, Format('Health:%d', [mon.MonsterHealth]), 255, 127, 0); my -= 8;
225 // ammo
226 drawText6(mx, my, Format('Ammo:%d', [mon.MonsterAmmo]), 255, 127, 0); my -= 8;
227 // target
228 drawText6(mx, my, Format('TgtUID:%u', [mon.MonsterTargetUID]), 255, 127, 0); my -= 8;
229 drawText6(mx, my, Format('TgtTime:%d', [mon.MonsterTargetTime]), 255, 127, 0); my -= 8;
232 property MonsterRemoved: Boolean read FRemoved write FRemoved;
233 property MonsterPain: Integer read FPain write FPain;
234 property MonsterAnim: Byte read FCurAnim write FCurAnim;
236 end;
238 var
239 mon: TMonster;
240 mx, my, mw, mh: Integer;
241 begin
242 //e_DrawPoint(4, plrMouseX, plrMouseY, 255, 0, 255);
243 if (gPlayer1 = nil) then exit;
245 //e_WriteLog(Format('(%d,%d)-(%d,%d)', [laserX0, laserY0, laserX1, laserY1]), MSG_NOTIFY);
247 glPushMatrix();
248 glTranslatef(-vpx, -vpy, 0);
250 g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true);
252 if (monMarkedUID <> -1) then
253 begin
254 mon := g_Monsters_ByUID(monMarkedUID);
255 if (mon <> nil) then
256 begin
257 mon.getMapBox(mx, my, mw, mh);
258 e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 0, 0, 30);
259 drawMonsterInfo(mon);
260 end;
261 end;
263 //e_DrawPoint(16, laserX0, laserY0, 255, 255, 255);
265 glPopMatrix();
266 end;
270 procedure drawTileGrid ();
271 var
272 x, y: Integer;
273 begin
274 y := mapGrid.gridY0;
275 while (y < mapGrid.gridY0+mapGrid.gridHeight) do
276 begin
277 x := mapGrid.gridX0;
278 while (x < mapGrid.gridX0+mapGrid.gridWidth) do
279 begin
280 if (x+mapGrid.tileSize > vpx) and (y+mapGrid.tileSize > vpy) and
281 (x < vpx+vpw) and (y < vpy+vph) then
282 begin
283 e_DrawQuad(x, y, x+mapGrid.tileSize-1, y+mapGrid.tileSize-1, 96, 96, 96, 96);
284 end;
285 Inc(x, mapGrid.tileSize);
286 end;
287 Inc(y, mapGrid.tileSize);
288 end;
289 end;
293 // ////////////////////////////////////////////////////////////////////////// //
294 function g_Holmes_mouseEvent (var ev: THMouseEvent): Boolean;
295 begin
296 result := true;
297 msX := ev.x;
298 msY := ev.y;
299 msB := ev.bstate;
300 kbS := ev.kstate;
301 plrDebugMouse(ev);
302 end;
305 function g_Holmes_KeyEvent (var ev: THKeyEvent): Boolean;
306 begin
307 result := false;
308 end;
311 // ////////////////////////////////////////////////////////////////////////// //
312 procedure g_Holmes_Draw ();
313 begin
314 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // modify color buffer
315 glDisable(GL_STENCIL_TEST);
316 glDisable(GL_BLEND);
317 glDisable(GL_SCISSOR_TEST);
318 glDisable(GL_TEXTURE_2D);
320 if gGameOn then
321 begin
322 plrDebugDraw();
323 end;
325 //drawText6Prop(10, 10, 'Hi there, I''m Holmes!', 255, 255, 0);
326 //drawText8Prop(10, 20, 'Hi there, I''m Holmes!', 255, 255, 0);
328 drawCursor();
329 end;
332 end.