Skip to content

Commit 1279839

Browse files
Lincoln-Ablungarella-raffaele
authored andcommitted
feat: improve Randomizer second step
fix #102
1 parent 0302169 commit 1279839

File tree

4 files changed

+79
-21
lines changed

4 files changed

+79
-21
lines changed

assets/resources/levels/persistent_levels.tres

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
[ext_resource type="Script" path="res://scripts/utility/cell_data.gd" id="2_08p0w"]
55
[ext_resource type="Script" path="res://scripts/utility/slider_data.gd" id="3_cr51g"]
66
[ext_resource type="Script" path="res://scripts/utility/level_container.gd" id="4_v7vmu"]
7-
[ext_resource type="Resource" path="res://assets/resources/tutorial/slider_tutorial.tres" id="5_w6l3t"]
8-
[ext_resource type="Resource" path="res://assets/resources/tutorial/symbols_tutorial.tres" id="6_dak7y"]
9-
[ext_resource type="Resource" path="res://assets/resources/tutorial/blocked_tile_tutorial.tres" id="7_k86s7"]
10-
[ext_resource type="Resource" path="res://assets/resources/tutorial/automatic_slider_tutorial.tres" id="8_www21"]
11-
[ext_resource type="Resource" path="res://assets/resources/tutorial/invert_slider_tutorial.tres" id="9_up8js"]
12-
[ext_resource type="Resource" path="res://assets/resources/tutorial/block_slider_tutorial.tres" id="10_fk02p"]
7+
[ext_resource type="Resource" uid="uid://g4xb4c18wx6d" path="res://assets/resources/tutorial/slider_tutorial.tres" id="5_w6l3t"]
8+
[ext_resource type="Resource" uid="uid://di7kanjcci6e6" path="res://assets/resources/tutorial/symbols_tutorial.tres" id="6_dak7y"]
9+
[ext_resource type="Resource" uid="uid://cexkhgb6rb2ip" path="res://assets/resources/tutorial/blocked_tile_tutorial.tres" id="7_k86s7"]
10+
[ext_resource type="Resource" uid="uid://df5xj4eoouci8" path="res://assets/resources/tutorial/automatic_slider_tutorial.tres" id="8_www21"]
11+
[ext_resource type="Resource" uid="uid://wor27ovpdofm" path="res://assets/resources/tutorial/invert_slider_tutorial.tres" id="9_up8js"]
12+
[ext_resource type="Resource" uid="uid://bh8t8odtplmtn" path="res://assets/resources/tutorial/block_slider_tutorial.tres" id="10_fk02p"]
1313

1414
[sub_resource type="Resource" id="Resource_qujjk"]
1515
script = ExtResource("2_08p0w")

assets/resources/utility/randomizer_options.tres

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ extension_rules = {
2828
"RANDOM": 30
2929
}
3030
full_odd = 15
31+
full_odd_on_stop = 60
3132
block_full_odd = 50
33+
block_full_odd_on_stop = 80
34+
block_full_retract_odd = 80
3235
type_rules = {
3336
"ADD": 45,
3437
"BLOCK": 7,

scripts/utility/randomizer.gd

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

269324
static func _get_possible_sliders(data: LevelData) -> Dictionary:
270325
var result: Dictionary

scripts/utility/randomizer_options.gd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ class_name RandomizerOptions extends Resource
2626
## Slider full probability
2727
@export var full_odd := 10
2828
## Slider full probability when stopped by another block
29-
@export var full_odd_on_stop := 60
29+
@export var full_odd_on_stop := 30
3030
## Slider block full probability
3131
@export var block_full_odd := 20
3232
## Slider block full probability when stopped by another block
33-
@export var block_full_odd_on_stop := 80
33+
@export var block_full_odd_on_stop := 50
3434
## Slider block retractable after stop other sliders
35-
@export var block_full_retract_odd := 80
35+
@export var block_full_retract_odd := 50
3636
## Sliders type rules
3737
@export var type_rules := {"ADD": 45, "SUBTRACT": 45, "CHANGE_SIGN": 3, "BLOCK": 7}

0 commit comments

Comments
 (0)