# HG changeset patch # User unc0rr # Date 1338221089 -14400 # Node ID 5587ab553f321ddbff60fe77a8f63b4fee4ae263 # Parent 4d863aadd0b2662f06b00c42cbebf2e28da7c416# Parent beb16926ae5c8947dd36470ad9b7f761b12c2520 merge diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/pas2c.h --- a/hedgewars/pas2c.h Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/pas2c.h Mon May 28 20:04:49 2012 +0400 @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -56,17 +57,6 @@ typedef int PtrInt; typedef wchar_t widechar; -#ifdef __GNUG__ -#define NULL __null -#else /* G++ */ -/* shield NULL definition for non-gnu parsers */ -#ifndef __cplusplus -#define NULL ((void *)0) -#else -#define NULL 0 -#endif /* __cplusplus */ -#endif /* G++ */ - #define new(a) __new((void **)&a, sizeof(*(a))) void __new(void ** p, int size); #define dispose(a) __dispose(a, sizeof(*(a))) @@ -85,6 +75,7 @@ bool _strcomparec(string255 a, char b); bool _strncompare(string255 a, string255 b); char * _pchar(string255 s); +string255 pchar2str(char * s); int Length(string255 a); string255 copy(string255 a, int s, int l); @@ -113,6 +104,7 @@ void close(int f); void write(string255 s); +void writeLn(string255 s); bool DirectoryExists(string255 dir); bool FileExists(string255 filename); diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/pas2cSystem.pas --- a/hedgewars/pas2cSystem.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/pas2cSystem.pas Mon May 28 20:04:49 2012 +0400 @@ -68,6 +68,7 @@ Length, StrToInt : function : integer; SetLength, val : procedure; _pchar : function : PChar; + pchar2str : function : string; memcpy : procedure; assign, rewrite, reset, flush, BlockWrite, BlockRead, close : procedure; diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/uAI.pas Mon May 28 20:04:49 2012 +0400 @@ -142,41 +142,41 @@ inc(BestActions.Score, Score); BestActions.isWalkingToABetterPlace:= false; - if (ap.Angle > 0) then - AddAction(BestActions, aia_LookRight, 0, 200, 0, 0) - else if (ap.Angle < 0) then - AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0); + AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0); - AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0); - - if (ap.Time <> 0) then - AddAction(BestActions, aia_Timer, ap.Time div 1000, 400, 0, 0); - if (Ammoz[a].Ammo.Propz and ammoprop_NoCrosshair) = 0 then - begin - ap.Angle:= LongInt(Me^.Angle) - Abs(ap.Angle); - if ap.Angle > 0 then + if (ap.Angle > 0) then + AddAction(BestActions, aia_LookRight, 0, 200, 0, 0) + else if (ap.Angle < 0) then + AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0); + + if (ap.Time <> 0) then + AddAction(BestActions, aia_Timer, ap.Time div 1000, 400, 0, 0); + if (Ammoz[a].Ammo.Propz and ammoprop_NoCrosshair) = 0 then begin - AddAction(BestActions, aia_Up, aim_push, 300 + random(250), 0, 0); - AddAction(BestActions, aia_Up, aim_release, ap.Angle, 0, 0) - end - else if ap.Angle < 0 then + ap.Angle:= LongInt(Me^.Angle) - Abs(ap.Angle); + if ap.Angle > 0 then + begin + AddAction(BestActions, aia_Up, aim_push, 300 + random(250), 0, 0); + AddAction(BestActions, aia_Up, aim_release, ap.Angle, 0, 0) + end + else if ap.Angle < 0 then + begin + AddAction(BestActions, aia_Down, aim_push, 300 + random(250), 0, 0); + AddAction(BestActions, aia_Down, aim_release, -ap.Angle, 0, 0) + end + end; + if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 0 then begin - AddAction(BestActions, aia_Down, aim_push, 300 + random(250), 0, 0); - AddAction(BestActions, aia_Down, aim_release, -ap.Angle, 0, 0) - end - end; - if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 0 then - begin - AddAction(BestActions, aia_Put, 0, 1, ap.AttackPutX, ap.AttackPutY) - end; - if (Ammoz[a].Ammo.Propz and ammoprop_AttackingPut) = 0 then - begin - AddAction(BestActions, aia_attack, aim_push, 650 + random(300), 0, 0); - AddAction(BestActions, aia_attack, aim_release, ap.Power, 0, 0); - end; - if ap.ExplR > 0 then - AddAction(BestActions, aia_AwareExpl, ap.ExplR, 10, ap.ExplX, ap.ExplY); - end + AddAction(BestActions, aia_Put, 0, 1, ap.AttackPutX, ap.AttackPutY) + end; + if (Ammoz[a].Ammo.Propz and ammoprop_AttackingPut) = 0 then + begin + AddAction(BestActions, aia_attack, aim_push, 650 + random(300), 0, 0); + AddAction(BestActions, aia_attack, aim_release, ap.Power, 0, 0); + end; + if ap.ExplR > 0 then + AddAction(BestActions, aia_AwareExpl, ap.ExplR, 10, ap.ExplX, ap.ExplY); + end end; if a = High(TAmmoType) then a:= Low(TAmmoType) @@ -205,10 +205,6 @@ BotLevel:= Me^.Hedgehog^.BotLevel; -tmp:= random(2) + 1; -Push(0, Actions, Me^, tmp); -Push(0, Actions, Me^, tmp xor 3); - if (Me^.State and gstAttacked) = 0 then maxticks:= Max(0, TurnTimeLeft - 5000 - LongWord(4000 * BotLevel)) else @@ -221,8 +217,12 @@ BaseRate:= Max(BestRate, 0); if (Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) <> 0 then - AddAction(Actions, aia_Weapon, Longword(amNothing), 100 + random(200), 0, 0); + AddAction(Actions, aia_Weapon, Longword(amSkip), 100 + random(200), 0, 0); +tmp:= random(2) + 1; +Push(0, Actions, Me^, tmp); +Push(0, Actions, Me^, tmp xor 3); + while (Stack.Count > 0) and (not StopThinking) and (GameFlags and gfArtillery = 0) do begin Pop(ticks, Actions, Me^); diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/uAIActions.pas --- a/hedgewars/uAIActions.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/uAIActions.pas Mon May 28 20:04:49 2012 +0400 @@ -176,7 +176,8 @@ exit end else - begin CheckHang(Me); + begin + CheckHang(Me); exit end; @@ -194,7 +195,8 @@ exit end else - begin CheckHang(Me); + begin + CheckHang(Me); exit end; aia_LookLeft: diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/uAIAmmoTests.pas Mon May 28 20:04:49 2012 +0400 @@ -364,7 +364,7 @@ Vx:= ((Targ.X+10) - meX) / (TestTime + tDelta) else Vx:= ((Targ.X-10) - meX) / (TestTime + tDelta); - Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-150) - meY) / (TestTime + tDelta); + Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta); r:= sqr(Vx)+sqr(Vy); if not (r > 1) then begin @@ -388,7 +388,7 @@ if valueResult < Score then begin ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level)); - ap.Power:= trunc(sqrt(r) * cMaxPower * 0.9) + AIrndSign(random(Level) * 15); + ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15); ap.Time:= TestTime; ap.ExplR:= 90; ap.ExplX:= EX; @@ -416,7 +416,7 @@ repeat inc(TestTime, 1000); Vx:= (Targ.X - meX) / (TestTime + tDelta); - Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-200) - meY) / (TestTime + tDelta); + Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta); r:= sqr(Vx)+sqr(Vy); if not (r > 1) then begin @@ -424,30 +424,31 @@ y:= meY; dY:= -Vy; t:= TestTime; - repeat - x:= x + Vx; - y:= y + dY; - dY:= dY + cGravityf; - dec(t) - until TestCollExcludingMe(Me, trunc(x), trunc(y), 5) or (t = 0); - EX:= trunc(x); - EY:= trunc(y); - if t < 50 then - Score:= RateExplosion(Me, EX, EY, 381) - else - Score:= BadTurn; + repeat + x:= x + Vx; + y:= y + dY; + dY:= dY + cGravityf; + dec(t) + until TestCollExcludingMe(Me, trunc(x), trunc(y), 7) or (t = 0); - if valueResult < Score then - begin - ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level)); - ap.Power:= trunc(sqrt(r) * cMaxPower * 0.9) + AIrndSign(random(Level) * 15); - ap.Time:= TestTime; - ap.ExplR:= 300; - ap.ExplX:= EX; - ap.ExplY:= EY; - valueResult:= Score - end; - end + EX:= trunc(x); + EY:= trunc(y); + if t < 50 then + Score:= RateExplosion(Me, EX, EY, 200) + RateExplosion(Me, EX, EY + 120, 200) + else + Score:= BadTurn; + + if valueResult < Score then + begin + ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level)); + ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15); + ap.Time:= TestTime; + ap.ExplR:= 300; + ap.ExplX:= EX; + ap.ExplY:= EY; + valueResult:= Score + end; + end until (TestTime = 4000); TestWatermelon:= valueResult end; @@ -457,15 +458,15 @@ var A, B, D, T: real; C: LongInt; begin - A:= sqr(cGravityf) * 0.25; + A:= sqr(cGravityf); B:= - cGravityf * (TY - MY) - 1; C:= sqr(TY - MY) + sqr(TX - MX); - D:= sqr(B) - (A * C * 4); + D:= sqr(B) - A * C; if D >= 0 then begin - D:= ( - B + sqrt(D)) * 0.5 / A; + D:= sqrt(D) - B; if D >= 0 then - T:= sqrt(D) + T:= sqrt(D * 2 / A) else T:= 0; Solve:= trunc(T) @@ -662,14 +663,15 @@ x, y: real; begin Level:= Level; // avoid compiler hint +TestFirePunch:= BadTurn; ap.ExplR:= 0; ap.Time:= 0; ap.Power:= 1; ap.Angle:= hwSign(Me^.dX); x:= hwFloat2Float(Me^.X); y:= hwFloat2Float(Me^.Y); -if (Abs(trunc(x) - Targ.X) > 25) -or (Abs(trunc(y) - 50 - Targ.Y) > 50) then +if (Abs(trunc(x) - Targ.X) < 25) + and (Abs(trunc(y) - 50 - Targ.Y) < 50) then begin // TODO - find out WTH this works. if TestColl(trunc(x), trunc(y) - 16, 6) and @@ -772,6 +774,7 @@ if (Level > 3) then exit(BadTurn); +ap.Angle:= 0; ap.AttackPutX:= Targ.X; ap.AttackPutY:= Targ.Y; diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/uConsole.pas --- a/hedgewars/uConsole.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/uConsole.pas Mon May 28 20:04:49 2012 +0400 @@ -49,8 +49,10 @@ end; procedure WriteToConsole(s: shortstring); +{$IFNDEF NOCONSOLE} var Len: LongInt; done: boolean; +{$ENDIF} begin {$IFNDEF NOCONSOLE} AddFileLog('[Con] ' + s); diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/uDebug.pas --- a/hedgewars/uDebug.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/uDebug.pas Mon May 28 20:04:49 2012 +0400 @@ -47,9 +47,13 @@ end; procedure SDLTry(Assert: boolean; isFatal: boolean); +var s: shortstring; begin if not Assert then - OutError(SDL_GetError, isFatal) + begin + s:= SDL_GetError(); + OutError(s, isFatal) + end end; end. diff -r 4d863aadd0b2 -r 5587ab553f32 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Mon May 28 01:51:50 2012 -0400 +++ b/hedgewars/uStore.pas Mon May 28 20:04:49 2012 +0400 @@ -825,7 +825,7 @@ if caption = '' then caption:= '???'; if subcaption = '' then - subcaption:= ' '; + subcaption:= _S' '; font:= CheckCJKFont(caption,fnt16); font:= CheckCJKFont(subcaption,font); @@ -909,9 +909,9 @@ r:= WriteInRect(tmpsurf, cFontBorder + 2, r.y + r.h, $ff707070, font, tmpline); // render highlighted caption (if there is a ':') - tmpline2:= ''; + tmpline2:= _S''; SplitByChar(tmpline, tmpline2, ':'); - if tmpline2 <> '' then + if tmpline2 <> _S'' then WriteInRect(tmpsurf, cFontBorder + 2, r2.y + r2.h, $ffc7c7c7, font, tmpline + ':'); end end; @@ -954,7 +954,7 @@ r.h:= 32; // default (no extra text) -extra:= ''; +extra:= _S''; extracolor:= 0; if (CurrentTeam <> nil) and (Ammoz[atype].SkipTurns >= CurrentTeam^.Clan^.TurnNumber) then // weapon or utility is not yet available @@ -969,7 +969,7 @@ end else begin - extra:= ''; + extra:= _S''; extracolor:= 0; end; diff -r 4d863aadd0b2 -r 5587ab553f32 tools/pas2c.hs --- a/tools/pas2c.hs Mon May 28 01:51:50 2012 -0400 +++ b/tools/pas2c.hs Mon May 28 20:04:49 2012 +0400 @@ -39,10 +39,11 @@ uniqCounter :: Int, toMangle :: Set.Set String, currentUnit :: String, + currentFunctionResult :: String, namespaces :: Map.Map String Records } -emptyState = RenderState Map.empty "" BTUnknown [] 0 Set.empty "" +emptyState = RenderState Map.empty "" BTUnknown [] 0 Set.empty "" "" getUniq :: State RenderState Int getUniq = do @@ -381,13 +382,19 @@ t <- type2C returnType t'<- gets lastType n <- id2C IOInsert $ setBaseType (BTFunction (numberOfDeclarations params) t') name - (p, ph) <- withState' (\st -> st{currentScope = Map.insertWith un (map toLower rv) [(render res, t')] $ currentScope st}) $ do + + let isVoid = case returnType of + VoidType -> True + _ -> False + + (p, ph) <- withState' (\st -> st{currentScope = Map.insertWith un (map toLower rv) [(render res, t')] $ currentScope st + , currentFunctionResult = if isVoid then [] else render res}) $ do p <- functionParams2C params ph <- liftM2 ($+$) (typesAndVars2C False tvars) (phrase2C' phrase) return (p, ph) - let phrasesBlock = case returnType of - VoidType -> ph - _ -> t empty <+> res <> semi $+$ ph $+$ text "return" <+> res <> semi + + let phrasesBlock = if isVoid then ph else t empty <+> res <> semi $+$ ph $+$ text "return" <+> res <> semi + return [ t empty <+> n <> parens p $+$ @@ -615,6 +622,18 @@ (BTFunction {}, (Reference r')) -> do e <- ref2C r' return $ r <+> text "=" <+> e <> semi + (BTString, _) -> do + e <- expr2C expr + lt <- gets lastType + case lt of + -- assume pointer to char for simplicity + BTPointerTo _ -> do + e <- expr2C $ Reference $ FunCall [Reference $ RefExpression expr] (SimpleReference (Identifier "pchar2str" BTUnknown)) + return $ r <+> text "=" <+> e <> semi + BTString -> do + e <- expr2C expr + return $ r <+> text "=" <+> e <> semi + _ -> error $ "Assignment to string from " ++ show lt (BTArray (Range _) _ _, _) -> phrase2C $ ProcCall (FunCall [ @@ -671,7 +690,12 @@ return $ text "do" <+> p <+> text "while" <> parens (text "!" <> parens e) <> semi phrase2C NOP = return $ text ";" -phrase2C (BuiltInFunctionCall [] (SimpleReference (Identifier "exit" BTUnknown))) = return $ text "return" <> semi +phrase2C (BuiltInFunctionCall [] (SimpleReference (Identifier "exit" BTUnknown))) = do + f <- gets currentFunctionResult + if null f then + return $ text "return" <> semi + else + return $ text "return" <+> text f <> semi phrase2C (BuiltInFunctionCall [] (SimpleReference (Identifier "break" BTUnknown))) = return $ text "break" <> semi phrase2C (BuiltInFunctionCall [] (SimpleReference (Identifier "continue" BTUnknown))) = return $ text "continue" <> semi phrase2C (BuiltInFunctionCall [e] (SimpleReference (Identifier "exit" BTUnknown))) = liftM (\e -> text "return" <+> e <> semi) $ expr2C e