@@ -81,13 +81,17 @@ static func _add_sliders(data: LevelData, filtered: Dictionary) -> void:
8181 var normal_sliders : Array [Vector2i ]
8282 var locked_cells : Array [CellData ]
8383 var receiver_cells : Dictionary
84+
85+ var effect_slider_count := 0
8486 for slider_coord : Vector2i in filtered .keys ():
8587 var slider_data := filtered .get (slider_coord ) as RandomizerSlider
8688 match _get_rule (OPTIONS .type_rules ):
8789 "ADD" :
90+ effect_slider_count += 1
8891 slider_data .effect = GlobalConst .AreaEffect .ADD
8992 normal_sliders .append (slider_coord )
9093 "SUBTRACT" :
94+ effect_slider_count += 1
9195 slider_data .effect = GlobalConst .AreaEffect .SUBTRACT
9296 normal_sliders .append (slider_coord )
9397 "CHANGE_SIGN" :
@@ -96,6 +100,16 @@ static func _add_sliders(data: LevelData, filtered: Dictionary) -> void:
96100 "BLOCK" :
97101 slider_data .effect = GlobalConst .AreaEffect .BLOCK
98102 block_sliders .append (slider_coord )
103+
104+ # check that at least one slider affects the grid
105+ if effect_slider_count == 0 :
106+ var slider_coord := filtered .keys ()[0 ] as Vector2i
107+ var slider_data := filtered .get (slider_coord ) as RandomizerSlider
108+ slider_data .effect = GlobalConst .AreaEffect .ADD
109+ normal_sliders .append (slider_coord )
110+ block_sliders .erase (slider_coord )
111+ change_sliders .erase (slider_coord )
112+
99113 # add slider-block
100114 for slider_coord in block_sliders :
101115 var slider := filtered .get (slider_coord ) as RandomizerSlider
@@ -124,6 +138,7 @@ static func _add_sliders(data: LevelData, filtered: Dictionary) -> void:
124138 emitter_sliders = receiver_cells .get (cell_coord )
125139 emitter_sliders .append (slider_coord )
126140 receiver_cells [cell_coord ] = emitter_sliders
141+
127142 # mix other sliders
128143 if ! change_sliders .is_empty ():
129144 normal_sliders .append_array (change_sliders )
@@ -154,6 +169,7 @@ static func _add_sliders(data: LevelData, filtered: Dictionary) -> void:
154169 emitter_sliders = receiver_cells .get (cell_coord )
155170 emitter_sliders .append (slider_coord )
156171 receiver_cells [cell_coord ] = emitter_sliders
172+
157173 # use unfull slider-block for check behavior-full probability
158174 for slider_coord : Vector2i in filtered .keys ():
159175 var slider := filtered .get (slider_coord ) as RandomizerSlider
@@ -171,24 +187,56 @@ static func _add_sliders(data: LevelData, filtered: Dictionary) -> void:
171187 continue
172188 if _check_probability (OPTIONS .block_full_odd_on_stop ):
173189 slider .behavior = GlobalConst .AreaBehavior .FULL
174- # else:
175- ## use stopped slider for check retractable slider-block
176- # if slider.is_stopped and slider.behavior == GlobalConst.AreaBehavior.FULL:
177- # if _check_probability(OPTIONS.block_full_retract_odd):
178- # var cell_coord := slider.reachable[slider.reached.size()] as Vector2i
179- # var emitter_slider := receiver_cells.get(cell_coord) as Array[Vector2i]
180- # var slider_data := filtered.get(emitter_slider[0]) as RandomizerSlider
181- # for coord in slider_data.reached:
182- # var cell_data := data.cells_list[coord] as CellData
183- # cell_data.is_blocked = false
184- # locked_cells.erase(cell_data)
190+
191+ # use stopped slider for check retractable slider-block
192+ var stopped_sliders : Dictionary
193+ for slider_coord : Vector2i in filtered .keys ():
194+ var slider := filtered .get (slider_coord ) as RandomizerSlider
195+ if slider .effect == GlobalConst .AreaEffect .BLOCK :
196+ continue
197+ if slider .is_stopped :
198+ stopped_sliders [slider_coord ] = slider .reachable [slider .reached .size ()]
199+ if stopped_sliders .size () > 1 :
200+ for slider_coord in block_sliders :
201+ var blocked_sliders : Array [Vector2i ]
202+ var slider_data := filtered .get (slider_coord ) as RandomizerSlider
203+ for cell_coord in slider_data .reached :
204+ while true :
205+ var coord = stopped_sliders .find_key (cell_coord )
206+ if coord == null :
207+ break
208+ stopped_sliders .erase (coord )
209+ blocked_sliders .append (coord )
210+ if blocked_sliders .size () <= 1 :
211+ continue
212+ if _check_probability (OPTIONS .block_full_retract_odd ):
213+ # retract slider-block
214+ for coord in slider_data .reached :
215+ var cell_data := data .cells_list [coord ] as CellData
216+ cell_data .is_blocked = false
217+ locked_cells .erase (cell_data )
218+ # extend other slider but last
219+ for i in range (blocked_sliders .size ()):
220+ var slider := filtered .get (blocked_sliders [i ]) as RandomizerSlider
221+ if i == blocked_sliders .size () - 1 :
222+ # last slider blocked
223+ slider .behavior = GlobalConst .AreaBehavior .FULL
224+ else :
225+ if slider .effect != GlobalConst .AreaEffect .CHANGE_SIGN :
226+ for j in range (slider .reached .size (), slider .reachable .size ()):
227+ var cell := data .cells_list [slider .reachable [j ]] as CellData
228+ if cell .is_blocked :
229+ break
230+ _apply_slider_effect (cell , slider .effect )
231+
185232 # add slider to level data
186233 for slider_coord in filtered .keys ():
187234 var slider := filtered .get (slider_coord ) as RandomizerSlider
188235 var slider_data := SliderData .new ()
189236 slider_data .area_effect = slider .effect
190237 slider_data .area_behavior = slider .behavior
191238 data .slider_list [slider_coord ] = slider_data
239+
192240 # remove temporarily block
193241 for cell_data in locked_cells :
194242 cell_data .is_blocked = false
@@ -223,18 +271,25 @@ static func _get_filtered_sliders(possible: Dictionary) -> Dictionary:
223271 filterd .shuffle ()
224272 filterd .resize (slider_count )
225273 # calculate sliders extesion
274+ var extended_count := 0
226275 for slider_coord in filterd :
227276 var slider_data := RandomizerSlider .new ()
228277 slider_data .reachable = possible .get (slider_coord ) as Array [Vector2i ]
229278 var reached := possible .get (slider_coord ).duplicate () as Array [Vector2i ]
230279 match _get_rule (OPTIONS .extension_rules ):
280+ "MAX" :
281+ extended_count += 1
231282 "NONE" :
232283 reached .clear ()
233284 "RANDOM" :
285+ extended_count += 1
234286 if reached .size () > 1 :
235287 reached .resize (randi_range (1 , reached .size () - 1 ))
236288 slider_data .reached = reached
237289 result [slider_coord ] = slider_data
290+ if extended_count == 0 :
291+ var slider_data := result .get (result .keys ()[0 ]) as RandomizerSlider
292+ slider_data .reached = slider_data .reachable
238293 return result
239294
240295
@@ -264,7 +319,7 @@ static func _is_opposite_slider(a: Vector2i, b: Vector2i) -> bool:
264319 if a .x % 2 == b .x % 2 :
265320 return true
266321 return false
267-
322+
268323
269324static func _get_possible_sliders (data : LevelData ) -> Dictionary :
270325 var result : Dictionary
0 commit comments