author | unc0rr |
Thu, 25 Feb 2010 18:34:36 +0000 | |
changeset 2869 | 93cc73dcc421 |
parent 2844 | cea15ef417ea |
child 2873 | e7acb0251a22 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
883 | 3 |
* Copyright (c) 2004-2008 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 |
||
2623 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
4 | 21 |
unit uStore; |
22 |
interface |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
23 |
uses sysutils, uConsts, uTeams, SDLh, uFloat, |
2152 | 24 |
{$IFDEF GLES11} |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
25 |
gles11; |
1906 | 26 |
{$ELSE} |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
27 |
GL, GLext; |
1906 | 28 |
{$ENDIF} |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
29 |
|
4 | 30 |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
31 |
var PixelFormat: PSDL_PixelFormat; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
32 |
SDLPrimSurface: PSDL_Surface; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
33 |
PauseTexture, |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
34 |
SyncTexture, |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
35 |
ConfirmTexture: PTexture; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
36 |
cScaleFactor: GLfloat; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
37 |
SupportNPOTT: Boolean; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
38 |
Step: LongInt; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
39 |
squaresize : LongInt; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
40 |
numsquares : LongInt; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
41 |
ProgrTex: PTexture; |
2801 | 42 |
MissionIcons: PSDL_Surface; |
2811 | 43 |
ropeIconTex: PTexture; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
44 |
|
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
45 |
procedure init_uStore; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
46 |
procedure free_uStore; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
47 |
|
4 | 48 |
procedure StoreLoad; |
49 |
procedure StoreRelease; |
|
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
50 |
procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); |
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
51 |
procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); |
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
52 |
procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); |
1939 | 53 |
procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); |
762 | 54 |
procedure DrawTexture(X, Y: LongInt; Texture: PTexture); |
2811 | 55 |
procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
56 |
procedure DrawRotatedTextureF(Texture: PTexture; Scale, OffsetX, OffsetY: GLfloat; X, Y, Frame, Dir, w, h: LongInt; Angle: real); |
|
822 | 57 |
procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); |
853 | 58 |
procedure DrawRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); |
822 | 59 |
procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); |
762 | 60 |
procedure DrawCentered(X, Top: LongInt; Source: PTexture); |
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
61 |
procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); |
1865
ebc6dfca60d4
- nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1854
diff
changeset
|
62 |
procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); |
1431 | 63 |
procedure DrawFillRect(r: TSDL_Rect); |
2801 | 64 |
procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
65 |
function CheckCJKFont(s: string; font: THWFont): THWFont; |
762 | 66 |
function RenderStringTex(s: string; Color: Longword; font: THWFont): PTexture; |
2017 | 67 |
function RenderSpeechBubbleTex(s: string; SpeechType: Longword; font: THWFont): PTexture; |
68 |
procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean); |
|
69 |
//procedure rotateSurface(Surface: PSDL_Surface); |
|
70 |
procedure copyRotatedSurface(src, dest: PSDL_Surface); // this is necessary since width/height are read only in SDL |
|
71 |
procedure copyToXY(src, dest: PSDL_Surface; destX, destY: Integer); |
|
4 | 72 |
procedure RenderHealth(var Hedgehog: THedgehog); |
73 |
procedure AddProgress; |
|
510 | 74 |
procedure FinishProgress; |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
75 |
function LoadImage(const filename: string; imageFlags: LongInt): PSDL_Surface; |
753 | 76 |
procedure SetupOpenGL; |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2154
diff
changeset
|
77 |
procedure SetScale(f: GLfloat); |
2786 | 78 |
function RenderHelpWindow(caption, subcaption, description, extra: shortstring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture; |
2747 | 79 |
procedure RenderWeaponTooltip(atype: TAmmoType); |
80 |
procedure ShowWeaponTooltip(x, y: LongInt); |
|
81 |
procedure FreeWeaponTooltip; |
|
4 | 82 |
|
83 |
implementation |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
84 |
uses uMisc, uConsole, uLand, uLocale, uWorld{$IFDEF IPHONEOS}, PascalExports{$ENDIF}; |
4 | 85 |
|
2735 | 86 |
type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple); |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
87 |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
88 |
var HHTexture: PTexture; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
89 |
MaxTextureSize: Integer; |
2735 | 90 |
cGPUVendor: TGPUVendor; |
4 | 91 |
|
351 | 92 |
procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); |
47 | 93 |
var r: TSDL_Rect; |
94 |
begin |
|
95 |
r:= rect^; |
|
83 | 96 |
if Clear then SDL_FillRect(Surface, @r, 0); |
764
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
97 |
|
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
98 |
BorderColor:= SDL_MapRGB(Surface^.format, BorderColor shr 16, BorderColor shr 8, BorderColor and $FF); |
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
99 |
FillColor:= SDL_MapRGB(Surface^.format, FillColor shr 16, FillColor shr 8, FillColor and $FF); |
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
100 |
|
351 | 101 |
r.y:= rect^.y + 1; |
102 |
r.h:= rect^.h - 2; |
|
47 | 103 |
SDL_FillRect(Surface, @r, BorderColor); |
351 | 104 |
r.x:= rect^.x + 1; |
105 |
r.w:= rect^.w - 2; |
|
106 |
r.y:= rect^.y; |
|
107 |
r.h:= rect^.h; |
|
47 | 108 |
SDL_FillRect(Surface, @r, BorderColor); |
351 | 109 |
r.x:= rect^.x + 2; |
110 |
r.y:= rect^.y + 1; |
|
111 |
r.w:= rect^.w - 4; |
|
112 |
r.h:= rect^.h - 2; |
|
47 | 113 |
SDL_FillRect(Surface, @r, FillColor); |
351 | 114 |
r.x:= rect^.x + 1; |
115 |
r.y:= rect^.y + 2; |
|
116 |
r.w:= rect^.w - 2; |
|
117 |
r.h:= rect^.h - 4; |
|
47 | 118 |
SDL_FillRect(Surface, @r, FillColor) |
119 |
end; |
|
120 |
||
371 | 121 |
function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: string): TSDL_Rect; |
351 | 122 |
var w, h: LongInt; |
4 | 123 |
tmpsurf: PSDL_Surface; |
124 |
clr: TSDL_Color; |
|
2695 | 125 |
finalRect: TSDL_Rect; |
4 | 126 |
begin |
2620
796269129c47
koda, can we try to keep unC0Rr's code formatting, and not just change it when we feel like it?
nemo
parents:
2619
diff
changeset
|
127 |
TTF_SizeUTF8(Fontz[Font].Handle, Str2PChar(s), w, h); |
2695 | 128 |
finalRect.x:= X; |
129 |
finalRect.y:= Y; |
|
130 |
finalRect.w:= w + FontBorder * 2 + 4; |
|
131 |
finalRect.h:= h + FontBorder * 2; |
|
132 |
DrawRoundRect(@finalRect, cWhiteColor, endian(cNearBlackColorChannels.value), Surface, true); |
|
2670 | 133 |
clr.r:= (Color shr 16) and $FF; |
2620
796269129c47
koda, can we try to keep unC0Rr's code formatting, and not just change it when we feel like it?
nemo
parents:
2619
diff
changeset
|
134 |
clr.g:= (Color shr 8) and $FF; |
796269129c47
koda, can we try to keep unC0Rr's code formatting, and not just change it when we feel like it?
nemo
parents:
2619
diff
changeset
|
135 |
clr.b:= Color and $FF; |
2665
50b4e544c163
complete transition of longword->sdl_color for TTF bindings
koda
parents:
2663
diff
changeset
|
136 |
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, Str2PChar(s), clr); |
2695 | 137 |
finalRect.x:= X + FontBorder + 2; |
138 |
finalRect.y:= Y + FontBorder; |
|
2620
796269129c47
koda, can we try to keep unC0Rr's code formatting, and not just change it when we feel like it?
nemo
parents:
2619
diff
changeset
|
139 |
SDLTry(tmpsurf <> nil, true); |
2695 | 140 |
SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect); |
2620
796269129c47
koda, can we try to keep unC0Rr's code formatting, and not just change it when we feel like it?
nemo
parents:
2619
diff
changeset
|
141 |
SDL_FreeSurface(tmpsurf); |
2695 | 142 |
finalRect.x:= X; |
143 |
finalRect.y:= Y; |
|
144 |
finalRect.w:= w + FontBorder * 2 + 4; |
|
145 |
finalRect.h:= h + FontBorder * 2; |
|
146 |
WriteInRoundRect:= finalRect; |
|
4 | 147 |
end; |
148 |
||
2747 | 149 |
function WriteInRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: string): TSDL_Rect; |
150 |
var w, h: LongInt; |
|
151 |
tmpsurf: PSDL_Surface; |
|
152 |
clr: TSDL_Color; |
|
153 |
finalRect: TSDL_Rect; |
|
154 |
begin |
|
155 |
TTF_SizeUTF8(Fontz[Font].Handle, Str2PChar(s), w, h); |
|
156 |
finalRect.x:= X + FontBorder + 2; |
|
157 |
finalRect.y:= Y + FontBorder; |
|
158 |
finalRect.w:= w + FontBorder * 2 + 4; |
|
159 |
finalRect.h:= h + FontBorder * 2; |
|
160 |
clr.r:= Color shr 16; |
|
161 |
clr.g:= (Color shr 8) and $FF; |
|
162 |
clr.b:= Color and $FF; |
|
163 |
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, Str2PChar(s), clr); |
|
164 |
tmpsurf:= doSurfaceConversion(tmpsurf); |
|
165 |
SDLTry(tmpsurf <> nil, true); |
|
166 |
SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect); |
|
167 |
SDL_FreeSurface(tmpsurf); |
|
168 |
finalRect.x:= X; |
|
169 |
finalRect.y:= Y; |
|
170 |
finalRect.w:= w + FontBorder * 2 + 4; |
|
171 |
finalRect.h:= h + FontBorder * 2; |
|
172 |
WriteInRect:= finalRect |
|
173 |
end; |
|
174 |
||
4 | 175 |
procedure StoreLoad; |
844 | 176 |
var s: string; |
4 | 177 |
|
1185 | 178 |
procedure WriteNames(Font: THWFont); |
179 |
var t: LongInt; |
|
180 |
i: LongInt; |
|
181 |
r, rr: TSDL_Rect; |
|
182 |
drY: LongInt; |
|
2811 | 183 |
texsurf, flagsurf, iconsurf: PSDL_Surface; |
1185 | 184 |
begin |
185 |
r.x:= 0; |
|
186 |
r.y:= 0; |
|
187 |
drY:= - 4; |
|
188 |
for t:= 0 to Pred(TeamsCount) do |
|
189 |
with TeamsArray[t]^ do |
|
190 |
begin |
|
191 |
NameTagTex:= RenderStringTex(TeamName, Clan^.Color, Font); |
|
690 | 192 |
|
1185 | 193 |
r.w:= cTeamHealthWidth + 5; |
194 |
r.h:= NameTagTex^.h; |
|
690 | 195 |
|
1185 | 196 |
texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, r.w, r.h, 32, RMask, GMask, BMask, AMask); |
197 |
TryDo(texsurf <> nil, errmsgCreateSurface, true); |
|
198 |
TryDo(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); |
|
690 | 199 |
|
2666 | 200 |
DrawRoundRect(@r, cWhiteColor, cNearBlackColorChannels.value, texsurf, true); |
1185 | 201 |
rr:= r; |
202 |
inc(rr.x, 2); dec(rr.w, 4); inc(rr.y, 2); dec(rr.h, 4); |
|
203 |
DrawRoundRect(@rr, Clan^.Color, Clan^.Color, texsurf, false); |
|
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2285
diff
changeset
|
204 |
HealthTex:= Surface2Tex(texsurf, false); |
1185 | 205 |
SDL_FreeSurface(texsurf); |
690 | 206 |
|
2747 | 207 |
r.x:= 0; |
208 |
r.y:= 0; |
|
209 |
r.w:= 32; |
|
210 |
r.h:= 32; |
|
211 |
texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, r.w, r.h, 32, RMask, GMask, BMask, AMask); |
|
212 |
TryDo(texsurf <> nil, errmsgCreateSurface, true); |
|
213 |
TryDo(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); |
|
214 |
||
215 |
r.w:= 26; |
|
216 |
r.h:= 19; |
|
217 |
||
218 |
DrawRoundRect(@r, cWhiteColor, cNearBlackColor, texsurf, true); |
|
219 |
||
2751 | 220 |
// overwrite flag for cpu teams and keep players from using it |
221 |
if (Hedgehogs[0].Gear <> nil) and (Hedgehogs[0].BotLevel > 0) then |
|
222 |
Flag:= 'cpu' |
|
223 |
else if Flag = 'cpu' then |
|
224 |
Flag:= 'hedgewars'; |
|
225 |
||
2747 | 226 |
flagsurf:= LoadImage(Pathz[ptFlags] + '/' + Flag, ifNone); |
227 |
if flagsurf = nil then |
|
228 |
flagsurf:= LoadImage(Pathz[ptFlags] + '/hedgewars', ifNone); |
|
229 |
TryDo(flagsurf <> nil, 'Failed to load flag "' + Flag + '" as well as the default flag', true); |
|
230 |
copyToXY(flagsurf, texsurf, 2, 2); |
|
231 |
SDL_FreeSurface(flagsurf); |
|
232 |
||
233 |
// restore black border pixels inside the flag |
|
234 |
PLongwordArray(texsurf^.pixels)^[32 * 2 + 2]:= cNearBlackColor; |
|
235 |
PLongwordArray(texsurf^.pixels)^[32 * 2 + 23]:= cNearBlackColor; |
|
236 |
PLongwordArray(texsurf^.pixels)^[32 * 16 + 2]:= cNearBlackColor; |
|
237 |
PLongwordArray(texsurf^.pixels)^[32 * 16 + 23]:= cNearBlackColor; |
|
238 |
||
239 |
FlagTex:= Surface2Tex(texsurf, false); |
|
240 |
||
1185 | 241 |
dec(drY, r.h + 2); |
242 |
DrawHealthY:= drY; |
|
243 |
for i:= 0 to 7 do |
|
244 |
with Hedgehogs[i] do |
|
245 |
if Gear <> nil then |
|
1242 | 246 |
begin |
1185 | 247 |
NameTagTex:= RenderStringTex(Name, Clan^.Color, fnt16); |
1294
50198e5c7f02
- Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1251
diff
changeset
|
248 |
if Hat <> 'NoHat' then |
50198e5c7f02
- Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1251
diff
changeset
|
249 |
begin |
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2161
diff
changeset
|
250 |
texsurf:= LoadImage(Pathz[ptHats] + '/' + Hat, ifNone); |
1698 | 251 |
if texsurf <> nil then |
252 |
begin |
|
2447
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2438
diff
changeset
|
253 |
HatTex:= Surface2Tex(texsurf, true); |
1698 | 254 |
SDL_FreeSurface(texsurf) |
255 |
end |
|
1294
50198e5c7f02
- Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1251
diff
changeset
|
256 |
end |
1242 | 257 |
end; |
1185 | 258 |
end; |
2811 | 259 |
MissionIcons:= LoadImage(Pathz[ptGraphics] + '/missions', ifCritical); |
260 |
iconsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, 28, 28, 32, RMask, GMask, BMask, AMask); |
|
261 |
if iconsurf <> nil then |
|
262 |
begin |
|
263 |
r.x:= 0; |
|
264 |
r.y:= 0; |
|
265 |
r.w:= 28; |
|
266 |
r.h:= 28; |
|
267 |
DrawRoundRect(@r, cWhiteColor, cNearBlackColor, iconsurf, true); |
|
268 |
ropeIconTex:= Surface2Tex(iconsurf, false); |
|
269 |
SDL_FreeSurface(iconsurf) |
|
270 |
end; |
|
1185 | 271 |
end; |
4 | 272 |
|
1185 | 273 |
procedure MakeCrossHairs; |
274 |
var t: LongInt; |
|
275 |
tmpsurf, texsurf: PSDL_Surface; |
|
276 |
Color, i: Longword; |
|
277 |
begin |
|
278 |
s:= Pathz[ptGraphics] + '/' + cCHFileName; |
|
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2161
diff
changeset
|
279 |
tmpsurf:= LoadImage(s, ifAlpha or ifCritical); |
4 | 280 |
|
1185 | 281 |
for t:= 0 to Pred(TeamsCount) do |
282 |
with TeamsArray[t]^ do |
|
283 |
begin |
|
284 |
texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, tmpsurf^.w, tmpsurf^.h, 32, RMask, GMask, BMask, AMask); |
|
285 |
TryDo(texsurf <> nil, errmsgCreateSurface, true); |
|
764
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
286 |
|
1185 | 287 |
Color:= Clan^.Color; |
288 |
Color:= SDL_MapRGB(texsurf^.format, Color shr 16, Color shr 8, Color and $FF); |
|
289 |
SDL_FillRect(texsurf, nil, Color); |
|
764
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
290 |
|
1185 | 291 |
SDL_UpperBlit(tmpsurf, nil, texsurf, nil); |
777 | 292 |
|
1185 | 293 |
TryDo(tmpsurf^.format^.BytesPerPixel = 4, 'Ooops', true); |
777 | 294 |
|
1185 | 295 |
if SDL_MustLock(texsurf) then |
296 |
SDLTry(SDL_LockSurface(texsurf) >= 0, true); |
|
777 | 297 |
|
1185 | 298 |
// make black pixel be alpha-transparent |
299 |
for i:= 0 to texsurf^.w * texsurf^.h - 1 do |
|
2592 | 300 |
if PLongwordArray(texsurf^.pixels)^[i] = AMask then PLongwordArray(texsurf^.pixels)^[i]:= 0; |
777 | 301 |
|
1185 | 302 |
if SDL_MustLock(texsurf) then |
303 |
SDL_UnlockSurface(texsurf); |
|
764
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
304 |
|
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2285
diff
changeset
|
305 |
CrosshairTex:= Surface2Tex(texsurf, false); |
1185 | 306 |
SDL_FreeSurface(texsurf) |
307 |
end; |
|
351 | 308 |
|
1185 | 309 |
SDL_FreeSurface(tmpsurf) |
310 |
end; |
|
4 | 311 |
|
1185 | 312 |
procedure InitHealth; |
313 |
var i, t: LongInt; |
|
314 |
begin |
|
315 |
for t:= 0 to Pred(TeamsCount) do |
|
316 |
if TeamsArray[t] <> nil then |
|
317 |
with TeamsArray[t]^ do |
|
318 |
begin |
|
319 |
for i:= 0 to cMaxHHIndex do |
|
320 |
if Hedgehogs[i].Gear <> nil then |
|
321 |
RenderHealth(Hedgehogs[i]); |
|
322 |
end |
|
323 |
end; |
|
4 | 324 |
|
1185 | 325 |
procedure LoadGraves; |
326 |
var t: LongInt; |
|
327 |
texsurf: PSDL_Surface; |
|
328 |
begin |
|
329 |
for t:= 0 to Pred(TeamsCount) do |
|
330 |
if TeamsArray[t] <> nil then |
|
331 |
with TeamsArray[t]^ do |
|
332 |
begin |
|
333 |
if GraveName = '' then GraveName:= 'Simple'; |
|
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2161
diff
changeset
|
334 |
texsurf:= LoadImage(Pathz[ptGraves] + '/' + GraveName, ifCritical or ifTransparent); |
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2285
diff
changeset
|
335 |
GraveTex:= Surface2Tex(texsurf, false); |
1185 | 336 |
SDL_FreeSurface(texsurf) |
337 |
end |
|
338 |
end; |
|
4 | 339 |
|
844 | 340 |
var ii: TSprite; |
341 |
fi: THWFont; |
|
342 |
ai: TAmmoType; |
|
343 |
tmpsurf: PSDL_Surface; |
|
344 |
i: LongInt; |
|
4 | 345 |
begin |
2222 | 346 |
|
4 | 347 |
for fi:= Low(THWFont) to High(THWFont) do |
1185 | 348 |
with Fontz[fi] do |
349 |
begin |
|
350 |
s:= Pathz[ptFonts] + '/' + Name; |
|
351 |
WriteToConsole(msgLoading + s + '... '); |
|
352 |
Handle:= TTF_OpenFont(Str2PChar(s), Height); |
|
353 |
SDLTry(Handle <> nil, true); |
|
354 |
TTF_SetFontStyle(Handle, style); |
|
355 |
WriteLnToConsole(msgOK) |
|
356 |
end; |
|
53 | 357 |
|
4 | 358 |
WriteNames(fnt16); |
70 | 359 |
MakeCrossHairs; |
4 | 360 |
LoadGraves; |
361 |
||
362 |
AddProgress; |
|
363 |
for ii:= Low(TSprite) to High(TSprite) do |
|
1185 | 364 |
with SpritesData[ii] do |
2145 | 365 |
// FIXME - add a sprite attribute |
2426 | 366 |
if (not cReducedQuality) or (not (ii in [sprSky, sprSkyL, sprSkyR, sprHorizont, sprHorizontL, sprHorizontR, sprFlake])) then // FIXME: hack |
2229
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
367 |
begin |
1185 | 368 |
if AltPath = ptNone then |
2426 | 369 |
if ii in [sprHorizontL, sprHorizontR, sprSkyL, sprSkyR] then // FIXME: hack |
370 |
tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent or ifLowRes) |
|
371 |
else |
|
372 |
tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent or ifCritical or ifLowRes) |
|
1185 | 373 |
else begin |
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2161
diff
changeset
|
374 |
tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
1185 | 375 |
if tmpsurf = nil then |
2610 | 376 |
tmpsurf:= LoadImage(Pathz[AltPath] + '/' + FileName, ifAlpha or ifCritical or ifTransparent); |
1185 | 377 |
end; |
2426 | 378 |
|
379 |
if tmpsurf <> nil then |
|
2630 | 380 |
begin |
2610 | 381 |
if imageWidth = 0 then imageWidth:= tmpsurf^.w; |
382 |
if imageHeight = 0 then imageHeight:= tmpsurf^.h; |
|
2426 | 383 |
if Width = 0 then Width:= tmpsurf^.w; |
384 |
if Height = 0 then Height:= tmpsurf^.h; |
|
2452 | 385 |
if (ii in [sprSky, sprSkyL, sprSkyR, sprHorizont, sprHorizontL, sprHorizontR]) then |
2426 | 386 |
Texture:= Surface2Tex(tmpsurf, true) |
387 |
else |
|
2447
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2438
diff
changeset
|
388 |
begin |
2426 | 389 |
Texture:= Surface2Tex(tmpsurf, false); |
2447
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2438
diff
changeset
|
390 |
if (ii = sprWater) and not cReducedQuality then // HACK: We should include some sprite attribute to define the texture wrap directions |
2630 | 391 |
begin |
2447
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2438
diff
changeset
|
392 |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
08d623a494e6
Smaxx's updated german translation + texture gap fixes + updated room list
koda
parents:
2438
diff
changeset
|
393 |
end; |
2630 | 394 |
end; |
2426 | 395 |
if saveSurf then Surface:= tmpsurf else SDL_FreeSurface(tmpsurf) |
396 |
end |
|
397 |
else |
|
398 |
Surface:= nil |
|
2229
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
399 |
end; |
80 | 400 |
|
4 | 401 |
AddProgress; |
567 | 402 |
|
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2161
diff
changeset
|
403 |
tmpsurf:= LoadImage(Pathz[ptGraphics] + '/' + cHHFileName, ifAlpha or ifCritical or ifTransparent); |
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2285
diff
changeset
|
404 |
HHTexture:= Surface2Tex(tmpsurf, false); |
761 | 405 |
SDL_FreeSurface(tmpsurf); |
4 | 406 |
|
407 |
InitHealth; |
|
408 |
||
2623 | 409 |
PauseTexture:= RenderStringTex(trmsg[sidPaused], cYellowColor, fntBig); |
410 |
ConfirmTexture:= RenderStringTex(trmsg[sidConfirm], cYellowColor, fntBig); |
|
411 |
SyncTexture:= RenderStringTex(trmsg[sidSync], cYellowColor, fntBig); |
|
281
5b483aa9f2ab
Pause support (mouse cursor is released when the game is paused)
unc0rr
parents:
208
diff
changeset
|
412 |
|
2601 | 413 |
AddProgress; |
414 |
||
2670 | 415 |
// name of weapons in ammo menu |
843 | 416 |
for ai:= Low(TAmmoType) to High(TAmmoType) do |
417 |
with Ammoz[ai] do |
|
418 |
begin |
|
2665
50b4e544c163
complete transition of longword->sdl_color for TTF bindings
koda
parents:
2663
diff
changeset
|
419 |
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(trAmmo[NameId]), cWhiteColorChannels); |
2670 | 420 |
tmpsurf:= doSurfaceConversion(tmpsurf); |
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2285
diff
changeset
|
421 |
NameTex:= Surface2Tex(tmpsurf, false); |
843 | 422 |
SDL_FreeSurface(tmpsurf) |
423 |
end; |
|
2376 | 424 |
|
2670 | 425 |
// number of weapons in ammo menu |
844 | 426 |
for i:= Low(CountTexz) to High(CountTexz) do |
427 |
begin |
|
2665
50b4e544c163
complete transition of longword->sdl_color for TTF bindings
koda
parents:
2663
diff
changeset
|
428 |
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(IntToStr(i) + 'x'), cWhiteColorChannels); |
2670 | 429 |
tmpsurf:= doSurfaceConversion(tmpsurf); |
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2285
diff
changeset
|
430 |
CountTexz[i]:= Surface2Tex(tmpsurf, false); |
844 | 431 |
SDL_FreeSurface(tmpsurf) |
432 |
end; |
|
433 |
||
4 | 434 |
{$IFDEF DUMP} |
2601 | 435 |
//not working anymore, where are LandSurface and StoreSurface defined? |
436 |
//SDL_SaveBMP_RW(LandSurface, SDL_RWFromFile('LandSurface.bmp', 'wb'), 1); |
|
437 |
//SDL_SaveBMP_RW(StoreSurface, SDL_RWFromFile('StoreSurface.bmp', 'wb'), 1); |
|
4 | 438 |
{$ENDIF} |
2222 | 439 |
AddProgress; |
2669 | 440 |
|
2672 | 441 |
{$IFDEF SDL_IMAGE_NEWER} |
2669 | 442 |
IMG_Quit(); |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
443 |
{$ENDIF} |
4 | 444 |
end; |
445 |
||
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
446 |
procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); |
4 | 447 |
var rr: TSDL_Rect; |
764
7513452b1d51
Now game looks almost like it did before switching to OpenGL
unc0rr
parents:
762
diff
changeset
|
448 |
_l, _r, _t, _b: real; |
1916 | 449 |
VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; |
4 | 450 |
begin |
2428 | 451 |
if (SourceTexture^.h = 0) or (SourceTexture^.w = 0) then exit; |
4 | 452 |
rr.x:= X; |
453 |
rr.y:= Y; |
|
351 | 454 |
rr.w:= r^.w; |
455 |
rr.h:= r^.h; |
|
755 | 456 |
|
1896 | 457 |
_l:= r^.x / SourceTexture^.w * SourceTexture^.rx; |
458 |
_r:= (r^.x + r^.w) / SourceTexture^.w * SourceTexture^.rx; |
|
459 |
_t:= r^.y / SourceTexture^.h * SourceTexture^.ry; |
|
460 |
_b:= (r^.y + r^.h) / SourceTexture^.h * SourceTexture^.ry; |
|
755 | 461 |
|
462 |
glBindTexture(GL_TEXTURE_2D, SourceTexture^.id); |
|
463 |
||
1916 | 464 |
VertexBuffer[0].X:= X; |
465 |
VertexBuffer[0].Y:= Y; |
|
466 |
VertexBuffer[1].X:= rr.w + X; |
|
467 |
VertexBuffer[1].Y:= Y; |
|
468 |
VertexBuffer[2].X:= rr.w + X; |
|
469 |
VertexBuffer[2].Y:= rr.h + Y; |
|
470 |
VertexBuffer[3].X:= X; |
|
471 |
VertexBuffer[3].Y:= rr.h + Y; |
|
755 | 472 |
|
1916 | 473 |
TextureBuffer[0].X:= _l; |
474 |
TextureBuffer[0].Y:= _t; |
|
475 |
TextureBuffer[1].X:= _r; |
|
476 |
TextureBuffer[1].Y:= _t; |
|
477 |
TextureBuffer[2].X:= _r; |
|
478 |
TextureBuffer[2].Y:= _b; |
|
479 |
TextureBuffer[3].X:= _l; |
|
480 |
TextureBuffer[3].Y:= _b; |
|
755 | 481 |
|
1916 | 482 |
glEnableClientState(GL_VERTEX_ARRAY); |
483 |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
755 | 484 |
|
1916 | 485 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
486 |
glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
|
487 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
488 |
||
489 |
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
|
490 |
glDisableClientState(GL_VERTEX_ARRAY) |
|
762 | 491 |
end; |
492 |
||
493 |
procedure DrawTexture(X, Y: LongInt; Texture: PTexture); |
|
494 |
begin |
|
1904 | 495 |
glPushMatrix; |
496 |
glTranslatef(X, Y, 0); |
|
497 |
||
762 | 498 |
glBindTexture(GL_TEXTURE_2D, Texture^.id); |
499 |
||
1904 | 500 |
glEnableClientState(GL_VERTEX_ARRAY); |
501 |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
762 | 502 |
|
1912
c3d31fb59f0e
Save much CPU time by initializing vertex arrays in texture creation function
unc0rr
parents:
1908
diff
changeset
|
503 |
glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb); |
c3d31fb59f0e
Save much CPU time by initializing vertex arrays in texture creation function
unc0rr
parents:
1908
diff
changeset
|
504 |
glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); |
c3d31fb59f0e
Save much CPU time by initializing vertex arrays in texture creation function
unc0rr
parents:
1908
diff
changeset
|
505 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); |
1904 | 506 |
|
507 |
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
|
508 |
glDisableClientState(GL_VERTEX_ARRAY); |
|
509 |
||
510 |
glPopMatrix |
|
4 | 511 |
end; |
512 |
||
2811 | 513 |
procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
1242 | 514 |
begin |
2811 | 515 |
DrawRotatedTextureF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) |
2597 | 516 |
end; |
517 |
||
2811 | 518 |
procedure DrawRotatedTextureF(Texture: PTexture; Scale, OffsetX, OffsetY: GLfloat; X, Y, Frame, Dir, w, h: LongInt; Angle: real); |
519 |
var ft, fb, fl, fr: GLfloat; |
|
520 |
hw, nx, ny: LongInt; |
|
2597 | 521 |
VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; |
522 |
begin |
|
523 |
glPushMatrix; |
|
524 |
glTranslatef(X, Y, 0); |
|
525 |
||
526 |
if Dir < 0 then |
|
527 |
glRotatef(Angle, 0, 0, -1) |
|
528 |
else |
|
529 |
glRotatef(Angle, 0, 0, 1); |
|
530 |
||
531 |
glTranslatef(Dir*OffsetX, OffsetY, 0); |
|
2811 | 532 |
glScalef(Scale, Scale, 1); |
533 |
||
2597 | 534 |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
1242 | 535 |
|
536 |
if Dir < 0 then |
|
2811 | 537 |
hw:= w div -2 |
1242 | 538 |
else |
2811 | 539 |
hw:= w div 2; |
540 |
||
541 |
nx:= round(Texture^.w * Texture^.rx / w); |
|
542 |
ny:= round(Texture^.h * Texture^.ry / h); |
|
1242 | 543 |
|
2811 | 544 |
ft:= ((Frame mod ny) / ny); |
545 |
fb:= (((Frame mod ny) + 1) / ny); |
|
546 |
fl:= ((Frame div ny) / nx) * Texture^.rx; |
|
547 |
fr:= (((Frame div ny) + 1) / nx); |
|
1242 | 548 |
|
549 |
glBindTexture(GL_TEXTURE_2D, Texture^.id); |
|
550 |
||
1916 | 551 |
VertexBuffer[0].X:= -hw; |
2811 | 552 |
VertexBuffer[0].Y:= w / -2; |
1916 | 553 |
VertexBuffer[1].X:= hw; |
2811 | 554 |
VertexBuffer[1].Y:= w / -2; |
1916 | 555 |
VertexBuffer[2].X:= hw; |
2811 | 556 |
VertexBuffer[2].Y:= w / 2; |
1916 | 557 |
VertexBuffer[3].X:= -hw; |
2811 | 558 |
VertexBuffer[3].Y:= w / 2; |
1242 | 559 |
|
2811 | 560 |
TextureBuffer[0].X:= fl; |
1916 | 561 |
TextureBuffer[0].Y:= ft; |
2811 | 562 |
TextureBuffer[1].X:= fr; |
1916 | 563 |
TextureBuffer[1].Y:= ft; |
2811 | 564 |
TextureBuffer[2].X:= fr; |
1916 | 565 |
TextureBuffer[2].Y:= fb; |
2811 | 566 |
TextureBuffer[3].X:= fl; |
1916 | 567 |
TextureBuffer[3].Y:= fb; |
1242 | 568 |
|
1916 | 569 |
glEnableClientState(GL_VERTEX_ARRAY); |
570 |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
1242 | 571 |
|
1916 | 572 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
573 |
glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
|
574 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
575 |
||
576 |
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
|
577 |
glDisableClientState(GL_VERTEX_ARRAY); |
|
578 |
||
1242 | 579 |
|
580 |
glPopMatrix |
|
581 |
end; |
|
582 |
||
822 | 583 |
procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); |
775 | 584 |
begin |
777 | 585 |
DrawRotatedTex(SpritesData[Sprite].Texture, |
822 | 586 |
SpritesData[Sprite].Width, |
587 |
SpritesData[Sprite].Height, |
|
588 |
X, Y, Dir, Angle) |
|
777 | 589 |
end; |
590 |
||
853 | 591 |
procedure DrawRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); |
806 | 592 |
begin |
593 |
glPushMatrix; |
|
809 | 594 |
glTranslatef(X, Y, 0); |
806 | 595 |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
596 |
if Dir < 0 then |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
597 |
glRotatef(Angle, 0, 0, -1) |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
598 |
else |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
599 |
glRotatef(Angle, 0, 0, 1); |
853 | 600 |
if Dir < 0 then glScalef(-1.0, 1.0, 1.0); |
601 |
||
602 |
DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); |
|
806 | 603 |
|
604 |
glPopMatrix |
|
605 |
end; |
|
606 |
||
822 | 607 |
procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); |
1916 | 608 |
var VertexBuffer: array [0..3] of TVertex2f; |
777 | 609 |
begin |
775 | 610 |
glPushMatrix; |
611 |
glTranslatef(X, Y, 0); |
|
822 | 612 |
|
613 |
if Dir < 0 then |
|
614 |
begin |
|
615 |
hw:= - hw; |
|
616 |
glRotatef(Angle, 0, 0, -1); |
|
617 |
end else |
|
618 |
glRotatef(Angle, 0, 0, 1); |
|
619 |
||
775 | 620 |
|
777 | 621 |
glBindTexture(GL_TEXTURE_2D, Tex^.id); |
775 | 622 |
|
1916 | 623 |
VertexBuffer[0].X:= -hw; |
624 |
VertexBuffer[0].Y:= -hh; |
|
625 |
VertexBuffer[1].X:= hw; |
|
626 |
VertexBuffer[1].Y:= -hh; |
|
627 |
VertexBuffer[2].X:= hw; |
|
628 |
VertexBuffer[2].Y:= hh; |
|
629 |
VertexBuffer[3].X:= -hw; |
|
630 |
VertexBuffer[3].Y:= hh; |
|
775 | 631 |
|
1916 | 632 |
glEnableClientState(GL_VERTEX_ARRAY); |
633 |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
775 | 634 |
|
1916 | 635 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
636 |
glTexCoordPointer(2, GL_FLOAT, 0, @Tex^.tb); |
|
637 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
775 | 638 |
|
1916 | 639 |
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
640 |
glDisableClientState(GL_VERTEX_ARRAY); |
|
775 | 641 |
|
642 |
glPopMatrix |
|
643 |
end; |
|
644 |
||
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
645 |
procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); |
4 | 646 |
begin |
647 |
r.y:= r.y + Height * Position; |
|
648 |
r.h:= Height; |
|
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
649 |
DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture) |
4 | 650 |
end; |
651 |
||
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
652 |
procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); |
2229
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
653 |
var row, col, numFramesFirstCol: LongInt; |
4 | 654 |
begin |
2229
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
655 |
numFramesFirstCol:= SpritesData[Sprite].imageHeight div SpritesData[Sprite].Height; |
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
656 |
row:= Frame mod numFramesFirstCol; |
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
657 |
col:= Frame div numFramesFirstCol; |
081081a61a16
patch for loading sprites on two columns (helps embedded and lowpower machines). must deal with amGirder.png
koda
parents:
2227
diff
changeset
|
658 |
DrawSprite2 (Sprite, X, Y, col, row); |
4 | 659 |
end; |
660 |
||
1939 | 661 |
procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); |
662 |
var r: TSDL_Rect; |
|
663 |
begin |
|
664 |
r.x:= 0; |
|
665 |
r.y:= 0; |
|
666 |
r.w:= SpritesData[Sprite].Width; |
|
667 |
r.h:= SpritesData[Sprite].Height; |
|
668 |
||
669 |
if (X < LeftX) then |
|
670 |
r.x:= LeftX - X; |
|
671 |
if (Y < TopY) then |
|
672 |
r.y:= TopY - Y; |
|
673 |
||
674 |
if (Y + SpritesData[Sprite].Height > BottomY) then |
|
675 |
r.h:= BottomY - Y + 1; |
|
676 |
if (X + SpritesData[Sprite].Width > RightX) then |
|
677 |
r.w:= RightX - X + 1; |
|
678 |
||
679 |
dec(r.h, r.y); |
|
680 |
dec(r.w, r.x); |
|
2230
d6963f72d21a
once again, trying to restore windows compatibility from nemo's experiments
koda
parents:
2229
diff
changeset
|
681 |
|
1939 | 682 |
DrawFromRect(X + r.x, Y + r.y, @r, SpritesData[Sprite].Texture) |
683 |
end; |
|
684 |
||
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
685 |
procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); |
43 | 686 |
var r: TSDL_Rect; |
687 |
begin |
|
688 |
r.x:= FrameX * SpritesData[Sprite].Width; |
|
689 |
r.w:= SpritesData[Sprite].Width; |
|
690 |
r.y:= FrameY * SpritesData[Sprite].Height; |
|
691 |
r.h:= SpritesData[Sprite].Height; |
|
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset
|
692 |
DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture) |
43 | 693 |
end; |
694 |
||
762 | 695 |
procedure DrawCentered(X, Top: LongInt; Source: PTexture); |
95 | 696 |
begin |
2567 | 697 |
DrawTexture(X - Source^.w shr 1, Top, Source) |
4 | 698 |
end; |
699 |
||
1865
ebc6dfca60d4
- nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1854
diff
changeset
|
700 |
procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); |
1916 | 701 |
const VertexBuffer: array [0..3] of TVertex2f = ( |
702 |
(x: -16; y: -16), |
|
703 |
(x: 16; y: -16), |
|
704 |
(x: 16; y: 16), |
|
705 |
(x: -16; y: 16)); |
|
761 | 706 |
var l, r, t, b: real; |
1916 | 707 |
TextureBuffer: array [0..3] of TVertex2f; |
4 | 708 |
begin |
761 | 709 |
|
710 |
t:= Pos * 32 / HHTexture^.h; |
|
711 |
b:= (Pos + 1) * 32 / HHTexture^.h; |
|
712 |
||
713 |
if Dir = -1 then |
|
714 |
begin |
|
715 |
l:= (Step + 1) * 32 / HHTexture^.w; |
|
716 |
r:= Step * 32 / HHTexture^.w |
|
717 |
end else |
|
718 |
begin |
|
719 |
l:= Step * 32 / HHTexture^.w; |
|
720 |
r:= (Step + 1) * 32 / HHTexture^.w |
|
721 |
end; |
|
722 |
||
821
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
723 |
|
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
724 |
glPushMatrix(); |
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
725 |
glTranslatef(X, Y, 0); |
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
726 |
glRotatef(Angle, 0, 0, 1); |
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
727 |
|
761 | 728 |
glBindTexture(GL_TEXTURE_2D, HHTexture^.id); |
729 |
||
1916 | 730 |
TextureBuffer[0].X:= l; |
731 |
TextureBuffer[0].Y:= t; |
|
732 |
TextureBuffer[1].X:= r; |
|
733 |
TextureBuffer[1].Y:= t; |
|
734 |
TextureBuffer[2].X:= r; |
|
735 |
TextureBuffer[2].Y:= b; |
|
736 |
TextureBuffer[3].X:= l; |
|
737 |
TextureBuffer[3].Y:= b; |
|
761 | 738 |
|
1916 | 739 |
glEnableClientState(GL_VERTEX_ARRAY); |
740 |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
761 | 741 |
|
1916 | 742 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
743 |
glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
|
744 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
761 | 745 |
|
1916 | 746 |
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
747 |
glDisableClientState(GL_VERTEX_ARRAY); |
|
761 | 748 |
|
1854 | 749 |
|
750 |
glColor4f(1,1,1,1); |
|
821
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
751 |
|
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
809
diff
changeset
|
752 |
glPopMatrix |
4 | 753 |
end; |
754 |
||
1431 | 755 |
procedure DrawFillRect(r: TSDL_Rect); |
1916 | 756 |
var VertexBuffer: array [0..3] of TVertex2f; |
1431 | 757 |
begin |
758 |
glDisable(GL_TEXTURE_2D); |
|
759 |
||
760 |
glColor4ub(0, 0, 0, 127); |
|
761 |
||
1916 | 762 |
VertexBuffer[0].X:= r.x; |
763 |
VertexBuffer[0].Y:= r.y; |
|
764 |
VertexBuffer[1].X:= r.x + r.w; |
|
765 |
VertexBuffer[1].Y:= r.y; |
|
766 |
VertexBuffer[2].X:= r.x + r.w; |
|
767 |
VertexBuffer[2].Y:= r.y + r.h; |
|
768 |
VertexBuffer[3].X:= r.x; |
|
769 |
VertexBuffer[3].Y:= r.y + r.h; |
|
1431 | 770 |
|
1916 | 771 |
glEnableClientState(GL_VERTEX_ARRAY); |
772 |
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
|
773 |
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
774 |
glDisableClientState(GL_VERTEX_ARRAY); |
|
1431 | 775 |
|
776 |
glColor4f(1, 1, 1, 1); |
|
777 |
glEnable(GL_TEXTURE_2D) |
|
778 |
end; |
|
779 |
||
4 | 780 |
procedure StoreRelease; |
781 |
var ii: TSprite; |
|
782 |
begin |
|
783 |
for ii:= Low(TSprite) to High(TSprite) do |
|
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
784 |
begin |
759 | 785 |
FreeTexture(SpritesData[ii].Texture); |
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
786 |
if SpritesData[ii].Surface <> nil then SDL_FreeSurface(SpritesData[ii].Surface) |
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
787 |
end; |
2786 | 788 |
SDL_FreeSurface(MissionIcons); |
2811 | 789 |
FreeTexture(ropeIconTex); |
1806 | 790 |
FreeTexture(HHTexture) |
4 | 791 |
end; |
792 |
||
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
793 |
|
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
794 |
function CheckCJKFont(s: string; font: THWFont): THWFont; |
2681
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
795 |
var l, i : LongInt; |
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
796 |
u: WideChar; |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
797 |
tmpstr: array[0..256] of WideChar; |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
798 |
begin |
2843 | 799 |
if (font >= CJKfnt16) or (length(s) = 0) then exit(font); |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
800 |
|
2684
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
801 |
l:= Utf8ToUnicode(@tmpstr, Str2PChar(s), length(s))-1; |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
802 |
i:= 0; |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
803 |
while i < l do |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
804 |
begin |
2681
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
805 |
u:= tmpstr[i]; |
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
806 |
if (#$2E80 <= u) and ( |
2684
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
807 |
(u <= #$2FDF ) or // CJK Radicals Supplement / Kangxi Radicals |
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
808 |
((#$2FF0 <= u) and (u <= #$303F)) or // Ideographic Description Characters / CJK Radicals Supplement |
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
809 |
((#$31C0 <= u) and (u <= #$31EF)) or // CJK Strokes |
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
810 |
((#$3200 <= u) and (u <= #$4DBF)) or // Enclosed CJK Letters and Months / CJK Compatibility / CJK Unified Ideographs Extension A |
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
811 |
((#$4E00 <= u) and (u <= #$9FFF)) or // CJK Unified Ideographs |
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
812 |
((#$F900 <= u) and (u <= #$FAFF)) or // CJK Compatibility Ideographs |
04c086d8d9d4
Hopefully this is the last error. Fix the if test, offset by -1 due to how the output appears to be handled.
nemo
parents:
2681
diff
changeset
|
813 |
((#$FE30 <= u) and (u <= #$FE4F))) // CJK Compatibility Forms |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
814 |
then exit(THWFont( ord(font) + ((ord(High(THWFont))+1) div 2) )); |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
815 |
inc(i) |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
816 |
end; |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
817 |
exit(font); |
2681
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
818 |
(* two more to check. pascal WideChar is only 16 bit though |
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
819 |
((#$20000 <= u) and (u >= #$2A6DF)) or // CJK Unified Ideographs Extension B |
dcbb5e98afc7
Drop the LongInt conversion, strip the two tests that are too large
nemo
parents:
2679
diff
changeset
|
820 |
((#$2F800 <= u) and (u >= #$2FA1F))) // CJK Compatibility Ideographs Supplement *) |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
821 |
end; |
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
822 |
|
762 | 823 |
function RenderStringTex(s: string; Color: Longword; font: THWFont): PTexture; |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
824 |
var w, h : LongInt; |
2695 | 825 |
finalSurface: PSDL_Surface; |
95 | 826 |
begin |
1989 | 827 |
if length(s) = 0 then s:= ' '; |
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
828 |
font:= CheckCJKFont(s, font); |
355 | 829 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(s), w, h); |
785 | 830 |
|
2695 | 831 |
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + FontBorder * 2 + 4, h + FontBorder * 2, |
762 | 832 |
32, RMask, GMask, BMask, AMask); |
785 | 833 |
|
2695 | 834 |
TryDo(finalSurface <> nil, 'RenderString: fail to create surface', true); |
785 | 835 |
|
2695 | 836 |
WriteInRoundRect(finalSurface, 0, 0, Color, font, s); |
785 | 837 |
|
2695 | 838 |
TryDo(SDL_SetColorKey(finalSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); |
785 | 839 |
|
2695 | 840 |
RenderStringTex:= Surface2Tex(finalSurface, false); |
785 | 841 |
|
2695 | 842 |
SDL_FreeSurface(finalSurface); |
95 | 843 |
end; |
844 |
||
2017 | 845 |
function RenderSpeechBubbleTex(s: string; SpeechType: Longword; font: THWFont): PTexture; |
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
846 |
var textWidth, textHeight, x, y, w, h, i, j, pos, prevpos, line, numLines, edgeWidth, edgeHeight, cornerWidth, cornerHeight: LongInt; |
2695 | 847 |
finalSurface, tmpsurf, rotatedEdge: PSDL_Surface; |
2017 | 848 |
rect: TSDL_Rect; |
849 |
chars: TSysCharSet = [#9,' ','.',';',':','?','!',',']; |
|
850 |
substr: shortstring; |
|
851 |
edge, corner, tail: TSPrite; |
|
852 |
begin |
|
853 |
||
854 |
case SpeechType of |
|
2376 | 855 |
1: begin; |
856 |
edge:= sprSpeechEdge; |
|
2017 | 857 |
corner:= sprSpeechCorner; |
858 |
tail:= sprSpeechTail; |
|
859 |
end; |
|
2376 | 860 |
2: begin; |
2017 | 861 |
edge:= sprThoughtEdge; |
2376 | 862 |
corner:= sprThoughtCorner; |
2017 | 863 |
tail:= sprThoughtTail; |
864 |
end; |
|
2376 | 865 |
3: begin; |
2017 | 866 |
edge:= sprShoutEdge; |
867 |
corner:= sprShoutCorner; |
|
868 |
tail:= sprShoutTail; |
|
869 |
end; |
|
870 |
end; |
|
871 |
edgeHeight:= SpritesData[edge].Height; |
|
872 |
edgeWidth:= SpritesData[edge].Width; |
|
873 |
cornerWidth:= SpritesData[corner].Width; |
|
874 |
cornerHeight:= SpritesData[corner].Height; |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
875 |
// This one screws up WrapText |
2022 | 876 |
//s:= 'This is the song that never ends. ''cause it goes on and on my friends. Some people, started singing it not knowing what it was. And they''ll just go on singing it forever just because... This is the song that never ends...'; |
2154
3d2917be12c3
Change default output to stderr since /tmp doesn't exist under windows and is useless under iphoneos, add a couple of extra parameters
nemo
parents:
2153
diff
changeset
|
877 |
// This one does not |
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
878 |
//s:= 'This is the song that never ends. cause it goes on and on my friends. Some people, started singing it not knowing what it was. And they will go on singing it forever just because... This is the song that never ends... '; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
879 |
|
2022 | 880 |
numLines:= 0; |
2017 | 881 |
|
882 |
if length(s) = 0 then s:= '...'; |
|
2677
83ad68ceef72
Non-hacked version of CJK handling. Should switch to CJK rendering only if a particular string needs it, instead of based on locale file.
nemo
parents:
2674
diff
changeset
|
883 |
font:= CheckCJKFont(s, font); |
2017 | 884 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(s), w, h); |
2332
351abbbb12f3
Lower bound on speech text width for proper rendering
nemo
parents:
2292
diff
changeset
|
885 |
if w<8 then w:= 8; |
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
886 |
j:= 0; |
2017 | 887 |
if (length(s) > 20) then |
888 |
begin |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
889 |
w:= 0; |
2017 | 890 |
i:= round(Sqrt(length(s)) * 2); |
891 |
s:= WrapText(s, #1, chars, i); |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
892 |
pos:= 1; prevpos:= 0; line:= 0; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
893 |
// Find the longest line for the purposes of centring the text. Font dependant. |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
894 |
while pos <= length(s) do |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
895 |
begin |
2017 | 896 |
if (s[pos] = #1) or (pos = length(s)) then |
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
897 |
begin |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
898 |
inc(numlines); |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
899 |
if s[pos] <> #1 then inc(pos); |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
900 |
while s[prevpos+1] = ' ' do inc(prevpos); |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
901 |
substr:= copy(s, prevpos+1, pos-prevpos-1); |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
902 |
i:= 0; j:= 0; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
903 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(substr), i, j); |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
904 |
if i > w then w:= i; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
905 |
prevpos:= pos; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
906 |
end; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
907 |
inc(pos); |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
908 |
end; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
909 |
end |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
910 |
else numLines := 1; |
2017 | 911 |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
912 |
textWidth:=((w-(cornerWidth-edgeWidth)*2) div edgeWidth)*edgeWidth+edgeWidth; |
2022 | 913 |
textHeight:=(((numlines * h + 2)-((cornerHeight-edgeWidth)*2)) div edgeWidth)*edgeWidth; |
2019 | 914 |
|
2022 | 915 |
textHeight:=max(textHeight,edgeWidth); |
2017 | 916 |
//textWidth:=max(textWidth,SpritesData[tail].Width); |
917 |
rect.x:= 0; |
|
918 |
rect.y:= 0; |
|
2022 | 919 |
rect.w:= textWidth + (cornerWidth * 2); |
920 |
rect.h:= textHeight + cornerHeight*2 - edgeHeight + SpritesData[tail].Height; |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
921 |
//s:= inttostr(w) + ' ' + inttostr(numlines) + ' ' + inttostr(rect.x) + ' '+inttostr(rect.y) + ' ' + inttostr(rect.w) + ' ' + inttostr(rect.h); |
2017 | 922 |
|
2695 | 923 |
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, rect.w, rect.h, 32, RMask, GMask, BMask, AMask); |
2017 | 924 |
|
2695 | 925 |
TryDo(finalSurface <> nil, 'RenderString: fail to create surface', true); |
2017 | 926 |
|
927 |
//////////////////////////////// CORNERS /////////////////////////////// |
|
2695 | 928 |
copyToXY(SpritesData[corner].Surface, finalSurface, 0, 0); /////////////////// NW |
2017 | 929 |
|
930 |
flipSurface(SpritesData[corner].Surface, true); // store all 4 versions in memory to avoid repeated flips? |
|
931 |
x:= 0; |
|
932 |
y:= textHeight + cornerHeight -1; |
|
2695 | 933 |
copyToXY(SpritesData[corner].Surface, finalSurface, x, y); /////////////////// SW |
2017 | 934 |
|
935 |
flipSurface(SpritesData[corner].Surface, false); |
|
936 |
x:= rect.w-cornerWidth-1; |
|
937 |
y:= textHeight + cornerHeight -1; |
|
2695 | 938 |
copyToXY(SpritesData[corner].Surface, finalSurface, x, y); /////////////////// SE |
2017 | 939 |
|
940 |
flipSurface(SpritesData[corner].Surface, true); |
|
941 |
x:= rect.w-cornerWidth-1; |
|
942 |
y:= 0; |
|
2695 | 943 |
copyToXY(SpritesData[corner].Surface, finalSurface, x, y); /////////////////// NE |
2017 | 944 |
flipSurface(SpritesData[corner].Surface, false); // restore original position |
945 |
//////////////////////////////// END CORNERS /////////////////////////////// |
|
946 |
||
947 |
//////////////////////////////// EDGES ////////////////////////////////////// |
|
948 |
x:= cornerWidth; |
|
949 |
y:= 0; |
|
950 |
while x < rect.w-cornerWidth-1 do |
|
951 |
begin |
|
2695 | 952 |
copyToXY(SpritesData[edge].Surface, finalSurface, x, y); ///////////////// top edge |
2017 | 953 |
inc(x,edgeWidth); |
954 |
end; |
|
955 |
flipSurface(SpritesData[edge].Surface, true); |
|
956 |
x:= cornerWidth; |
|
957 |
y:= textHeight + cornerHeight*2 - edgeHeight-1; |
|
958 |
while x < rect.w-cornerWidth-1 do |
|
959 |
begin |
|
2695 | 960 |
copyToXY(SpritesData[edge].Surface, finalSurface, x, y); ///////////////// bottom edge |
2017 | 961 |
inc(x,edgeWidth); |
962 |
end; |
|
963 |
flipSurface(SpritesData[edge].Surface, true); // restore original position |
|
964 |
||
965 |
rotatedEdge:= SDL_CreateRGBSurface(SDL_SWSURFACE, edgeHeight, edgeWidth, 32, RMask, GMask, BMask, AMask); |
|
966 |
x:= rect.w - edgeHeight - 1; |
|
967 |
y:= cornerHeight; |
|
968 |
//// initially was going to rotate in place, but the SDL spec claims width/height are read only |
|
969 |
copyRotatedSurface(SpritesData[edge].Surface,rotatedEdge); |
|
970 |
while y < textHeight + cornerHeight do |
|
971 |
begin |
|
2695 | 972 |
copyToXY(rotatedEdge, finalSurface, x, y); |
2017 | 973 |
inc(y,edgeWidth); |
974 |
end; |
|
975 |
flipSurface(rotatedEdge, false); // restore original position |
|
976 |
x:= 0; |
|
977 |
y:= cornerHeight; |
|
978 |
while y < textHeight + cornerHeight do |
|
979 |
begin |
|
2695 | 980 |
copyToXY(rotatedEdge, finalSurface, x, y); |
2017 | 981 |
inc(y,edgeWidth); |
982 |
end; |
|
983 |
//////////////////////////////// END EDGES ////////////////////////////////////// |
|
984 |
||
985 |
x:= cornerWidth; |
|
986 |
y:= textHeight + cornerHeight * 2 - edgeHeight - 1; |
|
2695 | 987 |
copyToXY(SpritesData[tail].Surface, finalSurface, x, y); |
2017 | 988 |
|
989 |
rect.x:= edgeHeight; |
|
990 |
rect.y:= edgeHeight; |
|
991 |
rect.w:= rect.w - edgeHeight * 2; |
|
992 |
rect.h:= textHeight + cornerHeight * 2 - edgeHeight * 2; |
|
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
993 |
i:= rect.w; |
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
994 |
j:= rect.h; |
2695 | 995 |
SDL_FillRect(finalSurface, @rect, cWhiteColor); |
2017 | 996 |
|
997 |
pos:= 1; prevpos:= 0; line:= 0; |
|
998 |
while pos <= length(s) do |
|
999 |
begin |
|
1000 |
if (s[pos] = #1) or (pos = length(s)) then |
|
1001 |
begin |
|
1002 |
if s[pos] <> #1 then inc(pos); |
|
1003 |
while s[prevpos+1] = ' 'do inc(prevpos); |
|
1004 |
substr:= copy(s, prevpos+1, pos-prevpos-1); |
|
1005 |
if Length(substr) <> 0 then |
|
1006 |
begin |
|
2666 | 1007 |
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, Str2PChar(substr), cNearBlackColorChannels); |
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
1008 |
rect.x:= edgeHeight + 1 + ((i - w) div 2); |
2022 | 1009 |
// trying to more evenly position the text, vertically |
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2022
diff
changeset
|
1010 |
rect.y:= edgeHeight + ((j-(numLines*h)) div 2) + line * h; |
2017 | 1011 |
SDLTry(tmpsurf <> nil, true); |
2695 | 1012 |
SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect); |
2017 | 1013 |
SDL_FreeSurface(tmpsurf); |
1014 |
inc(line); |
|
1015 |
prevpos:= pos; |
|
1016 |
end; |
|
1017 |
end; |
|
1018 |
inc(pos); |
|
1019 |
end; |
|
1020 |
||
2695 | 1021 |
//TryDo(SDL_SetColorKey(finalSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); |
1022 |
RenderSpeechBubbleTex:= Surface2Tex(finalSurface, true); |
|
2017 | 1023 |
|
1024 |
SDL_FreeSurface(rotatedEdge); |
|
2695 | 1025 |
SDL_FreeSurface(finalSurface); |
2017 | 1026 |
end; |
1027 |
||
4 | 1028 |
procedure RenderHealth(var Hedgehog: THedgehog); |
95 | 1029 |
var s: shortstring; |
4 | 1030 |
begin |
2705
2b5625c4ec16
fix a nasty 196 bytes memory leak in engine, plus other stuff for iphone frontend
koda
parents:
2701
diff
changeset
|
1031 |
str(Hedgehog.Gear^.Health, s); |
2b5625c4ec16
fix a nasty 196 bytes memory leak in engine, plus other stuff for iphone frontend
koda
parents:
2701
diff
changeset
|
1032 |
if Hedgehog.HealthTagTex <> nil then |
2b5625c4ec16
fix a nasty 196 bytes memory leak in engine, plus other stuff for iphone frontend
koda
parents:
2701
diff
changeset
|
1033 |
FreeTexture(Hedgehog.HealthTagTex); |
2b5625c4ec16
fix a nasty 196 bytes memory leak in engine, plus other stuff for iphone frontend
koda
parents:
2701
diff
changeset
|
1034 |
Hedgehog.HealthTagTex:= RenderStringTex(s, Hedgehog.Team^.Clan^.Color, fnt16) |
4 | 1035 |
end; |
1036 |
||
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1037 |
function LoadImage(const filename: string; imageFlags: LongInt): PSDL_Surface; |
30 | 1038 |
var tmpsurf: PSDL_Surface; |
355 | 1039 |
s: shortstring; |
4 | 1040 |
begin |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1041 |
WriteToConsole(msgLoading + filename + ' [flags: ' + inttostr(imageFlags) + ']... '); |
2426 | 1042 |
|
2630 | 1043 |
s:= filename + '.png'; |
1044 |
tmpsurf:= IMG_Load(Str2PChar(s)); |
|
2254 | 1045 |
|
2630 | 1046 |
if (imageFlags and ifLowRes) <> 0 then |
2244
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1047 |
begin |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1048 |
s:= filename + '-lowres.png'; |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1049 |
if (tmpsurf <> nil) then |
2376 | 1050 |
begin |
2244
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1051 |
if ((tmpsurf^.w > MaxTextureSize) or (tmpsurf^.h > MaxTextureSize)) then |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1052 |
begin |
2426 | 1053 |
SDL_FreeSurface(tmpsurf); |
2630 | 1054 |
{$IFDEF DEBUGFILE} |
1055 |
AddFileLog('...image too big, trying to load lowres version: ' + s + '...'); |
|
1056 |
{$ENDIF} |
|
2244
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1057 |
tmpsurf:= IMG_Load(Str2PChar(s)) |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1058 |
end; |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1059 |
end |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1060 |
else |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1061 |
begin |
2630 | 1062 |
{$IFDEF DEBUGFILE} |
1063 |
AddFileLog('...image not found, trying to load lowres version: ' + s + '...'); |
|
1064 |
{$ENDIF} |
|
2244
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1065 |
tmpsurf:= IMG_Load(Str2PChar(s)) |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1066 |
end; |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1067 |
end; |
2376 | 1068 |
|
2630 | 1069 |
if tmpsurf = nil then |
2153 | 1070 |
begin |
2630 | 1071 |
OutError(msgFailed, (imageFlags and ifCritical) <> 0); |
1072 |
exit(nil) |
|
2153 | 1073 |
end; |
1074 |
||
2630 | 1075 |
if ((imageFlags and ifIgnoreCaps) = 0) and ((tmpsurf^.w > MaxTextureSize) or (tmpsurf^.h > MaxTextureSize)) then |
2153 | 1076 |
begin |
2244
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1077 |
SDL_FreeSurface(tmpsurf); |
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1078 |
OutError(msgFailedSize, (imageFlags and ifCritical) <> 0); |
2630 | 1079 |
// dummy surface to replace non-critical textures that failed to load due to their size |
2244
853a1db1cff6
routine for loading lower resolution horizont and sky for nature theme when bigger images are not supported; right now they are not installed, but they could be useful for less powerful machines in general
koda
parents:
2240
diff
changeset
|
1080 |
exit(SDL_CreateRGBSurface(SDL_SWSURFACE, 32, 32, 32, RMask, GMask, BMask, AMask)); |
2153 | 1081 |
end; |
351 | 1082 |
|
2630 | 1083 |
tmpsurf:= doSurfaceConversion(tmpsurf); |
1084 |
||
1085 |
if (imageFlags and ifTransparent) <> 0 then |
|
1086 |
TryDo(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); |
|
1087 |
||
1088 |
WriteLnToConsole('(' + inttostr(tmpsurf^.w) + ',' + inttostr(tmpsurf^.h) + ') '); |
|
1089 |
WriteLnToConsole(msgOK); |
|
1090 |
||
1091 |
LoadImage:= tmpsurf //Result |
|
753 | 1092 |
end; |
1093 |
||
2428 | 1094 |
function glLoadExtension(extension : string) : boolean; |
1095 |
begin |
|
2580
aeccc8f51d3f
completes touch input/control (problems with moving camera)
koda
parents:
2578
diff
changeset
|
1096 |
{$IFDEF IPHONEOS} |
aeccc8f51d3f
completes touch input/control (problems with moving camera)
koda
parents:
2578
diff
changeset
|
1097 |
glLoadExtension:= false; |
aeccc8f51d3f
completes touch input/control (problems with moving camera)
koda
parents:
2578
diff
changeset
|
1098 |
{$ELSE} |
2428 | 1099 |
glLoadExtension:= glext_LoadExtension(extension); |
2438 | 1100 |
{$ENDIF} |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1101 |
{$IFDEF DEBUGFILE} |
2428 | 1102 |
if not glLoadExtension then |
2575 | 1103 |
AddFileLog('OpenGL - "' + extension + '" failed to load') |
2428 | 1104 |
else |
2575 | 1105 |
AddFileLog('OpenGL - "' + extension + '" loaded'); |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1106 |
{$ENDIF} |
2428 | 1107 |
end; |
1108 |
||
753 | 1109 |
procedure SetupOpenGL; |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1110 |
var vendor: shortstring; |
753 | 1111 |
begin |
2697 | 1112 |
{$IFDEF IPHONEOS} |
1113 |
//these are good performance savers, perhaps we could enable them by default |
|
1114 |
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0); |
|
1115 |
SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 1); |
|
1116 |
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); |
|
1117 |
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); |
|
1118 |
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); |
|
1119 |
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); |
|
1120 |
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); |
|
1121 |
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); |
|
1122 |
//SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); |
|
1123 |
{$ELSE} |
|
1124 |
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); |
|
1125 |
{$ENDIF} |
|
1126 |
||
1127 |
{$IFNDEF SDL13} |
|
1128 |
// this attribute is default in 1.3 and must be enabled in MacOSX |
|
1129 |
{$IFNDEF DARWIN} |
|
1130 |
if cVSyncInUse then |
|
1131 |
{$ENDIF} |
|
1132 |
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); |
|
1133 |
{$ENDIF} |
|
1134 |
||
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1135 |
glGetIntegerv(GL_MAX_TEXTURE_SIZE, @MaxTextureSize); |
2697 | 1136 |
|
2698 | 1137 |
vendor:= LowerCase(string(pchar(glGetString(GL_VENDOR)))); |
2697 | 1138 |
{$IFDEF DEBUGFILE} |
2701
3a8560c00f78
settings tab has now a very nice iphone-like interface
koda
parents:
2699
diff
changeset
|
1139 |
AddFileLog('OpenGL-- Renderer: ' + string(pchar(glGetString(GL_RENDERER)))); |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1140 |
AddFileLog(' |----- Vendor: ' + vendor); |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1141 |
AddFileLog(' |----- Version: ' + string(pchar(glGetString(GL_VERSION)))); |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1142 |
AddFileLog(' \----- GL_MAX_TEXTURE_SIZE: ' + inttostr(MaxTextureSize)); |
2153 | 1143 |
{$ENDIF} |
2252 | 1144 |
|
2697 | 1145 |
if MaxTextureSize <= 0 then |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1146 |
begin |
2633 | 1147 |
MaxTextureSize:= 1024; |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1148 |
{$IFDEF DEBUGFILE} |
2633 | 1149 |
AddFileLog('OpenGL Warning - driver didn''t provide any valid max texture size; assuming 1024'); |
2568
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1150 |
{$ENDIF} |
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1151 |
end; |
e654cbfb23ba
Bunch of neat stuff by Smaxx. ATI check, translucent name tags to reduce terrain fail, disabling health crates on invulnerable hogs. Also tweaks to prior stuff.
nemo
parents:
2567
diff
changeset
|
1152 |
|
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1153 |
{$IFNDEF IPHONEOS} |
2697 | 1154 |
if StrPos(Str2PChar(vendor), Str2PChar('nvidia')) <> nil then |
1155 |
cGPUVendor:= gvNVIDIA |
|
1156 |
else if StrPos(Str2PChar(vendor), Str2PChar('intel')) <> nil then |
|
1157 |
cGPUVendor:= gvATI |
|
1158 |
else if StrPos(Str2PChar(vendor), Str2PChar('ati')) <> nil then |
|
1159 |
cGPUVendor:= gvIntel; |
|
2647 | 1160 |
//SupportNPOTT:= glLoadExtension('GL_ARB_texture_non_power_of_two'); |
2735 | 1161 |
{$ELSE} |
1162 |
cGPUVendor:= gvApple; |
|
1163 |
{$ENDIF} |
|
1164 |
||
1165 |
{$IFDEF DEBUGFILE} |
|
1166 |
if cGPUVendor = gvUnknown then |
|
1167 |
AddFileLog('OpenGL Warning - unknown hardware vendor; please report'); |
|
1168 |
{$ELSE} |
|
1169 |
// just avoid 'never used' compiler warning for now |
|
1170 |
if cGPUVendor = gvUnknown then cGPUVendor:= gvUnknown; |
|
2428 | 1171 |
{$ENDIF} |
1172 |
||
2697 | 1173 |
// set view port to whole window |
2724 | 1174 |
{$IFDEF IPHONEOS} |
1175 |
glViewport(0, 0, cScreenHeight, cScreenWidth); |
|
1176 |
{$ELSE} |
|
2697 | 1177 |
glViewport(0, 0, cScreenWidth, cScreenHeight); |
2724 | 1178 |
{$ENDIF} |
2428 | 1179 |
|
2697 | 1180 |
glMatrixMode(GL_MODELVIEW); |
1181 |
// prepare default translation/scaling |
|
1182 |
glLoadIdentity(); |
|
2724 | 1183 |
{$IFDEF IPHONEOS} |
1184 |
glRotatef(-90, 0, 0, 1); |
|
1185 |
{$ENDIF} |
|
2697 | 1186 |
glScalef(2.0 / cScreenWidth, -2.0 / cScreenHeight, 1.0); |
1187 |
glTranslatef(0, -cScreenHeight / 2, 0); |
|
2428 | 1188 |
|
2697 | 1189 |
// enable alpha blending |
1190 |
glEnable(GL_BLEND); |
|
1191 |
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
|
4 | 1192 |
end; |
1193 |
||
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2154
diff
changeset
|
1194 |
procedure SetScale(f: GLfloat); |
2724 | 1195 |
var |
1196 |
{$IFDEF IPHONEOS} |
|
1197 |
scale: GLfloat = 1.5; |
|
1198 |
{$ELSE} |
|
1199 |
scale: GLfloat = 2.0; |
|
1200 |
{$ENDIF} |
|
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2154
diff
changeset
|
1201 |
begin |
2697 | 1202 |
// leave immediately if scale factor did not change |
1203 |
if f = cScaleFactor then exit; |
|
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2154
diff
changeset
|
1204 |
|
2724 | 1205 |
if f = scale then glPopMatrix // "return" to default scaling |
1206 |
else // other scaling |
|
2428 | 1207 |
begin |
2724 | 1208 |
glPushMatrix; // save default scaling |
2697 | 1209 |
glLoadIdentity; |
2724 | 1210 |
{$IFDEF IPHONEOS} |
1211 |
glRotatef(-90, 0, 0, 1); |
|
1212 |
{$ENDIF} |
|
2697 | 1213 |
glScalef(f / cScreenWidth, -f / cScreenHeight, 1.0); |
1214 |
glTranslatef(0, -cScreenHeight / 2, 0); |
|
2428 | 1215 |
end; |
2258 | 1216 |
|
2697 | 1217 |
cScaleFactor:= f; |
2161
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2154
diff
changeset
|
1218 |
end; |
0c8634241fa4
Some work on zooming. Hedgewars are now unplayable.
unc0rr
parents:
2154
diff
changeset
|
1219 |
|
510 | 1220 |
//////////////////////////////////////////////////////////////////////////////// |
1221 |
procedure AddProgress; |
|
1222 |
var r: TSDL_Rect; |
|
766 | 1223 |
texsurf: PSDL_Surface; |
510 | 1224 |
begin |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1225 |
if Step = 0 then |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1226 |
begin |
2697 | 1227 |
{$IFDEF SDL_IMAGE_NEWER} |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1228 |
WriteToConsole('Init SDL_image... '); |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1229 |
SDLTry(IMG_Init(IMG_INIT_PNG) <> 0, true); |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1230 |
WriteLnToConsole(msgOK); |
2697 | 1231 |
{$ENDIF} |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1232 |
|
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1233 |
WriteToConsole(msgLoading + 'progress sprite: '); |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1234 |
texsurf:= LoadImage(Pathz[ptGraphics] + '/Progress', ifCritical or ifTransparent); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1235 |
|
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1236 |
ProgrTex:= Surface2Tex(texsurf, false); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1237 |
|
2697 | 1238 |
squaresize:= texsurf^.w shr 1; |
1239 |
numsquares:= texsurf^.h div squaresize; |
|
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1240 |
SDL_FreeSurface(texsurf); |
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2670
diff
changeset
|
1241 |
end; |
1045 | 1242 |
|
2697 | 1243 |
TryDo(ProgrTex <> nil, 'Error - Progress Texure is nil!', true); |
2284 | 1244 |
|
2697 | 1245 |
glClear(GL_COLOR_BUFFER_BIT); |
1246 |
glEnable(GL_TEXTURE_2D); |
|
1247 |
if Step < numsquares then r.x:= 0 |
|
1248 |
else r.x:= squaresize; |
|
1249 |
||
1250 |
r.y:= (Step mod numsquares) * squaresize; |
|
1251 |
r.w:= squaresize; |
|
1252 |
r.h:= squaresize; |
|
1253 |
||
1254 |
DrawFromRect( -squaresize div 2, (cScreenHeight - squaresize) shr 1, @r, ProgrTex); |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1255 |
|
2697 | 1256 |
glDisable(GL_TEXTURE_2D); |
1257 |
SDL_GL_SwapBuffers(); |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1258 |
{$IFDEF SDL13} |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1259 |
SDL_RenderPresent(); |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1260 |
{$ENDIF} |
2697 | 1261 |
inc(Step); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1262 |
|
510 | 1263 |
end; |
1264 |
||
2222 | 1265 |
|
510 | 1266 |
procedure FinishProgress; |
1267 |
begin |
|
2697 | 1268 |
WriteLnToConsole('Freeing progress surface... '); |
1269 |
FreeTexture(ProgrTex); |
|
2689 | 1270 |
|
1271 |
{$IFDEF IPHONEOS} |
|
2697 | 1272 |
// show overlay buttons |
1273 |
IPH_showControls; |
|
2689 | 1274 |
{$ENDIF} |
510 | 1275 |
end; |
1276 |
||
2017 | 1277 |
procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean); |
1278 |
var y, x, i, j: LongInt; |
|
1279 |
tmpPixel: Longword; |
|
1280 |
pixels: PLongWordArray; |
|
1281 |
begin |
|
1282 |
TryDo(Surface^.format^.BytesPerPixel = 4, 'flipSurface failed, expecting 32 bit surface', true); |
|
1283 |
pixels:= Surface^.pixels; |
|
1284 |
if Vertical then |
|
1285 |
for y := 0 to (Surface^.h div 2) - 1 do |
|
1286 |
for x := 0 to Surface^.w - 1 do |
|
1287 |
begin |
|
1288 |
i:= y * Surface^.w + x; |
|
1289 |
j:= (Surface^.h - y - 1) * Surface^.w + x; |
|
1290 |
tmpPixel:= pixels^[i]; |
|
1291 |
pixels^[i]:= pixels^[j]; |
|
1292 |
pixels^[j]:= tmpPixel; |
|
1293 |
end |
|
1294 |
else |
|
1295 |
for x := 0 to (Surface^.w div 2) - 1 do |
|
1296 |
for y := 0 to Surface^.h -1 do |
|
1297 |
begin |
|
1298 |
i:= y*Surface^.w + x; |
|
1299 |
j:= y*Surface^.w + (Surface^.w - x - 1); |
|
1300 |
tmpPixel:= pixels^[i]; |
|
1301 |
pixels^[i]:= pixels^[j]; |
|
1302 |
pixels^[j]:= tmpPixel; |
|
1303 |
end; |
|
1304 |
end; |
|
1305 |
||
1306 |
procedure copyToXY(src, dest: PSDL_Surface; destX, destY: Integer); |
|
1307 |
var srcX, srcY, i, j, maxDest: LongInt; |
|
1308 |
srcPixels, destPixels: PLongWordArray; |
|
1309 |
begin |
|
1310 |
maxDest:= (dest^.pitch div 4) * dest^.h; |
|
1311 |
srcPixels:= src^.pixels; |
|
1312 |
destPixels:= dest^.pixels; |
|
1313 |
||
1314 |
for srcX:= 0 to src^.w - 1 do |
|
1315 |
for srcY:= 0 to src^.h - 1 do |
|
1316 |
begin |
|
1317 |
i:= (destY + srcY) * (dest^.pitch div 4) + destX + srcX; |
|
1318 |
j:= srcY * (src^.pitch div 4) + srcX; |
|
1319 |
// basic skip of transparent pixels - cleverness would be to do true alpha |
|
2592 | 1320 |
if (i < maxDest) and (AMask and srcPixels^[j] <> 0) then destPixels^[i]:= srcPixels^[j]; |
2017 | 1321 |
end; |
1322 |
end; |
|
1323 |
||
1324 |
procedure copyRotatedSurface(src, dest: PSDL_Surface); // this is necessary since width/height are read only in SDL, apparently |
|
1325 |
var y, x, i, j: LongInt; |
|
1326 |
srcPixels, destPixels: PLongWordArray; |
|
1327 |
begin |
|
1328 |
TryDo(src^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true); |
|
1329 |
TryDo(dest^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true); |
|
1330 |
||
1331 |
srcPixels:= src^.pixels; |
|
1332 |
destPixels:= dest^.pixels; |
|
1333 |
||
1334 |
j:= 0; |
|
1335 |
for x := 0 to src^.w - 1 do |
|
1336 |
for y := 0 to src^.h - 1 do |
|
1337 |
begin |
|
1338 |
i:= (src^.h - 1 - y) * (src^.pitch div 4) + x; |
|
1339 |
destPixels^[j]:= srcPixels^[i]; |
|
1340 |
inc(j) |
|
1341 |
end; |
|
1342 |
end; |
|
1343 |
||
2747 | 1344 |
function RenderHelpWindow(caption, subcaption, description, extra: shortstring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture; |
1345 |
var tmpsurf: PSDL_SURFACE; |
|
1346 |
w, h, i, j: LongInt; |
|
1347 |
font: THWFont; |
|
1348 |
r, r2: TSDL_Rect; |
|
1349 |
wa, ha: LongInt; |
|
1350 |
tmpline, tmpline2, tmpdesc: shortstring; |
|
1351 |
begin |
|
2843 | 1352 |
// make sure there is a caption as well as a sub caption - description is optional |
1353 |
if caption = '' then caption:= '???'; |
|
1354 |
if subcaption = '' then subcaption:= ' '; |
|
1355 |
||
2841 | 1356 |
font:= CheckCJKFont(caption,fnt16); |
1357 |
font:= CheckCJKFont(subcaption,font); |
|
1358 |
font:= CheckCJKFont(description,font); |
|
1359 |
font:= CheckCJKFont(extra,font); |
|
2747 | 1360 |
|
1361 |
w:= 0; |
|
1362 |
h:= 0; |
|
1363 |
wa:= FontBorder * 2 + 4; |
|
1364 |
ha:= FontBorder * 2; |
|
1365 |
||
1366 |
// TODO: Recheck height/position calculation |
|
1367 |
||
1368 |
// get caption's dimensions |
|
1369 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(caption), i, j); |
|
1370 |
// width adds 36 px (image + space) |
|
1371 |
w:= i + 36 + wa; |
|
1372 |
h:= j + ha; |
|
1373 |
||
1374 |
// get sub caption's dimensions |
|
1375 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(subcaption), i, j); |
|
1376 |
// width adds 36 px (image + space) |
|
1377 |
if w < (i + 36 + wa) then w:= i + 36 + wa; |
|
1378 |
inc(h, j + ha); |
|
1379 |
||
1380 |
// get description's dimensions |
|
1381 |
tmpdesc:= description; |
|
1382 |
while tmpdesc <> '' do |
|
1383 |
begin |
|
1384 |
tmpline:= tmpdesc; |
|
1385 |
SplitByChar(tmpline, tmpdesc, '|'); |
|
1386 |
if tmpline <> '' then |
|
1387 |
begin |
|
1388 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(tmpline), i, j); |
|
1389 |
if w < (i + wa) then w:= i + wa; |
|
1390 |
inc(h, j + ha) |
|
1391 |
end |
|
1392 |
end; |
|
1393 |
||
1394 |
if extra <> '' then |
|
1395 |
begin |
|
1396 |
// get extra label's dimensions |
|
1397 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(extra), i, j); |
|
1398 |
if w < (i + wa) then w:= i + wa; |
|
1399 |
inc(h, j + ha); |
|
1400 |
end; |
|
1401 |
||
1402 |
// add borders space |
|
1403 |
inc(w, wa); |
|
1404 |
inc(h, ha + 8); |
|
1405 |
||
1406 |
tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask); |
|
1407 |
TryDo(tmpsurf <> nil, 'RenderHelpWindow: fail to create surface', true); |
|
1408 |
||
1409 |
// render border and background |
|
1410 |
r.x:= 0; |
|
1411 |
r.y:= 0; |
|
1412 |
r.w:= w; |
|
1413 |
r.h:= h; |
|
1414 |
DrawRoundRect(@r, cWhiteColor, cNearBlackColor, tmpsurf, true); |
|
1415 |
||
1416 |
// render caption |
|
1417 |
r:= WriteInRect(tmpsurf, 36 + FontBorder + 2, ha, $ffffffff, font, caption); |
|
1418 |
// render sub caption |
|
1419 |
r:= WriteInRect(tmpsurf, 36 + FontBorder + 2, r.y + r.h, $ffc7c7c7, font, subcaption); |
|
1420 |
||
1421 |
// render all description lines |
|
1422 |
tmpdesc:= description; |
|
1423 |
while tmpdesc <> '' do |
|
1424 |
begin |
|
1425 |
tmpline:= tmpdesc; |
|
1426 |
SplitByChar(tmpline, tmpdesc, '|'); |
|
1427 |
r2:= r; |
|
1428 |
if tmpline <> '' then |
|
1429 |
begin |
|
1430 |
r:= WriteInRect(tmpsurf, FontBorder + 2, r.y + r.h, $ff707070, font, tmpline); |
|
1431 |
||
1432 |
// render highlighted caption (if there's a ':') |
|
1433 |
SplitByChar(tmpline, tmpline2, ':'); |
|
1434 |
if tmpline2 <> '' then |
|
1435 |
WriteInRect(tmpsurf, FontBorder + 2, r2.y + r2.h, $ffc7c7c7, font, tmpline + ':'); |
|
1436 |
end |
|
1437 |
end; |
|
1438 |
||
1439 |
if extra <> '' then |
|
1440 |
r:= WriteInRect(tmpsurf, FontBorder + 2, r.y + r.h, extracolor, font, extra); |
|
1441 |
||
1442 |
r.x:= FontBorder + 6; |
|
1443 |
r.y:= FontBorder + 4; |
|
1444 |
r.w:= 32; |
|
1445 |
r.h:= 32; |
|
1446 |
SDL_FillRect(tmpsurf, @r, $ffffffff); |
|
1447 |
SDL_UpperBlit(iconsurf, iconrect, tmpsurf, @r); |
|
1448 |
||
1449 |
RenderHelpWindow:= Surface2Tex(tmpsurf, true); |
|
1450 |
SDL_FreeSurface(tmpsurf) |
|
1451 |
end; |
|
1452 |
||
1453 |
procedure RenderWeaponTooltip(atype: TAmmoType); |
|
2753 | 1454 |
{$IFNDEF IPHONEOS} |
2747 | 1455 |
var r: TSDL_Rect; |
1456 |
i: LongInt; |
|
1457 |
extra: string; |
|
1458 |
extracolor: LongInt; |
|
1459 |
begin |
|
1460 |
// don't do anything if the window shouldn't be shown |
|
1461 |
if not cWeaponTooltips then |
|
1462 |
begin |
|
1463 |
WeaponTooltipTex:= nil; |
|
1464 |
exit |
|
1465 |
end; |
|
1466 |
||
1467 |
// free old texture |
|
1468 |
FreeWeaponTooltip; |
|
1469 |
||
1470 |
// image region |
|
1471 |
i:= LongInt(atype) - 1; |
|
1472 |
r.x:= (i shr 5) * 32; |
|
1473 |
r.y:= (i mod 32) * 32; |
|
1474 |
r.w:= 32; |
|
1475 |
r.h:= 32; |
|
1476 |
||
1477 |
// default (no extra text) |
|
1478 |
extra:= ''; |
|
1479 |
extracolor:= 0; |
|
1480 |
||
1481 |
if (CurrentTeam <> nil) and (Ammoz[atype].SkipTurns >= CurrentTeam^.Clan^.TurnNumber) then // weapon or utility is not yet available |
|
1482 |
begin |
|
1483 |
extra:= trmsg[sidNotYetAvailable]; |
|
1484 |
extracolor:= LongInt($ffc77070); |
|
1485 |
end |
|
1486 |
else if (Ammoz[atype].Ammo.Propz and ammoprop_NoRoundEndHint) <> 0 then // weapon or utility won't end your turn |
|
1487 |
begin |
|
1488 |
extra:= trmsg[sidNoEndTurn]; |
|
1489 |
extracolor:= LongInt($ff70c770); |
|
1490 |
end |
|
1491 |
else |
|
1492 |
begin |
|
1493 |
extra:= ''; |
|
1494 |
extracolor:= 0; |
|
1495 |
end; |
|
1496 |
||
1497 |
// render window and return the texture |
|
1498 |
WeaponTooltipTex:= RenderHelpWindow(trammo[Ammoz[atype].NameId], trammoc[Ammoz[atype].NameId], trammod[Ammoz[atype].NameId], extra, extracolor, SpritesData[sprAMAmmos].Surface, @r) |
|
2753 | 1499 |
end; |
1500 |
{$ELSE} |
|
1501 |
begin end; |
|
2747 | 1502 |
{$ENDIF} |
1503 |
||
1504 |
procedure ShowWeaponTooltip(x, y: LongInt); |
|
1505 |
begin |
|
1506 |
{$IFNDEF IPHONEOS} |
|
1507 |
// draw the texture if it exists |
|
1508 |
if WeaponTooltipTex <> nil then |
|
1509 |
DrawTexture(x, y, WeaponTooltipTex) |
|
1510 |
{$ENDIF} |
|
1511 |
end; |
|
1512 |
||
1513 |
procedure FreeWeaponTooltip; |
|
1514 |
begin |
|
1515 |
{$IFNDEF IPHONEOS} |
|
1516 |
// free the existing texture (if there's any) |
|
1517 |
if WeaponTooltipTex = nil then |
|
1518 |
exit; |
|
1519 |
FreeTexture(WeaponTooltipTex); |
|
1520 |
WeaponTooltipTex:= nil |
|
1521 |
{$ENDIF} |
|
1522 |
end; |
|
1523 |
||
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
1524 |
procedure init_uStore; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
1525 |
begin |
2801 | 1526 |
PixelFormat:= nil; |
1527 |
SDLPrimSurface:= nil; |
|
1528 |
{$IFNDEF IPHONEOS}cGPUVendor:= gvUnknown;{$ENDIF} |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
1529 |
|
2801 | 1530 |
cScaleFactor:= 2.0; |
1531 |
SupportNPOTT:= false; |
|
1532 |
Step:= 0; |
|
1533 |
ProgrTex:= nil; |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
1534 |
end; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
1535 |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1536 |
procedure free_uStore; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1537 |
begin |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1538 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2705
diff
changeset
|
1539 |
|
4 | 1540 |
end. |