# HG changeset patch # User Xeli # Date 1312918912 -7200 # Node ID 25d4118056e12f7cfb933eb16f9554f039f82144 # Parent 8710987d34845b9af52cf24b776a92bcb4baa945# Parent c539e5c81870997ace885122af0f8e72387a7f95 merge diff -r 8710987d3484 -r 25d4118056e1 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/GSHandlers.inc Tue Aug 09 21:41:52 2011 +0200 @@ -257,16 +257,14 @@ AllInactive := false; Gear^.Y := Gear^.Y + cDrownSpeed; Gear^.X := Gear^.X + Gear^.dX * cDrownSpeed; - if (not SuddenDeathDmg and (cWaterOpacity > $FE)) or (SuddenDeathDmg and (cSDWaterOpacity > $FE)) or (hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater) then - DeleteGear(Gear); // Create some bubbles (0.5% might be better but causes too few bubbles sometimes) if ((not SuddenDeathDmg and (cWaterOpacity < $FF)) or (SuddenDeathDmg and (cSDWaterOpacity < $FF))) and ((GameTicks and $1F) = 0) then if (Gear^.Kind = gtHedgehog) and (Random(4) = 0) then - AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, - vgtBubble) + AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble) else if Random(12) = 0 then - AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, - vgtBubble) + AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble); + if (not SuddenDeathDmg and (cWaterOpacity > $FE)) or (SuddenDeathDmg and (cSDWaterOpacity > $FE)) or (hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater) then + DeleteGear(Gear); end; //////////////////////////////////////////////////////////////////////////////// @@ -796,8 +794,8 @@ begin if (GameTicks and $30) = 0 then AddVisualGear(gX, gY, vgtBeeTrace); - Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (TargetPoint.X - gX)); - Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (TargetPoint.Y - gY)); + Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (Gear^.TargetX - gX)); + Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (Gear^.TargetY - gY)); // make sure new speed isn't higher than original one (which we stored in Friction variable) t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY); Gear^.dX := Gear^.dX * t; @@ -1368,7 +1366,7 @@ DeleteGear(Gear) end; -procedure WaitCollision; +(*procedure WaitCollision; begin with HHGear^ do begin @@ -1378,7 +1376,7 @@ RopePoints.Count := 0; Gear^.Elasticity := _0; Gear^.doStep := @doStepRopeAfterAttack -end; +end;*) begin HHGear := Gear^.Hedgehog^.Gear; @@ -1584,9 +1582,9 @@ with Gear^.Hedgehog^ do begin PlaySound(sndRopeRelease); - if CurAmmoType <> amParachute then - WaitCollision - else + //if CurAmmoType <> amParachute then + // WaitCollision + //else DeleteMe end end @@ -2419,14 +2417,14 @@ end; Gear^.Y := int2hwFloat(topY-300); - Gear^.dX := int2hwFloat(TargetPoint.X - 5 * Gear^.Tag * 15); + Gear^.dX := int2hwFloat(Gear^.TargetX - 5 * Gear^.Tag * 15); // calcs for Napalm Strike, so that it will hit the target (without wind at least :P) if (Gear^.State = 2) then Gear^.dX := Gear^.dX - cBombsSpeed * Gear^.Tag * 900 // calcs for regular falling gears - else if (int2hwFloat(TargetPoint.Y) - Gear^.Y > _0) then - Gear^.dX := Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(TargetPoint.Y) - Gear^.Y) * 2 / + else if (int2hwFloat(Gear^.TargetY) - Gear^.Y > _0) then + Gear^.dX := Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(Gear^.TargetY) - Gear^.Y) * 2 / cGravity) * Gear^.Tag; Gear^.Health := 6; @@ -2462,14 +2460,14 @@ AllInactive := false; HHGear := Gear^.Hedgehog^.Gear; - tx := int2hwFloat(TargetPoint.X); - ty := int2hwFloat(TargetPoint.Y); + tx := int2hwFloat(Gear^.TargetX); + ty := int2hwFloat(Gear^.TargetY); x := HHGear^.X; y := HHGear^.Y; if (Distance(tx - x, ty - y) > _256) or - not TryPlaceOnLand(TargetPoint.X - SpritesData[sprAmGirder].Width div 2, - TargetPoint.Y - SpritesData[sprAmGirder].Height div 2, + not TryPlaceOnLand(Gear^.TargetX - SpritesData[sprAmGirder].Width div 2, + Gear^.TargetY - SpritesData[sprAmGirder].Height div 2, sprAmGirder, Gear^.State, true, false) then begin PlaySound(sndDenied); @@ -2488,7 +2486,6 @@ HHGear^.State := HHGear^.State and not (gstAttacking or gstAttacked); HHGear^.Message := HHGear^.Message and not gmAttack; - TargetPoint.X := NoPointX end; //////////////////////////////////////////////////////////////////////////////// @@ -2529,8 +2526,8 @@ AllInactive := false; HHGear := Gear^.Hedgehog^.Gear; - if not TryPlaceOnLand(TargetPoint.X - SpritesData[sprHHTelepMask].Width div 2, - TargetPoint.Y - SpritesData[sprHHTelepMask].Height div 2, + if not TryPlaceOnLand(Gear^.TargetX - SpritesData[sprHHTelepMask].Width div 2, + Gear^.TargetY - SpritesData[sprHHTelepMask].Height div 2, sprHHTelepMask, 0, false, false) then begin HHGear^.Message := HHGear^.Message and not gmAttack; @@ -2552,12 +2549,12 @@ HHGear^.dX.isNegative := (Gear^.X.QWordValue <> 0); Gear^.X := HHGear^.X; Gear^.Y := HHGear^.Y; - HHGear^.X := int2hwFloat(TargetPoint.X); - HHGear^.Y := int2hwFloat(TargetPoint.Y); + HHGear^.X := int2hwFloat(Gear^.TargetX); + HHGear^.Y := int2hwFloat(Gear^.TargetY); HHGear^.State := HHGear^.State or gstMoving; playSound(sndWarp) end; - TargetPoint.X := NoPointX; + Gear^.TargetX:= NoPointX end; //////////////////////////////////////////////////////////////////////////////// @@ -2945,10 +2942,26 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepSeductionWork(Gear: PGear); var - x, y: LongInt; + x, y, i: LongInt; + hogs: TPGearArray; + d: hwFloat; begin AllInactive := false; - + hogs := GearsNear(Gear^.X, Gear^.Y, gtHedgehog, Gear^.Radius); + if Length(hogs) > 0 then + begin + for i:= 0 to High(hogs) do + begin + //d:= Distance(Gear^.X - hogs[i]^.X, Gear^.Y - hogs[i]^.Y); + hogs[i]^.dX:= _0_25 * (Gear^.X - hogs[i]^.X) / _250; + //if Gear^.X < hogs[i]^.X then hogs[i]^.dX.isNegative:= true; + hogs[i]^.dY:= -_0_25; + hogs[i]^.Active:= true; + end; + end ; + AfterAttack; + DeleteGear(Gear); +(* Gear^.X := Gear^.X + Gear^.dX; Gear^.Y := Gear^.Y + Gear^.dY; x := hwRound(Gear^.X); @@ -2970,7 +2983,7 @@ begin AfterAttack; DeleteGear(Gear) - end + end*) end; procedure doStepSeductionWear(Gear: PGear); @@ -2992,7 +3005,7 @@ procedure doStepSeduction(Gear: PGear); begin AllInactive := false; - DeleteCI(Gear^.Hedgehog^.Gear); + //DeleteCI(Gear^.Hedgehog^.Gear); Gear^.doStep := @doStepSeductionWear end; diff -r 8710987d3484 -r 25d4118056e1 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/HHHandlers.inc Tue Aug 09 21:41:52 2011 +0200 @@ -182,6 +182,7 @@ if ((State and gstHHDriven) <> 0)and ((State and (gstAttacked or gstHHChooseTarget)) = 0) and (((State and gstMoving) = 0) or + (CurAmmoType = amTeleport) or // Allow attacks while moving on ammo with AltAttack ((CurAmmoGear <> nil) and ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0)) or ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackInMove) <> 0)) and @@ -301,7 +302,7 @@ end; amKamikaze: newGear:= AddGear(hwRound(lx), hwRound(ly), gtKamikaze, 0, xx * _0_5, yy * _0_5, 0); amCake: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 3, hwRound(ly), gtCake, 0, xx, _0, 0); - amSeduction: newGear:= AddGear(hwRound(lx + xx * cHHRadius * 2), hwRound(ly + yy * cHHRadius * 2), gtSeduction, 0, xx * _0_4, yy * _0_4, 0); + amSeduction: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSeduction, 0, _0, _0, 0); amWatermelon: newGear:= AddGear(hwRound(lx), hwRound(ly), gtWatermelon, 0, newDx, newDy, CurWeapon^.Timer); amHellishBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtHellishBomb, 0, newDx, newDy, 0); amDrill: newGear:= AddGear(hwRound(lx), hwRound(ly), gtDrill, 0, newDx, newDy, 0); @@ -373,6 +374,11 @@ amResurrector, amStructure, amTardis: CurAmmoGear:= newGear; end; + if Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0 then + begin + newGear^.TargetX:= TargetPoint.X; + newGear^.TargetY:= TargetPoint.Y + end; // Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement if altUse then FollowGear:= nil; @@ -416,7 +422,8 @@ AfterAttack; end end else Message:= Message and not gmAttack; - end + end; + TargetPoint.X := NoPointX end; procedure AfterAttack; diff -r 8710987d3484 -r 25d4118056e1 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/SDLh.pas Tue Aug 09 21:41:52 2011 +0200 @@ -783,6 +783,7 @@ function SDL_GL_CreateContext(window: PSDL_Window): PSDL_GLContext; cdecl; external SDLLibName; procedure SDL_GL_DeleteContext(context: PSDL_GLContext); cdecl; external SDLLibName; function SDL_GL_SwapWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName; +function SDL_GL_SetSwapInterval(interval: LongInt): LongInt; cdecl; external SDLLibName; procedure SDL_VideoQuit; cdecl; external SDLLibName; function SDL_GetNumVideoDisplays: LongInt; cdecl; external SDLLibName; diff -r 8710987d3484 -r 25d4118056e1 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/hwengine.pas Tue Aug 09 21:41:52 2011 +0200 @@ -105,7 +105,7 @@ end; {$IFDEF SDL13} - SDL_RenderPresent(SDLrender); + SDL_GL_SwapWindow(SDLwindow); {$ELSE} SDL_GL_SwapBuffers(); {$ENDIF} @@ -130,10 +130,9 @@ CloseIPC(); TTF_Quit(); {$IFDEF SDL13} - SDL_RenderClear(SDLrender); - SDL_DestroyRenderer(SDLrender); + SDL_GL_DeleteContext(SDLGLcontext); SDL_DestroyWindow(SDLwindow); - SDLrender:= nil; + SDLGLcontext:= nil; SDLwindow:= nil; {$ENDIF} SDL_Quit(); @@ -147,6 +146,7 @@ const event: TSDL_Event = (); {$WARNINGS ON} var PrevTime, CurrTime: Longword; + prevFocusState: boolean; begin PrevTime:= SDL_GetTicks; while isTerminated = false do @@ -165,14 +165,22 @@ KeyPressChat(event.key.keysym.sym); SDL_WINDOWEVENT: if event.window.event = SDL_WINDOWEVENT_SHOWN then + begin cHasFocus:= true; + onFocusStateChanged() + end; {$ELSE} KeyPressChat(event.key.keysym.unicode); SDL_MOUSEBUTTONDOWN: if event.button.button = SDL_BUTTON_WHEELDOWN then wheelDown:= true; SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then wheelUp:= true; SDL_ACTIVEEVENT: if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then + begin + prevFocusState:= cHasFocus; cHasFocus:= event.active.gain = 1; + if prevFocusState xor cHasFocus then + onFocusStateChanged() + end; {$ENDIF} SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); SDL_JOYHATMOTION: ControllerHatEvent(event.jhat.which, event.jhat.hat, event.jhat.value); diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uAmmos.pas Tue Aug 09 21:41:52 2011 +0200 @@ -110,7 +110,8 @@ if ((a = amLowGravity) and ((GameFlags and gfLowGravity) <> 0)) or ((a = amInvulnerable) and ((GameFlags and gfInvulnerable) <> 0)) or ((a = amLaserSight) and ((GameFlags and gfLaserSight) <> 0)) or - ((a = amVampiric) and ((GameFlags and gfVampiric) <> 0)) then + ((a = amVampiric) and ((GameFlags and gfVampiric) <> 0)) or + ((a = amExtraTime) and (cHedgehogTurnTime >= 1000000)) then begin cnt:= 0; Ammoz[a].Probability:= 0 diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uCommandHandlers.pas --- a/hedgewars/uCommandHandlers.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uCommandHandlers.pas Tue Aug 09 21:41:52 2011 +0200 @@ -46,9 +46,13 @@ if GameState <> gsConfirm then begin prevGState:= GameState; - GameState:= gsConfirm + GameState:= gsConfirm; + SDL_ShowCursor(1) end else - GameState:= prevGState + begin + GameState:= prevGState; + SDL_ShowCursor(ord(isPaused)) + end end; procedure chForceQuit(var s: shortstring); @@ -529,7 +533,11 @@ s:= s; // avoid compiler hint if gameType <> gmtNet then isPaused:= not isPaused; -SDL_ShowCursor(ord(isPaused)) + +if isPaused then + SDL_ShowCursor(1) + else + SDL_ShowCursor(ord(GameState = gsConfirm)) end; procedure chRotateMask(var s: shortstring); diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uGears.pas Tue Aug 09 21:41:52 2011 +0200 @@ -207,6 +207,7 @@ FillChar(gear^, sizeof(TGear), 0); gear^.X:= int2hwFloat(X); gear^.Y:= int2hwFloat(Y); +gear^.TargetX:= NoPointX; gear^.Kind := Kind; gear^.State:= State; gear^.Active:= true; @@ -275,6 +276,8 @@ gear^.Density:= _1; end; gtSnowball: begin + gear^.ImpactSound:= sndMudballImpact; + gear^.nImpactSounds:= 1; gear^.Radius:= 4; gear^.Elasticity:= _1; gear^.Friction:= _1; @@ -310,6 +313,9 @@ gear^.Elasticity:= _0_9; gear^.Tag:= getRandom(32); end; + gtSeduction: begin + gear^.Radius:= 250; + end; gtShotgunShot: begin gear^.Timer:= 900; gear^.Radius:= 2 @@ -328,6 +334,8 @@ RopePoints.Count:= 0; end; gtMine: begin + gear^.ImpactSound:= sndMineImpact; + gear^.nImpactSounds:= 1; gear^.Health:= 10; gear^.State:= gear^.State or gstMoving; gear^.Radius:= 2; @@ -910,8 +918,15 @@ begin dec(delay2); - if ((delay2 mod cInactDelay) = 0) and (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) then + if ((delay2 mod cInactDelay) = 0) and (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) and not CurrentHedgehog^.Unplaced then + begin + if (CurrentHedgehog^.Gear^.State and gstAttacked <> 0) and (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0) then + begin + CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State or gstHHChooseTarget; + isCursorVisible := true + end; CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and not gstAttacked; + end; if delay2 = 0 then begin if (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.State and gstAttacked = 0) then SweepDirty; @@ -1210,7 +1225,6 @@ vg: PVisualGear; i, cnt: LongInt; begin -TargetPoint.X:= NoPointX; if Radius > 4 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')'); if Radius > 25 then KickFlakes(Radius, X, Y); @@ -1587,7 +1601,6 @@ begin gear^.dX := _0; gear^.dY := _0; - gear^.State := gstWait; gear^.Damage := 0; gear^.Health := gear^.Hedgehog^.InitialHealth; gear^.Hedgehog^.Effects[hePoisoned] := false; @@ -1604,6 +1617,7 @@ if gear <> nil then begin RenderHealth(gear^.Hedgehog^); ScriptCall('onGearResurrect', gear^.uid); + gear^.State := gstWait; end; RecountTeamHealth(tempTeam); end; diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uGearsRender.pas Tue Aug 09 21:41:52 2011 +0200 @@ -600,7 +600,10 @@ amGasBomb: DrawRotated(sprHandCheese, hx, hy, sign, aangle); amMine: DrawRotated(sprHandMine, hx, hy, sign, aangle); amSMine: DrawRotated(sprHandSMine, hx, hy, sign, aangle); - amSeduction: DrawRotated(sprHandSeduction, hx, hy, sign, aangle); + amSeduction: begin + DrawRotated(sprHandSeduction, hx, hy, sign, aangle); + DrawCircle(ox, oy, 248, 4, $FF, $00, $00, $AA); + end; amVampiric: DrawRotatedF(sprHandVamp, hx, hy, (RealTicks div 125) mod 4, sign, aangle); amRCPlane: begin DrawRotated(sprHandPlane, hx, hy, sign, 0); @@ -877,6 +880,12 @@ i: Longword; startX, endX, startY, endY: LongInt; begin + if Gear^.TargetX <> NoPointX then + if Gear^.AmmoType = amBee then + DrawRotatedF(sprTargetBee, Gear^.TargetX + WorldDx, Gear^.TargetY + WorldDy, 0, 0, (RealTicks shr 3) mod 360) + else + DrawRotatedF(sprTargetP, Gear^.TargetX + WorldDx, Gear^.TargetY + WorldDy, 0, 0, (RealTicks shr 3) mod 360); + case Gear^.Kind of gtGrenade: DrawRotated(sprBomb, x, y, 0, Gear^.DirAngle); gtSnowball: DrawRotated(sprSnowball, x, y, 0, Gear^.DirAngle); @@ -1019,7 +1028,12 @@ end; end else - DrawTextureF(SpritesData[sprBirdy].Texture, 1, x, y, ((Gear^.Pos shr 6) or (RealTicks shr 8)) mod 2, Gear^.Tag, 75, 75); + begin + if Gear^.Health < 250 then + DrawTextureF(SpritesData[sprBirdy].Texture, 1, x, y, ((Gear^.Pos shr 6) or (RealTicks shr 7)) mod 2, Gear^.Tag, 75, 75) + else + DrawTextureF(SpritesData[sprBirdy].Texture, 1, x, y, ((Gear^.Pos shr 6) or (RealTicks shr 8)) mod 2, Gear^.Tag, 75, 75); + end; end; gtEgg: DrawRotatedTextureF(SpritesData[sprEgg].Texture, 1, 0, 0, x, y, 0, 1, 16, 16, Gear^.DirAngle); gtPiano: begin @@ -1049,7 +1063,7 @@ Tint($FF, $FF, $FF, $FF); end; gtNapalmBomb: DrawRotated(sprNapalmBomb, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); - gtFlake: if (Gear^.State and gstTmpFlag) <> 0 then + gtFlake: if Gear^.State and (gstDrowning or gstTmpFlag) <> 0 then begin Tint((cExplosionBorderColor shr RShift) and $FF, (cExplosionBorderColor shr GShift) and $FF, diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uScript.pas Tue Aug 09 21:41:52 2011 +0200 @@ -1214,6 +1214,44 @@ lc_setgearposition:= 0 end; +function lc_getgeartarget(L : Plua_State) : LongInt; Cdecl; +var gear: PGear; +begin + if lua_gettop(L) <> 1 then + begin + LuaError('Lua: Wrong number of parameters passed to GetGearTarget!'); + lua_pushnil(L); + lua_pushnil(L) + end + else + begin + gear:= GearByUID(lua_tointeger(L, 1)); + if gear <> nil then + begin + lua_pushinteger(L, gear^.TargetX); + lua_pushinteger(L, gear^.TargetY) + end + end; + lc_getgeartarget:= 2; +end; + +function lc_setgeartarget(L : Plua_State) : LongInt; Cdecl; +var gear: PGear; +begin + if lua_gettop(L) <> 3 then + LuaError('Lua: Wrong number of parameters passed to SetGearTarget!') + else + begin + gear:= GearByUID(lua_tointeger(L, 1)); + if gear <> nil then + begin + gear^.TargetX:= lua_tointeger(L, 2); + gear^.TargetY:= lua_tointeger(L, 3) + end + end; + lc_setgeartarget:= 0 +end; + function lc_getgearvelocity(L : Plua_State) : LongInt; Cdecl; var gear: PGear; begin @@ -1819,6 +1857,27 @@ for cg:= Low(TCapGroup) to High(TCapGroup) do ScriptSetInteger(EnumToStr(cg), ord(cg)); +ScriptSetInteger('gstDrowning' ,$00000001); +ScriptSetInteger('gstHHDriven' ,$00000002); +ScriptSetInteger('gstMoving' ,$00000004); +ScriptSetInteger('gstAttacked' ,$00000008); +ScriptSetInteger('gstAttacking' ,$00000010); +ScriptSetInteger('gstCollision' ,$00000020); +ScriptSetInteger('gstHHChooseTarget' ,$00000040); +ScriptSetInteger('gstHHJumping' ,$00000100); +ScriptSetInteger('gsttmpFlag' ,$00000200); +ScriptSetInteger('gstHHThinking' ,$00000800); +ScriptSetInteger('gstNoDamage' ,$00001000); +ScriptSetInteger('gstHHHJump' ,$00002000); +ScriptSetInteger('gstAnimation' ,$00004000); +ScriptSetInteger('gstHHDeath' ,$00008000); +ScriptSetInteger('gstWinner' ,$00010000); +ScriptSetInteger('gstWait' ,$00020000); +ScriptSetInteger('gstNotKickable' ,$00040000); +ScriptSetInteger('gstLoser' ,$00080000); +ScriptSetInteger('gstHHGone' ,$00100000); +ScriptSetInteger('gstInvisible' ,$00200000); + // register functions lua_register(luaState, 'band', @lc_band); lua_register(luaState, 'bor', @lc_bor); @@ -1843,6 +1902,8 @@ lua_register(luaState, 'FindPlace', @lc_findplace); lua_register(luaState, 'SetGearPosition', @lc_setgearposition); lua_register(luaState, 'GetGearPosition', @lc_getgearposition); +lua_register(luaState, 'SetGearTarget', @lc_setgeartarget); +lua_register(luaState, 'GetGearTarget', @lc_getgeartarget); lua_register(luaState, 'SetGearVelocity', @lc_setgearvelocity); lua_register(luaState, 'GetGearVelocity', @lc_getgearvelocity); lua_register(luaState, 'ParseCommand', @lc_parsecommand); diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uStore.pas Tue Aug 09 21:41:52 2011 +0200 @@ -525,17 +525,24 @@ end; procedure SetupOpenGL; -{$IFNDEF IPHONEOS} -var vendor: shortstring; +var vendor: shortstring = ''; {$IFDEF DARWIN} const one : LongInt = 1; {$ENDIF} +begin +{$IFDEF SDL13} + // this function creates an opengles1.1 context by default on mobile devices + // use SDL_GL_SetAttribute to change this behaviour + SDLGLcontext:=SDL_GL_CreateContext(SDLwindow); + SDLTry(SDLGLcontext <> nil, true); + SDL_GL_SetSwapInterval(1); {$ENDIF} -begin -{$IFDEF MOBILE} +{$IFDEF IHPONE} SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0); SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 1); + vendor:= vendor; // avoid hint + one:= one; // avoid hint {$ELSE} SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); vendor:= LowerCase(shortstring(pchar(glGetString(GL_VENDOR)))); @@ -709,7 +716,7 @@ DrawFromRect( -squaresize div 2, (cScreenHeight - squaresize) shr 1, @r, ProgrTex); {$IFDEF SDL13} - SDL_RenderPresent(SDLrender); + SDL_GL_SwapWindow(SDLwindow); {$ELSE} SDL_GL_SwapBuffers(); {$ENDIF} @@ -814,7 +821,7 @@ begin r:= WriteInRect(tmpsurf, FontBorder + 2, r.y + r.h, $ff707070, font, tmpline); - // render highlighted caption (if there's a ':') + // render highlighted caption (if there is a ':') tmpline2:= ''; SplitByChar(tmpline, tmpline2, ':'); if tmpline2 <> '' then @@ -868,7 +875,7 @@ extra:= trmsg[sidNotYetAvailable]; extracolor:= LongInt($ffc77070); end -else if (Ammoz[atype].Ammo.Propz and ammoprop_NoRoundEnd) <> 0 then // weapon or utility won't end your turn +else if (Ammoz[atype].Ammo.Propz and ammoprop_NoRoundEnd) <> 0 then // weapon or utility will not end your turn begin extra:= trmsg[sidNoEndTurn]; extracolor:= LongInt($ff70c770); @@ -957,24 +964,11 @@ x:= x or (SDL_GetNumVideoDisplays() - 1); y:= y or (SDL_GetNumVideoDisplays() - 1); - // hardcode the opengles driver as we do our own drawing - SDL_SetHint('SDL_RENDER_DRIVER','opengles'); - flags:= flags or SDL_WINDOW_BORDERLESS; // do not set SDL_WINDOW_RESIZABLE on iOS + flags:= flags or SDL_WINDOW_BORDERLESS; // do not use SDL_WINDOW_RESIZABLE on ios (yet) {$ENDIF} SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cScreenWidth, cScreenHeight, flags); SDLTry(SDLwindow <> nil, true); - SDLrender:= SDL_CreateRenderer(SDLwindow, -1, SDL_RENDERER_ACCELERATED or SDL_RENDERER_PRESENTVSYNC); - SDLTry(SDLrender <> nil, true); - - // clean the renderer before using it - SDL_SetRenderDrawColor(SDLrender, 0, 0, 0, 255); - SDL_RenderClear(SDLrender); - SDL_RenderPresent(SDLrender); - - // reset the gl context from the one created by SDL (as we have our own drawing system) - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); {$ELSE} if not cOnlyStats then begin diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uTypes.pas Tue Aug 09 21:41:52 2011 +0200 @@ -117,7 +117,8 @@ TSound = (sndNone, sndGrenadeImpact, sndExplosion, sndThrowPowerUp, sndThrowRelease, sndSplash, sndShotgunReload, sndShotgunFire, sndGraveImpact, - sndMineTick, sndPickhammer, sndGun, sndBee, sndJump1, sndJump2, + sndMineImpact, sndMineTick, sndMudballImpact, + sndPickhammer, sndGun, sndBee, sndJump1, sndJump2, sndJump3, sndYesSir, sndLaugh, sndIllGetYou, sndIncoming, sndMissed, sndStupid, sndFirstBlood, sndBoring, sndByeBye, sndSameTeam, sndNutter, sndReinforce, sndTraitor, sndRegret, @@ -227,6 +228,8 @@ Y : hwFloat; dX: hwFloat; dY: hwFloat; + TargetX : LongInt; + TargetY : LongInt; Kind: TGearType; Pos: Longword; doStep: TGearStepProcedure; diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uVariables.pas Tue Aug 09 21:41:52 2011 +0200 @@ -167,7 +167,7 @@ {$IFDEF SDL13} SDLwindow : PSDL_Window; - SDLrender : PSDL_Renderer; + SDLGLcontext : PSDL_GLContext; {$ENDIF} WorldDx: LongInt; @@ -633,7 +633,9 @@ (FileName: 'shotgunreload.ogg'; Path: ptSounds),// sndShotgunReload (FileName: 'shotgunfire.ogg'; Path: ptSounds),// sndShotgunFire (FileName: 'graveimpact.ogg'; Path: ptSounds),// sndGraveImpact + (FileName: 'mineimpact.ogg'; Path: ptSounds),// sndMineImpact (FileName: 'minetick.ogg'; Path: ptSounds),// sndMineTicks + (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndMudballImpact (FileName: 'pickhammer.ogg'; Path: ptSounds),// sndPickhammer (FileName: 'gun.ogg'; Path: ptSounds),// sndGun (FileName: 'bee.ogg'; Path: ptSounds),// sndBee @@ -729,7 +731,7 @@ (FileName: 'Ooff1.ogg'; Path: ptVoices),// sndOoff1 (FileName: 'Ooff2.ogg'; Path: ptVoices),// sndOoff2 (FileName: 'Ooff3.ogg'; Path: ptVoices),// sndOoff3 - (FileName: 'whipcrack.ogg'; Path: ptSounds),// sndWhack + (FileName: 'hammer.ogg'; Path: ptSounds),// sndWhack (FileName: 'Comeonthen.ogg'; Path: ptVoices),// sndComeonthen (FileName: 'parachute.ogg'; Path: ptSounds),// sndParachute (FileName: 'bump.ogg'; Path: ptSounds),// sndBump @@ -2490,7 +2492,7 @@ {$IFDEF SDL13} SDLwindow := nil; - SDLrender := nil; + SDLGLcontext := nil; {$ENDIF} // those values still are not perfect diff -r 8710987d3484 -r 25d4118056e1 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Tue Aug 09 21:31:49 2011 +0200 +++ b/hedgewars/uWorld.pas Tue Aug 09 21:41:52 2011 +0200 @@ -33,6 +33,7 @@ procedure HideMission; procedure ShakeCamera(amount: LongWord); procedure MoveCamera; +procedure onFocusStateChanged; implementation uses @@ -51,7 +52,8 @@ uTextures, uRender, uCaptions, - uCursor + uCursor, + uCommands ; var cWaveWidth, cWaveHeight: LongInt; @@ -1175,7 +1177,7 @@ PrevSentPointTime: LongWord = 0; begin {$IFNDEF MOBILE} -if (not (CurrentTeam^.ExtDriven and isCursorVisible and not bShowAmmoMenu)) and cHasFocus then +if (not (CurrentTeam^.ExtDriven and isCursorVisible and not bShowAmmoMenu)) and cHasFocus and (GameState <> gsConfirm) then uCursor.updatePosition(); {$ENDIF} @@ -1312,6 +1314,14 @@ WorldDy:= WorldDy - amount + LongInt(getRandom(1 + amount * 2)); end; + +procedure onFocusStateChanged; +begin +if (not cHasFocus) and (GameState <> gsConfirm) then + ParseCommand('quit', true); +end; + + procedure initModule; begin fpsTexture:= nil; diff -r 8710987d3484 -r 25d4118056e1 misc/libfreetype/Xcode-iPhoneOS/Freetype.xcodeproj/project.pbxproj --- a/misc/libfreetype/Xcode-iPhoneOS/Freetype.xcodeproj/project.pbxproj Tue Aug 09 21:31:49 2011 +0200 +++ b/misc/libfreetype/Xcode-iPhoneOS/Freetype.xcodeproj/project.pbxproj Tue Aug 09 21:41:52 2011 +0200 @@ -1115,7 +1115,8 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 2; + GCC_FAST_MATH = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ( DARWIN_NO_CARBON, FT2_BUILD_LIBRARY, diff -r 8710987d3484 -r 25d4118056e1 misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj --- a/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Tue Aug 09 21:31:49 2011 +0200 +++ b/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Tue Aug 09 21:41:52 2011 +0200 @@ -405,6 +405,7 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; + GCC_FAST_MATH = YES; GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff -r 8710987d3484 -r 25d4118056e1 misc/libtremor/Xcode/Tremor.xcodeproj/project.pbxproj --- a/misc/libtremor/Xcode/Tremor.xcodeproj/project.pbxproj Tue Aug 09 21:31:49 2011 +0200 +++ b/misc/libtremor/Xcode/Tremor.xcodeproj/project.pbxproj Tue Aug 09 21:41:52 2011 +0200 @@ -325,6 +325,7 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; + GCC_FAST_MATH = YES; GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff -r 8710987d3484 -r 25d4118056e1 project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m --- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Tue Aug 09 21:31:49 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Tue Aug 09 21:41:52 2011 +0200 @@ -144,10 +144,9 @@ -(void) applicationWillResignActive:(UIApplication *)application { //[super applicationWillResignActive:application]; - UIDevice* device = [UIDevice currentDevice]; + UIDevice *device = [UIDevice currentDevice]; if ([device respondsToSelector:@selector(isMultitaskingSupported)] && - device.multitaskingSupported && - self.isInGame) { + [device isMultitaskingSupported] && self.isInGame) { // let's try to be permissive with multitasking here... if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"multitasking"] boolValue]) HW_suspend(); @@ -166,10 +165,9 @@ -(void) applicationDidBecomeActive:(UIApplication *)application { //[super applicationDidBecomeActive:application]; - UIDevice* device = [UIDevice currentDevice]; + UIDevice *device = [UIDevice currentDevice]; if ([device respondsToSelector:@selector(isMultitaskingSupported)] && - device.multitaskingSupported && - self.isInGame) { + [device isMultitaskingSupported] && self.isInGame) { HW_resume(); } } diff -r 8710987d3484 -r 25d4118056e1 project_files/HedgewarsMobile/Classes/UIImageExtra.m --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.m Tue Aug 09 21:31:49 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.m Tue Aug 09 21:41:52 2011 +0200 @@ -25,17 +25,17 @@ @implementation UIImage (extra) CGFloat getScreenScale(void) { + float scale = 1.0f; if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) - return [UIScreen mainScreen].scale; - else - return 1.0f; + scale = [[UIScreen mainScreen] scale]; + return scale; } -(UIImage *)scaleToSize:(CGSize) size { DLog(@"warning - this is a very expensive operation, you should avoid using it"); // Create a bitmap graphics context; this will also set it as the current context - if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) + if (UIGraphicsBeginImageContextWithOptions != NULL) UIGraphicsBeginImageContextWithOptions(size, NO, getScreenScale()); else UIGraphicsBeginImageContext(size); diff -r 8710987d3484 -r 25d4118056e1 share/hedgewars/Data/Sounds/hammer.ogg Binary file share/hedgewars/Data/Sounds/hammer.ogg has changed diff -r 8710987d3484 -r 25d4118056e1 share/hedgewars/Data/Sounds/mineimpact.ogg Binary file share/hedgewars/Data/Sounds/mineimpact.ogg has changed