# HG changeset patch # User unc0rr # Date 1320475087 -10800 # Node ID 68db7625060de1d2add45917ffeed1568b36bd34 # Parent 627b5752733ad1085b6eec6a06d84fabecb4d077# Parent 835392304f81acf1069adade45e59635378b852f merge diff -r 627b5752733a -r 68db7625060d hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/GSHandlers.inc Sat Nov 05 09:38:07 2011 +0300 @@ -1424,10 +1424,13 @@ end; if b then - DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs( - Gear^.dY) * 7, + begin + DrawTunnel(HHGear^.X + Gear^.dX * cHHRadius, + HHGear^.Y + Gear^.dY * cHHRadius - _1 - + ((hwAbs(Gear^.dX) / (hwAbs(Gear^.dX) + hwAbs(Gear^.dY))) * _0_5 * 7), Gear^.dX, Gear^.dY, - cHHRadius * 5, cHHRadius * 2 + 7); + cHHStepTicks, cHHRadius * 2 + 7); + end; if (TurnTimeLeft = 0) or (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then begin diff -r 627b5752733a -r 68db7625060d hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/SDLh.pas Sat Nov 05 09:38:07 2011 +0300 @@ -107,6 +107,7 @@ SDL_INIT_NOPARACHUTE = $00100000; SDL_INIT_EVERYTHING = $0000FFFF; + SDL_ALLEVENTS = $FFFFFFFF; SDL_APPINPUTFOCUS = $02; SDL_BUTTON_WHEELUP = 4; SDL_BUTTON_WHEELDOWN = 5; @@ -136,9 +137,18 @@ SDL_JOYHATMOTION = $602; SDL_JOYBUTTONDOWN = $603; SDL_JOYBUTTONUP = $604; - //TODO: implement otheer event types + SDL_FINGERDOWN = $700; + SDL_FINGERUP = $701; + SDL_FINGERMOTION = $702; + SDL_TOUCHBUTTONDOWN = $703; + SDL_TOUCHBUTTONUP = $704; + SDL_DOLLARGESTURE = $800; + SDL_DOLLARRECORD = $801; + SDL_MULTIGESTURE = $802; + SDL_CLIPBOARDUPDATE = $900; SDL_USEREVENT = $8000; SDL_LASTEVENT = $FFFF; + // no compatibility events $7000 // SDL_Surface flags SDL_SWSURFACE = $00000000; //*< Not used */ @@ -228,8 +238,6 @@ SDL_HWPALETTE = $20000000; SDL_DOUBLEBUF = $40000000; SDL_FULLSCREEN = $80000000; - - SDL_ALLEVENTS = $FFFFFFFF; {$ENDIF} {$IFDEF ENDIAN_LITTLE} @@ -286,6 +294,10 @@ /////////////////////// TYPE DEFINITIONS /////////////////////// ///////////////////////////////////////////////////////////////// +// two important reference points for the wanderers of this area +// http://www.freepascal.org/docs-html/ref/refsu5.html +// http://www.freepascal.org/docs-html/prog/progsu144.html + type {$IFDEF SDL13} PSDL_Window = Pointer; @@ -311,15 +323,15 @@ PSDL_PixelFormat = ^TSDL_PixelFormat; TSDL_PixelFormat = record {$IFDEF SDL13} - format: Longword; - palette: Pointer; // actually it is a PSDL_Palette + format: LongWord; + palette: Pointer; BitsPerPixel : Byte; BytesPerPixel: Byte; padding: array[0..1] of Byte; - RMask : Longword; - GMask : Longword; - BMask : Longword; - AMask : Longword; + RMask : LongWord; + GMask : LongWord; + BMask : LongWord; + AMask : LongWord; Rloss : Byte; Gloss : Byte; Bloss : Byte; @@ -342,11 +354,11 @@ Gshift: Byte; Bshift: Byte; Ashift: Byte; - RMask : Longword; - GMask : Longword; - BMask : Longword; - AMask : Longword; - colorkey: Longword; + RMask : LongWord; + GMask : LongWord; + BMask : LongWord; + AMask : LongWord; + colorkey: LongWord; alpha: Byte; {$ENDIF} end; @@ -355,10 +367,10 @@ PSDL_Surface = ^TSDL_Surface; TSDL_Surface = record - flags : Longword; + flags : LongWord; format: PSDL_PixelFormat; w, h : LongInt; - pitch : Word; + pitch : {$IFDEF SDL13}LongInt{$ELSE}Word{$ENDIF}; pixels: Pointer; offset: LongInt; {$IFDEF SDL13} @@ -374,12 +386,12 @@ PSDL_Color = ^TSDL_Color; TSDL_Color = record - case byte of + case Byte of 0: ( r: Byte; g: Byte; b: Byte; unused: Byte; ); - 1: ( value: Longword; ); + 1: ( value: LongWord; ); end; @@ -390,8 +402,8 @@ TClose = function( context: PSDL_RWops ): LongInt; cdecl; TStdio = record - autoclose: {$IFDEF SDL13}boolean{$ELSE}LongInt{$ENDIF}; - fp: pointer; + autoclose: {$IFDEF SDL13}Boolean{$ELSE}LongInt{$ENDIF}; + fp: Pointer; end; TMem = record @@ -409,7 +421,7 @@ read: TRead; write: TWrite; close: TClose; - type_: Longword; + type_: LongWord; case Byte of 0: (stdio: TStdio); 1: (mem: TMem); @@ -423,31 +435,84 @@ TSDL_KeySym = record scancode: LongInt; sym: LongInt; - modifier: Smallint; - unicode: LongInt; + modifier: Word; + unicode: LongWord; end; TSDL_WindowEvent = record - type_: LongInt; - windowID: LongInt; - event: byte; - padding1, padding2, padding3: byte; + type_: LongWord; + windowID: LongWord; + event: Byte; + padding1, padding2, padding3: Byte; data1, data2: LongInt; end; + + // available in sdl12 but not exposed + TSDL_TextEditingEvent = record + type_: LongWord; + windowID: LongWord; + text: array[0..31] of Byte; + start, lenght: LongInt; + end; + + // available in sdl12 but not exposed + TSDL_TextInputEvent = record + type_: LongWord; + windowID: LongWord; + text: array[0..31] of Byte; + end; + + TSDL_TouchFingerEvent = record + type_: LongWord; + windowId: LongWord; + touchId: Int64; + fingerId: Int64; + state, padding1, padding2, padding3: Byte; + x, y: Word; + dx, dy: SmallInt; + pressure: Word; + end; + + TSDL_TouchButtonEvent = record + type_: LongWord; + windowId: LongWord; + touchId: Int64; + state, button, padding1, padding2: Byte; + end; + + TSDL_MultiGestureEvent = record + type_: LongWord; + windowId: LongWord; + touchId: Int64; + dTheta, dDist, x, y: Single; + numFingers, padding: Word; + end; + + TSDL_DollarGestureEvent = record + type_: LongWord; + windowId: LongWord; + touchId: Int64; + gesturedId: Int64; + numFingers: LongWord; + error: Single; + end; + + TSDL_SysWMEvent = record + type_: LongWord; + msg: Pointer; + end; {$ELSE} TSDL_KeySym = record scancode: Byte; - sym: Longword; - modifier: Longword; + sym: LongWord; + modifier: LongWord; unicode: Word; end; - // these two are present in sdl1.3 but only for backward compatibility - // and in 1.3 type_ is LongInt, not byte TSDL_ActiveEvent = record - type_: byte; - gain: byte; - state: byte; + type_: Byte; + gain: Byte; + state: Byte; end; TSDL_ResizeEvent = record @@ -458,88 +523,75 @@ TSDL_KeyboardEvent = record {$IFDEF SDL13} - type_: LongInt; - windowID: LongInt; - state, repeat_, padding2, padding3: byte; + type_: LongWord; + windowID: LongWord; + state, repeat_, padding2, padding3: Byte; {$ELSE} - type_: byte; - which: byte; - state: byte; + type_, which, state: Byte; {$ENDIF} keysym: TSDL_KeySym; end; -//TODO: implement SDL_TextEditingEvent + SDL_TextInputEvent for sdl13 - - // this structure is wrong but the correct version makes the game hang TSDL_MouseMotionEvent = record - which: byte; - state: byte; {$IFDEF SDL13} - type_: LongInt; - windowID: LongInt; - padding1, padding2: byte; + type_: LongWord; + windowID: LongWord; + state, padding1, padding2, padding3: Byte; x, y, z, xrel, yrel : LongInt; - pressure, pressure_max, pressure_min, - rotation, tilt, cursor: LongInt; {$ELSE} - type_: byte; - x, y, xrel, yrel : word; + type_, which, state: Byte; + x, y, xrel, yrel : Word; {$ENDIF} end; TSDL_MouseButtonEvent = record {$IFDEF SDL13} - type_: LongInt; - windowID: LongInt; + type_: LongWord; + windowID: LongWord; + buttonm, state, padding1, padding2: Byte; x, y: LongInt; - padding1: byte; {$ELSE} - type_, - which, - button, - state: byte; - x, y: word; + type_, which, button, state: Byte; + x, y: Word; {$ENDIF} end; + TSDL_MouseWheelEvent = record + type_: LongWord; {$IFDEF SDL13} - TSDL_MouseWheelEvent = record - type_: LongInt; - windowID: LongInt; + windowID: LongWord; +{$ELSE} which: Byte; +{$ENDIF} x, y: LongInt; end; -//TODO: implement SDL_ProximityEvent -{$ENDIF} - TSDL_JoyAxisEvent = record - type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; + type_: {$IFDEF SDL13}LongWord{$ELSE}Byte{$ENDIF}; which: Byte; axis: Byte; {$IFDEF SDL13} padding1, padding2: Byte; value: LongInt; {$ELSE} - value: Smallint; + value: SmallInt; {$ENDIF} end; TSDL_JoyBallEvent = record - type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; + type_: {$IFDEF SDL13}LongWord{$ELSE}Byte{$ENDIF}; which: Byte; ball: Byte; {$IFDEF SDL13} padding1, padding2: Byte; xrel, yrel: LongInt; {$ELSE} - xrel, yrel: Smallint; + xrel, yrel: SmallInt; {$ENDIF} end; TSDL_JoyHatEvent = record - type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; + type_: {$IFDEF SDL13}LongWord{$ELSE}Byte{$ENDIF}; which: Byte; hat: Byte; value: Byte; @@ -549,7 +601,7 @@ end; TSDL_JoyButtonEvent = record - type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; + type_: {$IFDEF SDL13}LongWord{$ELSE}Byte{$ENDIF}; which: Byte; button: Byte; state: Byte; @@ -558,16 +610,14 @@ {$ENDIF} end; -//TODO: implement SDL_TouchButtonEvent, SDL_MultiGestureEvent, SDL_DollarGestureEvent - TSDL_QuitEvent = record - type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; + type_: {$IFDEF SDL13}LongWord{$ELSE}Byte{$ENDIF}; end; TSDL_UserEvent = record {$IFDEF SDL13} - type_: LongInt; - windowID: LongInt; + type_: LongWord; + windowID: LongWord; {$ELSE} type_: Byte; {$ENDIF} @@ -583,8 +633,8 @@ SDL_WINDOWEVENT: (window: TSDL_WindowEvent); SDL_KEYDOWN, SDL_KEYUP: (key: TSDL_KeyboardEvent); - SDL_TEXTEDITING, - SDL_TEXTINPUT: (edit: byte); + SDL_TEXTEDITING: (edit: TSDL_TextEditingEvent); + SDL_TEXTINPUT: (tedit: TSDL_TextInputEvent); SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent); SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP: (button: TSDL_MouseButtonEvent); @@ -596,10 +646,18 @@ SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent); SDL_QUITEV: (quit: TSDL_QuitEvent); SDL_USEREVENT: (user: TSDL_UserEvent); - //TODO: implement other events + SDL_SYSWMEVENT: (syswm: TSDL_SysWMEvent); + SDL_FINGERDOWN, + SDL_FINGERUP, + SDL_FINGERMOTION: (tfinger: TSDL_TouchFingerEvent); + SDL_TOUCHBUTTONUP, + SDL_TOUCHBUTTONDOWN: (tbutton: TSDL_TouchButtonEvent); + SDL_MULTIGESTURE: (mgesture: TSDL_MultiGestureEvent); + SDL_DOLLARGESTURE: (dgesture: TSDL_DollarGestureEvent); + SDL_ALLEVENTS: (foo: shortstring); {$ELSE} case Byte of - SDL_NOEVENT: (type_: byte); + SDL_NOEVENT: (type_: Byte); SDL_ACTIVEEVENT: (active: TSDL_ActiveEvent); SDL_KEYDOWN, SDL_KEYUP: (key: TSDL_KeyboardEvent); @@ -614,6 +672,7 @@ SDL_QUITEV: (quit: TSDL_QuitEvent); //SDL_SYSWMEVENT,SDL_EVENT_RESERVEDA,SDL_EVENT_RESERVEDB SDL_VIDEORESIZE: (resize: TSDL_ResizeEvent); + SDL_ALLEVENTS: (foo: shortstring); {$ENDIF} end; @@ -654,7 +713,7 @@ ); {$IFDEF SDL13} - TSDL_ArrayByteOrder = ( // array component order, low byte -> high byte + TSDL_ArrayByteOrder = ( // array component order, low Byte -> high Byte SDL_ARRAYORDER_NONE, SDL_ARRAYORDER_RGB, SDL_ARRAYORDER_RGBA, @@ -678,9 +737,9 @@ {* SDL_mixer *} PMixChunk = ^TMixChunk; TMixChunk = record - allocated: Longword; + allocated: LongWord; abuf : PByte; - alen : Longword; + alen : LongWord; volume : PByte; end; TMusic = (MUS_CMD, MUS_WAV, MUS_MOD, MUS_MID, MUS_OGG, MUS_MP3); @@ -688,13 +747,13 @@ TMidiSong = record samples : LongInt; - events : pointer; + events : Pointer; end; TMusicUnion = record case Byte of 0: ( midi : TMidiSong ); - 1: ( ogg : pointer); + 1: ( ogg : Pointer); end; PMixMusic = ^TMixMusic; @@ -703,7 +762,7 @@ {* SDL_net *} TIPAddress = record - host: Longword; + host: LongWord; port: Word; end; @@ -729,16 +788,12 @@ {* SDL *} -function SDL_Init(flags: Longword): LongInt; cdecl; external SDLLibName; +function SDL_Init(flags: LongWord): LongInt; cdecl; external SDLLibName; function SDL_InitSubSystem(flags: LongWord): LongInt; cdecl; external SDLLibName; procedure SDL_Quit; cdecl; external SDLLibName; -function SDL_VideoDriverName(var namebuf; maxlen: LongInt): PChar; cdecl; external SDLLibName; -function SDL_EnableUNICODE(enable: LongInt): LongInt; cdecl; external SDLLibName; -function SDL_EnableKeyRepeat(delay_, interval: LongInt): LongInt; cdecl; external SDLLibName; - -procedure SDL_Delay(msec: Longword); cdecl; external SDLLibName; -function SDL_GetTicks: Longword; cdecl; external SDLLibName; +procedure SDL_Delay(msec: LongWord); cdecl; external SDLLibName; +function SDL_GetTicks: LongWord; cdecl; external SDLLibName; function SDL_MustLock(Surface: PSDL_Surface): Boolean; function SDL_LockSurface(Surface: PSDL_Surface): LongInt; cdecl; external SDLLibName; @@ -746,23 +801,23 @@ function SDL_GetError: PChar; cdecl; external SDLLibName; -function SDL_SetVideoMode(width, height, bpp: LongInt; flags: Longword): PSDL_Surface; cdecl; external SDLLibName; -function SDL_CreateRGBSurface(flags: Longword; Width, Height, Depth: LongInt; RMask, GMask, BMask, AMask: Longword): PSDL_Surface; cdecl; external SDLLibName; -function SDL_CreateRGBSurfaceFrom(pixels: Pointer; width, height, depth, pitch: LongInt; RMask, GMask, BMask, AMask: Longword): PSDL_Surface; cdecl; external SDLLibName; +function SDL_SetVideoMode(width, height, bpp: LongInt; flags: LongWord): PSDL_Surface; cdecl; external SDLLibName; +function SDL_CreateRGBSurface(flags: LongWord; Width, Height, Depth: LongInt; RMask, GMask, BMask, AMask: LongWord): PSDL_Surface; cdecl; external SDLLibName; +function SDL_CreateRGBSurfaceFrom(pixels: Pointer; width, height, depth, pitch: LongInt; RMask, GMask, BMask, AMask: LongWord): PSDL_Surface; cdecl; external SDLLibName; procedure SDL_FreeSurface(Surface: PSDL_Surface); cdecl; external SDLLibName; -function SDL_SetColorKey(surface: PSDL_Surface; flag, key: Longword): LongInt; cdecl; external SDLLibName; -function SDL_SetAlpha(surface: PSDL_Surface; flag, key: Longword): LongInt; cdecl; external SDLLibName; +function SDL_SetColorKey(surface: PSDL_Surface; flag, key: LongWord): LongInt; cdecl; external SDLLibName; +function SDL_SetAlpha(surface: PSDL_Surface; flag, key: LongWord): LongInt; cdecl; external SDLLibName; function SDL_ConvertSurface(src: PSDL_Surface; fmt: PSDL_PixelFormat; flags: LongInt): PSDL_Surface; cdecl; external SDLLibName; function SDL_UpperBlit(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): LongInt; cdecl; external SDLLibName; -function SDL_FillRect(dst: PSDL_Surface; dstrect: PSDL_Rect; color: Longword): LongInt; cdecl; external SDLLibName; -procedure SDL_UpdateRect(Screen: PSDL_Surface; x, y: LongInt; w, h: Longword); cdecl; external SDLLibName; +function SDL_FillRect(dst: PSDL_Surface; dstrect: PSDL_Rect; color: LongWord): LongInt; cdecl; external SDLLibName; +procedure SDL_UpdateRect(Screen: PSDL_Surface; x, y: LongInt; w, h: LongWord); cdecl; external SDLLibName; function SDL_Flip(Screen: PSDL_Surface): LongInt; cdecl; external SDLLibName; -procedure SDL_GetRGB(pixel: Longword; fmt: PSDL_PixelFormat; r, g, b: PByte); cdecl; external SDLLibName; -procedure SDL_GetRGBA(pixel: Longword; fmt: PSDL_PixelFormat; r, g, b, a: PByte); cdecl; external SDLLibName; -function SDL_MapRGB(format: PSDL_PixelFormat; r, g, b: Byte): Longword; cdecl; external SDLLibName; -function SDL_MapRGBA(format: PSDL_PixelFormat; r, g, b, a: Byte): Longword; cdecl; external SDLLibName; +procedure SDL_GetRGB(pixel: LongWord; fmt: PSDL_PixelFormat; r, g, b: PByte); cdecl; external SDLLibName; +procedure SDL_GetRGBA(pixel: LongWord; fmt: PSDL_PixelFormat; r, g, b, a: PByte); cdecl; external SDLLibName; +function SDL_MapRGB(format: PSDL_PixelFormat; r, g, b: Byte): LongWord; cdecl; external SDLLibName; +function SDL_MapRGBA(format: PSDL_PixelFormat; r, g, b, a: Byte): LongWord; cdecl; external SDLLibName; function SDL_DisplayFormat(Surface: PSDL_Surface): PSDL_Surface; cdecl; external SDLLibName; function SDL_DisplayFormatAlpha(Surface: PSDL_Surface): PSDL_Surface; cdecl; external SDLLibName; @@ -771,11 +826,12 @@ function SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: LongInt): LongInt; cdecl; external SDLLibName; {$IFDEF SDL13} -function SDL_CreateWindow(title: PChar; x,y,w,h, flags: LongInt): PSDL_Window; cdecl; external SDLLibName; -function SDL_CreateRenderer(window: PSDL_Window; index, flags: LongInt): PSDL_Renderer; cdecl; external SDLLibName; +function SDL_CreateWindow(title: PChar; x,y,w,h: LongInt; flags: LongWord): PSDL_Window; cdecl; external SDLLibName; +function SDL_CreateRenderer(window: PSDL_Window; index: LongInt; flags: LongWord): PSDL_Renderer; cdecl; external SDLLibName; function SDL_DestroyWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName; function SDL_DestroyRenderer(renderer: PSDL_Renderer): LongInt; cdecl; external SDLLibName; procedure SDL_SetWindowSize(window: PSDL_Window; w, h: LongInt); cdecl; external SDLLibName; +function SDL_GetCurrentVideoDriver:Pchar; cdecl; external SDLLibName; function SDL_GL_CreateContext(window: PSDL_Window): PSDL_GLContext; cdecl; external SDLLibName; procedure SDL_GL_DeleteContext(context: PSDL_GLContext); cdecl; external SDLLibName; @@ -786,38 +842,37 @@ function SDL_GetNumVideoDisplays: LongInt; cdecl; external SDLLibName; procedure SDL_ShowWindow(window: PSDL_Window); cdecl; external SDLLibName; -function SDL_SetRenderDrawColor(renderer: PSDL_Renderer; r,g,b,a: byte): LongInt; cdecl; external SDLLibName; +function SDL_SetRenderDrawColor(renderer: PSDL_Renderer; r,g,b,a: Byte): LongInt; cdecl; external SDLLibName; function SDL_GetRenderer(window: PSDL_Window): PSDL_Renderer; cdecl; external SDLLibName; function SDL_RenderFillRect(renderer: PSDL_Renderer; rect: PSDL_Rect): LongInt; cdecl; external SDLLibName; function SDL_RenderClear(renderer: PSDL_Renderer): LongInt; cdecl; external SDLLibName; procedure SDL_RenderPresent(renderer: PSDL_Renderer); cdecl; external SDLLibName; -function SDL_RenderReadPixels(renderer: PSDL_Renderer; rect: PSDL_Rect; format: LongInt; pixels: pointer; pitch: LongInt): LongInt; cdecl; external SDLLibName; +function SDL_RenderReadPixels(renderer: PSDL_Renderer; rect: PSDL_Rect; format: LongInt; pixels: Pointer; pitch: LongInt): LongInt; cdecl; external SDLLibName; function SDL_RenderSetViewport(window: PSDL_Window; rect: PSDL_Rect): LongInt; cdecl; external SDLLibName; -function SDL_SelectMouse(index: LongInt): LongInt; cdecl; external SDLLibName; function SDL_GetRelativeMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName; -function SDL_GetNumMice: LongInt; cdecl; external SDLLibName; -function SDL_PixelFormatEnumToMasks(format: TSDL_ArrayByteOrder; bpp: PLongInt; Rmask, Gmask, Bmask, Amask: PLongInt): boolean; cdecl; external SDLLibName; +function SDL_PixelFormatEnumToMasks(format: TSDL_ArrayByteOrder; bpp: PLongInt; Rmask, Gmask, Bmask, Amask: PLongInt): Boolean; cdecl; external SDLLibName; procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName; -function SDL_SetHint(name, value: PChar): boolean; cdecl; external SDLLibName; +function SDL_SetHint(name, value: PChar): Boolean; cdecl; external SDLLibName; +procedure SDL_StartTextInput; cdecl; external SDLLibName; -function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; minType, maxType: LongInt): LongInt; cdecl; external SDLLibName; +function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; minType, maxType: LongWord): LongInt; cdecl; external SDLLibName; {$ELSE} -function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; mask: Longword): LongInt; cdecl; external SDLLibName; +function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; mask: LongWord): LongInt; cdecl; external SDLLibName; {$ENDIF} function SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName; -function SDL_GetKeyName(key: Longword): PChar; cdecl; external SDLLibName; +function SDL_GetKeyName(key: LongWord): PChar; cdecl; external SDLLibName; procedure SDL_PumpEvents; cdecl; external SDLLibName; function SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName; function SDL_WaitEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName; -procedure SDL_SetEventFilter( filter : TSDL_EventFilter ); cdecl; external SDLLibName; +procedure SDL_SetEventFilter(filter: TSDL_EventFilter); cdecl; external SDLLibName; function SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName; -procedure SDL_WM_SetIcon(icon: PSDL_Surface; mask : byte); cdecl; external SDLLibName; +procedure SDL_WM_SetIcon(icon: PSDL_Surface; mask : Byte); cdecl; external SDLLibName; procedure SDL_WM_SetCaption(title: PChar; icon: PChar); cdecl; external SDLLibName; function SDL_WM_ToggleFullScreen(surface: PSDL_Surface): LongInt; cdecl; external SDLLibName; @@ -854,14 +909,17 @@ {* Compatibility between SDL-1.2 and SDL-1.3 *} procedure SDL_WarpMouse(x, y: Word); {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF} function SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName {$IFDEF SDL13} name 'SDL_GetKeyboardState'{$ENDIF}; -function SDL_AllocFormat(format: Longword): PSDL_PixelFormat; {$IFDEF SDL13}cdecl; external SDLLibName;{$ENDIF} +function SDL_AllocFormat(format: LongWord): PSDL_PixelFormat; {$IFDEF SDL13}cdecl; external SDLLibName;{$ENDIF} procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); {$IFDEF SDL13}cdecl; external SDLLibName;{$ENDIF} +function SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar; {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF} +function SDL_EnableUNICODE(enable: LongInt): LongInt; {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF} +function SDL_EnableKeyRepeat(delay_, interval: LongInt): LongInt; {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF} (* SDL_ttf *) function TTF_Init: LongInt; cdecl; external SDL_TTFLibName; procedure TTF_Quit; cdecl; external SDL_TTFLibName; -function TTF_SizeUTF8(font: PTTF_Font; const text: PChar; out w, h: LongInt): LongInt; cdecl; external SDL_TTFLibName; +function TTF_SizeUTF8(font: PTTF_Font; const text: PChar; w, h: PLongInt): LongInt; cdecl; external SDL_TTFLibName; function TTF_RenderUTF8_Solid(font: PTTF_Font; const text: PChar; fg: TSDL_Color): PSDL_Surface; cdecl; external SDL_TTFLibName; function TTF_RenderUTF8_Blended(font: PTTF_Font; const text: PChar; fg: TSDL_Color): PSDL_Surface; cdecl; external SDL_TTFLibName; @@ -927,13 +985,13 @@ function SDLNet_CheckSockets(_set: PSDLNet_SocketSet; timeout: LongInt): LongInt; cdecl; external SDL_NetLibName; -procedure SDLNet_Write16(value: Word; buf: pointer); -procedure SDLNet_Write32(value: LongWord; buf: pointer); -function SDLNet_Read16(buf: pointer): Word; -function SDLNet_Read32(buf: pointer): LongWord; +procedure SDLNet_Write16(value: Word; buf: Pointer); +procedure SDLNet_Write32(value: LongWord; buf: Pointer); +function SDLNet_Read16(buf: Pointer): Word; +function SDLNet_Read32(buf: Pointer): LongWord; implementation -uses uVariables; +uses strings, uVariables; {$IFDEF SDL13} // this needs to be reimplemented because in SDL_compat.c the window is the one created in the SDL_SetVideoMode @@ -942,8 +1000,31 @@ begin SDL_WarpMouseInWindow(SDLwindow, x, y); end; + +function SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar; +var name : PChar = nil; +begin + name:= SDL_GetCurrentVideoDriver(); + if (name <> nil) and (namebuf <> nil) then + begin + strlcopy(namebuf, name, maxlen); + exit(namebuf) + end; + exit(name); +end; + +function SDL_EnableUNICODE(enable: LongInt): LongInt; +begin + SDL_StartTextInput(); + exit(0); +end; + +function SDL_EnableKeyRepeat(delay_, interval: LongInt): LongInt; +begin + exit(0); +end; {$ELSE} -function SDL_AllocFormat(format: Longword): PSDL_PixelFormat; +function SDL_AllocFormat(format: LongWord): PSDL_PixelFormat; const conversionFormat: TSDL_PixelFormat = ( palette: nil; BitsPerPixel: 32; BytesPerPixel: 4; Rloss: 0; Gloss: 0; Bloss: 0; Aloss: 0; @@ -993,13 +1074,13 @@ end; {$ENDIF} -procedure SDLNet_Write16(value: Word; buf: pointer); +procedure SDLNet_Write16(value: Word; buf: Pointer); begin PByteArray(buf)^[1]:= value; PByteArray(buf)^[0]:= value shr 8 end; -procedure SDLNet_Write32(value: LongWord; buf: pointer); +procedure SDLNet_Write32(value: LongWord; buf: Pointer); begin PByteArray(buf)^[3]:= value; PByteArray(buf)^[2]:= value shr 8; @@ -1007,13 +1088,13 @@ PByteArray(buf)^[0]:= value shr 24 end; -function SDLNet_Read16(buf: pointer): Word; +function SDLNet_Read16(buf: Pointer): Word; begin SDLNet_Read16:= PByteArray(buf)^[1] or (PByteArray(buf)^[0] shl 8) end; -function SDLNet_Read32(buf: pointer): LongWord; +function SDLNet_Read32(buf: Pointer): LongWord; begin SDLNet_Read32:= PByteArray(buf)^[3] or (PByteArray(buf)^[2] shl 8) or diff -r 627b5752733a -r 68db7625060d hedgewars/uChat.pas --- a/hedgewars/uChat.pas Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/uChat.pas Sat Nov 05 09:38:07 2011 +0300 @@ -84,7 +84,7 @@ font:= CheckCJKFont(str, fnt16); w:= 0; h:= 0; // avoid compiler hints -TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), w, h); +TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @w, @h); resSurface:= SDL_CreateRGBSurface(0, toPowerOf2(w), toPowerOf2(h), 32, RMask, GMask, BMask, AMask); diff -r 627b5752733a -r 68db7625060d hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/uCollisions.pas Sat Nov 05 09:38:07 2011 +0300 @@ -52,7 +52,8 @@ function TestRectancleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean; -function CalcSlopeTangentBelowGear(Gear: PGear; var outDeltaX, outDeltaY: LongInt): boolean; +// returns: negative sign if going downhill to left, value is steepness (noslope/error = _0, 45° = _0_5) +function CalcSlopeBelowGear(Gear: PGear): hwFloat; function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): Boolean; implementation @@ -403,7 +404,7 @@ if (dx.QWordValue > _0_995.QWordValue ) or (dy.QWordValue > _0_995.QWordValue ) then begin // scale - s := _1 / Distance(dx,dy); + s := _0_995 / Distance(dx,dy); dx := s * dx; dy := s * dy; end; @@ -519,17 +520,12 @@ exit(true); end; -function CalcSlopeTangentBelowGear(Gear: PGear; var outDeltaX, outDeltaY: LongInt): boolean; +function CalcSlopeBelowGear(Gear: PGear): hwFloat; var dx, dy: hwFloat; - collX, i, y, x, gx: LongInt; + collX, i, y, x, gx, sdx, sdy: LongInt; isColl, succ: Boolean; begin -// save original dx/dy -dx:= Gear^.dX; -dy:= Gear^.dY; -Gear^.dX.QWordValue:= 0; -Gear^.dY:= _1; y:= hwRound(Gear^.Y) + Gear^.Radius; gx:= hwRound(Gear^.X); @@ -553,15 +549,32 @@ end; if isColl then - succ := CalcSlopeTangent(Gear, collX, y, outDeltaX, outDeltaY, 255) -else - succ := false; + begin + // save original dx/dy + dx := Gear^.dX; + dy := Gear^.dY; + + Gear^.dX.QWordValue:= 0; + Gear^.dX.isNegative:= (collX >= gx); + Gear^.dY:= _1; + + sdx:= 0; + sdy:= 0; + succ := CalcSlopeTangent(Gear, collX, y, sdx, sdy, 255); -// restore original dx/dy -Gear^.dX:= dx; -Gear^.dY:= dy; + // restore original dx/dy + Gear^.dX := dx; + Gear^.dY := dy; -CalcSlopeTangentBelowGear := succ; + if succ and (sdx <> 0) and (sdy <> 0) then + begin + dx := int2hwFloat(sdy) / (abs(sdx) + abs(sdy)); + dx.isNegative := (sdx * sdy) < 0; + exit (dx); + end; + end; + +CalcSlopeBelowGear := _0; end; procedure initModule; diff -r 627b5752733a -r 68db7625060d hedgewars/uRenderUtils.pas --- a/hedgewars/uRenderUtils.pas Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/uRenderUtils.pas Sat Nov 05 09:38:07 2011 +0300 @@ -68,7 +68,7 @@ clr: TSDL_Color; finalRect: TSDL_Rect; begin - TTF_SizeUTF8(Fontz[Font].Handle, Str2PChar(s), w, h); + TTF_SizeUTF8(Fontz[Font].Handle, Str2PChar(s), @w, @h); finalRect.x:= X; finalRect.y:= Y; finalRect.w:= w + FontBorder * 2 + 4; @@ -173,7 +173,7 @@ if length(s) = 0 then s:= ' '; font:= CheckCJKFont(s, font); w:= 0; h:= 0; // avoid compiler hints - TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(s), w, h); + TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(s), @w, @h); finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + FontBorder * 2 + 4, h + FontBorder * 2, 32, RMask, GMask, BMask, AMask); @@ -229,7 +229,7 @@ if length(s) = 0 then s:= '...'; font:= CheckCJKFont(s, font); w:= 0; h:= 0; // avoid compiler hints - TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(s), w, h); + TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(s), @w, @h); if w<8 then w:= 8; j:= 0; if (length(s) > 20) then @@ -248,7 +248,7 @@ while s[prevpos+1] = ' ' do inc(prevpos); substr:= copy(s, prevpos+1, pos-prevpos-1); i:= 0; j:= 0; - TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(substr), i, j); + TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(substr), @i, @j); if i > w then w:= i; prevpos:= pos; end; diff -r 627b5752733a -r 68db7625060d hedgewars/uStore.pas --- a/hedgewars/uStore.pas Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/uStore.pas Sat Nov 05 09:38:07 2011 +0300 @@ -56,7 +56,7 @@ finalRect: TSDL_Rect; begin w:= 0; h:= 0; // avoid compiler hints -TTF_SizeUTF8(Fontz[Font].Handle, Str2PChar(s), w, h); +TTF_SizeUTF8(Fontz[Font].Handle, Str2PChar(s), @w, @h); finalRect.x:= X + FontBorder + 2; finalRect.y:= Y + FontBorder; finalRect.w:= w + FontBorder * 2 + 4; @@ -796,13 +796,13 @@ // TODO: Recheck height/position calculation // get caption's dimensions -TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(caption), i, j); +TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(caption), @i, @j); // width adds 36 px (image + space) w:= i + 36 + wa; h:= j + ha; // get sub caption's dimensions -TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(subcaption), i, j); +TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(subcaption), @i, @j); // width adds 36 px (image + space) if w < (i + 36 + wa) then w:= i + 36 + wa; inc(h, j + ha); @@ -815,7 +815,7 @@ SplitByChar(tmpline, tmpdesc, '|'); if tmpline <> '' then begin - TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(tmpline), i, j); + TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(tmpline), @i, @j); if w < (i + wa) then w:= i + wa; inc(h, j + ha) end @@ -824,7 +824,7 @@ if extra <> '' then begin // get extra label's dimensions - TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(extra), i, j); + TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(extra), @i, @j); if w < (i + wa) then w:= i + wa; inc(h, j + ha); end; diff -r 627b5752733a -r 68db7625060d hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Sat Nov 05 09:37:17 2011 +0300 +++ b/hedgewars/uWorld.pas Sat Nov 05 09:38:07 2011 +0300 @@ -185,8 +185,16 @@ WorldDy:= - (LAND_HEIGHT - (playHeight div 2)) + (cScreenHeight div 2); AMSlotSize:= 33; {$IFDEF IPHONEOS} -AMxOffset:= 10; -AMyOffset:= 10 + 123; // moved downwards +if isPhone() then + begin + AMxOffset:= -30 + cScreenHeight div 2; + AMyOffset:= 10; + end +else + begin + AMxOffset:= AMSlotSize + cScreenHeight div 2; + AMyOffset:= -10 + cScreenWidth div 3; + end; AMWidth:= (cMaxSlotAmmoIndex + 1) * AMSlotSize + AMxOffset; {$ELSE} AMxOffset:= 10; @@ -210,205 +218,206 @@ Slot, Pos, STurns: LongInt; Ammo: PHHAmmo; begin -if (TurnTimeLeft = 0) or (not CurrentTeam^.ExtDriven and (((CurAmmoGear = nil) or ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) = 0)) and hideAmmoMenu)) then - bShowAmmoMenu:= false; -if bShowAmmoMenu then - begin - FollowGear:= nil; - if AMxShift = AMWidth then prevPoint.X:= 0; - if (cReducedQuality and rqSlowMenu) <> 0 then - AMxShift:= 0 - else - if AMxShift > MENUSPEED then - dec(AMxShift, MENUSPEED) - else - AMxShift:= 0; - end else - begin - if AMxShift = 0 then - begin - CursorPoint.X:= cScreenWidth shr 1; - CursorPoint.Y:= cScreenHeight shr 1; - prevPoint:= CursorPoint; - end; - if (cReducedQuality and rqSlowMenu) <> 0 then - AMxShift:= AMWidth - else - if AMxShift < (AMWidth - MENUSPEED) then - inc(AMxShift, MENUSPEED) - else - AMxShift:= AMWidth; - end; -Ammo:= nil; -if (CurrentTeam <> nil) and (CurrentHedgehog <> nil) and (not CurrentTeam^.ExtDriven) and (CurrentHedgehog^.BotLevel = 0) then - Ammo:= CurrentHedgehog^.Ammo -else if (LocalAmmo <> -1) then - Ammo:= GetAmmoByNum(LocalAmmo); -Pos:= -1; -if Ammo = nil then - begin - bShowAmmoMenu:= false; - exit - end; -SlotsNum:= 0; -x:= (cScreenWidth shr 1) - AMWidth + AMxShift; + if (TurnTimeLeft = 0) or (not CurrentTeam^.ExtDriven and (((CurAmmoGear = nil) or + ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) = 0)) and hideAmmoMenu)) then + bShowAmmoMenu:= false; -{$IFDEF IPHONEOS} -Slot:= cMaxSlotIndex; -x:= x - cOffsetY; -y:= AMyOffset; -dec(y, BORDERSIZE); -DrawSprite(sprAMCorners, x - BORDERSIZE, y, 0); -for i:= 0 to cMaxSlotAmmoIndex do - DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 0); -DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 1); -inc(y, BORDERSIZE); - -for i:= 0 to cMaxSlotIndex do - if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then + if bShowAmmoMenu then + // show ammo menu begin - if (cScreenHeight - CursorPoint.Y >= y) and (cScreenHeight - CursorPoint.Y <= y + AMSlotSize) then Slot:= i; - inc(SlotsNum); - DrawSprite(sprAMBorderVertical, x - BORDERSIZE, y, 0); - t:= 0; - g:= 0; - while (t <= cMaxSlotAmmoIndex) and (Ammo^[i, t].Count > 0) do + FollowGear:= nil; + if AMxShift = AMWidth then prevPoint.X:= 0; + if (cReducedQuality and rqSlowMenu) <> 0 then AMxShift:= 0 + else + if AMxShift > MENUSPEED then dec(AMxShift, MENUSPEED) + else AMxShift:= 0; + end + else + // hide ammo menu + begin + if AMxShift = 0 then begin - DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); - if (Ammo^[i, t].AmmoType <> amNothing) then - begin - STurns:= Ammoz[Ammo^[i, t].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber; - - if STurns >= 0 then - begin - DrawSprite(sprAMAmmosBW, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); - if STurns < 100 then DrawSprite(sprTurnsLeft, x + (g + 1) * AMSlotSize - 16, y + AMSlotSize - 16, STurns); - end else - DrawSprite(sprAMAmmos, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); - if (Slot = i) - and (CursorPoint.X >= x + g * AMSlotSize) - and (CursorPoint.X <= x + (g + 1) * AMSlotSize) then - begin - if (STurns < 0) then DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 0); - Pos:= t; - end; - inc(g) - end; - inc(t) + CursorPoint.X:= cScreenWidth shr 1; + CursorPoint.Y:= cScreenHeight shr 1; + prevPoint:= CursorPoint; end; - for g:= g to cMaxSlotAmmoIndex do - DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); - DrawSprite(sprAMBorderVertical, x + AMWidth - AMxOffset, y, 1); - inc(y, AMSlotSize); + if (cReducedQuality and rqSlowMenu) <> 0 then AMxShift:= AMWidth+2 + else + if AMxShift < (AMWidth - MENUSPEED) then inc(AMxShift, MENUSPEED) + else AMxShift:= AMWidth; end; -DrawSprite(sprAMCorners, x - BORDERSIZE, y, 2); -for i:= 0 to cMaxSlotAmmoIndex do - DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 1); -DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 3); -{$ELSE} -Slot:= 0; -y:= cScreenHeight - AMyOffset; -DrawSprite(sprAMCorners, x - BORDERSIZE, y, 2); -for i:= 0 to cMaxSlotAmmoIndex + 1 do - DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 1); -DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 3); -dec(y, AMSlotSize); -DrawSprite(sprAMBorderVertical, x - BORDERSIZE, y, 0); -for i:= 0 to cMaxSlotAmmoIndex do - DrawSprite(sprAMSlot, x + i * AMSlotSize, y, 2); -DrawSprite(sprAMSlot, x + (cMaxSlotAmmoIndex + 1) * AMSlotSize, y, 1); -DrawSprite(sprAMBorderVertical, x + AMWidth - AMxOffset, y, 1); + // give the assigned ammo to hedgehog + Ammo:= nil; + if (CurrentTeam <> nil) and (CurrentHedgehog <> nil) and + (not CurrentTeam^.ExtDriven) and (CurrentHedgehog^.BotLevel = 0) then + Ammo:= CurrentHedgehog^.Ammo + else if (LocalAmmo <> -1) then + Ammo:= GetAmmoByNum(LocalAmmo); + Pos:= -1; + if Ammo = nil then + begin + bShowAmmoMenu:= false; + exit + end; + SlotsNum:= 0; + x:= (cScreenWidth shr 1) - AMWidth + AMxShift; -for i:= cMaxSlotIndex downto 0 do - if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then - begin - if (cScreenHeight - CursorPoint.Y >= y - AMSlotSize) and (cScreenHeight - CursorPoint.Y <= y) then Slot:= i; - dec(y, AMSlotSize); - inc(SlotsNum); - DrawSprite(sprAMBorderVertical, x - BORDERSIZE, y, 0); - DrawSprite(sprAMSlot, x, y, 1); - DrawSprite(sprAMSlotKeys, x, y + 1, i); - t:= 0; - g:= 1; - while (t <= cMaxSlotAmmoIndex) and (Ammo^[i, t].Count > 0) do +{$IFDEF IPHONEOS} + Slot:= cMaxSlotIndex; + x:= x - cOffsetY; + y:= AMyOffset; + dec(y, BORDERSIZE); + DrawSprite(sprAMCorners, x - BORDERSIZE, y, 0); + for i:= 0 to cMaxSlotAmmoIndex do + DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 0); + DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 1); + inc(y, BORDERSIZE); + + for i:= 0 to cMaxSlotIndex do + if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then begin - DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); - if (Ammo^[i, t].AmmoType <> amNothing) then + if (cScreenHeight - CursorPoint.Y >= y) and (cScreenHeight - CursorPoint.Y <= y + AMSlotSize) then Slot:= i; + inc(SlotsNum); + DrawSprite(sprAMBorderVertical, x - BORDERSIZE, y, 0); + t:= 0; + g:= 0; + while (t <= cMaxSlotAmmoIndex) and (Ammo^[i, t].Count > 0) do begin - STurns:= Ammoz[Ammo^[i, t].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber; - - if STurns >= 0 then - begin - DrawSprite(sprAMAmmosBW, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); - if STurns < 100 then DrawSprite(sprTurnsLeft, x + (g + 1) * AMSlotSize - 16, y + AMSlotSize - 16, STurns); - end else - DrawSprite(sprAMAmmos, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); - if (Slot = i) - and (CursorPoint.X >= x + g * AMSlotSize) - and (CursorPoint.X <= x + (g + 1) * AMSlotSize) then + DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); + if (Ammo^[i, t].AmmoType <> amNothing) then begin - if (STurns < 0) then DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 0); - Pos:= t; + STurns:= Ammoz[Ammo^[i, t].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber; + + if STurns >= 0 then + begin + DrawSprite(sprAMAmmosBW, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); + if STurns < 100 then DrawSprite(sprTurnsLeft, x + (g + 1) * AMSlotSize - 16, y + AMSlotSize - 16, STurns); + end + else + DrawSprite(sprAMAmmos, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); + if (Slot = i) and (CursorPoint.X >= x + g * AMSlotSize) and + (CursorPoint.X <= x + (g + 1) * AMSlotSize) then + begin + if (STurns < 0) then DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 0); + Pos:= t; + end; + inc(g) end; - inc(g) + inc(t) end; - inc(t) + for g:= g to cMaxSlotAmmoIndex do + DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); + DrawSprite(sprAMBorderVertical, x + AMWidth - AMxOffset, y, 1); + inc(y, AMSlotSize); end; - for g:= g to cMaxSlotAmmoIndex + 1 do - DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); - DrawSprite(sprAMBorderVertical, x + AMWidth - AMxOffset, y, 1); - end; + + DrawSprite(sprAMCorners, x - BORDERSIZE, y, 2); + for i:= 0 to cMaxSlotAmmoIndex do + DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 1); + DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 3); +{$ELSE} + Slot:= 0; + y:= cScreenHeight - AMyOffset; + DrawSprite(sprAMCorners, x - BORDERSIZE, y, 2); + for i:= 0 to cMaxSlotAmmoIndex + 1 do + DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 1); + DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 3); + dec(y, AMSlotSize); + DrawSprite(sprAMBorderVertical, x - BORDERSIZE, y, 0); + for i:= 0 to cMaxSlotAmmoIndex do + DrawSprite(sprAMSlot, x + i * AMSlotSize, y, 2); + DrawSprite(sprAMSlot, x + (cMaxSlotAmmoIndex + 1) * AMSlotSize, y, 1); + DrawSprite(sprAMBorderVertical, x + AMWidth - AMxOffset, y, 1); -dec(y, BORDERSIZE); -DrawSprite(sprAMCorners, x - BORDERSIZE, y, 0); -for i:= 0 to cMaxSlotAmmoIndex + 1 do - DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 0); -DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 1); + for i:= cMaxSlotIndex downto 0 do + if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then + begin + if (cScreenHeight - CursorPoint.Y >= y - AMSlotSize) and (cScreenHeight - CursorPoint.Y <= y) then Slot:= i; + dec(y, AMSlotSize); + inc(SlotsNum); + DrawSprite(sprAMBorderVertical, x - BORDERSIZE, y, 0); + DrawSprite(sprAMSlot, x, y, 1); + DrawSprite(sprAMSlotKeys, x, y + 1, i); + t:= 0; + g:= 1; + while (t <= cMaxSlotAmmoIndex) and (Ammo^[i, t].Count > 0) do + begin + DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); + if (Ammo^[i, t].AmmoType <> amNothing) then + begin + STurns:= Ammoz[Ammo^[i, t].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber; + + if STurns >= 0 then + begin + DrawSprite(sprAMAmmosBW, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); + if STurns < 100 then DrawSprite(sprTurnsLeft, x + (g + 1) * AMSlotSize - 16, y + AMSlotSize - 16, STurns); + end else + DrawSprite(sprAMAmmos, x + g * AMSlotSize, y + 1, LongInt(Ammo^[i, t].AmmoType)-1); + if (Slot = i) and (CursorPoint.X >= x + g * AMSlotSize) and + (CursorPoint.X <= x + (g + 1) * AMSlotSize) then + begin + if (STurns < 0) then DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 0); + Pos:= t; + end; + inc(g) + end; + inc(t) + end; + for g:= g to cMaxSlotAmmoIndex + 1 do + DrawSprite(sprAMSlot, x + g * AMSlotSize, y, 1); + DrawSprite(sprAMBorderVertical, x + AMWidth - AMxOffset, y, 1); + end; + + dec(y, BORDERSIZE); + DrawSprite(sprAMCorners, x - BORDERSIZE, y, 0); + for i:= 0 to cMaxSlotAmmoIndex + 1 do + DrawSprite(sprAMBorderHorizontal, x + i * AMSlotSize, y, 0); + DrawSprite(sprAMCorners, x + AMWidth - AMxOffset, y, 1); {$ENDIF} -if (Pos >= 0) then - begin - if (Ammo^[Slot, Pos].Count > 0) and (Ammo^[Slot, Pos].AmmoType <> amNothing) then + if (Pos >= 0) then begin - if (amSel <> Ammo^[Slot, Pos].AmmoType) or (WeaponTooltipTex = nil) then + if (Ammo^[Slot, Pos].Count > 0) and (Ammo^[Slot, Pos].AmmoType <> amNothing) then begin - amSel:= Ammo^[Slot, Pos].AmmoType; - RenderWeaponTooltip(amSel) - end; + if (amSel <> Ammo^[Slot, Pos].AmmoType) or (WeaponTooltipTex = nil) then + begin + amSel:= Ammo^[Slot, Pos].AmmoType; + RenderWeaponTooltip(amSel) + end; {$IFDEF IPHONEOS} - DrawTexture(cScreenWidth div 2 - (AMWidth - 10) + AMxShift, AMyOffset - 25, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex); - - if Ammo^[Slot, Pos].Count < AMMO_INFINITE then - DrawTexture(cScreenWidth div 2 + AMxOffset - 45, AMyOffset - 25, CountTexz[Ammo^[Slot, Pos].Count]); + DrawTexture(cScreenWidth div 2 - (AMWidth - 10) + AMxShift, AMyOffset - 25, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex); + if Ammo^[Slot, Pos].Count < AMMO_INFINITE then + DrawTexture(cScreenWidth div 2 - (AMWidth - 10) + 163, AMyOffset - 25, CountTexz[Ammo^[Slot, Pos].Count]); {$ELSE} - DrawTexture(cScreenWidth div 2 - (AMWidth - 10) + AMxShift, cScreenHeight - AMyOffset - 25, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex); - if Ammo^[Slot, Pos].Count < AMMO_INFINITE then - DrawTexture(cScreenWidth div 2 + AMxOffset - 45, cScreenHeight - AMyOffset - 25, CountTexz[Ammo^[Slot, Pos].Count]); + DrawTexture(cScreenWidth div 2 - (AMWidth - 10) + AMxShift, cScreenHeight - AMyOffset - 25, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex); + if Ammo^[Slot, Pos].Count < AMMO_INFINITE then + DrawTexture(cScreenWidth div 2 + AMxOffset - 45, cScreenHeight - AMyOffset - 25, CountTexz[Ammo^[Slot, Pos].Count]); {$ENDIF} - if bSelected and (Ammoz[Ammo^[Slot, Pos].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber < 0) then - begin - bShowAmmoMenu:= false; - SetWeapon(Ammo^[Slot, Pos].AmmoType); - bSelected:= false; - FreeWeaponTooltip; - exit - end; - end - end -else - FreeWeaponTooltip; -if (WeaponTooltipTex <> nil) and (AMxShift = 0) then + if bSelected and (Ammoz[Ammo^[Slot, Pos].AmmoType].SkipTurns - CurrentTeam^.Clan^.TurnNumber < 0) then + begin + bShowAmmoMenu:= false; + SetWeapon(Ammo^[Slot, Pos].AmmoType); + bSelected:= false; + FreeWeaponTooltip; + exit + end; + end + end + else + FreeWeaponTooltip; + + if (WeaponTooltipTex <> nil) and (AMxShift = 0) then {$IFDEF IPHONEOS} - ShowWeaponTooltip(x - WeaponTooltipTex^.w - 3, AMyOffset - 1); + ShowWeaponTooltip(-WeaponTooltipTex^.w div 2, 100); {$ELSE} - ShowWeaponTooltip(x - WeaponTooltipTex^.w - 3, Min(y + 1, cScreenHeight - WeaponTooltipTex^.h - 40)); + ShowWeaponTooltip(x - WeaponTooltipTex^.w - 3, Min(y + 1, cScreenHeight - WeaponTooltipTex^.h - 40)); {$ENDIF} -bSelected:= false; -if AMxShift = 0 then DrawSprite(sprArrow, CursorPoint.X, cScreenHeight - CursorPoint.Y, (RealTicks shr 6) mod 8) + bSelected:= false; + if AMxShift = 0 then DrawSprite(sprArrow, CursorPoint.X, cScreenHeight - CursorPoint.Y, (RealTicks shr 6) mod 8) end; procedure DrawWater(Alpha: byte; OffsetY: LongInt); diff -r 627b5752733a -r 68db7625060d project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m --- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sat Nov 05 09:37:17 2011 +0300 +++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sat Nov 05 09:38:07 2011 +0300 @@ -62,6 +62,8 @@ else // = everything else tmpQuality = 0; // full quality + // disable ammomenu animation + tmpQuality = tmpQuality | 0x00000080; // disable tooltips on iPhone if (IS_IPAD() == NO) tmpQuality = tmpQuality | 0x00000400; diff -r 627b5752733a -r 68db7625060d project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Sat Nov 05 09:37:17 2011 +0300 +++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Sat Nov 05 09:38:07 2011 +0300 @@ -239,9 +239,6 @@ cell.detailTextLabel.text = NSLocalizedString(@"Select which style of ammo menu you prefer",@""); switchContent.on = [[settings objectForKey:@"classic_menu"] boolValue]; switchContent.tag = 60; - // remove this when classic ammomenu works on iphone as well - if (IS_IPAD() == NO) - switchContent.enabled = NO; break; default: DLog(@"Nope");