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