author | koda |
Sun, 25 Oct 2009 23:52:36 +0000 | |
changeset 2590 | e7e87e3c67db |
parent 2581 | 10f03732ea60 |
child 2599 | c7153d2348f3 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
1689 | 3 |
* Copyright (c) 2004-2009 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 5 |
* This program is free software; you can redistribute it and/or modify |
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
4 | 8 |
* |
183 | 9 |
* This program is distributed in the hope that it will be useful, |
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
4 | 17 |
*) |
18 |
||
19 |
unit uWorld; |
|
20 |
interface |
|
351 | 21 |
uses SDLh, uGears, uConsts, uFloat; |
4 | 22 |
{$INCLUDE options.inc} |
371 | 23 |
const WorldDx: LongInt = -512; |
24 |
WorldDy: LongInt = -256; |
|
4 | 25 |
|
26 |
procedure InitWorld; |
|
956 | 27 |
procedure DrawWorld(Lag: LongInt); |
108 | 28 |
procedure AddCaption(s: string; Color: Longword; Group: TCapGroup); |
4 | 29 |
|
30 |
{$IFDEF COUNTTICKS} |
|
31 |
var cntTicks: LongWord; |
|
32 |
{$ENDIF} |
|
33 |
var FollowGear: PGear = nil; |
|
1256 | 34 |
WindBarWidth: LongInt = 0; |
2409
dbf195c3e09c
fix a very rare bug in which CurSlot becomes greater than cMaxCurSlot
koda
parents:
2407
diff
changeset
|
35 |
bShowAmmoMenu: boolean = false; |
1256 | 36 |
bSelected: boolean = false; |
37 |
bShowFinger: boolean = false; |
|
38 |
Frames: Longword = 0; |
|
39 |
WaterColor, DeepWaterColor: TSDL_Color; |
|
4 | 40 |
|
41 |
implementation |
|
1906 | 42 |
uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound, |
2152 | 43 |
{$IFDEF GLES11} |
1906 | 44 |
gles11, |
45 |
{$ELSE} |
|
46 |
GL, |
|
47 |
{$ENDIF} |
|
1870 | 48 |
uAmmos, uVisualGears, uChat, uLandTexture, uLand; |
1807 | 49 |
|
564 | 50 |
const FPS: Longword = 0; |
4 | 51 |
CountTicks: Longword = 0; |
174 | 52 |
SoundTimerTicks: Longword = 0; |
4 | 53 |
prevPoint: TPoint = (X: 0; Y: 0); |
161 | 54 |
|
4 | 55 |
type TCaptionStr = record |
762 | 56 |
Tex: PTexture; |
4 | 57 |
EndTime: LongWord; |
58 |
end; |
|
59 |
||
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
60 |
var cWaveWidth, cWaveHeight: LongInt; |
1256 | 61 |
Captions: array[TCapGroup] of TCaptionStr; |
62 |
AMxShift, SlotsNum: LongInt; |
|
63 |
tmpSurface: PSDL_Surface; |
|
64 |
fpsTexture: PTexture = nil; |
|
4 | 65 |
|
66 |
procedure InitWorld; |
|
67 |
begin |
|
1825 | 68 |
cWaveWidth:= SpritesData[sprWater].Width; |
2268
053eb81e60ee
little experiment to see if this improve appearance of laser/ufo/cake/laser guided missile - of course, can't actually see it until unc0rr restores waves
nemo
parents:
2226
diff
changeset
|
69 |
//cWaveHeight:= SpritesData[sprWater].Height; |
053eb81e60ee
little experiment to see if this improve appearance of laser/ufo/cake/laser guided missile - of course, can't actually see it until unc0rr restores waves
nemo
parents:
2226
diff
changeset
|
70 |
cWaveHeight:= 32; |
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
71 |
|
284 | 72 |
cGearScrEdgesDist:= Min(cScreenWidth div 2 - 100, cScreenHeight div 2 - 50); |
74 | 73 |
SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2); |
2197 | 74 |
prevPoint.X:= 0; |
74 | 75 |
prevPoint.Y:= cScreenHeight div 2; |
1760 | 76 |
WorldDx:= - (LAND_WIDTH div 2) + cScreenWidth div 2; |
2139
5a083e71a71d
Properly decrement sniper rifle if timed out. Try to get camera position straight for once.
nemo
parents:
2119
diff
changeset
|
77 |
WorldDy:= - (LAND_HEIGHT - (playHeight div 2)) + (cScreenHeight div 2); |
1120 | 78 |
AMxShift:= 210 |
161 | 79 |
end; |
80 |
||
956 | 81 |
procedure ShowAmmoMenu; |
161 | 82 |
const MENUSPEED = 15; |
2360
d4d545da9dbe
Ok. This time I think I have it. amNothing should work.
nemo
parents:
2359
diff
changeset
|
83 |
var x, y, i, t, l, g: LongInt; |
371 | 84 |
Slot, Pos: LongInt; |
161 | 85 |
begin |
2428 | 86 |
if (TurnTimeLeft = 0) or (((CurAmmoGear = nil) or ((CurAmmoGear^.Ammo^.Propz and ammoprop_AltAttack) = 0)) and hideAmmoMenu) then bShowAmmoMenu:= false; |
165 | 87 |
if bShowAmmoMenu then |
88 |
begin |
|
2226
e35b62cb7a1c
Try turning off follow gear while ammo menu is open - needs testing w/ rope/parachute/jetpack
nemo
parents:
2224
diff
changeset
|
89 |
FollowGear:= nil; |
1120 | 90 |
if AMxShift = 210 then prevPoint.X:= 0; |
1812 | 91 |
if cReducedQuality then |
92 |
AMxShift:= 0 |
|
93 |
else |
|
94 |
if AMxShift > 0 then dec(AMxShift, MENUSPEED); |
|
165 | 95 |
end else |
96 |
begin |
|
1120 | 97 |
if AMxShift = 0 then |
165 | 98 |
begin |
2579 | 99 |
CursorPoint.X:= cScreenWidth shr 1; |
100 |
CursorPoint.Y:= cScreenHeight shr 1; |
|
165 | 101 |
prevPoint:= CursorPoint; |
2197 | 102 |
SDL_WarpMouse(CursorPoint.X + cScreenWidth div 2, cScreenHeight - CursorPoint.Y) |
165 | 103 |
end; |
1812 | 104 |
if cReducedQuality then |
105 |
AMxShift:= 210 |
|
106 |
else |
|
107 |
if AMxShift < 210 then inc(AMxShift, MENUSPEED); |
|
165 | 108 |
end; |
161 | 109 |
|
110 |
if CurrentTeam = nil then exit; |
|
162 | 111 |
Slot:= 0; |
112 |
Pos:= -1; |
|
602 | 113 |
with CurrentHedgehog^ do |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
114 |
begin |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
115 |
if Ammo = nil then exit; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
116 |
SlotsNum:= 0; |
2579 | 117 |
x:= (cScreenWidth shr 1) - 210 + AMxShift; |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
118 |
y:= cScreenHeight - 40; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
119 |
dec(y); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
120 |
DrawSprite(sprAMBorders, x, y, 0); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
121 |
dec(y); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
122 |
DrawSprite(sprAMBorders, x, y, 1); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
123 |
dec(y, 33); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
124 |
DrawSprite(sprAMSlotName, x, y, 0); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
125 |
for i:= cMaxSlotIndex downto 0 do |
2361 | 126 |
if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
127 |
begin |
2197 | 128 |
if (cScreenHeight - CursorPoint.Y >= y - 33) and (cScreenHeight - CursorPoint.Y < y) then Slot:= i; |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
129 |
dec(y, 33); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
130 |
inc(SlotsNum); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
131 |
DrawSprite(sprAMSlot, x, y, 0); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
132 |
DrawSprite(sprAMSlotKeys, x + 2, y + 1, i); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
133 |
t:= 0; |
2581 | 134 |
g:= 0; |
2360
d4d545da9dbe
Ok. This time I think I have it. amNothing should work.
nemo
parents:
2359
diff
changeset
|
135 |
while (t <= cMaxSlotAmmoIndex) and (Ammo^[i, t].Count > 0) do |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
136 |
begin |
2379 | 137 |
if (Ammo^[i, t].AmmoType <> amNothing) then |
138 |
begin |
|
139 |
l:= Ammoz[Ammo^[i, t].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber; |
|
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
140 |
|
2379 | 141 |
if l >= 0 then |
142 |
begin |
|
143 |
DrawSprite(sprAMAmmosBW, x + g * 33 + 35, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); |
|
144 |
DrawSprite(sprTurnsLeft, x + g * 33 + 51, y + 17, l); |
|
145 |
end else |
|
146 |
DrawSprite(sprAMAmmos, x + g * 33 + 35, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); |
|
961
a9a349b2b3fa
Use turnsleft sprites to indicate turns left to activate ammo
unc0rr
parents:
956
diff
changeset
|
147 |
|
2379 | 148 |
if (Slot = i) |
149 |
and (CursorPoint.X >= x + g * 33 + 35) |
|
150 |
and (CursorPoint.X < x + g * 33 + 68) then |
|
151 |
begin |
|
152 |
if (l < 0) then DrawSprite(sprAMSelection, x + g * 33 + 35, y + 1, 0); |
|
153 |
Pos:= t; |
|
154 |
end; |
|
155 |
inc(g) |
|
156 |
end; |
|
157 |
inc(t) |
|
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
158 |
end |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
159 |
end; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
160 |
dec(y, 1); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
161 |
DrawSprite(sprAMBorders, x, y, 0); |
961
a9a349b2b3fa
Use turnsleft sprites to indicate turns left to activate ammo
unc0rr
parents:
956
diff
changeset
|
162 |
|
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
163 |
if (Pos >= 0) then |
2357
babe1a55e284
Add an empty weapon to avoid selection of weapons which aren't yet ready. Might all be useful to switch to amNothing in certain situations, like after using up all ropes, instead of bazooka.
nemo
parents:
2330
diff
changeset
|
164 |
if (Ammo^[Slot, Pos].Count > 0) and (Ammo^[Slot, Pos].AmmoType <> amNothing) then |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
165 |
begin |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
166 |
DrawTexture(cScreenWidth div 2 - 200 + AMxShift, cScreenHeight - 68, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex); |
2376 | 167 |
|
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
168 |
if Ammo^[Slot, Pos].Count < AMMO_INFINITE then |
2198 | 169 |
DrawTexture(cScreenWidth div 2 + AMxShift - 35, cScreenHeight - 68, CountTexz[Ammo^[Slot, Pos].Count]); |
2376 | 170 |
|
2434 | 171 |
if bSelected and (Ammoz[Ammo^[Slot, Pos].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber < 0) then |
1529
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
172 |
begin |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
173 |
bShowAmmoMenu:= false; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
174 |
SetWeapon(Ammo^[Slot, Pos].AmmoType); |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
175 |
bSelected:= false; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
176 |
exit |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
177 |
end; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
178 |
end; |
3bc916b419cd
Don't hide ammo menu when user clicks on not yet available weapon
unc0rr
parents:
1439
diff
changeset
|
179 |
end; |
162 | 180 |
|
181 |
bSelected:= false; |
|
2197 | 182 |
if AMxShift = 0 then DrawSprite(sprArrow, CursorPoint.X, cScreenHeight - CursorPoint.Y, (RealTicks shr 6) mod 8) |
4 | 183 |
end; |
184 |
||
162 | 185 |
procedure MoveCamera; forward; |
186 |
||
2269
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
187 |
procedure DrawWater(Alpha: byte); |
1915 | 188 |
var VertexBuffer: array [0..3] of TVertex2f; |
189 |
r: TSDL_Rect; |
|
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
190 |
lw, lh: GLfloat; |
1915 | 191 |
begin |
2269
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
192 |
WaterColorArray[0].a := Alpha; |
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
193 |
WaterColorArray[1].a := Alpha; |
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
194 |
WaterColorArray[2].a := Alpha; |
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
195 |
WaterColorArray[3].a := Alpha; |
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
196 |
|
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
197 |
lw:= cScreenWidth / cScaleFactor; |
2378 | 198 |
lh:= trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 + 16; |
1915 | 199 |
// Water |
2378 | 200 |
r.y:= WorldDy + cWaterLine; |
201 |
if WorldDy < trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 - cWaterLine then |
|
1915 | 202 |
begin |
203 |
if r.y < 0 then r.y:= 0; |
|
204 |
||
205 |
glDisable(GL_TEXTURE_2D); |
|
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
206 |
VertexBuffer[0].X:= -lw; |
1915 | 207 |
VertexBuffer[0].Y:= r.y; |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
208 |
VertexBuffer[1].X:= lw; |
1915 | 209 |
VertexBuffer[1].Y:= r.y; |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
210 |
VertexBuffer[2].X:= lw; |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
211 |
VertexBuffer[2].Y:= lh; |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
212 |
VertexBuffer[3].X:= -lw; |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
213 |
VertexBuffer[3].Y:= lh; |
1915 | 214 |
|
215 |
glEnableClientState (GL_COLOR_ARRAY); |
|
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
216 |
glColorPointer(4, GL_UNSIGNED_BYTE, 0, @WaterColorArray[0]); |
1915 | 217 |
|
218 |
glEnableClientState(GL_VERTEX_ARRAY); |
|
219 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
|
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
220 |
|
1915 | 221 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
222 |
||
2330 | 223 |
glDisableClientState(GL_VERTEX_ARRAY); |
1915 | 224 |
glDisableClientState(GL_COLOR_ARRAY); |
225 |
||
226 |
glColor4f(1, 1, 1, 1); // disable coloring |
|
227 |
glEnable(GL_TEXTURE_2D) |
|
228 |
end |
|
229 |
end; |
|
230 |
||
2288 | 231 |
procedure DrawWaves(Dir, dX, dY: LongInt); |
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
232 |
var VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; |
2374 | 233 |
lw, waves, shift: GLfloat; |
2288 | 234 |
begin |
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
235 |
lw:= cScreenWidth / cScaleFactor; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
236 |
waves:= lw * 2 / cWaveWidth; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
237 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
238 |
glBindTexture(GL_TEXTURE_2D, SpritesData[sprWater].Texture^.id); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
239 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
240 |
VertexBuffer[0].X:= -lw; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
241 |
VertexBuffer[0].Y:= cWaterLine + WorldDy + dY; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
242 |
VertexBuffer[1].X:= lw; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
243 |
VertexBuffer[1].Y:= VertexBuffer[0].Y; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
244 |
VertexBuffer[2].X:= lw; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
245 |
VertexBuffer[2].Y:= VertexBuffer[0].Y + SpritesData[sprWater].Height; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
246 |
VertexBuffer[3].X:= -lw; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
247 |
VertexBuffer[3].Y:= VertexBuffer[2].Y; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
248 |
|
2374 | 249 |
shift:= - lw / cWaveWidth; |
2495 | 250 |
TextureBuffer[0].X:= shift + (( - WorldDx + LongInt(RealTicks shr 6) * Dir + dX) mod cWaveWidth) / (cWaveWidth - 1); |
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
251 |
TextureBuffer[0].Y:= 0; |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
252 |
TextureBuffer[1].X:= TextureBuffer[0].X + waves; |
2447
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2434
diff
changeset
|
253 |
TextureBuffer[1].Y:= TextureBuffer[0].Y; |
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2434
diff
changeset
|
254 |
TextureBuffer[2].X:= TextureBuffer[1].X; |
2553 | 255 |
TextureBuffer[2].Y:= SpritesData[sprWater].Texture^.ry; |
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
256 |
TextureBuffer[3].X:= TextureBuffer[0].X; |
2447
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2434
diff
changeset
|
257 |
TextureBuffer[3].Y:= TextureBuffer[2].Y; |
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
258 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
259 |
glEnableClientState(GL_VERTEX_ARRAY); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
260 |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
261 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
262 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
263 |
glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
264 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
265 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
266 |
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
267 |
glDisableClientState(GL_VERTEX_ARRAY); |
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
268 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
269 |
|
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
270 |
{for i:= -1 to cWaterSprCount do |
2288 | 271 |
DrawSprite(sprWater, |
272 |
i * cWaveWidth + ((WorldDx + (RealTicks shr 6) * Dir + dX) mod cWaveWidth) - (cScreenWidth div 2), |
|
273 |
cWaterLine + WorldDy + dY, |
|
2292
87af4ad0ec98
New waves rendering procedure based on using texture coodrinates > 1.0
unc0rr
parents:
2290
diff
changeset
|
274 |
0)} |
2288 | 275 |
end; |
276 |
||
2426 | 277 |
procedure DrawRepeated(spr, sprL, sprR: TSprite; Shift: LongInt); |
278 |
var i, w, sw: LongInt; |
|
279 |
begin |
|
280 |
sw:= round(cScreenWidth / cScaleFactor); |
|
281 |
if (SpritesData[sprL].Texture = nil) or (SpritesData[sprR].Texture = nil) then |
|
282 |
begin |
|
283 |
w:= SpritesData[spr].Width; |
|
284 |
i:= Shift mod w; |
|
285 |
if i > 0 then dec(i, w); |
|
286 |
dec(i, w * (sw div w + 1)); |
|
287 |
repeat |
|
288 |
DrawSprite(spr, i, WorldDy + LAND_HEIGHT - SpritesData[spr].Height, 0); |
|
289 |
inc(i, w) |
|
290 |
until i > sw |
|
291 |
end else |
|
292 |
begin |
|
293 |
w:= SpritesData[spr].Width; |
|
294 |
dec(Shift, w div 2); |
|
295 |
DrawSprite(spr, Shift, WorldDy + LAND_HEIGHT - SpritesData[spr].Height, 0); |
|
296 |
||
297 |
sw:= round(cScreenWidth / cScaleFactor); |
|
298 |
||
299 |
i:= Shift - SpritesData[sprL].Width; |
|
300 |
while i >= -sw - SpritesData[sprL].Width do |
|
301 |
begin |
|
302 |
DrawSprite(sprL, i, WorldDy + LAND_HEIGHT - SpritesData[sprL].Height, 0); |
|
303 |
dec(i, SpritesData[sprL].Width); |
|
304 |
end; |
|
305 |
||
306 |
i:= Shift + w; |
|
307 |
while i <= sw do |
|
308 |
begin |
|
309 |
DrawSprite(sprR, i, WorldDy + LAND_HEIGHT - SpritesData[sprR].Height, 0); |
|
310 |
inc(i, SpritesData[sprR].Width) |
|
311 |
end |
|
312 |
end |
|
313 |
end; |
|
314 |
||
315 |
||
956 | 316 |
procedure DrawWorld(Lag: LongInt); |
371 | 317 |
var i, t: LongInt; |
4 | 318 |
r: TSDL_Rect; |
107 | 319 |
tdx, tdy: Double; |
175 | 320 |
grp: TCapGroup; |
174 | 321 |
s: string[15]; |
2569 | 322 |
{$IFDEF IPHONEOS} |
2567 | 323 |
x,y: LongInt; |
2569 | 324 |
{$ENDIF} |
2567 | 325 |
offset: LongInt; |
4 | 326 |
begin |
2372 | 327 |
if ZoomValue < zoom then |
328 |
begin |
|
2379 | 329 |
zoom:= zoom - 0.002 * Lag; |
2374 | 330 |
if ZoomValue > zoom then zoom:= ZoomValue |
2372 | 331 |
end else |
332 |
if ZoomValue > zoom then |
|
333 |
begin |
|
2379 | 334 |
zoom:= zoom + 0.002 * Lag; |
2374 | 335 |
if ZoomValue < zoom then zoom:= ZoomValue |
2372 | 336 |
end; |
2376 | 337 |
|
770 | 338 |
// Sky |
756 | 339 |
glClear(GL_COLOR_BUFFER_BIT); |
340 |
glEnable(GL_BLEND); |
|
775 | 341 |
glEnable(GL_TEXTURE_2D); |
777 | 342 |
//glPushMatrix; |
343 |
//glScalef(1.0, 1.0, 1.0); |
|
756 | 344 |
|
2567 | 345 |
{$IFDEF IPHONEOS} |
346 |
{* see the code in MainLoop *} |
|
347 |
SDL_GetMouseState(0, @x, @y); |
|
2590 | 348 |
if ((x > 50) and (x <= 270) and (y > 50) and (y <= 330)) then |
2567 | 349 |
{$ENDIF} |
281
5b483aa9f2ab
Pause support (mouse cursor is released when the game is paused)
unc0rr
parents:
244
diff
changeset
|
350 |
if not isPaused then MoveCamera; |
162 | 351 |
|
1812 | 352 |
if not cReducedQuality then |
353 |
begin |
|
354 |
// background |
|
2426 | 355 |
DrawRepeated(sprSky, sprSkyL, sprSkyR, (WorldDx + LAND_WIDTH div 2) * 3 div 8); |
356 |
DrawRepeated(sprHorizont, sprHorizontL, sprHorizontR, (WorldDx + LAND_WIDTH div 2) * 3 div 5); |
|
4 | 357 |
|
1812 | 358 |
DrawVisualGears(0); |
2288 | 359 |
end; |
803 | 360 |
|
2288 | 361 |
// Waves |
2579 | 362 |
DrawWaves( 1, 0, - (cWaveHeight shl 1)); |
363 |
DrawWaves(-1, 100, - (cWaveHeight + (cWaveHeight shr 1))); |
|
1812 | 364 |
|
4 | 365 |
|
762 | 366 |
DrawLand(WorldDx, WorldDy); |
1911 | 367 |
|
2269
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
368 |
DrawWater(255); |
4 | 369 |
|
1660 | 370 |
// Attack bar |
371 |
if CurrentTeam <> nil then |
|
372 |
case AttackBar of |
|
373 |
(* 1: begin |
|
374 |
r:= StuffPoz[sPowerBar]; |
|
375 |
{$WARNINGS OFF} |
|
376 |
r.w:= (CurrentHedgehog^.Gear^.Power * 256) div cPowerDivisor; |
|
377 |
{$WARNINGS ON} |
|
378 |
DrawSpriteFromRect(r, cScreenWidth - 272, cScreenHeight - 48, 16, 0, Surface); |
|
379 |
end;*) |
|
380 |
2: with CurrentHedgehog^ do |
|
381 |
begin |
|
382 |
tdx:= hwSign(Gear^.dX) * Sin(Gear^.Angle * Pi / cMaxAngle); |
|
383 |
tdy:= - Cos(Gear^.Angle * Pi / cMaxAngle); |
|
384 |
for i:= (Gear^.Power * 24) div cPowerDivisor downto 0 do |
|
385 |
DrawSprite(sprPower, |
|
386 |
hwRound(Gear^.X) + system.round(WorldDx + tdx * (24 + i * 2)) - 16, |
|
387 |
hwRound(Gear^.Y) + system.round(WorldDy + tdy * (24 + i * 2)) - 12, |
|
388 |
i) |
|
389 |
end |
|
390 |
end; |
|
391 |
||
956 | 392 |
DrawGears; |
4 | 393 |
|
2047
805f7b62cff6
Allow speech bubble/small damage tags in "reduced quality"
nemo
parents:
2002
diff
changeset
|
394 |
DrawVisualGears(1); |
1045 | 395 |
|
2273 | 396 |
DrawWater(cWaterOpacity); |
2269
00f5704f5f39
add extra semi-opaque layer of water to discolour objects in the water.
nemo
parents:
2268
diff
changeset
|
397 |
|
5 | 398 |
// Waves |
2288 | 399 |
DrawWaves( 1, 25, - cWaveHeight); |
2567 | 400 |
DrawWaves(-1, 50, - (cWaveHeight shr 1)); |
2288 | 401 |
DrawWaves( 1, 75, 0); |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
402 |
|
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
403 |
|
2288 | 404 |
{$WARNINGS OFF} |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
405 |
// Target |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
406 |
if TargetPoint.X <> NoPointX then DrawSprite(sprTargetP, TargetPoint.X + WorldDx - 16, TargetPoint.Y + WorldDy - 16, 0); |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
407 |
|
4 | 408 |
{$WARNINGS ON} |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
409 |
SetScale(2.0); |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
410 |
|
2567 | 411 |
{$IFDEF IPHONEOS} |
412 |
offset:= 465; |
|
413 |
{$ELSE} |
|
414 |
offset:= 48; |
|
415 |
{$ENDIF} |
|
79 | 416 |
// Turn time |
4 | 417 |
if TurnTimeLeft <> 0 then |
418 |
begin |
|
419 |
i:= Succ(Pred(TurnTimeLeft) div 1000); |
|
420 |
if i>99 then t:= 112 |
|
421 |
else if i>9 then t:= 96 |
|
422 |
else t:= 80; |
|
2567 | 423 |
DrawSprite(sprFrame, -cScreenWidth div 2 + t, cScreenHeight - offset, 1); |
4 | 424 |
while i > 0 do |
425 |
begin |
|
426 |
dec(t, 32); |
|
2567 | 427 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, cScreenHeight - offset, i mod 10); |
4 | 428 |
i:= i div 10 |
429 |
end; |
|
2567 | 430 |
DrawSprite(sprFrame, -cScreenWidth div 2 + t - 4, cScreenHeight - offset, 0); |
4 | 431 |
end; |
79 | 432 |
|
2567 | 433 |
{$IFNDEF IPHONEOS} |
2428 | 434 |
// Timetrial |
435 |
if ((TrainingFlags and tfTimeTrial) <> 0) and (TimeTrialStartTime > 0) then |
|
436 |
begin |
|
437 |
if TimeTrialStopTime = 0 then i:= RealTicks - TimeTrialStartTime else i:= TimeTrialStopTime - TimeTrialStartTime; |
|
438 |
t:= 272; |
|
439 |
// right frame |
|
440 |
DrawSprite(sprFrame, -cScreenWidth div 2 + t, 8, 1); |
|
441 |
dec(t, 32); |
|
442 |
// 1 ms |
|
443 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 10); |
|
444 |
dec(t, 32); |
|
445 |
i:= i div 10; |
|
446 |
// 10 ms |
|
447 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 10); |
|
448 |
dec(t, 32); |
|
449 |
i:= i div 10; |
|
450 |
// 100 ms |
|
451 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 10); |
|
452 |
dec(t, 16); |
|
453 |
// Point |
|
454 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, 11); |
|
455 |
dec(t, 32); |
|
456 |
i:= i div 10; |
|
457 |
// 1 s |
|
458 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 10); |
|
459 |
dec(t, 32); |
|
460 |
i:= i div 10; |
|
461 |
// 10s |
|
462 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 6); |
|
463 |
dec(t, 16); |
|
464 |
// Point |
|
465 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, 10); |
|
466 |
dec(t, 32); |
|
467 |
i:= i div 6; |
|
468 |
// 1 m |
|
469 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 10); |
|
470 |
dec(t, 32); |
|
471 |
i:= i div 10; |
|
472 |
// 10 m |
|
473 |
DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, 8, i mod 10); |
|
474 |
// left frame |
|
475 |
DrawSprite(sprFrame, -cScreenWidth div 2 + t - 4, 8, 0); |
|
476 |
end; |
|
2567 | 477 |
{$ENDIF} |
478 |
||
4 | 479 |
// Captions |
2567 | 480 |
{$IFDEF IPHONEOS} |
481 |
i:= 53; |
|
482 |
{$ELSE} |
|
2428 | 483 |
if ((TrainingFlags and tfTimeTrial) <> 0) and (TimeTrialStartTime > 0) then i:= 48 else i:= 8; |
2567 | 484 |
{$ENDIF} |
2428 | 485 |
|
175 | 486 |
for grp:= Low(TCapGroup) to High(TCapGroup) do |
487 |
with Captions[grp] do |
|
762 | 488 |
if Tex <> nil then |
175 | 489 |
begin |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
490 |
DrawCentered(0, i, Tex); |
762 | 491 |
inc(i, Tex^.h + 2); |
564 | 492 |
if EndTime <= RealTicks then |
175 | 493 |
begin |
762 | 494 |
FreeTexture(Tex); |
495 |
Tex:= nil; |
|
175 | 496 |
EndTime:= 0 |
497 |
end |
|
498 |
end; |
|
4 | 499 |
|
47 | 500 |
// Teams Healths |
547 | 501 |
for t:= 0 to Pred(TeamsCount) do |
502 |
with TeamsArray[t]^ do |
|
47 | 503 |
begin |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
504 |
DrawTexture(- NameTagTex^.w - 3, cScreenHeight + DrawHealthY, NameTagTex); |
690 | 505 |
|
506 |
r.x:= 0; |
|
507 |
r.y:= 0; |
|
547 | 508 |
r.w:= 2 + TeamHealthBarWidth; |
764
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
509 |
r.h:= HealthTex^.h; |
690 | 510 |
|
2409
dbf195c3e09c
fix a very rare bug in which CurSlot becomes greater than cMaxCurSlot
koda
parents:
2407
diff
changeset
|
511 |
DrawFromRect(0, cScreenHeight + DrawHealthY, @r, HealthTex); |
690 | 512 |
|
83 | 513 |
inc(r.x, cTeamHealthWidth + 2); |
514 |
r.w:= 3; |
|
690 | 515 |
|
2409
dbf195c3e09c
fix a very rare bug in which CurSlot becomes greater than cMaxCurSlot
koda
parents:
2407
diff
changeset
|
516 |
DrawFromRect(TeamHealthBarWidth + 2, cScreenHeight + DrawHealthY, @r, HealthTex); |
47 | 517 |
end; |
518 |
||
5 | 519 |
// Lag alert |
2567 | 520 |
if isInLag then DrawSprite(sprLag, 32 - (cScreenWidth shr 1), 32, (RealTicks shr 7) mod 12); |
4 | 521 |
|
5 | 522 |
// Wind bar |
2567 | 523 |
{$IFDEF IPHONEOS} |
524 |
offset:= 450; |
|
525 |
{$ELSE} |
|
526 |
offset:= 30; |
|
527 |
{$ENDIF} |
|
528 |
DrawSprite(sprWindBar, (cScreenWidth shr 1) - 180, cScreenHeight - offset, 0); |
|
6 | 529 |
if WindBarWidth > 0 then |
5 | 530 |
begin |
689 | 531 |
{$WARNINGS OFF} |
532 |
r.x:= 8 - (RealTicks shr 6) mod 8; |
|
533 |
{$WARNINGS ON} |
|
534 |
r.y:= 0; |
|
535 |
r.w:= WindBarWidth; |
|
536 |
r.h:= 13; |
|
2571 | 537 |
DrawSpriteFromRect(sprWindR, r, (cScreenWidth shr 1) - 103, cScreenHeight - offset + 2, 13, 0); |
5 | 538 |
end else |
6 | 539 |
if WindBarWidth < 0 then |
5 | 540 |
begin |
689 | 541 |
{$WARNINGS OFF} |
542 |
r.x:= (WindBarWidth + RealTicks shr 6) mod 8; |
|
543 |
{$WARNINGS ON} |
|
544 |
r.y:= 0; |
|
545 |
r.w:= - WindBarWidth; |
|
546 |
r.h:= 13; |
|
2571 | 547 |
DrawSpriteFromRect(sprWindL, r, (cScreenWidth shr 1) - 106 + WindBarWidth, cScreenHeight - offset + 2, 13, 0); |
5 | 548 |
end; |
549 |
||
161 | 550 |
// AmmoMenu |
1120 | 551 |
if (AMxShift < 210) or bShowAmmoMenu then ShowAmmoMenu; |
161 | 552 |
|
2287 | 553 |
// Cursor |
554 |
if isCursorVisible and bShowAmmoMenu then |
|
555 |
DrawSprite(sprArrow, CursorPoint.X, cScreenHeight - CursorPoint.Y, (RealTicks shr 6) mod 8); |
|
942 | 556 |
|
2567 | 557 |
{$IFNDEF IPHONEOS} |
558 |
{* do not draw the chat because a) no input b) too little space*} |
|
2287 | 559 |
DrawChat; |
2567 | 560 |
{$ENDIF} |
4 | 561 |
|
2567 | 562 |
if fastUntilLag then DrawCentered(0, (cScreenHeight shr 1), SyncTexture); |
563 |
if isPaused then DrawCentered(0, (cScreenHeight shr 1), PauseTexture); |
|
281
5b483aa9f2ab
Pause support (mouse cursor is released when the game is paused)
unc0rr
parents:
244
diff
changeset
|
564 |
|
4 | 565 |
inc(Frames); |
298
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
566 |
if cShowFPS then |
4 | 567 |
begin |
298
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
568 |
inc(CountTicks, Lag); |
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
569 |
if CountTicks >= 1000 then |
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
570 |
begin |
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
571 |
FPS:= Frames; |
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
572 |
Frames:= 0; |
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
573 |
CountTicks:= 0; |
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
574 |
s:= inttostr(FPS) + ' fps'; |
759 | 575 |
if fpsTexture <> nil then FreeTexture(fpsTexture); |
576 |
tmpSurface:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(s), $FFFFFF); |
|
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2288
diff
changeset
|
577 |
fpsTexture:= Surface2Tex(tmpSurface, false); |
759 | 578 |
SDL_FreeSurface(tmpSurface) |
298
112e61bd2cc2
Render FPS value to its own surface one time a second
unc0rr
parents:
295
diff
changeset
|
579 |
end; |
759 | 580 |
if fpsTexture <> nil then |
2567 | 581 |
DrawTexture((cScreenWidth shr 1) - 50, 10, fpsTexture); |
4 | 582 |
end; |
174 | 583 |
|
584 |
inc(SoundTimerTicks, Lag); |
|
585 |
if SoundTimerTicks >= 50 then |
|
586 |
begin |
|
587 |
SoundTimerTicks:= 0; |
|
588 |
if cVolumeDelta <> 0 then |
|
589 |
begin |
|
590 |
str(ChangeVolume(cVolumeDelta), s); |
|
175 | 591 |
AddCaption(Format(trmsg[sidVolume], s), $FFFFFF, capgrpVolume) |
174 | 592 |
end |
756 | 593 |
end; |
594 |
||
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
595 |
if GameState = gsConfirm then DrawCentered(0, cScreenHeight div 2, ConfirmTexture); |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
596 |
|
2162 | 597 |
SetScale(zoom); |
1023 | 598 |
|
2287 | 599 |
// Cursor |
600 |
if isCursorVisible then |
|
601 |
begin |
|
602 |
if not bShowAmmoMenu then |
|
603 |
with CurrentHedgehog^ do |
|
604 |
if (Gear^.State and gstHHChooseTarget) <> 0 then |
|
605 |
begin |
|
606 |
i:= Ammo^[CurSlot, CurAmmo].Pos; |
|
607 |
with Ammoz[Ammo^[CurSlot, CurAmmo].AmmoType] do |
|
608 |
if PosCount > 1 then |
|
609 |
DrawSprite(PosSprite, CursorPoint.X - SpritesData[PosSprite].Width div 2, |
|
610 |
cScreenHeight - CursorPoint.Y - SpritesData[PosSprite].Height div 2, |
|
611 |
i); |
|
612 |
end; |
|
613 |
DrawSprite(sprArrow, CursorPoint.X, cScreenHeight - CursorPoint.Y, (RealTicks shr 6) mod 8) |
|
614 |
end; |
|
615 |
||
616 |
||
775 | 617 |
glDisable(GL_TEXTURE_2D); |
756 | 618 |
glDisable(GL_BLEND) |
4 | 619 |
end; |
620 |
||
108 | 621 |
procedure AddCaption(s: string; Color: Longword; Group: TCapGroup); |
4 | 622 |
begin |
2142 | 623 |
//if Group in [capgrpGameState] then WriteLnToConsole(s); |
762 | 624 |
if Captions[Group].Tex <> nil then FreeTexture(Captions[Group].Tex); |
4 | 625 |
|
762 | 626 |
Captions[Group].Tex:= RenderStringTex(s, Color, fntBig); |
2142 | 627 |
|
628 |
case Group of |
|
629 |
capgrpGameState: Captions[Group].EndTime:= RealTicks + 2200 |
|
630 |
else |
|
631 |
Captions[Group].EndTime:= RealTicks + 1570 |
|
632 |
end; |
|
4 | 633 |
end; |
634 |
||
79 | 635 |
procedure MoveCamera; |
4 | 636 |
const PrevSentPointTime: LongWord = 0; |
2428 | 637 |
var EdgesDist, wdy: LongInt; |
4 | 638 |
begin |
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
639 |
if (not (CurrentTeam^.ExtDriven and isCursorVisible)) and cHasFocus then |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
640 |
begin |
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
641 |
{$IFDEF SDL13} |
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
642 |
SDL_GetMouseState(0, @CursorPoint.X, @CursorPoint.Y); |
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
643 |
{$ELSE} |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
644 |
SDL_GetMouseState(@CursorPoint.X, @CursorPoint.Y); |
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2162
diff
changeset
|
645 |
{$ENDIF} |
2567 | 646 |
CursorPoint.X:= CursorPoint.X - (cScreenWidth shr 1); |
2197 | 647 |
CursorPoint.Y:= cScreenHeight - CursorPoint.Y; |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2152
diff
changeset
|
648 |
end; |
678 | 649 |
|
2397
2ca4ca6b4bab
- Patch for "Syncronizing" message by Smaxx + some tweaks by me
unc0rr
parents:
2379
diff
changeset
|
650 |
if (FollowGear <> nil) and (not isCursorVisible) and (not fastUntilLag) then |
1689 | 651 |
if abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y) > 4 then |
652 |
begin |
|
653 |
FollowGear:= nil; |
|
2197 | 654 |
prevPoint:= CursorPoint; |
1689 | 655 |
exit |
656 |
end |
|
657 |
else begin |
|
2198 | 658 |
CursorPoint.x:= (prevPoint.x * 7 + hwRound(FollowGear^.X) + hwSign(FollowGear^.dX) * 100 + WorldDx) div 8; |
2197 | 659 |
CursorPoint.y:= (prevPoint.y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + WorldDy)) div 8; |
1689 | 660 |
end; |
4 | 661 |
|
2375 | 662 |
wdy:= trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 - cWaterLine - cVisibleWater; |
663 |
if WorldDy < wdy then WorldDy:= wdy; |
|
664 |
||
2197 | 665 |
if ((CursorPoint.X = prevPoint.X) and (CursorPoint.Y = prevpoint.Y)) then exit; |
4 | 666 |
|
1120 | 667 |
if AMxShift < 210 then |
1689 | 668 |
begin |
2178
d8b3417b2704
Some fixes on camera broken by zoom code (ammo menu should work now)
unc0rr
parents:
2171
diff
changeset
|
669 |
if CursorPoint.X < cScreenWidth div 2 + AMxShift - 175 then CursorPoint.X:= cScreenWidth div 2 + AMxShift - 175; |
d8b3417b2704
Some fixes on camera broken by zoom code (ammo menu should work now)
unc0rr
parents:
2171
diff
changeset
|
670 |
if CursorPoint.X > cScreenWidth div 2 + AMxShift - 10 then CursorPoint.X:= cScreenWidth div 2 + AMxShift - 10; |
2197 | 671 |
if CursorPoint.Y > 75 + SlotsNum * 33 then CursorPoint.Y:= 75 + SlotsNum * 33; |
672 |
if CursorPoint.Y < 76 then CursorPoint.Y:= 76; |
|
1689 | 673 |
prevPoint:= CursorPoint; |
2197 | 674 |
if cHasFocus then SDL_WarpMouse(CursorPoint.X + cScreenWidth div 2, cScreenHeight - CursorPoint.Y); |
1689 | 675 |
exit |
676 |
end; |
|
162 | 677 |
|
4 | 678 |
if isCursorVisible then |
1689 | 679 |
begin |
2197 | 680 |
if (not CurrentTeam^.ExtDriven) and (GameTicks >= PrevSentPointTime + cSendCursorPosTime) then |
1689 | 681 |
begin |
2407
9f413bd5150e
- Fix mouse cursor bugs in net game (still has a bug near water)
unc0rr
parents:
2397
diff
changeset
|
682 |
SendIPCXY('P', CursorPoint.X - WorldDx, cScreenHeight - CursorPoint.Y - WorldDy); |
1689 | 683 |
PrevSentPointTime:= GameTicks |
684 |
end; |
|
685 |
end; |
|
351 | 686 |
|
4 | 687 |
if isCursorVisible or (FollowGear <> nil) then |
688 |
begin |
|
284 | 689 |
if isCursorVisible then EdgesDist:= cCursorEdgesDist |
690 |
else EdgesDist:= cGearScrEdgesDist; |
|
2197 | 691 |
if CursorPoint.X < - cScreenWidth div 2 + EdgesDist then |
4 | 692 |
begin |
2197 | 693 |
WorldDx:= WorldDx - CursorPoint.X - cScreenWidth div 2 + EdgesDist; |
694 |
CursorPoint.X:= - cScreenWidth div 2 + EdgesDist |
|
4 | 695 |
end else |
2197 | 696 |
if CursorPoint.X > cScreenWidth div 2 - EdgesDist then |
4 | 697 |
begin |
2197 | 698 |
WorldDx:= WorldDx - CursorPoint.X + cScreenWidth div 2 - EdgesDist; |
2198 | 699 |
CursorPoint.X:= cScreenWidth div 2 - EdgesDist |
4 | 700 |
end; |
284 | 701 |
if CursorPoint.Y < EdgesDist then |
4 | 702 |
begin |
2197 | 703 |
WorldDy:= WorldDy + CursorPoint.Y - EdgesDist; |
284 | 704 |
CursorPoint.Y:= EdgesDist |
4 | 705 |
end else |
284 | 706 |
if CursorPoint.Y > cScreenHeight - EdgesDist then |
4 | 707 |
begin |
2197 | 708 |
WorldDy:= WorldDy + CursorPoint.Y - cScreenHeight + EdgesDist; |
284 | 709 |
CursorPoint.Y:= cScreenHeight - EdgesDist |
4 | 710 |
end; |
711 |
end else |
|
308 | 712 |
if cHasFocus then |
713 |
begin |
|
70 | 714 |
WorldDx:= WorldDx - CursorPoint.X + prevPoint.X; |
2197 | 715 |
WorldDy:= WorldDy + CursorPoint.Y - prevPoint.Y; |
2162 | 716 |
CursorPoint.X:= 0; |
717 |
CursorPoint.Y:= cScreenHeight div 2; |
|
308 | 718 |
end; |
351 | 719 |
|
4 | 720 |
prevPoint:= CursorPoint; |
2567 | 721 |
if cHasFocus then SDL_WarpMouse(CursorPoint.X + (cScreenWidth shr 1), cScreenHeight - CursorPoint.Y); |
1760 | 722 |
if WorldDy > LAND_HEIGHT + 1024 then WorldDy:= LAND_HEIGHT + 1024; |
2375 | 723 |
if WorldDy < wdy then WorldDy:= wdy; |
2426 | 724 |
if WorldDx < - LAND_WIDTH - 1024 then WorldDx:= - LAND_WIDTH - 1024; |
725 |
if WorldDx > 1024 then WorldDx:= 1024; |
|
4 | 726 |
end; |
727 |
||
728 |
initialization |
|
729 |
FillChar(Captions, sizeof(Captions), 0) |
|
730 |
||
731 |
end. |