Create your first Smartobject

This is a small tutorial on how to create a SmartObject.

SmartObjects are objects used ingame that interact with Emergencies as well as with your people, for example a shower could be a SmartObject, or a Bed.

create a `<filename>.fsx` file named after your smartObject Library (more then one SmartObject are stored here)

Full Example

```
#load "EmergencyShared.fsx"
open EMT.Modding
open EmergencyShared

//Comment for your self.
Def.SmartObject.Add {
    ID = "Bed"
    Special = No
    Tags = []
    Profession = ""
    Unlock = None
    BuildDuration = Rt.seconds 10.0
    BuildCost = 800
    SellingPrice = 0.5, Gt.weeks 1.0
    MaintenanceCost = Gt.perDay 50.0
    Type = None
    Cells = [
        RequireSpace {
            Tags = ["BedRoom"]
            Block = [Rect (0,0) (1,2)]
            Free = []
        }
        Activity {
            Transform = -1, 0, XPos
            ID = "sleeping"
            Enter = XPos, Rt.seconds 1.0
            Exit = Rt.seconds 1.0
            Effects = []
                ++ Condition.whileTraitBelow "Rest" 0.9
                ++ Condition.whileTraitBelow "Exhaustion" 2.0
                ++ Effect.changeTrait "Rest" (Gt.perHour 0.5)
                ++ Effect.changeTrait "Exhaustion" (Gt.perHour 1.4)
                ++ Effect.changeTrait "Relaxation" (Rt.perSecond 0.4)
            Tags = ["IncreaseRest"; "Exhaustion"]
        }
    ]
}

```

Let me now explain you the what the lines actually mean

```
#load "Include.fsx"
open EMT.Modding

// default costs
let NeedObjectBuildCost = 50
let NeedObjectMaintenance = Gt.perDay 100.0

let VanityObjectBuildCost = 5
let VanityObjectMaintenance = Gt.perDay 1.0

let StorageObjectBuildCost = 500
let StorageObjectMaintenance = Gt.perDay 5.0
let defautlTrainingTime = 30.0

let RequireStreetAndHideWall (x, y, dir:Direction) =
    RequireMarker (x + int dir.X, y + int dir.Y, dir) "Street"
    @ HideWall (x, y, dir)

```

This is the headder that is needed to create a SmartObject and can be also changed
(Simple SmartObject)

```
Def.SmartObject.Add {
    ID = "ShowerBed"                                                                      ///Name your SmartObject
    Special = No                                                                         ///more later
    Tags = []                                                                           ///Used internal
    Profession = ""                                                                    ///Can be for example Police and is used to show what department "use that"
    Unlock = Some {                                                                   ///You can set here the goals that has to be reached to unlock the object, Reputations or Missions for example 'Goal.HaveUnlocked "SFL_UnlockFD"'
        RequiredReputation = 500
        Goals = []                                                                  ///In that example we just set a reputation of 500 to unlock the item
    }
    BuildDuration = Rt.seconds 15.0                                               ///The time that the station actually need to be build
    BuildCost = 1000                                                             ///The price of the item
    SellingPrice = 0.5, Gt.weeks 1.0                                            ///The selling price should drop if you longer own the item
    MaintenanceCost = Gt.perDay 50.0                                           ///The costs that you pay per day for the item
    Type = None                                                               ///For a simple object we dont need to set any type

```

(Vehicle SmartObject)

```
Def.SmartObject.Add {
    ID = "UFO"                                                                            ///Name your SmartObject
    Special = No                                                                         ///more later
    Tags = [USAVehicle]                                                                 ///Used internal
    Profession = "FireFighter"                                                         ///Can be for example FireFighterand is used to show what department "use that"
    Unlock = Some {                                                                   ///You can set here the goals that has to be reached to unlock the object, Reputations or Missions for example 'Goal.HaveUnlocked "SFL_UnlockFD"'
        RequiredReputation = 1000
        Goals = [Goal.HaveUnlocked "SFL_UnlockFD"]                                  ///In that example we just set a reputation of 1000 to unlock the item and have to finish the Mission "SF Firedepartment"
    }
    BuildDuration = Rt.seconds 60.0                                               ///The time that the station actually need to be build
    BuildCost = 100000                                                           ///The price of the item
    SellingPrice = 5.0, Gt.weeks 1.0                                            ///The selling price should drop if you longer own the item
    MaintenanceCost = Gt.perDay 500.0                                          ///The costs that you pay per day for the item
    Type = SmartObjectType.Vehicle {                                          ///A UFO is not a simple object so we need to set some more values, we declare it here as a vehicle
        Emergency = {                                                        ///In case of a emergency
            LeaveTime  = Rt.seconds 0.1                                     ///The time that the vehicle need to leave the station - look the UFO is fast as hell!
            ComeBackTime = Rt.seconds 0.1                                  ///The time that the vehicle need to return
            Contributions = [                                             ///Here we can set the items that a UFO carry, these must have the same name that the item
                Contribution.Asset "MagicStick" Condition.Always         ///We carry a item called MagicStick here ;-) it is always available
            ]
            ItemSlots = 6                                                                                         ///The count of items that we can carry with our vehicle
            //ItemAccessPoint = ItemAccessPoint (2, 2, XNeg) (Rt.seconds 1.0) (Rt.seconds 1.0)                   ///In your vehicle 3D Model you set the access points for the items
            Seats = [
                AccessPoint (2, 0, XNeg) "Sit" (XNeg, Rt.seconds 0.5) (Rt.seconds 0.5)                          ///You can set the spots where your people access the vehicle
            ]
        }
        Maintenance = {                                                                                       ///The costs of maintrance are set here, you have a Max DMG and can set the times and costs
            MaxDamage = 100.0
            DamageMultiplier = [
                Above 6, 1.5
                Above 3, 1.0
                Above 0, 0.5
            ]
            BreakDownChance = [                                                                            ///The chance that your item break down if it is damaged
                Above 0.5, 0.5
                Above 0.2, 0.1
                Above 0.0, 0.03
            ]
            RepairActivities = [                                                                         ///To repair the vehicle you also have to set the positions, animation (by ID) as well as time
                {
                    Transform = -1, 1, XPos
                    ID = "Repair1"
                    Enter = XPos, Rt.seconds 0.5
                    Exit = Rt.seconds 0.5
                }
            ]
        }
    }

```

After setting the base layout for our objects lets start with "where can you build it"
(SimpleObject)

```
    Cells = [                                        ///this is the main wrapper
        RequireSpace {                              ///Wrapper around the tags
            Tags = ["BedRoom","Bathroom"]          ///The rooms where you can build the objects
            Block = [Rect (0,0) (1,2)]            ///The tiles the object blocks
            Free = []                            ///If there are any free tiles
        }

```

(Vehicle/On Wall)

```
 Cells = [
        RequireSpace {
            Tags = ["Garage"]
            Block = [Rect (0, 0) (2, 5)]
            Free = [Rect (0, 0) (2, 6)]
        }
        RequireStreetAndHideWall (-1, 0, ZNeg)                ///Some objects should have a garage door or should be at a wall you can set this like this
        RequireStreetAndHideWall (0, 0, ZNeg)
        RequireStreetAndHideWall (1, 0, ZNeg)
        RequireStreetAndHideWall (2, 0, ZNeg)
    ]

```

At last our BedShower can has a activity sleeping and shower ;-) this cleans our people while they get new energy

```
Activity {
            Transform = -1, 0, XPos                                           ///Should the object be transformed
            ID = "cleansleeping"                                             ///A ID for the activity
            Enter = XPos, Rt.seconds 1.0                                    ///Where you access the object for the ability
            Exit = Rt.seconds 1.0                                          ///The time for exit :-)!
            Effects = []                                                  ///The buffs or nerfs your people get while using the object
                ++ Condition.whileTraitBelow "Rest" 0.9
                ++ Condition.whileTraitBelow "Exhaustion" 2.0
                ++ Effect.changeTrait "Rest" (Gt.perHour 0.5)
                ++ Effect.changeTrait "Exhaustion" (Gt.perHour 1.4)
                ++ Effect.changeTrait "Relaxation" (Rt.perSecond 0.4)
            Ta

```