Skip to content

Commit 60d7185

Browse files
authored
Merge pull request #72 from jramstedt/more-features
More features
2 parents 2c0556e + f126dae commit 60d7185

File tree

4 files changed

+325
-30
lines changed

4 files changed

+325
-30
lines changed

editor/levels/ObjectsView.go

+217
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,223 @@ func (view *ObjectsView) renderPropertyControl(lvl *level.Level, readOnly bool,
647647
})
648648
})
649649

650+
simplifier.SetSpecialHandler("MultiAnimation", func() {
651+
/*
652+
animationTypes := []string{"Random"}
653+
selectedType := -1
654+
if unifier.IsUnique() {
655+
value := int(unifier.Unified().(int32))
656+
selectedType = value >> 12
657+
}
658+
659+
values.RenderUnifiedCombo(readOnly, key+"###"+fullKey+"-Type", unifier,
660+
func(u values.Unifier) int {
661+
key := unifier.Unified().(int32)
662+
return int(key >> 12)
663+
},
664+
func(index int) string { return animationTypes[index] },
665+
len(animationTypes),
666+
func(newIndex int) {
667+
updater(func(oldValue uint32) uint32 {
668+
result := oldValue & ^uint32(0xF000)
669+
result |= uint32(newIndex<<12) & uint32(0xF000)
670+
return result
671+
})
672+
})
673+
*/
674+
675+
// if selectedType == 0 {
676+
values.RenderUnifiedSliderInt(readOnly, key+" infrequency###"+fullKey+"-infrequency", unifier,
677+
func(u values.Unifier) int {
678+
key := unifier.Unified().(int32)
679+
return int(key & 0x0FFF)
680+
},
681+
func(value int) string { return "%d" },
682+
0, 0x0FFF,
683+
func(newValue int) {
684+
updater(func(oldValue uint32) uint32 {
685+
result := oldValue & ^uint32(0x0FFF)
686+
result |= uint32(newValue) & uint32(0x0FFF)
687+
return result
688+
})
689+
})
690+
//}
691+
})
692+
693+
simplifier.SetSpecialHandler("PictureSource", func() {
694+
indexConverter := func(u values.Unifier) int { return int(u.Unified().(int32)) & 0x007F }
695+
indexUpdater := func(newValue int) {
696+
updater(func(oldValue uint32) uint32 {
697+
result := oldValue & ^uint32(0x007F)
698+
result |= uint32(newValue) & uint32(0x007F)
699+
return result
700+
})
701+
}
702+
703+
sourceType := []string{"Data", "ObjectID"}
704+
selectedType := -1
705+
if unifier.IsUnique() {
706+
value := int(unifier.Unified().(int32))
707+
selectedType = (value & 0x1000) >> 12
708+
}
709+
710+
imgui.Separator()
711+
imgui.Text(key + ":")
712+
713+
values.RenderUnifiedCombo(readOnly, "Source###"+fullKey+"-Source", unifier,
714+
func(u values.Unifier) int {
715+
key := unifier.Unified().(int32)
716+
return int((key & 0x1000) >> 12)
717+
},
718+
func(index int) string { return sourceType[index] },
719+
len(sourceType),
720+
func(newIndex int) {
721+
updater(func(oldValue uint32) uint32 {
722+
result := oldValue & ^uint32(0x1000)
723+
result |= uint32(newIndex<<12) & uint32(0x1000)
724+
return result
725+
})
726+
})
727+
728+
if selectedType == 0 {
729+
dataType := []string{"Screen", "Custom", "Text", "Scrolling Text"}
730+
textureData := -1
731+
index := -1
732+
selectedDataType := -1
733+
734+
if unifier.IsUnique() {
735+
value := int(unifier.Unified().(int32))
736+
textureData = value & 0x0FFF
737+
index = textureData & 0x007F
738+
selectedDataType = (value & 0x0180) >> 7
739+
}
740+
741+
values.RenderUnifiedCombo(readOnly, "Type###"+fullKey+"-Type", unifier,
742+
func(u values.Unifier) int {
743+
key := unifier.Unified().(int32)
744+
return int((key & 0x0180) >> 7)
745+
},
746+
func(index int) string { return dataType[index] },
747+
len(dataType),
748+
func(newIndex int) {
749+
updater(func(oldValue uint32) uint32 {
750+
result := oldValue & ^uint32(0x0180)
751+
result |= uint32(newIndex<<7) & uint32(0x0180)
752+
return result
753+
})
754+
})
755+
756+
if selectedDataType == 0 { // Screen
757+
resInfo, _ := ids.Info(ids.ScreenTextures)
758+
759+
values.RenderUnifiedSliderInt(readOnly, "Index###"+fullKey+"-Index", unifier,
760+
indexConverter,
761+
func(value int) string { return "%d" },
762+
0, resInfo.MaxCount-1,
763+
indexUpdater)
764+
765+
render.TextureSelector(key+"-Screen###"+fullKey+"-Screen", -1, view.guiScale, resInfo.MaxCount, index,
766+
view.textureCache,
767+
func(index int) resource.Key {
768+
return resource.KeyOf(ids.ScreenTextures.Plus(index), resource.LangAny, 0)
769+
},
770+
func(index int) string { return fmt.Sprintf("%3d", index) },
771+
func(index int) {
772+
if !readOnly {
773+
indexUpdater(index)
774+
}
775+
})
776+
} else if selectedDataType == 1 { // Custom
777+
values.RenderUnifiedSliderInt(readOnly, "Index###"+fullKey+"-Index", unifier,
778+
indexConverter,
779+
func(value int) string {
780+
if value >= 0x78 && value <= (0x78+8) {
781+
return "%d - Camera"
782+
} else if value == 0x77 {
783+
return "%d - Static"
784+
} else if value == 0x76 {
785+
return "%d - SHODAN Proximity"
786+
} else if value >= 0x70 && value <= (0x70+6) {
787+
return "%d - Automap"
788+
} else {
789+
return "%d"
790+
}
791+
},
792+
0, 0x007F,
793+
indexUpdater)
794+
795+
resInfo, _ := ids.Info(ids.ObjectMaterialBitmaps)
796+
if index < resInfo.MaxCount {
797+
render.TextureImage("Preview", view.textureCache, resource.KeyOf(ids.ObjectMaterialBitmaps.Plus(index), resource.LangAny, 0), imgui.Vec2{X: 64 * view.guiScale, Y: 64 * view.guiScale})
798+
}
799+
} else if selectedDataType == 2 { // Text
800+
values.RenderUnifiedSliderInt(readOnly, "Index###"+fullKey+"-Index", unifier,
801+
indexConverter,
802+
func(value int) string {
803+
if value == 0x007F {
804+
return "%d - (Random number)"
805+
} else {
806+
return "%d"
807+
}
808+
},
809+
0, 0x007F,
810+
indexUpdater)
811+
} else if selectedDataType == 3 { // Scrolling Text
812+
values.RenderUnifiedSliderInt(readOnly, "Index###"+fullKey+"-Index", unifier,
813+
indexConverter,
814+
func(value int) string { return "%d" },
815+
0, 0x007F,
816+
indexUpdater)
817+
}
818+
819+
if selectedDataType == 2 || selectedDataType == 3 {
820+
fontNames := []string{"Large Tech", "Small Tech"}
821+
values.RenderUnifiedCombo(readOnly, "Font###"+fullKey+"-Font", unifier,
822+
func(u values.Unifier) int {
823+
key := unifier.Unified().(int32)
824+
return int((key & 0x0800) >> 11)
825+
},
826+
func(value int) string { return fontNames[value] },
827+
len(fontNames),
828+
func(newValue int) {
829+
updater(func(oldValue uint32) uint32 {
830+
result := oldValue & ^uint32(0x0800)
831+
result |= uint32(newValue<<11) & uint32(0x0800)
832+
return result
833+
})
834+
})
835+
}
836+
837+
values.RenderUnifiedSliderInt(readOnly, "Scale###"+fullKey+"-Scale", unifier,
838+
func(u values.Unifier) int {
839+
key := unifier.Unified().(int32)
840+
return int((key & 0x0600) >> 9)
841+
},
842+
func(value int) string { return "%d" },
843+
0, 3,
844+
func(newValue int) {
845+
updater(func(oldValue uint32) uint32 {
846+
result := oldValue & ^uint32(0x0600)
847+
result |= uint32(newValue<<9) & uint32(0x0600)
848+
return result
849+
})
850+
})
851+
} else {
852+
// Indirection to another object
853+
values.RenderUnifiedSliderInt(readOnly, "ObjectID###"+fullKey+"-Object", unifier,
854+
func(u values.Unifier) int { return int(u.Unified().(int32)) & 0x0FFF },
855+
func(value int) string { return "%d" },
856+
0, lvl.ObjectCapacity(),
857+
func(newValue int) {
858+
updater(func(oldValue uint32) uint32 {
859+
result := oldValue & ^uint32(0x0FFF)
860+
result |= uint32(newValue) & uint32(0x0FFF)
861+
return result
862+
})
863+
})
864+
}
865+
})
866+
650867
describer(simplifier)
651868
}
652869

editor/levels/TilesView.go

+20-9
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func (view *TilesView) renderContent(lvl *level.Level, tiles []*level.TileMapEnt
9393
ceilingHeightUnifier := values.NewUnifier()
9494
slopeHeightUnifier := values.NewUnifier()
9595
slopeControlUnifier := values.NewUnifier()
96-
musicIndexUnifier := values.NewUnifier()
96+
musicZoneUnifier := values.NewUnifier()
9797

9898
floorPaletteIndexUnifier := values.NewUnifier()
9999
ceilingPaletteIndexUnifier := values.NewUnifier()
@@ -113,6 +113,7 @@ func (view *TilesView) renderContent(lvl *level.Level, tiles []*level.TileMapEnt
113113
ceilingLightUnifier := values.NewUnifier()
114114
ceilingLightDeltaUnifier := values.NewUnifier()
115115
deconstructedUnifier := values.NewUnifier()
116+
perildUnifier := values.NewUnifier()
116117
floorHazardUnifier := values.NewUnifier()
117118
ceilingHazardUnifier := values.NewUnifier()
118119

@@ -122,7 +123,8 @@ func (view *TilesView) renderContent(lvl *level.Level, tiles []*level.TileMapEnt
122123
ceilingHeightUnifier.Add(tile.Ceiling.AbsoluteHeight())
123124
slopeHeightUnifier.Add(tile.SlopeHeight)
124125
slopeControlUnifier.Add(tile.Flags.SlopeControl())
125-
musicIndexUnifier.Add(tile.Flags.MusicIndex())
126+
musicZoneUnifier.Add(tile.Flags.MusicZone())
127+
perildUnifier.Add(tile.Flags.Peril())
126128
if isCyberspace {
127129
floorPaletteIndexUnifier.Add(tile.TextureInfo.FloorPaletteIndex())
128130
ceilingPaletteIndexUnifier.Add(tile.TextureInfo.CeilingPaletteIndex())
@@ -180,11 +182,14 @@ func (view *TilesView) renderContent(lvl *level.Level, tiles []*level.TileMapEnt
180182
func(value int) string { return slopeControls[value].String() },
181183
len(slopeControls),
182184
func(newValue int) { view.changeTiles(setSlopeControlTo(slopeControls[newValue])) })
183-
values.RenderUnifiedSliderInt(readOnly, "Music Index", musicIndexUnifier,
184-
func(u values.Unifier) int { return u.Unified().(int) },
185-
func(value int) string { return "%d" },
186-
0, 15,
187-
func(newValue int) { view.changeTiles(setMusicIndexTo(newValue)) })
185+
musicZones := level.TileMusicZones()
186+
values.RenderUnifiedCombo(readOnly, "Music Zone", musicZoneUnifier,
187+
func(u values.Unifier) int { return int(u.Unified().(level.TileMusicZone)) },
188+
func(value int) string { return musicZones[value].String() },
189+
len(musicZones),
190+
func(newValue int) { view.changeTiles(setMusicZoneTo(musicZones[newValue])) })
191+
values.RenderUnifiedCheckboxCombo(readOnly, "Music Peril", perildUnifier,
192+
func(newValue bool) { view.changeTiles(setPerilTo(newValue)) })
188193

189194
imgui.Separator()
190195

@@ -400,9 +405,15 @@ func setSlopeControlTo(value level.TileSlopeControl) tileMapEntryModifier {
400405
}
401406
}
402407

403-
func setMusicIndexTo(value int) tileMapEntryModifier {
408+
func setPerilTo(value bool) tileMapEntryModifier {
404409
return func(tile *level.TileMapEntry) {
405-
tile.Flags = tile.Flags.WithMusicIndex(value)
410+
tile.Flags = tile.Flags.WithPeril(value)
411+
}
412+
}
413+
414+
func setMusicZoneTo(value level.TileMusicZone) tileMapEntryModifier {
415+
return func(tile *level.TileMapEntry) {
416+
tile.Flags = tile.Flags.WithMusicZone(value)
406417
}
407418
}
408419

ss1/content/archive/level/TileFlag.go

+72-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package level
22

3+
import "fmt"
4+
35
// TileFlag describes simple properties of a map tile.
46
type TileFlag uint32
57

@@ -19,17 +21,28 @@ func (flag TileFlag) ForCyberspace() CyberspaceFlag {
1921
return CyberspaceFlag(flag)
2022
}
2123

22-
// MusicIndex returns the music identifier. Range: [0..15].
23-
func (flag TileFlag) MusicIndex() int {
24-
return int((flag & 0x0000F000) >> 12)
24+
// MusicZone returns the music zone.
25+
func (flag TileFlag) MusicZone() TileMusicZone {
26+
return TileMusicZone((flag & 0x0000E000) >> 13)
2527
}
2628

27-
// WithMusicIndex returns a new flag value with the given music index set. Values beyond allowed range are ignored.
28-
func (flag TileFlag) WithMusicIndex(value int) TileFlag {
29-
if (value < 0) || (value > 15) {
30-
return flag
29+
// WithMusicZone returns a new flag value with the given music index set.
30+
func (flag TileFlag) WithMusicZone(value TileMusicZone) TileFlag {
31+
return TileFlag(uint32(flag&^0x0000E000) | (uint32(value) << 13))
32+
}
33+
34+
// Peril returns whether the tile is marked as peril (may play peril music).
35+
func (flag TileFlag) Peril() bool {
36+
return (flag & 0x00001000) != 0
37+
}
38+
39+
// WithPeril returns a flag with the given peril set.
40+
func (flag TileFlag) WithPeril(value bool) TileFlag {
41+
var valueFlag uint32
42+
if value {
43+
valueFlag = 0x00001000
3144
}
32-
return TileFlag(uint32(flag&^0x0000F000) | (uint32(value) << 12))
45+
return TileFlag(uint32(flag&^0x00001000) | valueFlag)
3346
}
3447

3548
// SlopeControl returns the slope control as per flags.
@@ -126,7 +139,7 @@ func (flag RealWorldFlag) TileVisited() bool {
126139
return (flag & 0x80000000) != 0
127140
}
128141

129-
// WithTileVisited returns a flag with the given deconstruction set.
142+
// WithTileVisited returns a flag with the given visited set.
130143
func (flag RealWorldFlag) WithTileVisited(value bool) RealWorldFlag {
131144
var valueFlag uint32
132145
if value {
@@ -162,3 +175,53 @@ func (flag CyberspaceFlag) WithFlightPull(value CyberspaceFlightPull) Cyberspace
162175
newFlag |= uint32(value&0x10) << 20
163176
return CyberspaceFlag(newFlag)
164177
}
178+
179+
type TileMusicZone byte
180+
181+
const (
182+
TileMusicZoneNoMusic TileMusicZone = 0
183+
TileMusicZoneHospital TileMusicZone = 1
184+
TileMusicZoneExecutive TileMusicZone = 2
185+
TileMusicZoneIndustrial TileMusicZone = 3
186+
TileMusicZoneMetal TileMusicZone = 4
187+
TileMusicZonePark TileMusicZone = 5
188+
TileMusicZoneBridge TileMusicZone = 6
189+
TileMusicZoneElevator TileMusicZone = 7
190+
)
191+
192+
// TileSlopeControls returns all control values.
193+
func TileMusicZones() []TileMusicZone {
194+
return []TileMusicZone{
195+
TileMusicZoneNoMusic,
196+
TileMusicZoneHospital,
197+
TileMusicZoneExecutive,
198+
TileMusicZoneIndustrial,
199+
TileMusicZoneMetal,
200+
TileMusicZonePark,
201+
TileMusicZoneBridge,
202+
TileMusicZoneElevator,
203+
}
204+
}
205+
206+
func (ctrl TileMusicZone) String() string {
207+
switch ctrl {
208+
case TileMusicZoneNoMusic:
209+
return "No Music"
210+
case TileMusicZoneHospital:
211+
return "Hospital"
212+
case TileMusicZoneExecutive:
213+
return "Executive"
214+
case TileMusicZoneIndustrial:
215+
return "Industrial"
216+
case TileMusicZoneMetal:
217+
return "Metal"
218+
case TileMusicZonePark:
219+
return "Park"
220+
case TileMusicZoneBridge:
221+
return "Bridge"
222+
case TileMusicZoneElevator:
223+
return "Elevator"
224+
default:
225+
return fmt.Sprintf("Unknown%02X", int(ctrl))
226+
}
227+
}

0 commit comments

Comments
 (0)