diff -r 15f2908113a1 -r 58cad46782ff hedgewars/uScript.pas --- a/hedgewars/uScript.pas Tue Dec 02 22:11:22 2014 +0100 +++ b/hedgewars/uScript.pas Tue Dec 02 23:33:28 2014 +0100 @@ -100,6 +100,7 @@ ScriptAmmoReinforcement : shortstring; ScriptLoaded : boolean; mapDims : boolean; + PointsBuffer: shortString; procedure ScriptPrepareAmmoStore; forward; procedure ScriptApplyAmmoStore; forward; @@ -190,6 +191,19 @@ CheckAndFetchParamCount:= true; end; +// check if is in range of count1 and count2 +function CheckAndFetchParamCountRange(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; +begin + actual:= lua_gettop(L); + if (actual < count1) or (actual > count2) then + begin + LuaParameterCountError('at least ' + inttostr(count1) + ', but at most ' + inttostr(count2), call, paramsyntax, actual); + exit(false); + end; + + CheckAndFetchParamCountRange:= true; +end; + // check if is same or higher as minCount function CheckAndFetchLuaParamMinCount(L : Plua_State; minCount: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; begin @@ -2252,6 +2266,60 @@ lc_declareachievement:= 0 end; + +procedure ScriptFlushPoints(); +begin + ParseCommand('draw ' + PointsBuffer, true, true); + PointsBuffer:= ''; +end; + + +function lc_addPoint(L : Plua_State) : LongInt; Cdecl; +var np, param: integer; +begin + if CheckAndFetchParamCountRange(L, 2, 4, 'AddPoint', 'x, y, width [, erase]', np) then + begin + // x + param:= lua_tointeger(L,1); + PointsBuffer:= PointsBuffer + char((param and $FF00) shr 8); + PointsBuffer:= PointsBuffer + char((param and $FF)); + // y + param:= lua_tointeger(L,2); + PointsBuffer:= PointsBuffer + char((param and $FF00) shr 8); + PointsBuffer:= PointsBuffer + char((param and $FF)); + // width + if np > 2 then + param:= lua_tointeger(L,3) + else + param:= 0; + + if param <> 0 then + begin + param:= (param or $80); + // erase + if (np > 3) and lua_toboolean(L, 4) then + param:= (param or $40); + PointsBuffer:= PointsBuffer + char(param); + end + // width is 0 + else + PointsBuffer:= PointsBuffer + char(0); + + // flush before shortstring limit length is reached + if length(PointsBuffer) > 245 then + ScriptFlushPoints(); + end; + lc_addPoint:= 0 +end; + + +function lc_flushPoints(L : Plua_State) : LongInt; Cdecl; +begin + if CheckLuaParamCount(L, 0, 'FlushPoints', '') then + ScriptFlushPoints(); + lc_flushPoints:= 0 +end; + // stuff for testing the lua API function lc_endluatest(L : Plua_State) : LongInt; Cdecl; begin @@ -2947,6 +3015,9 @@ lua_register(luaState, _P'SetWaterLine', @lc_setwaterline); lua_register(luaState, _P'SetNextWeapon', @lc_setnextweapon); lua_register(luaState, _P'SetWeapon', @lc_setweapon); +// drawn map functions +lua_register(luaState, _P'AddPoint', @lc_addPoint); +lua_register(luaState, _P'FlushPoints', @lc_flushPoints); lua_register(luaState, _P'SetGearAIHints', @lc_setaihintsongear); lua_register(luaState, _P'HedgewarsScriptLoad', @lc_hedgewarsscriptload); @@ -3051,6 +3122,7 @@ procedure initModule; begin mapDims:= false; +PointsBuffer:= ''; end; procedure freeModule;