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