Merge alfadur's commits
authorWuzzy <Wuzzy2@mail.ru>
Wed, 22 May 2019 23:32:22 +0200
changeset 15052 8cde6fb2fabd
parent 15051 2e89487540d8 (current diff)
parent 15048 88e3d1ff67bb (diff)
child 15053 b181ff6367c9
Merge alfadur's commits
--- a/hedgewars/uConsts.pas	Wed May 22 23:30:10 2019 +0200
+++ b/hedgewars/uConsts.pas	Wed May 22 23:32:22 2019 +0200
@@ -155,6 +155,7 @@
 
     MAXNAMELEN = 192;
     MAXROPEPOINTS = 3840;
+    MAXROPELAYERS = 16;
 
     {$IFNDEF PAS2C}
     // some opengl headers do not have these macros
--- a/hedgewars/uGearsRender.pas	Wed May 22 23:30:10 2019 +0200
+++ b/hedgewars/uGearsRender.pas	Wed May 22 23:32:22 2019 +0200
@@ -95,7 +95,7 @@
 end;
 
 
-function DrawRopeLine(X1, Y1, X2, Y2, roplen: LongInt): LongInt;
+function DrawRopeLine(X1, Y1, X2, Y2, roplen: LongInt; LayerIndex: Longword): LongInt;
 var  eX, eY, dX, dY: LongInt;
     i, sX, sY, x, y, d: LongInt;
     b: boolean;
@@ -162,42 +162,46 @@
         if b then
             begin
             inc(roplen);
-            if (roplen mod cRopeNodeStep) = 0 then
+            if (roplen mod (cRopeNodeStep * cRopeLayers)) = (cRopeNodeStep * LayerIndex) then
                 DrawSpriteRotatedF(sprRopeNode, x, y, roplen div cRopeNodeStep, 1, angle);
             end
     end;
     DrawRopeLine:= roplen;
 end;
 
+procedure DrawRopeLayer(Gear: PGear; LayerIndex: LongWord);
+var roplen, i: LongInt;
+begin
+    roplen:= 0;
+    if RopePoints.Count > 0 then
+    begin
+        i:= 0;
+        while i < Pred(RopePoints.Count) do
+        begin
+            roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
+                                  hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy, roplen, LayerIndex);
+            inc(i)
+        end;
+        roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
+                              hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, roplen, LayerIndex);
+        roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
+                              hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen, LayerIndex);
+    end
+    else
+        if Gear^.Elasticity.QWordValue > 0 then
+            roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
+                                  hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen, LayerIndex);
+end;
+
 procedure DrawRope(Gear: PGear);
-var roplen, i: LongInt;
+var i: LongInt;
 begin
     if Gear^.Hedgehog^.Gear = nil then exit;
     if (Gear^.Tag = 1) or ((cReducedQuality and rqSimpleRope) <> 0) then
         DrawRopeLinesRQ(Gear)
     else
-        begin
-        roplen:= 0;
-        if RopePoints.Count > 0 then
-            begin
-            i:= 0;
-            while i < Pred(RopePoints.Count) do
-                    begin
-                    roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
-                                hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy, roplen);
-                    inc(i)
-                    end;
-            roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
-                        hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, roplen);
-            roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
-                        hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen);
-            end
-        else
-            if Gear^.Elasticity.QWordValue > 0 then
-            roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
-                        hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen);
-        end;
-
+        for i := 0 to cRopeLayers - 1 do
+            DrawRopeLayer(Gear, i);
 
 if RopePoints.Count > 0 then
     DrawSpriteRotated(sprRopeHook, hwRound(RopePoints.ar[0].X) + WorldDx, hwRound(RopePoints.ar[0].Y) + WorldDy, 1, RopePoints.HookAngle)
--- a/hedgewars/uLandObjects.pas	Wed May 22 23:30:10 2019 +0200
+++ b/hedgewars/uLandObjects.pas	Wed May 22 23:32:22 2019 +0200
@@ -1061,7 +1061,9 @@
     else if key = 'snow' then
         cSnow:= true
     else if key = 'rope-step' then
-        cRopeNodeStep:= StrToInt(s)
+        cRopeNodeStep:= max(1, StrToInt(s))
+    else if key = 'rope-layers' then
+        cRopeLayers:= max(1, min(MAXROPELAYERS, StrToInt(s)))
     else if key = 'sd-water-top' then
         begin
         i:= Pos(',', s);
--- a/hedgewars/uVariables.pas	Wed May 22 23:30:10 2019 +0200
+++ b/hedgewars/uVariables.pas	Wed May 22 23:32:22 2019 +0200
@@ -117,6 +117,7 @@
     cMapGen         : TMapGen;
     cRopePercent    : LongWord;
     cRopeNodeStep   : LongWord;
+    cRopeLayers     : LongInt;
     cGetAwayTime    : LongWord;
 
     cAdvancedMapGenMode: boolean;
@@ -2883,6 +2884,7 @@
     cDamagePercent      := 100;
     cRopePercent        := 100;
     cRopeNodeStep       := 4;
+    cRopeLayers         := 1;
     cGetAwayTime        := 100;
     cMineDudPercent     := 0;
     cTemplateFilter     := 0;
--- a/rust/hedgewars-server/src/server/handlers/inroom.rs	Wed May 22 23:30:10 2019 +0200
+++ b/rust/hedgewars-server/src/server/handlers/inroom.rs	Wed May 22 23:32:22 2019 +0200
@@ -17,8 +17,7 @@
 };
 use base64::{decode, encode};
 use log::*;
-use std::iter::once;
-use std::mem::swap;
+use std::{cmp::min, iter::once, mem::swap};
 
 #[derive(Clone)]
 struct ByMsg<'a> {
@@ -166,7 +165,7 @@
         MaxTeams(count) => {
             if !client.is_master() {
                 response.add(Warning("You're not the room master!".to_string()).send_self());
-            } else if count < 2 || count > MAX_TEAMS_IN_ROOM {
+            } else if !(2..=MAX_TEAMS_IN_ROOM).contains(&count) {
                 response
                     .add(Warning("/maxteams: specify number from 2 to 8".to_string()).send_self());
             } else {
@@ -291,12 +290,13 @@
         SetHedgehogsNumber(team_name, number) => {
             let addable_hedgehogs = room.addable_hedgehogs();
             if let Some((_, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) {
+                let max_hedgehogs = min(
+                    MAX_HEDGEHOGS_PER_TEAM,
+                    addable_hedgehogs + team.hedgehogs_number,
+                );
                 if !client.is_master() {
                     response.add(Error("You're not the room master!".to_string()).send_self());
-                } else if number < 1
-                    || number > MAX_HEDGEHOGS_PER_TEAM
-                    || number > addable_hedgehogs + team.hedgehogs_number
-                {
+                } else if !(1..=max_hedgehogs).contains(&number) {
                     response
                         .add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send_self());
                 } else {
--- a/rust/hedgewars-server/src/utils.rs	Wed May 22 23:30:10 2019 +0200
+++ b/rust/hedgewars-server/src/utils.rs	Wed May 22 23:32:22 2019 +0200
@@ -14,7 +14,7 @@
         || name.trim() != name
         || name
             .chars()
-            .any(|c| "$()*+?[]^{|}\x7F".contains(c) || '\x00' <= c && c <= '\x1F')
+            .any(|c| "$()*+?[]^{|}\x7F".contains(c) || ('\x00'..='\x1F').contains(&c))
 }
 
 pub fn to_engine_msg<T>(msg: T) -> String
--- a/rust/integral-geometry/src/lib.rs	Wed May 22 23:30:10 2019 +0200
+++ b/rust/integral-geometry/src/lib.rs	Wed May 22 23:32:22 2019 +0200
@@ -1,7 +1,7 @@
 use fpnum::{distance, fp, FPNum, FPPoint};
 use std::{
     cmp::{max, min},
-    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Range, RangeInclusive, Sub, SubAssign},
+    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, RangeInclusive, Sub, SubAssign},
 };
 
 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
@@ -416,7 +416,7 @@
 
     #[inline]
     pub fn contains(&self, point: Point) -> bool {
-        self.x_range().contains(point.x) && self.y_range().contains(point.y)
+        self.x_range().contains(&point.x) && self.y_range().contains(&point.y)
     }
 
     #[inline]
@@ -467,22 +467,6 @@
     }
 }
 
-trait RangeContains<T> {
-    fn contains(&self, value: T) -> bool;
-}
-
-impl<T: Ord> RangeContains<T> for Range<T> {
-    fn contains(&self, value: T) -> bool {
-        value >= self.start && value < self.end
-    }
-}
-
-impl<T: Ord> RangeContains<T> for RangeInclusive<T> {
-    fn contains(&self, value: T) -> bool {
-        value >= *self.start() && value <= *self.end()
-    }
-}
-
 trait RangeClamp<T> {
     fn clamp(&self, value: T) -> T;
 }