Files
questshock/modding/hacked/ss1/content/archive/level/lvlobj/actions/Actions.go
T

359 lines
17 KiB
Go

package actions
import (
"fmt"
"github.com/inkyblackness/hacked/ss1/content/interpreters"
)
func forType(typeID int) func(*interpreters.Instance) bool {
return func(inst *interpreters.Instance) bool {
return inst.Get("Type") == uint32(typeID)
}
}
var transportHackerDetails = interpreters.New().
With("TargetX", 0, 4).As(interpreters.RangedValue(1, 63)).
With("TargetY", 4, 4).As(interpreters.RangedValue(1, 63)).
With("TargetZ", 8, 1).As(interpreters.RangedValue(0, 255)).
With("PreserveHeight", 9, 1).As(interpreters.EnumValue(map[uint32]string{0: "No", 0x40: "Yes"})).
With("CrossLevelTransportDestination", 12, 1).As(interpreters.RangedValue(0, 15)).
With("CrossLevelTransportFlag", 13, 1).As(interpreters.EnumValue(map[uint32]string{
0x00: "Cross-Level", 0x10: "Same-Level (0x10)", 0x20: "Same-Level (0x20)", 0x22: "Same-Level (0x22)"}))
var changeHealthDetails = interpreters.New().
With("HealthDelta", 4, 1).
With("HealthChangeFlag", 6, 2).As(interpreters.EnumValue(map[uint32]string{0: "Remove Delta", 1: "Add Delta"})).
With("PowerDelta", 8, 1).
With("PowerChangeFlag", 10, 2).As(interpreters.EnumValue(map[uint32]string{0: "Remove Delta", 1: "Add Delta"})).
With("FatigueDelta", 12, 2).As(interpreters.RangedValue(0, 255)).
With("FatigueChangeFlag", 14, 2).As(interpreters.EnumValue(map[uint32]string{0: "Add Delta", 1: "Remove Delta"}))
var cloneMoveObjectDetails = interpreters.New().
With("ObjectID", 0, 2).As(interpreters.ObjectID()).
With("MoveFlag", 2, 2).As(interpreters.EnumValue(map[uint32]string{
0x0000: "Clone Object",
0x0001: "Move Object (0x0001)",
0x0002: "Move Object (0x0002)",
0x0FFF: "Move Object (0x0FFF)",
0xAAAA: "Move Object (0xAAAA)",
0xFFFF: "Move Object (0xFFFF)"})).
With("TargetX", 4, 4).As(interpreters.RangedValue(1, 63)).
With("TargetY", 8, 4).As(interpreters.RangedValue(1, 63)).
With("TargetHeight", 12, 1).As(interpreters.SpecialValue("ObjectHeight")).
With("KeepSourceHeight", 13, 1).As(interpreters.EnumValue(map[uint32]string{0x00: "Set height", 0x40: "Keep height"}))
var setGameVariableDetails = interpreters.New().
With("VariableKey", 0, 4).As(interpreters.SpecialValue("VariableKey")).
With("Value", 4, 2).
With("Operation", 6, 2).As(interpreters.EnumValue(map[uint32]string{0: "Set", 1: "Add", 2: "Subtract", 3: "Multiply", 4: "Divide", 5: "Modulo"})).
With("Message1", 8, 4).As(interpreters.RangedValue(0, 511)).
With("Message2", 12, 4).As(interpreters.RangedValue(0, 511))
var showCutsceneDetails = interpreters.New().
With("CutsceneIndex", 0, 4).As(interpreters.EnumValue(map[uint32]string{0: "Death", 1: "Intro", 2: "Ending"})).
With("EndGameFlag", 4, 4).As(interpreters.EnumValue(map[uint32]string{0: "No (not working)", 1: "Yes"}))
func pointOneSecond(value int) string {
return fmt.Sprintf("%.1f sec", float64(value)*0.1)
}
var triggerOtherObjectsDetails = interpreters.New().
With("Object1ID", 0, 2).As(interpreters.ObjectID()).
With("Object1Delay", 2, 2).As(interpreters.FormattedRangedValue(0, 6000, pointOneSecond)).
With("Object2ID", 4, 2).As(interpreters.ObjectID()).
With("Object2Delay", 6, 2).As(interpreters.FormattedRangedValue(0, 6000, pointOneSecond)).
With("Object3ID", 8, 2).As(interpreters.ObjectID()).
With("Object3Delay", 10, 2).As(interpreters.FormattedRangedValue(0, 6000, pointOneSecond)).
With("Object4ID", 12, 2).As(interpreters.ObjectID()).
With("Object4Delay", 14, 2).As(interpreters.FormattedRangedValue(0, 6000, pointOneSecond))
var changeLightingDetails = interpreters.New().
Refining("ObjectExtent", 0, 2, interpreters.New().With("Index", 0, 2).As(interpreters.ObjectID()), func(inst *interpreters.Instance) bool {
var lightType = inst.Get("LightType")
return (lightType == 0x00) || (lightType == 0x01)
}).
Refining("RadiusExtent", 0, 2, interpreters.New().With("Tiles", 0, 2).As(interpreters.RangedValue(0, 31)), func(inst *interpreters.Instance) bool {
return inst.Get("LightType") == 0x03
}).
With("ReferenceObjectID", 2, 2).As(interpreters.ObjectID()).
With("TransitionType", 4, 2).As(interpreters.EnumValue(map[uint32]string{0x0000: "immediate", 0x0001: "fade", 0x0100: "flicker"})).
With("LightModification", 7, 1).As(interpreters.EnumValue(map[uint32]string{0x00: "light on", 0x10: "light off"})).
With("LightType", 8, 1).As(interpreters.EnumValue(map[uint32]string{0x00: "rectangular", 0x03: "circular gradient"})).
With("LightSurface", 10, 2).As(interpreters.EnumValue(map[uint32]string{0: "floor", 1: "ceiling", 2: "floor and ceiling"})).
Refining("Rectangular", 12, 2, interpreters.New().
With("Off light value", 0, 1).As(interpreters.RangedValue(0, 15)).
With("On light value", 1, 1).As(interpreters.RangedValue(0, 15)), func(inst *interpreters.Instance) bool {
return inst.Get("LightType") == 0x00
}).
Refining("Gradient", 12, 4, interpreters.New().
With("Off light begin intensity", 0, 1).As(interpreters.RangedValue(0, 127)).
With("Off light end intensity", 1, 1).As(interpreters.RangedValue(0, 127)).
With("On light begin intensity", 2, 1).As(interpreters.RangedValue(0, 127)).
With("On light end intensity", 3, 1).As(interpreters.RangedValue(0, 127)), func(inst *interpreters.Instance) bool {
var lightType = inst.Get("LightType")
return (lightType == 0x01) || (lightType == 0x03)
})
var effectDetails = interpreters.New().
With("SoundIndex", 0, 2).As(interpreters.RangedValue(0, 512)).
With("SoundPlayCount", 2, 2).As(interpreters.RangedValue(0, 100)).
With("VisualEffect", 4, 2).As(interpreters.EnumValue(map[uint32]string{
0: "none",
1: "power on",
2: "quake",
3: "escape pod",
4: "red static",
5: "interference"})).
With("AdditionalVisualEffect", 8, 2).As(interpreters.EnumValue(map[uint32]string{
0: "none",
1: "white flash",
2: "pink flash",
3: "gray static",
4: "vertical panning"})).
With("AdditionalEffectTime", 12, 2).As(interpreters.RangedValue(0, 1000))
var changeTileHeightsDetails = interpreters.New().
With("TileX", 0, 4).As(interpreters.RangedValue(1, 63)).
With("TileY", 4, 4).As(interpreters.RangedValue(1, 63)).
With("TargetFloorHeight", 8, 2).As(interpreters.SpecialValue("MoveTileHeight")).
With("TargetCeilingHeight", 10, 2).As(interpreters.SpecialValue("MoveTileHeight")).
With("FloorSound", 14, 2).As(interpreters.EnumValue(map[uint32]string{0x0000: "Audible", 0x0001: "Silent"}))
var changeTerrainDetails = interpreters.New().
With("TileX", 0, 4).As(interpreters.RangedValue(1, 63)).
With("TileY", 4, 4).As(interpreters.RangedValue(1, 63)).
With("Type", 8, 1).As(interpreters.SpecialValue("TileType")).
With("TypeControl", 9, 1).As(interpreters.EnumValue(map[uint32]string{0x00: "Set type", 0x40: "Keep type"})).
With("SlopeHeight", 12, 1).As(interpreters.SpecialValue("TileHeight")).
With("SlopeControl", 13, 1).As(interpreters.EnumValue(map[uint32]string{0x00: "Set height", 0x40: "Keep height"}))
var scheduledTrapDetails = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("TimeInterval", 4, 4).As(interpreters.FormattedRangedValue(0, 6000, pointOneSecond)).
With("ActivationValue", 8, 4).As(interpreters.EnumValue(map[uint32]string{0: "Off",
0xFFFF: "On (0xFFFF)", 0x10000: "On (0x10000)", 0x11111: "On (0x11111)"})).
With("Variance", 12, 2).As(interpreters.RangedValue(0, 512))
var cycleObjectsDetails = interpreters.New().
With("ObjectID1", 0, 4).As(interpreters.ObjectID()).
With("ObjectID2", 4, 4).As(interpreters.ObjectID()).
With("ObjectID3", 8, 4).As(interpreters.ObjectID()).
With("NextObject", 12, 4).As(interpreters.RangedValue(0, 2))
var deleteObjectsDetails = interpreters.New().
With("ObjectID1", 0, 2).As(interpreters.ObjectID()).
With("ObjectID2", 4, 2).As(interpreters.ObjectID()).
With("ObjectID3", 8, 2).As(interpreters.ObjectID()).
With("MessageIndex", 12, 2).As(interpreters.RangedValue(0, 511))
var receiveEmailDetails = interpreters.New().
With("EmailIndex", 0, 2).As(interpreters.RangedValue(0, 1000)).
With("DelaySec", 4, 2).As(interpreters.RangedValue(0, 600))
var exposeDetails = interpreters.New().
With("DeltaValue", 0, 2).As(interpreters.RangedValue(0, 1000)).
With("EffectChangeFlag", 2, 2).As(interpreters.EnumValue(map[uint32]string{0: "Add Delta", 1: "Remove Delta"})).
With("EffectType", 4, 4).As(interpreters.EnumValue(map[uint32]string{4: "Radiation poisoning", 8: "Bio contamination"}))
var setObjectParameterDetails = interpreters.New().
With("ObjectID1", 0, 2).As(interpreters.ObjectID()).
With("ObjectID2", 2, 2).As(interpreters.ObjectID()).
With("Value1", 4, 4).
With("Value2", 8, 4).
With("Value3", 12, 4)
var setScreenPictureDetails = interpreters.New().
With("ScreenObjectID1", 0, 2).As(interpreters.ObjectID()).
With("ScreenObjectID2", 2, 2).As(interpreters.ObjectID()).
With("SingleSequenceSource", 4, 4).
With("LoopSequenceSource", 8, 4)
var setCritterStateDetails = interpreters.New().
With("ReferenceObjectID1", 4, 2).As(interpreters.ObjectID()).
With("ReferenceObjectID2", 6, 2).As(interpreters.ObjectID()).
With("NewState", 8, 1).As(interpreters.EnumValue(map[uint32]string{
0: "docile",
1: "cautious",
2: "hostile",
3: "cautious (?)",
4: "attacking",
5: "sleeping",
6: "tranquilized",
7: "confused"}))
var trapMessageDetails = interpreters.New().
With("BackgroundImageIndex", 0, 4).As(interpreters.RangedValue(-2, 500)).
With("MessageIndex", 4, 4).As(interpreters.RangedValue(0, 511)).
With("TextColor", 8, 4).As(interpreters.RangedValue(0, 255)).
With("MfdSuppressionFlag", 12, 4).As(interpreters.EnumValue(map[uint32]string{0: "Show in MFD", 1: "Show only in HUD"}))
var spawnObjectsDetails = interpreters.New().
With("ObjectType", 0, 4).As(interpreters.SpecialValue("ObjectTriple")).
With("ReferenceObject1ID", 4, 2).As(interpreters.ObjectID()).
With("ReferenceObject2ID", 6, 2).As(interpreters.ObjectID()).
With("NumberOfObjects", 8, 4).As(interpreters.RangedValue(0, 100)).
With("Flags", 12, 1).As(interpreters.Bitfield(map[uint32]string{
0x00000001: "Avoid spawn within 7 tiles",
0x00000002: "Avoid spawn in close view",
0x00000004: "Avoid spawn in elevator music",
0x00000008: "Force spawn in occupied/close tiles"}))
var changeObjectTypeDetails = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("NewType", 4, 2).As(interpreters.RangedValue(0, 16)).
With("ResetMask", 6, 2).As(interpreters.RangedValue(0, 15))
// Change state block
var toggleRepulsorChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("OffTextureIndex", 4, 1).As(interpreters.SpecialValue("LevelTexture")).
With("OnTextureIndex", 5, 1).As(interpreters.SpecialValue("LevelTexture")).
With("ToggleType", 8, 1).As(interpreters.EnumValue(map[uint32]string{0: "Toggle On/Off", 1: "Toggle On, Stay On", 2: "Toggle Off, Stay Off"}))
var showGameCodeDigitChange = interpreters.New().
With("ScreenObjectID", 0, 4).As(interpreters.ObjectID()).
With("DigitNumber", 4, 4).As(interpreters.RangedValue(1, 6))
var setParameterFromVariableChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("ParameterNumber", 4, 4).As(interpreters.RangedValue(0, 16)).
With("VariableIndex", 8, 4).As(interpreters.SpecialValue("VariableKey"))
var setFrameStateChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("NewState", 4, 4).As(interpreters.EnumValue(map[uint32]string{0: "Off", 1: "On"}))
var doorControlChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("ControlValue", 4, 4).As(interpreters.EnumValue(map[uint32]string{1: "open door", 2: "close door", 3: "toggle door", 4: "disable auto-close"}))
var rotateObjectChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("Amount", 4, 1).As(interpreters.RangedValue(0, 255)).
With("RotationType", 5, 1).As(interpreters.EnumValue(map[uint32]string{0: "Endless", 1: "Back and forth"})).
With("Direction", 6, 1).As(interpreters.EnumValue(map[uint32]string{0: "Forward", 1: "Backward"})).
With("Axis", 7, 1).As(interpreters.EnumValue(map[uint32]string{0: "Z (Yaw)", 1: "X (Pitch)", 2: "Y (Roll)"})).
With("ForwardLimit", 8, 1).As(interpreters.RangedValue(0, 255)).
With("BackwardLimit", 9, 1).As(interpreters.RangedValue(0, 255))
var removeObjectsChange = interpreters.New().
With("ObjectType", 0, 4).As(interpreters.SpecialValue("ObjectTriple")).
With("Radius", 4, 1).As(interpreters.RangedValue(0, 255))
var setConditionChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("Condition", 4, 4)
var makeItemRadioactiveChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID()).
With("WatchedObjectID", 4, 2).As(interpreters.ObjectID()).
With("WatchedObjectTriggerState", 6, 2)
var orientedTriggerObjectChange = interpreters.New().
With("HorizontalDirection", 0, 2).As(interpreters.RangedValue(0, 0xFFFF)).
With("ObjectID", 4, 2).As(interpreters.ObjectID())
var closeDataMfdChange = interpreters.New().
With("ObjectID", 0, 4).As(interpreters.ObjectID())
var changeObjectTypeGlobalChange = interpreters.New().
With("ObjectType", 0, 4).As(interpreters.SpecialValue("ObjectTriple")).
With("NewType", 4, 1).As(interpreters.RangedValue(0, 16))
var hackDetails = interpreters.New().
With("Type", 0, 4).As(interpreters.EnumValue(map[uint32]string{
1: "Toggle Repulsor",
2: "Show Game Code Digit",
3: "Set Parameter from Variable",
4: "Set Button State",
5: "Door Control",
6: "Return to Menu",
7: "Rotate Objects",
8: "Remove Objects",
9: "SHODAN Pixelation",
10: "Set Condition",
11: "Show System Analyzer",
12: "Make Item Radioactive",
13: "Oriented Trigger Object",
14: "Close Data MFD",
15: "Earth Destruction by Laser",
16: "Change Objects Type (Level)"})).
Refining("ToggleRepulsor", 4, 12, toggleRepulsorChange, forType(1)).
Refining("ShowGameCodeDigit", 4, 12, showGameCodeDigitChange, forType(2)).
Refining("SetParameterFromVariable", 4, 12, setParameterFromVariableChange, forType(3)).
Refining("SetFrameState", 4, 12, setFrameStateChange, forType(4)).
Refining("DoorControl", 4, 12, doorControlChange, forType(5)).
Refining("ReturnToMenu", 4, 12, interpreters.New(), forType(6)).
Refining("RotateObject", 4, 12, rotateObjectChange, forType(7)).
Refining("RemoveObjects", 4, 12, removeObjectsChange, forType(8)).
Refining("ShodanPixelation", 4, 12, interpreters.New(), forType(9)).
Refining("SetCondition", 4, 12, setConditionChange, forType(10)).
Refining("ShowSystemAnalyzer", 4, 12, interpreters.New(), forType(11)).
Refining("MakeItemRadioactive", 4, 12, makeItemRadioactiveChange, forType(12)).
Refining("OrientedTriggerObject", 4, 12, orientedTriggerObjectChange, forType(13)).
Refining("CloseDataMfd", 4, 12, closeDataMfdChange, forType(14)).
Refining("EarthDestructionByLaser", 4, 12, interpreters.New(), forType(15)).
Refining("ChangeObjectsType", 4, 12, changeObjectTypeGlobalChange, forType(16))
var unconditionalAction = interpreters.New().
With("Type", 0, 1).As(interpreters.EnumValue(map[uint32]string{
0: "Nothing",
1: "Transport Hacker",
2: "Change Health",
3: "Clone/Move Object",
4: "Set Game Variable",
5: "Show Cutscene",
6: "Trigger Other Objects",
7: "Change Lighting",
8: "Effect",
9: "Change Tile Heights",
10: "Change Terrain",
11: "Random Timer",
12: "Cycle Objects",
13: "Delete Objects",
14: "Unknown (14)",
15: "Receive E-Mail",
16: "Change Effect",
17: "Set Object Parameter",
18: "Set Screen Picture",
19: "Change State",
20: "Unknown (20)",
21: "Set Critter State",
22: "Trap Message",
23: "Spawn Objects",
24: "Change Object Type"})).
With("UsageQuota", 1, 1).
Refining("TransportHacker", 6, 16, transportHackerDetails, forType(1)).
Refining("ChangeHealth", 6, 16, changeHealthDetails, forType(2)).
Refining("CloneMoveObject", 6, 16, cloneMoveObjectDetails, forType(3)).
Refining("SetGameVariable", 6, 16, setGameVariableDetails, forType(4)).
Refining("ShowCutscene", 6, 16, showCutsceneDetails, forType(5)).
Refining("TriggerOtherObjects", 6, 16, triggerOtherObjectsDetails, forType(6)).
Refining("ChangeLighting", 6, 16, changeLightingDetails, forType(7)).
Refining("Effect", 6, 16, effectDetails, forType(8)).
Refining("ChangeTileHeights", 6, 16, changeTileHeightsDetails, forType(9)).
Refining("ChangeTerrain", 6, 16, changeTerrainDetails, forType(10)).
Refining("ScheduledTrap", 6, 16, scheduledTrapDetails, forType(11)).
Refining("CycleObjects", 6, 16, cycleObjectsDetails, forType(12)).
Refining("DeleteObjects", 6, 16, deleteObjectsDetails, forType(13)).
// 14 unused
Refining("ReceiveEmail", 6, 16, receiveEmailDetails, forType(15)).
Refining("Expose", 6, 16, exposeDetails, forType(16)).
Refining("SetObjectParameter", 6, 16, setObjectParameterDetails, forType(17)).
Refining("SetScreenPicture", 6, 16, setScreenPictureDetails, forType(18)).
Refining("Hack", 6, 16, hackDetails, forType(19)).
// 20 unknown
Refining("SetCritterState", 6, 16, setCritterStateDetails, forType(21)).
Refining("TrapMessage", 6, 16, trapMessageDetails, forType(22)).
Refining("SpawnObjects", 6, 16, spawnObjectsDetails, forType(23)).
Refining("ChangeObjectType", 6, 16, changeObjectTypeDetails, forType(24))
// Unconditional returns the description of actions without a condition.
func Unconditional() *interpreters.Description {
return unconditionalAction
}