mirror of
https://github.com/Ellpeck/TinyLifeWeb.git
synced 2024-12-21 14:29:23 +01:00
added some sample code for modders
This commit is contained in:
parent
47c94a224b
commit
1acf111a1c
2 changed files with 109 additions and 0 deletions
107
docs/articles/sample_code.md
Normal file
107
docs/articles/sample_code.md
Normal file
|
@ -0,0 +1,107 @@
|
|||
# Sample Code for Modders
|
||||
This page collects various sample code snippets intended to help modders get started with more complex pieces of code like furniture that produces light, social actions, and more.
|
||||
|
||||
If you'd like for more examples of specific content pieces to be added to this list, don't hesitate to [ask on the Discord](https://link.tinylifegame.com/discordweb) or [open an issue](https://github.com/Ellpeck/TinyLifeWeb/issues) about it.
|
||||
|
||||
**Please note that, due to the game being closed source, the code displayed here is only intended as an example and not meant to be copied directly.**
|
||||
|
||||
## Furniture
|
||||
|
||||
### Furniture With Light
|
||||
The Sleek Floor Lamp item's code:
|
||||
```cs
|
||||
public static readonly FurnitureType SimpleLamp = FurnitureType.Register(new TypeSettings("SimpleLamp", new Point(1, 1), ObjectCategory.Lamp, 80, ColorScheme.Grays, ColorScheme.MutedPastels) {
|
||||
ElectricityRating = 1,
|
||||
LightSettings = {
|
||||
CreateLights = f => [
|
||||
new Light(f.Map, f.Position, f.Floor, Light.CircleTexture, new Vector2(6, 8), Color.LightYellow) {
|
||||
VisualWorldOffset = new Vector2(0.5F)
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
The Paper Lantern Fairy Lights item's code, which is a bit more complex since they're attached to walls:
|
||||
```cs
|
||||
public static readonly FurnitureType BulbFairyLights = FurnitureType.Register(new TypeSettings("BulbFairyLights", new Point(1, 1), ObjectCategory.Lamp | ObjectCategory.WallHanging | ObjectCategory.NonColliding | ObjectCategory.CanCoverWindow, 25, ColorScheme.White) {
|
||||
DecorativeRating = _ => 1,
|
||||
Tab = Tab.Decoration | Tab.Lighting,
|
||||
LightSettings = {
|
||||
CreateLights = f => f.AttachedWall == null ? [] : [
|
||||
new Light(f.Map, f.Position, f.Floor, Light.CircleTexture, new Vector2(1), Color.LightGoldenrodYellow) {
|
||||
PositionOffset = WallLike.GetCenterBottomPos(f.AttachedWall.Positions[0], f.AttachedWall.Positions[1]) - f.Position,
|
||||
VisualWorldOffset = new Vector2(1.6F),
|
||||
Rotation = MathHelper.ToRadians(25 * (WallLike.IsVerticalForCamera(WallLike.IsVertical(f.AttachedWall.Positions[0], f.AttachedWall.Positions[1])) ? -1 : 1))
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Actions
|
||||
|
||||
### Simple Social Actions (Talk Actions)
|
||||
The `TalkAction` class supplies a set of factory methods that allow easily creating social actions between Tinies which generally only involve talking and have a chance to succeed or fail, yielding friendship or romance gains or losses in return.
|
||||
|
||||
This is the most basic social action in the game, the Chat action:
|
||||
```cs
|
||||
public static readonly ActionType Talk = ActionType.Register(TalkAction.Create("Friendly/Talk", _ => 90, new TalkSettings {
|
||||
GoBadlyChance = _ => 0.01F, TalkMinutes = 10, FriendshipGain = _ => 1600,
|
||||
EmoteCategory = EmoteCategory.General, SpeakStyle = SpeakStyle.Neutral | SpeakStyle.Happy | SpeakStyle.Questioning
|
||||
}));
|
||||
```
|
||||
|
||||
Here is an example of a more complex talk action:
|
||||
```cs
|
||||
public static readonly ActionType AskAboutParenting = ActionType.Register(TalkAction.Create("Friendly/AskAboutParenting", _ => 50, new TalkSettings {
|
||||
FriendshipGain = _ => 3000, GoBadlyChance = _ => 0.02F, TalkMinutes = 15,
|
||||
EmoteCategory = EmoteCategory.General | EmoteCategory.Travel, SpeakStyle = SpeakStyle.Questioning | SpeakStyle.Confused | SpeakStyle.Scared,
|
||||
PartnerSpeakStyle = SpeakStyle.Confident | SpeakStyle.Affirmative | SpeakStyle.Happy | SpeakStyle.Neutral,
|
||||
Settings = {
|
||||
RequiredAges = AgeGroup.AdultOrOlder, RequiredPartnerAges = AgeGroup.AdultOrOlder,
|
||||
CanExecute = (i, _) => ActionType.Partner(i)?.Relationships.Any(r => r.Genealogy == GenealogyType.Parent) == true ? CanExecuteResult.Valid : CanExecuteResult.Hidden
|
||||
}
|
||||
}));
|
||||
```
|
||||
|
||||
## Life Goals (and Daily Tasks for Jobs)
|
||||
Here are some examples of how the `GoalSet` system can be used:
|
||||
```cs
|
||||
// execute the research business plans action for half an hour
|
||||
AutoGoalInfo.Timed<Action>("ResearchBusinessPlans", TimeSpan.FromMinutes(30), a => a.Type == ActionType.ResearchBusinessPlans, GoalTrigger.ActionUpdate)
|
||||
|
||||
// complete the read action 10 times
|
||||
AutoGoalInfo.Amount<ReadAction>("Read10Times", 10, triggers: GoalTrigger.ActionCompleted))
|
||||
|
||||
// talk to 10 distinct people
|
||||
AutoGoalInfo.Distinct<TalkAction>("TalkTo10People", 10, a => a.Partner.Id.ToString(), triggers: GoalTrigger.ActionCompleted)
|
||||
|
||||
// earning tb3000 in any way
|
||||
AutoGoalInfo.Amount<object>("Earn3000TinyBucks", 3000, triggers: GoalTrigger.EarnMoney)
|
||||
|
||||
// earning money through creating the painting furniture specifically
|
||||
AutoGoalInfo.Amount<Painting>("Earn1000FromPaintings", 1000, triggers: GoalTrigger.EarnMoney)
|
||||
|
||||
// earning money through a book project specifically
|
||||
AutoGoalInfo.Conditioned<Project>("EarnRoyalties10Books", p => p.Person.Projects.Count(pr => pr.Type == "Book" && pr.DailyPay > 0) >= 10, GoalTrigger.EarnMoney)
|
||||
```
|
||||
|
||||
Here is the full code for the game's Household Hero life goal as a reference:
|
||||
```cs
|
||||
public static readonly LifeGoal HouseholdHero = LifeGoal.Register(new LifeGoal("HouseholdHero", PersonalityType.HouseholdHero,
|
||||
new GoalSetInfo(
|
||||
AutoGoalInfo.Amount<Action>("Clean5Objects", 5, a => a.Type == ActionType.Clean || a.Type == ActionType.CleanDish, GoalTrigger.ActionCompleted),
|
||||
AutoGoalInfo.Conditioned<Person>("CleaningLevel3", p => p.HasSkillLevel(SkillType.Cleaning, 3), GoalTrigger.PersonUpdate)),
|
||||
new GoalSetInfo(
|
||||
AutoGoalInfo.Amount<RepairAction>("Repair3Objects", 3, triggers: GoalTrigger.ActionCompleted),
|
||||
AutoGoalInfo.Conditioned<Person>("RepairLevel5", p => p.HasSkillLevel(SkillType.Repair, 5), GoalTrigger.PersonUpdate)),
|
||||
new GoalSetInfo(
|
||||
AutoGoalInfo.Conditioned<Person>("CleaningLevel5", p => p.HasSkillLevel(SkillType.Cleaning, 5), GoalTrigger.PersonUpdate),
|
||||
AutoGoalInfo.Conditioned<Person>("RepairLevel10", p => p.HasSkillLevel(SkillType.Repair, 10), GoalTrigger.PersonUpdate))) {
|
||||
AllowedAges = AgeGroup.OlderThanChild
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
For more info on goal sets and how they can be used for life goals and job daily tasks, see [this Discord discussion](https://discord.com/channels/181435613147430913/981562300592947220/1281723775586406411).
|
|
@ -13,6 +13,8 @@
|
|||
- name: Modding
|
||||
- name: Modding Basics
|
||||
href: mod_basics.md
|
||||
- name: Sample Code for Modders
|
||||
href: sample_code.md
|
||||
- name: Creating Textures
|
||||
href: creating_textures.md
|
||||
|
||||
|
|
Loading…
Reference in a new issue