From 34856a61dd6b52c506aafa2dfd7de9d1ab07ced7 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Tue, 10 Nov 2020 03:44:40 +0100
Subject: [PATCH] Also inhibit FLATTEN_SURROUNDINGS with terrain passwording.

---
 plomrogue/game.py    |  8 ++++++++
 plomrogue/tasks.py   | 15 ++++++++-------
 plomrogue/things.py  |  2 +-
 rogue_chat_curses.py |  2 +-
 4 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/plomrogue/game.py b/plomrogue/game.py
index accf35d..a6bc2a3 100755
--- a/plomrogue/game.py
+++ b/plomrogue/game.py
@@ -73,6 +73,14 @@ class Game(GameBase):
                 print("FILE INPUT LINE %5s: %s" % (i, line), end='')
                 self.io.handle_input(line, god_mode=True)
 
+    def can_do_tile_with_pw(self, yx, pw):
+        tile_class = self.map_control[yx]
+        if tile_class in self.map_control_passwords:
+            tile_pw = self.map_control_passwords[tile_class]
+            if pw != tile_pw:
+                return False
+        return True
+
     def get_string_options(self, string_option_type):
         import string
         if string_option_type == 'direction':
diff --git a/plomrogue/tasks.py b/plomrogue/tasks.py
index 55669ec..2c0c3fc 100644
--- a/plomrogue/tasks.py
+++ b/plomrogue/tasks.py
@@ -51,11 +51,9 @@ class Task_WRITE(Task):
     argtypes = 'string:char string'
 
     def check(self):
-        tile_class = self.thing.game.map_control[self.thing.position]
-        if tile_class in self.thing.game.map_control_passwords:
-            tile_pw = self.thing.game.map_control_passwords[tile_class]
-            if self.args[1] != tile_pw:
-                raise GameError('wrong password for tile')
+        if not self.thing.game.can_do_tile_with_pw(self.thing.position,
+                                                   self.args[1]):
+            raise GameError('wrong password for tile')
 
     def do(self):
         self.thing.game.map[self.thing.position] = self.args[0]
@@ -64,12 +62,15 @@ class Task_WRITE(Task):
 
 class Task_FLATTEN_SURROUNDINGS(Task):
     todo = 10
+    argtypes = 'string'
 
     def check(self):
         pass
 
     def do(self):
-        self.thing.game.map[self.thing.position] = '.'
-        for yx in self.thing.game.map_geometry.get_neighbors(self.thing.position).values():
+        for yx in[self.thing.position] + \
+            list(self.thing.game.map_geometry.get_neighbors(self.thing.position).values()):
             if yx is not None:
+                if not self.thing.game.can_do_tile_with_pw(yx, self.args[0]):
+                    continue
                 self.thing.game.map[yx] = '.'
diff --git a/plomrogue/things.py b/plomrogue/things.py
index 0e4af34..f066ae6 100644
--- a/plomrogue/things.py
+++ b/plomrogue/things.py
@@ -74,5 +74,5 @@ class ThingPlayer(ThingAnimate):
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
-        self.nickname = 'undefined' 
+        self.nickname = 'undefined'
 
diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py
index bf5ad1f..7ce1496 100755
--- a/rogue_chat_curses.py
+++ b/rogue_chat_curses.py
@@ -649,7 +649,7 @@ class TUI:
                     self.switch_mode('edit')
                 elif key == self.keys['flatten'] and\
                      'FLATTEN_SURROUNDINGS' in self.game.tasks:
-                    self.send('TASK:FLATTEN_SURROUNDINGS')
+                    self.send('TASK:FLATTEN_SURROUNDINGS ' + quote(self.password))
                 elif key in self.movement_keys and 'MOVE' in self.game.tasks:
                     self.send('TASK:MOVE ' + self.movement_keys[key])
             elif self.mode == self.mode_edit:
-- 
2.30.2