Skip to content

Commit 5b84388

Browse files
committed
✨(mapScript) 适配K2和新版本SA
1 parent 8f60269 commit 5b84388

10 files changed

Lines changed: 103 additions & 127 deletions

File tree

scripts/bootStrap/generate.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ suspend fun main() {
3737
else
3838
Config.args.forEach { compileOnly(it) }
3939
}.run {
40-
val fail = conditions.values.filter { it.status == ConditionState.Status.Success }
40+
val fail = conditions.values.filter { it.status != ConditionState.Status.Success }
4141
println("共加载${conditions.size}个脚本,失败${fail.size}")
4242
printResult()
4343
if (System.getProperty("ScriptAgent.PreparePack") != null) {

scripts/mapScript/1005.kts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ registerGenerator(
2121
"HEXed*[yellow]沙滩海战", "WayZer", """
2222
你落到了一个满是水的星球,
2323
不过我们有传统异能-[sky]填海造陆[]
24-
24+
2525
另外我们有先进的技术,能够从空气中获取能量-[sky]无限火力[]
2626
并且只需要一点点引子就能量转换为物质-[sky](几乎)免费建筑[]
2727
但是纯能量速度毕竟有点慢
28-
28+
2929
[@pvpProtect=0]
3030
平衡调整:削弱t4海辅治疗能力, 大治疗治疗量等于小治疗(范围更大)
3131
中泵30玻璃10合金,大泵30氧化物
@@ -73,8 +73,6 @@ registerGenerator(
7373
genRound("initHexData") { HexData.init(generator.chunkCenters, coreSchema) }
7474
}
7575

76-
val base = contextScript<_14562>()
77-
7876
@Language("JSON5")
7977
val patch = """{
8078
"name": "1005",
@@ -100,7 +98,7 @@ onEnable {
10098
// """block.${it.name}.consumers:{clearItems:1,clearLiquids:1},"""
10199
// }}
102100
HexData.extraLoadout.add {
103-
coreTile.getLinkedTiles { base.myTiles[it.array()].discover() }
101+
coreTile.getLinkedTiles { IslandTile.tiles[it.array()].discover() }
104102
}
105103
loop(Dispatchers.game) {
106104
delay(1000)

scripts/mapScript/13545.kts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package mapScript
77

88
import arc.util.Align
9-
import coreLibrary.lib.util.loop
109
import mindustry.game.Team
1110
import mindustry.gen.Iconc
1211
import mindustry.net.Administration
@@ -34,20 +33,12 @@ val patch = """
3433
""".trimIndent()
3534
mapPatches = listOf(patch)
3635

37-
data class TeamData(val team: Team) {
38-
var blockDamageMultiplier by team.rules()::blockDamageMultiplier
39-
var blockHealthMultiplier by team.rules()::blockHealthMultiplier
40-
var unitDamageMultiplier by team.rules()::unitDamageMultiplier
41-
var unitHealthMultiplier by team.rules()::unitHealthMultiplier
42-
}
43-
44-
val teamData = mutableMapOf<Team, TeamData>()
45-
val Team.myData get() = teamData.getOrPut(this) { TeamData(this) }
46-
onDisable { teamData.clear() }
36+
val Team.myData get() = CoreWarTeamData.get(this)
37+
onDisable { CoreWarTeamData.map.clear() }
4738

4839
registerActionFilter {
49-
if(it.type == Administration.ActionType.control || it.type==Administration.ActionType.command){
50-
if(it.unit.type == UnitTypes.mono)
40+
if (it.type == Administration.ActionType.control || it.type == Administration.ActionType.command) {
41+
if (it.unit.type == UnitTypes.mono)
5142
return@registerActionFilter false
5243
}
5344
true

scripts/mapScript/13545.menu.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package mapScript
22

33
import arc.math.Mathf
4-
import cf.wayzer.scriptAgent.contextScript
54
import coreLibrary.lib.with
65
import coreMindustry.MenuBuilder
76
import coreMindustry.lib.MsgType
@@ -24,13 +23,24 @@ import kotlin.reflect.KMutableProperty0
2423

2524
private val confirmed = mutableSetOf<String>()
2625

26+
data class CoreWarTeamData(val team: Team) {
27+
var blockDamageMultiplier by team.rules()::blockDamageMultiplier
28+
var blockHealthMultiplier by team.rules()::blockHealthMultiplier
29+
var unitDamageMultiplier by team.rules()::unitDamageMultiplier
30+
var unitHealthMultiplier by team.rules()::unitHealthMultiplier
31+
32+
companion object {
33+
val map = mutableMapOf<Team, CoreWarTeamData>()
34+
fun get(team: Team) = map.getOrPut(team) { CoreWarTeamData(team) }
35+
}
36+
}
37+
2738
class CoreWarMenu(val player: Player, val build: Building) : MenuBuilder<Unit>(followup = true) {
28-
private val script = contextScript<_13545>()
2939
private val isErekir = build.block in arrayOf(Blocks.coreAcropolis, Blocks.coreBastion, Blocks.coreCitadel)
3040
private val item = if (isErekir) Items.beryllium else Items.copper
3141
private fun Building.getResource() = items.get(item)
3242
private fun Building.removeResource(v: Int) = items.remove(item, v)
33-
private val Team.myData get() = with(script) { myData }
43+
private val Team.myData: CoreWarTeamData get() = CoreWarTeamData.get(this)
3444

3545
@MenuBuilderDsl
3646
suspend fun costOption(title: String, cost: () -> Int, body: () -> Boolean) = lazyOption {

scripts/mapScript/14562.api.kt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package mapScript
2+
3+
import mindustry.content.Blocks
4+
import mindustry.world.Block
5+
import mindustry.world.Tile
6+
import mindustry.world.blocks.environment.Floor
7+
8+
class IslandTile(val tile: Tile) {
9+
companion object {
10+
var waterFloor: Floor = Blocks.deepwater.asFloor()!!
11+
val discoverQueue = mutableListOf<IslandTile>()
12+
var tiles = emptyList<IslandTile>()
13+
}
14+
15+
val floor: Floor = tile.floor()
16+
val overlay: Block = tile.overlay()
17+
var discovered = false
18+
19+
init {
20+
if (overlay != Blocks.spawn && tile.block() == Blocks.air) {
21+
tile.setBlock(Blocks.stone)//remove ore
22+
tile.setFloor(waterFloor)
23+
tile.setAir()
24+
} else
25+
discovered = true
26+
}
27+
28+
//use in init stage, no net sync
29+
fun discoverInit() {
30+
if (discovered) return
31+
discovered = true
32+
tile.setBlock(Blocks.stone)//remove ore
33+
tile.setFloor(floor)
34+
tile.setOverlay(overlay)
35+
tile.setAir()
36+
}
37+
38+
fun discover(): Boolean {
39+
if (discovered) return false
40+
discovered = true
41+
tile.setFloorNet(floor, overlay)
42+
if (tile.block() == Blocks.air)
43+
tile.setAir()
44+
if (floor.isDeep)//auto discover
45+
repeat(4) {
46+
val tile = tile.nearby(it) ?: return@repeat
47+
discoverQueue.add(tiles[tile.array()])
48+
}
49+
return true
50+
}
51+
52+
fun unDiscover(): Boolean {
53+
if (!discovered) return false
54+
discovered = false
55+
tile.setBlock(Blocks.stone)//remove ore
56+
tile.setFloorNet(waterFloor, Blocks.air)
57+
tile.setAir()
58+
return true
59+
}
60+
}

scripts/mapScript/14562.kts

Lines changed: 11 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package mapScript
33
import mindustry.ctype.ContentType
44
import mindustry.game.EventType.Trigger
55
import mindustry.gen.Iconc
6-
import mindustry.world.Block
7-
import mindustry.world.Tile
86
import mindustry.world.blocks.environment.Floor
97

108
name = "填海造陆"
@@ -17,60 +15,6 @@ modeIntroduce(
1715
""".trimIndent()
1816
)
1917

20-
var myTiles = emptyList<IslandTile>()
21-
val waterFloor by autoInit {
22-
state.rules.tags.get("@waterFloor")
23-
?.let { content.getByName(ContentType.block, it) as? Floor }
24-
?: Blocks.deepwater.asFloor()!!
25-
}
26-
27-
inner class IslandTile(val tile: Tile) {
28-
val floor: Floor = tile.floor()
29-
val overlay: Block = tile.overlay()
30-
var discovered = false
31-
32-
init {
33-
if (overlay != Blocks.spawn && tile.block() == Blocks.air) {
34-
tile.setBlock(Blocks.stone)//remove ore
35-
tile.setFloor(waterFloor)
36-
tile.setAir()
37-
} else
38-
discovered = true
39-
}
40-
41-
//use in init stage, no net sync
42-
fun discoverInit() {
43-
if (discovered) return
44-
discovered = true
45-
tile.setBlock(Blocks.stone)//remove ore
46-
tile.setFloor(floor)
47-
tile.setOverlay(overlay)
48-
tile.setAir()
49-
}
50-
51-
fun discover(): Boolean {
52-
if (discovered) return false
53-
discovered = true
54-
tile.setFloorNet(floor, overlay)
55-
if (tile.block() == Blocks.air)
56-
tile.setAir()
57-
if (floor.isDeep)//auto discover
58-
repeat(4) {
59-
val tile = tile.nearby(it) ?: return@repeat
60-
discoverQueue.add(myTiles[tile.array()])
61-
}
62-
return true
63-
}
64-
65-
fun unDiscover(): Boolean {
66-
if (!discovered) return false
67-
discovered = false
68-
tile.setBlock(Blocks.stone)//remove ore
69-
tile.setFloorNet(waterFloor, Blocks.air)
70-
tile.setAir()
71-
return true
72-
}
73-
}
7418

7519
val blocksToOpen = mapOf(
7620
Blocks.mechanicalPump to 1,
@@ -79,18 +23,21 @@ val blocksToOpen = mapOf(
7923
)
8024

8125
onEnable {
82-
myTiles = world.tiles.map(::IslandTile)
26+
IslandTile.waterFloor = state.rules.tags.get("@waterFloor")
27+
?.let { content.getByName(ContentType.block, it) as? Floor }
28+
?: Blocks.deepwater.asFloor()!!
29+
IslandTile.tiles = world.tiles.map(::IslandTile)
8330
Groups.build.filter { it.block in blocksToOpen }.forEach {
8431
it.tile.setAir()
8532
it.tile.circle(blocksToOpen[it.block]!!) { x, y ->
86-
myTiles[world.packArray(x, y)].discoverInit()
33+
IslandTile.tiles[world.packArray(x, y)].discoverInit()
8734
}
8835
}
8936
}
9037

9138
onDisable {
92-
discoverQueue.clear()
93-
myTiles = emptyList()
39+
IslandTile.discoverQueue.clear()
40+
IslandTile.tiles = emptyList()
9441
}
9542

9643
listen<EventType.BlockBuildEndEvent> {
@@ -99,31 +46,30 @@ listen<EventType.BlockBuildEndEvent> {
9946
when (val block = tile.block()) {
10047
in blocksToOpen -> {
10148
var any = false
102-
tile.getLinkedTiles { if (myTiles[it.array()].discover()) any = true }
49+
tile.getLinkedTiles { if (IslandTile.tiles[it.array()].discover()) any = true }
10350
if (any) {
10451
launch(Dispatchers.game) {
10552
delay(100)
10653
Call.deconstructFinish(tile, block, null)
10754
}
10855
tile.circle(blocksToOpen[block]!!) { x, y ->
109-
discoverQueue.add(myTiles[world.packArray(x, y)])
56+
IslandTile.discoverQueue.add(IslandTile.tiles[world.packArray(x, y)])
11057
}
11158
}
11259
}
11360

11461
Blocks.shockMine ->
115-
if (myTiles[tile.array()].unDiscover())
62+
if (IslandTile.tiles[tile.array()].unDiscover())
11663
launch(Dispatchers.game) {
11764
delay(100)
11865
Call.deconstructFinish(tile, block, null)
11966
}
12067
}
12168
}
12269

123-
val discoverQueue = mutableListOf<IslandTile>()
12470
listen(Trigger.update) {
12571
repeat(5) {
126-
val tile = discoverQueue.removeFirstOrNull() ?: return@listen
72+
val tile = IslandTile.discoverQueue.removeFirstOrNull() ?: return@listen
12773
tile.discover()
12874
}
12975
}

scripts/mapScript/lib/ContentExt.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,5 @@ fun Script.modeIntroduce(mode: String, introduce: String) {
1414
}
1515
}
1616

17-
@ScriptDsl
18-
var Script.mapScriptController by DSLBuilder.dataKey<Boolean>()
19-
2017
@ScriptDsl
2118
var Script.mapPatches by DSLBuilder.dataKey<List<String>>()

scripts/mapScript/lib/ScriptMapGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class ScriptMapGenerator(val script: Script, val width: Int, val height: Int) {
6060
}
6161
if (script.enabled) return// Already enabled inside WorldLoadEvent
6262
MindustryDispatcher.safeBlocking {
63-
ScriptManager.enableScript(script, true)
63+
ScriptManager.enableScript(script)
6464
}
6565
if (!thisContextScript().checkEnabled(script.scriptInfo)) {
6666
MapManager.loadMap()

scripts/mapScript/module.kts

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,13 @@ import wayzer.MapRegistry
1414

1515
val children get() = ScriptRegistry.allScripts { it != scriptInfo && it.dependsOn(scriptInfo) }
1616

17-
onEnable {
18-
//Disable all non-controller scripts
19-
children.forEach {
20-
if (it.scriptState == ScriptState.ToEnable && it.inst?.mapScriptController != true) {
21-
it.stateUpdateForce(ScriptState.Loaded)
22-
}
23-
}
24-
}
25-
26-
listen<EventType.ResetEvent> {
27-
MindustryDispatcher.safeBlocking {
28-
ScriptManager.transaction {
29-
addAll(children)
30-
disable()
31-
getForState(ScriptState.ToEnable).forEach {
32-
it.stateUpdateForce(ScriptState.Loaded)
33-
}
34-
}
35-
}
36-
}
37-
38-
listen<EventType.ResetEvent> {
39-
//try update child scripts
40-
ScriptRegistry.scanRoot()
17+
listen<EventType.ResetEvent> { _ ->
4118
MindustryDispatcher.safeBlocking {
42-
ScriptManager.transaction {
43-
addAll(children)
44-
removeIf { it.compiledScript?.source.run { this == null || this == it.source } }
45-
if (isEmpty()) return@transaction
46-
47-
logger.info("Unload outdated script: ${toList()}")
48-
unload()//unload all updatable
49-
}
19+
ScriptManager.transactionV2 {
20+
disable(children.filter { it.enabled })
21+
execute().printResult()
22+
load(keys.toList())
23+
}.printResult()
5024
}
5125
}
5226

@@ -78,9 +52,8 @@ listen<EventType.WorldLoadEvent> {
7852
val toLoad = getToLoadMapScripts()
7953
if (toLoad.isEmpty()) return@listen
8054
MindustryDispatcher.safeBlocking {
81-
ScriptManager.transaction {
82-
addAll(toLoad)
83-
load(); enable()
55+
ScriptManager.transactionV2 {
56+
enable(toLoad)
8457
}
8558
}
8659
toLoad.forEach { checkEnabled(it) }

scripts/mapScript/shared/hexed.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package mapScript.shared
44

55
import mindustry.world.blocks.storage.CoreBlock.CoreBuild
66
import mindustry.world.modules.ItemModule
7+
import wayzer.map.AssignTeamEvent
78
import kotlin.time.Duration.Companion.minutes
89

910
listen<EventType.BlockDestroyEvent> {
@@ -20,7 +21,7 @@ listen<EventType.BlockBuildEndEvent> {
2021
}
2122
}
2223

23-
listenTo<wayzer.map.BetterTeam.AssignTeamEvent> {
24+
listenTo<AssignTeamEvent> {
2425
team = HexData.assignTeam(player, group)
2526
}
2627

0 commit comments

Comments
 (0)